ZGlmZiAtLWdpdCBhL2F2Yi8uY2xhbmctZm9ybWF0IGIvYXZiLy5jbGFuZy1mb3JtYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmZjY0NgotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0Jhc2VkT25TdHlsZTogR29vZ2xlCitBbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZTogRW1wdHkKK0FsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lOiB0cnVlCitBbGxvd1Nob3J0TG9vcHNPbkFTaW5nbGVMaW5lOiBmYWxzZQorQmluUGFja0FyZ3VtZW50czogZmFsc2UKK0JpblBhY2tQYXJhbWV0ZXJzOiBmYWxzZQorQ29tbWVudFByYWdtYXM6IE5PTElOVDouKgorRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1RhYldpZHRoOiAyCmRpZmYgLS1naXQgYS9hdmIvQW5kcm9pZC5tayBiL2F2Yi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzM2MyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxMiBAQAorIworIyBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorIyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorIyBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisjIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorIyBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworIyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyMgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyMgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorIyBTT0ZUV0FSRS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKG15LWRpcikKKworYXZiX2NvbW1vbl9jZmxhZ3MgOj0gXAorICAgIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgXAorICAgIC1EX1BPU0lYX0NfU09VUkNFPTE5OTMwOUwgXAorICAgIC1XYSwtLW5vZXhlY3N0YWNrIFwKKyAgICAtV2Vycm9yIFwKKyAgICAtV2FsbCBcCisgICAgLVdleHRyYSBcCisgICAgLVdmb3JtYXQ9MiBcCisgICAgLVduby1wc2FiaSBcCisgICAgLVduby11bnVzZWQtcGFyYW1ldGVyIFwKKyAgICAtZmZ1bmN0aW9uLXNlY3Rpb25zIFwKKyAgICAtZnN0YWNrLXByb3RlY3Rvci1zdHJvbmcKK2F2Yl9jb21tb25fY3BwZmxhZ3MgOj0gXAorICAgIC1Xbm9uLXZpcnR1YWwtZHRvciBcCisgICAgLWZuby1zdHJpY3QtYWxpYXNpbmcKK2F2Yl9jb21tb25fbGRmbGFncyA6PSBcCisgICAgLVdsLC0tZ2Mtc2VjdGlvbnMKK2F2Yl9saWJfY29tbW9uX2ZpbGVzIDo9IFwKKyAgICBsaWJhdmIvYXZiX2NoYWluX3BhcnRpdGlvbl9kZXNjcmlwdG9yLmMgXAorICAgIGxpYmF2Yi9hdmJfY3JjMzIuYyBcCisgICAgbGliYXZiL2F2Yl9jcnlwdG8uYyBcCisgICAgbGliYXZiL2F2Yl9kZXNjcmlwdG9yLmMgXAorICAgIGxpYmF2Yi9hdmJfZm9vdGVyLmMgXAorICAgIGxpYmF2Yi9hdmJfaGFzaF9kZXNjcmlwdG9yLmMgXAorICAgIGxpYmF2Yi9hdmJfaGFzaHRyZWVfZGVzY3JpcHRvci5jIFwKKyAgICBsaWJhdmIvYXZiX2tlcm5lbF9jbWRsaW5lX2Rlc2NyaXB0b3IuYyBcCisgICAgbGliYXZiL2F2Yl9wcm9wZXJ0eV9kZXNjcmlwdG9yLmMgXAorICAgIGxpYmF2Yi9hdmJfcnNhLmMgXAorICAgIGxpYmF2Yi9hdmJfc2hhMjU2LmMgXAorICAgIGxpYmF2Yi9hdmJfc2hhNTEyLmMgXAorICAgIGxpYmF2Yi9hdmJfc2xvdF92ZXJpZnkuYyBcCisgICAgbGliYXZiL2F2Yl91dGlsLmMgXAorICAgIGxpYmF2Yi9hdmJfdmJtZXRhX2ltYWdlLmMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gYXZidG9vbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVYRUNVVEFCTEVTCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGZlYworTE9DQUxfSVNfSE9TVF9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFIDo9IGF2YnRvb2wKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworIyBCdWlsZCBsaWJhdmIgZm9yIHRoZSB0YXJnZXQgKGZvciBlLmcuIGZzX21nciB1c2FnZSkuCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBsaWJhdmIKK0xPQ0FMX01PRFVMRV9IT1NUX09TIDo9IGxpbnV4CitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorTE9DQUxfQ0ZMQUdTIDo9ICQoYXZiX2NvbW1vbl9jZmxhZ3MpIC1EQVZCX0VOQUJMRV9ERUJVRyAtREFWQl9DT01QSUxBVElPTgorTE9DQUxfTERGTEFHUyA6PSAkKGF2Yl9jb21tb25fbGRmbGFncykKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChhdmJfbGliX2NvbW1vbl9maWxlcykgXAorICAgIGxpYmF2Yi9hdmJfc3lzZGVwc19wb3NpeC5jCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYmF2Yl8zMgorTE9DQUxfTU9EVUxFX0hPU1RfT1MgOj0gbGludXgKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpCitMT0NBTF9NVUxUSUxJQiA6PSAzMgorTE9DQUxfQ0xBTkcgOj0gZmFsc2UKK0xPQ0FMX0NGTEFHUyA6PSAkKGF2Yl9jb21tb25fY2ZsYWdzKSAtREFWQl9FTkFCTEVfREVCVUcgLURBVkJfQ09NUElMQVRJT04gLWZuby11bndpbmQtdGFibGVzIC1zdGQ9Yzk5CitMT0NBTF9MREZMQUdTIDo9ICQoYXZiX2NvbW1vbl9sZGZsYWdzKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoYXZiX2xpYl9jb21tb25fZmlsZXMpCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMgQnVpbGQgbGliYXZiIGZvciB0aGUgaG9zdCAoZm9yIHVuaXQgdGVzdHMpLgoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGliYXZiX2hvc3QKK0xPQ0FMX01PRFVMRV9IT1NUX09TIDo9IGxpbnV4CitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IFNUQVRJQ19MSUJSQVJJRVMKK0xPQ0FMX0NMQU5HIDo9IHRydWUKK0xPQ0FMX0NGTEFHUyA6PSAkKGF2Yl9jb21tb25fY2ZsYWdzKSAtZm5vLXN0YWNrLXByb3RlY3RvciAtREFWQl9FTkFCTEVfREVCVUcgLURBVkJfQ09NUElMQVRJT04KK0xPQ0FMX0xERkxBR1MgOj0gJChhdmJfY29tbW9uX2xkZmxhZ3MpCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoYXZiX2xpYl9jb21tb25fZmlsZXMpCitpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKKworIyBCdWlsZCBsaWJhdmJfYWIgZm9yIHRoZSBob3N0IChmb3IgdW5pdCB0ZXN0cykuCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBsaWJhdmJfYWJfaG9zdAorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBsaWJhdmJfaG9zdAorTE9DQUxfTU9EVUxFX0hPU1RfT1MgOj0gbGludXgKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU1RBVElDX0xJQlJBUklFUworTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorTE9DQUxfQ0ZMQUdTIDo9ICQoYXZiX2NvbW1vbl9jZmxhZ3MpIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1EQVZCX0VOQUJMRV9ERUJVRyAtREFWQl9DT01QSUxBVElPTgorTE9DQUxfTERGTEFHUyA6PSAkKGF2Yl9jb21tb25fbGRmbGFncykKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgbGliYXZiX2FiL2F2Yl9hYl9mbG93LmMKK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorCisjIEJ1aWxkIGxpYmF2Yl9hdHggZm9yIHRoZSBob3N0IChmb3IgdW5pdCB0ZXN0cykuCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBsaWJhdmJfYXR4X2hvc3QKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gbGliYXZiX2hvc3QKK0xPQ0FMX01PRFVMRV9IT1NUX09TIDo9IGxpbnV4CitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IFNUQVRJQ19MSUJSQVJJRVMKK0xPQ0FMX0NMQU5HIDo9IHRydWUKK0xPQ0FMX0NGTEFHUyA6PSAkKGF2Yl9jb21tb25fY2ZsYWdzKSAtZm5vLXN0YWNrLXByb3RlY3RvciAtREFWQl9FTkFCTEVfREVCVUcgLURBVkJfQ09NUElMQVRJT04KK0xPQ0FMX0xERkxBR1MgOj0gJChhdmJfY29tbW9uX2xkZmxhZ3MpCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGxpYmF2Yl9hdHgvYXZiX2F0eF92YWxpZGF0ZS5jCitpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGliYXZiX2hvc3Rfc3lzZGVwcworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkKK0xPQ0FMX01PRFVMRV9IT1NUX09TIDo9IGxpbnV4CitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU1RBVElDX0xJQlJBUklFUworTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorTE9DQUxfQ0ZMQUdTIDo9ICQoYXZiX2NvbW1vbl9jZmxhZ3MpIC1EQVZCX0VOQUJMRV9ERUJVRyAtREFWQl9DT01QSUxBVElPTgorTE9DQUxfTERGTEFHUyA6PSAkKGF2Yl9jb21tb25fbGRmbGFncykKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgbGliYXZiL2F2Yl9zeXNkZXBzX3Bvc2l4LmMKK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBsaWJhdmJfaG9zdF91bml0dGVzdAorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBzaW1nMmltZyBpbWcyc2ltZyBhdmJ0b29sCitMT0NBTF9NT0RVTEVfSE9TVF9PUyA6PSBsaW51eAorTE9DQUxfQ1BQX0VYVEVOU0lPTiA6PSAuY2MKK0xPQ0FMX0NMQU5HIDo9IHRydWUKK0xPQ0FMX0NGTEFHUyA6PSAkKGF2Yl9jb21tb25fY2ZsYWdzKSAtREFWQl9FTkFCTEVfREVCVUcgLURBVkJfQ09NUElMQVRJT04KK0xPQ0FMX0NQUEZMQUdTIDo9ICQoYXZiX2NvbW1vbl9jcHBmbGFncykKK0xPQ0FMX0xERkxBR1MgOj0gJChhdmJfY29tbW9uX2xkZmxhZ3MpCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdmJfaG9zdCBcCisgICAgbGliYXZiX2hvc3Rfc3lzZGVwcyBcCisgICAgbGliYXZiX2FiX2hvc3QgXAorICAgIGxpYmF2Yl9hdHhfaG9zdCBcCisgICAgbGliZ21vY2tfaG9zdCBcCisgICAgbGliZ3Rlc3RfaG9zdAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY2hyb21lIFwKKyAgICBsaWJjcnlwdG8KK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgdGVzdC9hdmJfYWJfZmxvd191bml0dGVzdC5jYyBcCisgICAgdGVzdC9hdmJfYXR4X3ZhbGlkYXRlX3VuaXR0ZXN0LmNjIFwKKyAgICB0ZXN0L2F2Yl9zbG90X3ZlcmlmeV91bml0dGVzdC5jYyBcCisgICAgdGVzdC9hdmJfdW5pdHRlc3RfdXRpbC5jYyBcCisgICAgdGVzdC9hdmJfdXRpbF91bml0dGVzdC5jYyBcCisgICAgdGVzdC9hdmJfdmJtZXRhX2ltYWdlX3VuaXR0ZXN0LmNjIFwKKyAgICB0ZXN0L2F2YnRvb2xfdW5pdHRlc3QuY2MgXAorICAgIHRlc3QvZmFrZV9hdmJfb3BzLmNjCitMT0NBTF9MRExJQlNfbGludXggOj0gLWxydAoraW5jbHVkZSAkKEJVSUxEX0hPU1RfTkFUSVZFX1RFU1QpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYmF2Yl9ob3N0X3VzZXJfY29kZV90ZXN0CitMT0NBTF9NT0RVTEVfSE9TVF9PUyA6PSBsaW51eAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IFNUQVRJQ19MSUJSQVJJRVMKK0xPQ0FMX0NQUF9FWFRFTlNJT04gOj0gLmNjCitMT0NBTF9DTEFORyA6PSB0cnVlCitMT0NBTF9DRkxBR1MgOj0gJChhdmJfY29tbW9uX2NmbGFncykKK0xPQ0FMX0NQUEZMQUdTIDo9ICQoYXZiX2NvbW1vbl9jcHBmbGFncykKK0xPQ0FMX0xERkxBR1MgOj0gJChhdmJfY29tbW9uX2xkZmxhZ3MpCitMT0NBTF9TUkNfRklMRVMgOj0gdGVzdC91c2VyX2NvZGVfdGVzdC5jYworaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGJvb3RjdHJsLmF2YgorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gbGliYXZiCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGJvb3RfY29udHJvbC9ib290X2NvbnRyb2xfYXZiLmMgXAorICAgIGJvb3RfY29udHJvbC9hdmJfb3BzX2RldmljZS5jIFwKKyAgICBsaWJhdmJfYWIvYXZiX2FiX2Zsb3cuYyBcCisgICAgbGliYXZiL2F2Yl9zeXNkZXBzX3Bvc2l4LmMKK0xPQ0FMX0NMQU5HIDo9IHRydWUKK0xPQ0FMX0NGTEFHUyA6PSAkKGF2Yl9jb21tb25fY2ZsYWdzKSAtREFWQl9DT01QSUxBVElPTgorTE9DQUxfTERGTEFHUyA6PSAkKGF2Yl9jb21tb25fbGRmbGFncykKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYmFzZSBsaWJjdXRpbHMKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZnNfbWdyIGxpYmF2YgorTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCA6PSBcCisJJChoaWRlKSBta2RpciAtcCAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvaHcgJiYgXAorCWxuIC1zZiBib290Y3RybC5hdmIuc28gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2h3L2Jvb3RjdHJsLmRlZmF1bHQuc28KK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gbGliYXZiX2hvc3Rfc3ltYm9sc190ZXN0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBkZWJ1ZworTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gbGliYXZiX2FiX2hvc3QKK2luY2x1ZGUgJChCVUlMRF9IT1NUX1BSRUJVSUxUKQpkaWZmIC0tZ2l0IGEvYXZiL0xJQ0VOU0UgYi9hdmIvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjE2MjFhCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL0xJQ0VOU0UKQEAgLTAsMCArMSwyMCBAQAorQ29weXJpZ2h0IDIwMTYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECitOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvYXZiL01PRFVMRV9MSUNFTlNFX0FORFJPSUQgYi9hdmIvTU9EVUxFX0xJQ0VOU0VfQU5EUk9JRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL01PRFVMRV9MSUNFTlNFX0FORFJPSUQKZGlmZiAtLWdpdCBhL2F2Yi9QUkVVUExPQUQuY2ZnIGIvYXZiL1BSRVVQTE9BRC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5NDhkMgotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9QUkVVUExPQUQuY2ZnCkBAIC0wLDAgKzEsNSBAQAorW0J1aWx0aW4gSG9va3NdCitjbGFuZ19mb3JtYXQgPSB0cnVlCisKK1tCdWlsdGluIEhvb2tzIE9wdGlvbnNdCitjbGFuZ19mb3JtYXQgPSAtLWNvbW1pdCAke1BSRVVQTE9BRF9DT01NSVR9IC0tc3R5bGUgZmlsZSAtLWV4dGVuc2lvbnMgYyxoLGNjCmRpZmYgLS1naXQgYS9hdmIvUkVBRE1FIGIvYXZiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDM5Nzg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL1JFQURNRQpAQCAtMCwwICsxLDMwNyBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYXZidG9vbCwgbGliYXZiLCBhbmQgbGliYXZiX2FiLgorCitUaGUgbWFpbiBqb2Igb2YgYXZidG9vbCBpcyB0byBjcmVhdGUgdmJtZXRhLmltZyB3aGljaCBpcyB0aGUKK3RvcC1sZXZlbCBvYmplY3QgZm9yIHZlcmlmaWVkIGJvb3QuIFRoaXMgaW1hZ2UgaXMgZGVzaWduZWQgdG8gZ28gaW50bwordGhlIHZibWV0YSBwYXJ0aXRpb24gKG9yLCBpZiB1c2luZyBBL0IsIHRoZSBzbG90IGluIHF1ZXN0aW9uCitlLmcuIHZibWV0YV9hIG9yIHZibWV0YV9iKSBhbmQgYmUgb2YgbWluaW1hbCBzaXplIChmb3Igb3V0LW9mLWJhbmQKK3VwZGF0ZXMpLiBUaGUgdmJtZXRhIGltYWdlIGlzIGNyeXB0b2dyYXBoaWNhbGx5IHNpZ25lZCBhbmQgY29udGFpbnMKK3ZlcmlmaWNhdGlvbiBkYXRhIChlLmcuIGNyeXB0b2dyYXBoaWMgZGlnZXN0cykgZm9yIHZlcmlmeWluZyBib290LmltZywKK3N5c3RlbS5pbWcsIGFuZCBvdGhlciBwYXJ0aXRpb25zL2ltYWdlcy4KKworVGhlIHZibWV0YSBpbWFnZSBjYW4gYWxzbyBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgcGFydGl0aW9ucyB3aGVyZQordmVyaWZpY2F0aW9uIGRhdGEgaXMgc3RvcmVkIGFzIHdlbGwgYXMgYSBwdWJsaWMga2V5IGluZGljYXRpbmcgd2hvCitzaG91bGQgc2lnbiB0aGUgdmVyaWZpY2F0aW9uIGRhdGEuIFRoaXMgaW5kaXJlY3Rpb24gcHJvdmlkZXMKK2RlbGVnYXRpb24sIHRoYXQgaXMsIGl0IGFsbG93cyBhIDNyZCBwYXJ0eSB0byBjb250cm9sIGNvbnRlbnQgb24gYSBnaXZlbgorcGFydGl0aW9uIGJ5IGluY2x1ZGluZyB0aGUgcHVibGljIGtleSBzYWlkIDNyZCBwYXJ0eSBpcyB1c2luZyB0byBzaWduCit0aGUgZGF0YSB3aXRoLCBpbiB2Ym1ldGEuaW1nLiBCeSBkZXNpZ24sIHRoaXMgYXV0aG9yaXR5IGNhbiBiZSBlYXNpbHkKK3Jldm9rZWQgYnkgc2ltcGx5IHVwZGF0aW5nIHZibWV0YS5pbWcgd2l0aCBuZXcgZGVzY3JpcHRvcnMgZm9yIHRoZQorcGFydGl0aW9uIGluIHF1ZXN0aW9uLgorCitTdG9yaW5nIHNpZ25lZCB2ZXJpZmljYXRpb24gZGF0YSBvbiBvdGhlciBpbWFnZXMgLSBmb3IgZXhhbXBsZQorYm9vdC5pbWcgYW5kIHN5c3RlbS5pbWcgLSBpcyBhbHNvIGRvbmUgd2l0aCBhdmJ0b29sLgorCitJbiBhZGRpdGlvbiB0byBhdmJ0b29sLCBhIGxpYnJhcnkgLSBsaWJhdmIgLSBpcyBwcm92aWRlZC4gVGhpcyBsaWJyYXJ5CitwZXJmb3JtcyBhbGwgdmVyaWZpY2F0aW9uIG9uIHRoZSBkZXZpY2Ugc2lkZSBlLmcuIGl0IHN0YXJ0cyBieSBsb2FkaW5nCit0aGUgdmJtZXRhIHBhcnRpdGlvbiwgY2hlY2tzIHRoZSBzaWduYXR1cmUsIGFuZCB0aGVuIGdvZXMgb24gdG8gbG9hZAordGhlIGJvb3QgcGFydGl0aW9uIGZvciB2ZXJpZmljYXRpb24uCisKK1RoZSBsaWJhdmIgbGlicmFyeSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGJvdGggYm9vdCBsb2FkZXJzIGFuZAoraW5zaWRlIEFuZHJvaWQuIEl0IGhhcyBhIHNpbXBsZSBhYnN0cmFjdGlvbiBmb3Igc3lzdGVtIGRlcGVuZGVuY2llcworKHNlZSBsaWJhdmIvYXZiX3N5c2RlcHMuaCkgYXMgd2VsbCBhcyBvcGVyYXRpb25zIHRoYXQgdGhlIGJvb3QgbG9hZGVyCitvciBPUyBpcyBleHBlY3RlZCB0byBpbXBsZW1lbnQgKHNlZSBsaWJhdmIvYXZiX29wcy5oKS4gVGhlIG1haW4gZW50cnkKK3BvaW50IGZvciB2ZXJpZmljYXRpb24gaXMgYXZiX3Nsb3RfdmVyaWZ5KCkuCisKK0l0IGlzIGV4cGVjdGVkIHRoYXQgbW9zdCBkZXZpY2VzIHdpbGwgdXNlIEEvQiAoZS5nLiBtdWx0aXBsZSBjb3BpZXMgb2YKK3RoZSBPUyBpbiBzZXBhcmF0ZSBzby1jYWxsZWQgJ3Nsb3RzJykgaW4gYWRkaXRpb24gdG8gQVZCLiBXaGlsZQorbWFuYWdpbmcgQS9CIG1ldGFkYXRhIGFuZCBhc3NvY2lhdGVkIG1ldGFkYXRhIChlLmcuIG1hbmFnaW5nCitzdG9yZWRfcm9sbGJhY2tfaW5kZXhbbl0gbG9jYXRpb25zKSBpcyBvdXRzaWRlIHRoZSBzY29wZSBvZiBsaWJhdmIsCitlbm91Z2ggaW50ZXJmYWNlcyBhcmUgZXhwb3NlZCBzbyB0aGUgYm9vdCBsb2FkZXIgY2FuIGludGVncmF0ZSBpdHMgQS9CCitzdGFjayB3aXRoIGxpYmF2Yi4gSW4gcGFydGljdWxhciBhdmJfc2xvdF92ZXJpZnkoKSB0YWtlcyBhCit8c2xvdF9zdWZmaXh8IHBhcmFtZXRlciBhbmQgaXRzIHJlc3VsdCBzdHJ1Y3QgfEF2YlNsb3RWZXJpZnlEYXRhfAorY29udmV5IHRoZSByb2xsYmFjayBpbmRleGVzIGluIHRoZSBpbWFnZSB0aGF0IHdhcyB2ZXJpZmllZC4KKworQVZCIGFsc28gaW5jbHVkZXMgYW4gQS9CIGltcGxlbWVudGF0aW9uIHRoYXQgYm9vdCBsb2FkZXJzIG1heQorb3B0aW9uYWxseSB1c2UuIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaW4gdGhlIGxpYmF2Yl9hYiBsaWJyYXJ5IGFuZAoraW50ZWdyYXRlcyB3aXRoIGltYWdlIHZlcmlmaWNhdGlvbiBpbmNsdWRpbmcgdXBkYXRpbmcgdGhlCitzdG9yZWRfcm9sbGJhY2tfaW5kZXhbbl0gbG9jYXRpb25zIG9uIHRoZSBkZXZpY2UgYXMgbmVlZGVkLiBUaGUKK2Jvb3Rsb2FkZXIgY2FuIHVzZSB0aGlzIHRocm91Z2ggdGhlIGF2Yl9hYl9mbG93KCkgZnVuY3Rpb24uIFRoaXMKK2xpYnJhcnkgaXMgYnVpbHQgb24gdG9wIG9mIGxpYmF2Yi4KKworSW4gbGliYXZiX2FiLCBBL0IgbWV0YWRhdGEgaXMgc3RvcmVkIGluIHRoZSAnbWlzYycgcGFydGl0aW9uIHVzaW5nIGEKK2Zvcm1hdCBwcml2YXRlIHRvIGxpYmF2Yl9hYiBpbiB0aGUgbG9jYXRpb24gb24gJ21pc2MnIHJlc2VydmVkIGZvcgordGhpcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1pc2MuaW1nIGZpbGUgZm9ybWF0IHNlZSB0aGUKK2Jvb3RhYmxlL3JlY292ZXJ5L2Jvb3Rsb2FkZXIuaCBmaWxlLiBBL0IgbWV0YWRhdGEgY2FuIGJlIHdyaXR0ZW4gdG8KK21pc2MuaW1nIHVzaW5nIHRoZSBzZXRfYWJfbWV0YWRhdGEgc3ViLWNvbW1hbmQgb2YgYXZidG9vbC4gQS9CCittZXRhZGF0YSBpcyBjb21wcmlzZWQgb2YgKGZvciBlYWNoIHNsb3QpIGEgcHJpb3JpdHkgZmllbGQgKDAgdG8gMTUpLAorbnVtYmVyIG9mIHRyaWVzIHJlbWFpbmluZyBmb3IgYXR0ZW1wdGluZyB0byBib290IHRoZSBzbG90ICgwIHRvIDcpLAorYW5kIGEgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBzbG90IGhhcyBzdWNjZXNzZnVsbHkgYm9vdGVkLgorCitBL0IgbWV0YWRhdGEgaW50ZWdyaXR5IGlzIHByb3ZpZGVkIGJ5IGEgc2ltcGxlIG1hZ2ljIG1hcmtlciBhbmQgYQorQ1JDLTMyIGNoZWNrc3VtLiBJZiBpbnZhbGlkIEEvQiBtZXRhZGF0YSBpcyBkZXRlY3RlZCwgdGhlIGJlaGF2aW9yIGlzCit0byByZXNldCB0aGUgQS9CIG1ldGFkYXRhIHRvIGEga25vd24gc3RhdGUgd2hlcmUgYm90aCBzbG90cyBhcmUgZ2l2ZW4KK3NldmVuIGJvb3QgdHJpZXMuCisKK0FuIGltcGxlbWVudGF0aW9uIG9mIGEgYm9vdF9jb250cm9sIEhBTCB1c2luZyBBVkItc3BlY2lmaWMgQS9CCittZXRhZGF0YSBpcyBhbHNvIHByb3ZpZGVkLgorCitBbmRyb2lkIFRoaW5ncyBoYXMgc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGFuZCB2YWxpZGF0aW9uIGxvZ2ljIGZvciB0aGUKK3ZibWV0YSBwdWJsaWMga2V5LiBBbiBleHRlbnNpb24gaXMgcHJvdmlkZWQgaW4gbGliYXZiX2F0eCB3aGljaCBwZXJmb3JtcwordGhpcyB2YWxpZGF0aW9uIGFzIGFuIGltcGxlbWVudGF0aW8gb2YgbGliYXZiJ3MgcHVibGljIGtleSB2YWxpZGF0aW9uCitvcGVyYXRpb24gKHNlZSBhdmJfdmFsaWRhdGVfdmJtZXRhX3B1YmxpY19rZXkgaW4gYXZiX29wcy5oKS4KKworLS0gRklMRVMgQU5EIERJUkVDVE9SSUVTCisKKyBsaWJhdmIvCisKKyAgIEFuIGltcGxlbWVudGF0aW9uIG9mIGltYWdlIHZlcmlmaWNhdGlvbi4gVGhpcyBjb2RlIGlzIGRlc2lnbmVkIHRvCisgICBiZSBoaWdobHkgcG9ydGFibGUgc28gaXQgY2FuIGJlIHVzZWQgaW4gYXMgbWFueSBjb250ZXh0cyBhcworICAgcG9zc2libGUuIFRoaXMgY29kZSByZXF1aXJlcyBhIEM5OS1jb21wbGlhbnQgQyBjb21waWxlci4KKworICAgUGFydCBvZiB0aGlzIGNvZGUgaXMgY29uc2lkZXJlZCBpbnRlcm5hbCB0byB0aGUgaW1wbGVtZW50YXRpb24gYW5kCisgICBzaG91bGQgbm90IGJlIHVzZWQgb3V0c2lkZSBpdC4gRm9yIGV4YW1wbGUsIHRoaXMgYXBwbGllcyB0byB0aGUKKyAgIGF2Yl9yc2EuW2NoXSBhbmQgYXZiX3NoYS5bY2hdIGZpbGVzLgorCisgICBTeXN0ZW0gZGVwZW5kZW5jaWVzIGV4cGVjdGVkIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSBwbGF0Zm9ybSBpcworICAgZGVmaW5lZCBpbiBhdmJfc3lzZGVwcy5oLiBJZiB0aGUgcGxhdGZvcm0gcHJvdmlkZXMgdGhlIHN0YW5kYXJkIEMKKyAgIHJ1bnRpbWUgYXZiX3N5c2RlcHNfcG9zaXguYyBjYW4gYmUgdXNlZC4KKworIGxpYmF2Yl9hYi8KKworICAgQW4gQS9CIGltcGxlbWVudGF0aW9uIGZvciB1c2UgaW4gYm9vdCBsb2FkZXJzLiBUaGlzIGlzIGJ1aWx0IG9uIHRvcAorICAgb2YgbGliYXZiLgorCisgbGliYXZiX2F0eC8KKworICAgQW4gQW5kcm9pZCBUaGluZ3MgRXh0ZW5zaW9uIGZvciB2YWxpZGF0aW5nIHB1YmxpYyBrZXkgbWV0YWRhdGEuCisKKyBib290X2NvbnRyb2wvCisKKyAgIEFuIGltcGxlbWVtZW50YXRpb24gb2YgdGhlIEFuZHJvaWQgYm9vdF9jb250cm9sIEhBTCBmb3IgdXNlIHdpdGgKKyAgIGJvb3QgbG9hZGVycyB1c2luZyBsaWJhdmJfYWIuCisKKyBBbmRyb2lkLm1rCisKKyAgIEJ1aWxkIGluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgbGliYXZiIChhIHN0YXRpYyBsaWJyYXJ5IGZvciB1c2Ugb24KKyAgIHRoZSBkZXZpY2UpLCBob3N0LXNpZGUgbGlicmFyaWVzIChmb3IgdW5pdCB0ZXN0cyksIGFuZCB1bml0IHRlc3RzLgorCisgYXZidG9vbAorCisgICBBIHRvb2wgd3JpdHRlbiBpbiBQeXRob24gZm9yIHdvcmtpbmcgd2l0aCBpbWFnZXMgcmVsYXRlZCB0bworICAgdmVyaWZpZWQgYm9vdC4KKworIHRlc3QvCisKKyAgIENvbnRhaW5zIHVuaXQgdGVzdHMgZm9yIGFidnRvb2wsIGxpYmF2YiwgbGliYXZiX2FiLCBhbmQgbGliYXZiX2F0eC4KKworIGV4YW1wbGVzL3VlZmkvCisKKyAgIENvbnRhaW5zIHRoZSBzb3VyY2UtY29kZSBmb3IgYSBVRUZJLWJhc2VkIGJvb3QtbG9hZGVyIHV0aWxpemluZworICAgbGliYXZiLyBhbmQgbGliYXZiX2FiLy4KKworLS0gQVVESUVOQ0UgQU5EIFBPUlRBQklMSVRZIE5PVEVTCisKK1RoaXMgY29kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGJvb3Rsb2FkZXJzIGluIGRldmljZXMgcnVubmluZworQW5kcm9pZC4gVGhlIHN1Z2dlc3RlZCBhcHByb2FjaCBpcyB0byBjb3B5IHRoZSBhcHByb3ByaWF0ZSBoZWFkZXIgYW5kCitDIGZpbGVzIG1lbnRpb25lZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiBpbnRvIHRoZSBib290IGxvYWRlciBhbmQKK2ludGVncmF0ZSBhcyBhcHByb3ByaWF0ZS4KKworVGhlIGxpYmF2Yi8gYW5kIGxpYmF2Yl9hYi8gY29kZWJhc2Ugd2lsbCBldm9sdmUgb3ZlciB0aW1lIHNvCitpbnRlZ3JhdGlvbiBzaG91bGQgYmUgYXMgbm9uLWludmFzaXZlIGFzIHBvc3NpYmxlLiBUaGUgaW50ZW50aW9uIGlzIHRvCitrZWVwIHRoZSBBUEkgb2YgdGhlIGxpYnJhcnkgc3RhYmxlIGhvd2V2ZXIgaXQgd2lsbCBiZSBicm9rZW4gaWYKK25lY2Vzc2FyeS4KKworQXMgZm9yIHBvcnRhYmlsaXR5LCB0aGUgbGlicmFyeSBpcyBpbnRlbmRlZCB0byBiZSBoaWdobHkgcG9ydGFibGUsCit3b3JrIG9uIGJvdGggbGl0dGxlLSBhbmQgYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmVzIGFuZCAzMi0gYW5kCis2NC1iaXQuIEl0J3MgYWxzbyBpbnRlbmRlZCB0byB3b3JrIGluIG5vbi1zdGFuZGFyZCBlbnZpcm9ubWVudHMKK3dpdGhvdXQgdGhlIHN0YW5kYXJkIEMgbGlicmFyeSBhbmQgcnVudGltZS4KKworSWYgdGhlIEFWQl9FTkFCTEVfREVCVUcgcHJlcHJvY2Vzc29yIHN5bWJvbCBpcyBzZXQsIHRoZSBjb2RlIHdpbGwKK2luY2x1ZGUgdXNlZnVsIGRlYnVnIGluZm9ybWF0aW9uIGFuZCBydW4tdGltZSBjaGVja3MuIFByb2R1Y3Rpb24KK2J1aWxkcyBzaG91bGQgbm90IHVzZSB0aGlzLgorCitUaGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBBVkJfQ09NUElMQVRJT04gc2hvdWxkIGJlIHNldCBvbmx5IHdoZW4KK2NvbXBpbGluZyB0aGUgbGlicmFyaWVzLiBUaGUgY29kZSBtdXN0IGJlIGNvbXBpbGVkIGludG8gYSBzZXBhcmF0ZQorbGlicmFyaWVzLgorCitBcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGNvbXBpbGVkIGxpYmF2YiBsaWJyYXJ5IG11c3Qgb25seSBpbmNsdWRlIHRoZQorbGliYXZiL2xpYmF2Yi5oIGZpbGUgKHdoaWNoIHdpbGwgaW5jbHVkZSBhbGwgcHVibGljIGludGVyZmFjZXMpIGFuZAorbXVzdCBub3QgaGF2ZSB0aGUgQVZCX0NPTVBJTEFUSU9OIHByZXByb2Nlc3NvciBzeW1ib2wgc2V0LiBUaGlzIGlzIHRvCitlbnN1cmUgdGhhdCBpbnRlcm5hbCBjb2RlIHRoYXQgbWF5IGJlIGNoYW5nZSBpbiB0aGUgZnV0dXJlIChmb3IKK2V4YW1wbGUgYXZiX3NoYS5bY2hdIGFuZCBhdmJfcnNhLltjaF0pIHdpbGwgbm90IGJlIHZpc2libGUgdG8KK2FwcGxpY2F0aW9uIGNvZGUuCisKK0FwcGxpY2F0aW9ucyB1c2luZyB0aGUgY29tcGlsZWQgbGliYXZiX2FiIGxpYnJhcnkgbXVzdCBvbmx5IGluY2x1ZGUKK3RoZSBsaWJhdmJfYWIvbGliYXZiX2FiLmggZmlsZSBmb3Igc2ltaWxhciByZWFzb25zLgorCistLSBDT01QQVRJQklMSVRZIE5PVEVTCisKK1RoZSBWQk1ldGEgc3RydWN0dXJlIChhcyBkZWZpbmVkIGluIGxpYmF2Yi9hdmJfdmJtZXRhX2hlYWRlci5oKQorZ3VhcmFudGVlcyBmb3J3YXJkcy0gYW5kIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHByb3ZpZGVkIHRoZSBtYWpvcgordmVyc2lvbiBkb2VzIG5vdCBjaGFuZ2UuCisKK1doZW4gYmFja3dhcmRzLWNvbXBhdGlibGUgY2hhbmdlcyBhcmUgbWFkZSAtIGZvciBleGFtcGxlLCB3aGVuIGEgbmV3CitmaWVsZCBpcyBhZGRlZCB0byBBdmJWQk1ldGFJbWFnZUhlYWRlciAtIHRoZSBtaW5vciB2ZXJzaW9uIHdpbGwgYmUKK2J1bXBlZC4gQXQgdGhlIHNhbWUgdGltZSwgbGliYXZiIHdpbGwgYWxzbyBiZSBtb2RpZmllZCB0byB0ZXN0IGZvciB0aGUKK2FwcHJvcHJpYXRlIG1pbm9yIHZlcnNpb24gYmVmb3JlIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSBuZXdseSBhZGRlZAorZmllbGQuIFRoaXMgZW5zdXJlcyB0aGF0IHZlcnNpb24gMS5OIG9mIHRoZSBsaWJyYXJ5IGlzIGFibGUgdG8gcmVhZCBhbgorb2xkIHZibWV0YSBpbWFnZSBoZWFkZXIgcHJvZHVjZWQgd2l0aCB2ZXJzaW9uIDEuTSB3aGVyZSBOID4gTS4KKworVGhlIHVzdWFsIHNjZW5hcmlvIGlzIHRoYXQgdGhlIGNvZGUgcGFyc2luZyB0aGUgQXZiVkJNZXRhSW1hZ2VIZWFkZXIKK3JhcmVseSBjaGFuZ2VzIChpdCdzIHVzdWFsbHkgaW4gdGhlIGZpcm13YXJlIG9mIGEgZGV2aWNlIGFuZCB0aGlzCitmaXJtd2FyZSBpcyByYXJlbHkgdXBkYXRlZCBpZiBldmVyKSwgbGV0J3Mgc2F5IGl0J3MgZml4ZWQgYXQgdmVyc2lvbgorMS5OLiBBdCB0aGUgc2FtZSB0aW1lLCB0aGUgdmVyc2lvbiBvZiB0aGUgYXZidG9vbCB1c2VkIHRvIHByb2R1Y2UgdGhlCit2Ym1ldGEgaW1hZ2UgaXMgcm9sbGluZyBmb3J3YXJkIGFuZCBpcyBhdCB2ZXJzaW9uIDEuTSB3aGVyZSBNID4gTi4gVGhlCitwcm9ibGVtIHdpdGggdGhpcyBzY2VuYXJpbyBpcyB0aGF0IHZlcnNpb24gMS5NIG1heSBlYXNpbHkgYW5kCitpbmFkdmVydGVudGx5IGludHJvZHVjZSBhIHNlZW1pbmdseSBjb21wYXRpYmxlIGNoYW5nZSB0aGF0IGlzbid0LiBGb3IKK2V4YW1wbGUsIGNvbnNpZGVyIGlmIGEgbmV3IHZlcmlmaWNhdGlvbiBhbGdvcml0aG0gaXMgYWRkZWQgLSBpbiB0aGlzCitjYXNlIHZlcnNpb24gMS5OIG9mIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gd2lsbCBmYWlsIGF0Cit2ZXJpZmljYXRpb24gdGltZSB3aGVuIHZhbGlkYXRpbmcgdGhlIHxhbGdvcml0aG1fZmllbGR8IG9mIGEgMS5NIGltYWdlCitpZiBpdCdzIHNldCB0byB0aGUgbmV3IGFsZ29yaXRobS4KKworVGhlIGJlc3QgYXBwcm9hY2ggZm9yIGRlYWxpbmcgd2l0aCB0aGlzIHByb2JsZW0gaXMgdG8gYWx3YXlzIHVzZWQgYQorcGlubmVkIHZlcnNpb24gb2YgYXZidG9vbCAoc2F5LCB1c2UgdmVyc2lvbiAxLk4gdG8gZ2VuZXJhdGUgaW1hZ2VzCit0YXJnZXRlZCBmb3IgZGV2aWNlcyBydW5uaW5nIHZlcnNpb24gMS5OKSBmb3IgZ2VuZXJhdGluZyBhbmQgc2lnbmluZworaW1hZ2VzIGJ1dCBzb21ldGltZXMgdGhpcyBpcyBub3QgYWx3YXlzIHBvc3NpYmxlIG5vcgorZGVzaXJhYmxlLiBUaGVyZWZvcmUsIHRvIGF2b2lkIHRoaXMgY29tcGF0aWJpbGl0eSBwcm9ibGVtLCBhdmJ0b29sIGlzCitkZXNpZ25lZCB0byBhbHdheXMgdGFrZSBzdWNoIGlucHV0IGFzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50IHNvIGl0CitjYW4gYmUga2VwdCBjb25zdGFudCBieSB0aGUgY2FsbGVyLiBJbiBvdGhlciB3b3JkcywgYXMgbG9uZyBhcyB5b3UKK2tlZXAgeW91ciBjb21tYW5kLWxpbmUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGF2YiB0b29sIHRoZSBzYW1lLCBpbWFnZXMKK3Byb2R1Y2VkIGJ5IG5ld2VyIHZlcnNpb25zIG9mIGF2YiB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgb24gdGhlIHNhbWUKK3ZlcnNpb24gb2YgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KKworLS0gVVNBR0UKKworVGhlIGNvbnRlbnQgZm9yIHRoZSB2Ym1ldGEgcGFydGl0aW9uIGNhbiBiZSBnZW5lcmF0ZWQgYXMgZm9sbG93czoKKworICQgYXZidG9vbCBtYWtlX3ZibWV0YV9pbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIC0tb3V0cHV0IE9VVFBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgWy0tYWxnb3JpdGhtIEFMR09SSVRITV0gWy0ta2V5IC9wYXRoL3RvL2tleV91c2VkX2Zvcl9zaWduaW5nX29yX3B1Yl9rZXldICAgXAorICAgICBbLS1wdWJsaWNfa2V5X21ldGFkYXRhIC9wYXRoL3RvL3BrbWQuYmluXSBbLS1yb2xsYmFja19pbmRleCBOVU1CRVJdICAgICAgICBcCisgICAgIFstLWluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9mb290ZXIgL3BhdGgvdG8vaW1hZ2UuYmluXSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgWy0tc2V0dXBfcm9vdGZzX2Zyb21fa2VybmVsIC9wYXRoL3RvL2ltYWdlLmJpbl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBbLS1jaGFpbl9wYXJ0aXRpb24gcGFydF9uYW1lOnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uOi9wYXRoL3RvL2tleTEuYmluXSAgICBcCisgICAgIFstLXNpZ25pbmdfaGVscGVyIC9wYXRoL3RvL2V4dGVybmFsL3NpZ25lcl0KKworQW4gaW50ZWdyaXR5IGZvb3RlciBjb250YWluaW5nIHRoZSBoYXNoIGZvciBhbiBlbnRpcmUgcGFydGl0aW9uIGNhbiBiZQorYWRkZWQgdG8gYW4gZXhpc3RpbmcgaW1hZ2UgYXMgZm9sbG93czoKKworICQgYXZidG9vbCBhZGRfaGFzaF9mb290ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIC0taW1hZ2UgSU1BR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgLS1wYXJ0aXRpb25fbmFtZSBQQVJUTkFNRSAtLXBhcnRpdGlvbl9zaXplIFNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBbLS1hbGdvcml0aG0gQUxHT1JJVEhNXSBbLS1rZXkgL3BhdGgvdG8va2V5X3VzZWRfZm9yX3NpZ25pbmdfb3JfcHViX2tleV0gICBcCisgICAgIFstLXB1YmxpY19rZXlfbWV0YWRhdGEgL3BhdGgvdG8vcGttZC5iaW5dIFstLXJvbGxiYWNrX2luZGV4IE5VTUJFUl0gICAgICAgIFwKKyAgICAgWy0taGFzaF9hbGdvcml0aG0gSEFTSF9BTEddIFstLXNhbHQgSEVYXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBbLS1pbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21fZm9vdGVyIC9wYXRoL3RvL2ltYWdlLmJpbl0gICAgICAgICAgICAgICAgICAgICBcCisgICAgIFstLXNldHVwX3Jvb3Rmc19mcm9tX2tlcm5lbCAvcGF0aC90by9pbWFnZS5iaW5dICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgWy0tc2lnbmluZ19oZWxwZXIgL3BhdGgvdG8vZXh0ZXJuYWwvc2lnbmVyXQorCitBbiBpbnRlZ3JpdHkgZm9vdGVyIGNvbnRhaW5pbmcgdGhlIHJvb3QgZGlnZXN0IGFuZCBzYWx0IGZvciBhIGhhc2h0cmVlCitmb3IgYSBwYXJ0aXRpb24gY2FuIGJlIGFkZGVkIHRvIGFuIGV4aXN0aW5nIGltYWdlIGFzIGZvbGxvd3MuIFRoZQoraGFzaHRyZWUgaXMgYWxzbyBhcHBlbmRlZCB0byB0aGUgaW1hZ2UuCisKKyAgJCBhdmJ0b29sIGFkZF9oYXNodHJlZV9mb290ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAtLWltYWdlIElNQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIC0tcGFydGl0aW9uX25hbWUgUEFSVE5BTUUgLS1wYXJ0aXRpb25fc2l6ZSBTSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgWy0tYWxnb3JpdGhtIEFMR09SSVRITV0gWy0ta2V5IC9wYXRoL3RvL2tleV91c2VkX2Zvcl9zaWduaW5nX29yX3B1Yl9rZXldICAgXAorICAgICBbLS1wdWJsaWNfa2V5X21ldGFkYXRhIC9wYXRoL3RvL3BrbWQuYmluXSBbLS1yb2xsYmFja19pbmRleCBOVU1CRVJdICAgICAgICBcCisgICAgIFstLWhhc2hfYWxnb3JpdGhtIEhBU0hfQUxHXSBbLS1zYWx0IEhFWF0gWy0tYmxvY2tfc2l6ZSBTSVpFXSAgICAgICAgICAgICAgIFwKKyAgICAgWy0taW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2Zvb3RlciAvcGF0aC90by9pbWFnZS5iaW5dICAgICAgICAgICAgICAgICAgICAgXAorICAgICBbLS1zZXR1cF9yb290ZnNfZnJvbV9rZXJuZWwgL3BhdGgvdG8vaW1hZ2UuYmluXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIFstLWdlbmVyYXRlX2ZlY10gWy0tZmVjX251bV9yb290cyBGRUNfTlVNX1JPT1RTXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgWy0tc2lnbmluZ19oZWxwZXIgL3BhdGgvdG8vZXh0ZXJuYWwvc2lnbmVyXQorCitUaGUgaW50ZWdyaXR5IGZvb3RlciBvbiBhbiBpbWFnZSBjYW4gYmUgcmVtb3ZlZCBmcm9tIGFuIGltYWdlLiBUaGUKK2hhc2h0cmVlIGNhbiBvcHRpb25hbGx5IGJlIGtlcHQgaW4gcGxhY2UuCisKKyAgJCBhdmJ0b29sIGVyYXNlX2Zvb3RlciAtLWltYWdlIElNQUdFIFstLWtlZXBfaGFzaHRyZWVdCisKK1RvIGNhbGN1bGF0ZSB0aGUgbWF4aW11bSBzaXplIG9mIGFuIGltYWdlIHRoYXQgd2lsbCBmaXQgaW4gYSBwYXJ0aXRpb24KK29mIGEgZ2l2ZW4gc2l6ZSBhZnRlciBoYXZpbmcgdXNlZCB0aGUgJ2F2YnRvb2wgYWRkX2hhc2h0cmVlX2Zvb3RlcicKK2NvbW1hbmQgb24gaXQsIHVzZSB0aGUgLS1jYWxjX21heF9pbWFnZV9zaXplIG9wdGlvbjoKKworICAkIGF2YnRvb2wgYWRkX2hhc2h0cmVlX2Zvb3RlciAtLXBhcnRpdGlvbl9zaXplICQoKDEwKjEwMjQqMTAyNCkpIFwKKyAgICAgLS1jYWxjX21heF9pbWFnZV9zaXplCisgIDEwMzMwMTEyCisKK1RoZSAtLXNpZ25pbmdfaGVscGVyIG9wdGlvbiBjYW4gYmUgdXNlZCBpbiAnbWFrZV92Ym1ldGFfaW1hZ2UnLCAnYWRkX2hhc2hfZm9vdGVyJworYW5kICdhZGRfaGFzaHRyZWVfZm9vdGVyJyBjb21tYW5kcyB0byBzcGVjaWZ5IGFueSBleHRlcm5hbCBwcm9ncmFtIGZvciBzaWduaW5nCitoYXNoZXMuIFRoZSBkYXRhIHRvIHNpZ24gKGluY2x1ZGluZyBwYWRkaW5nIGUuZy4gUEtDUzEtdjEuNSkgaXMgZmVkIHZpYSBTVERJTgorYW5kIHRoZSBzaWduZWQgZGF0YSBpcyByZXR1cm5lZCB2aWEgU1RET1VULiBJZiAtLXNpZ25pbmdfaGVscGVyIGlzIHByZXNlbnQgaW4KK2EgY29tbWFuZCBsaW5lLCB0aGUgLS1rZXkgb3B0aW9uIG5lZWQgb25seSBjb250YWluIGEgcHVibGljIGtleS4gQXJndW1lbnRzIGZvcgorYSBzaWduaW5nIGhlbHBlciBhcmUgJ2FsZ29yaXRobScgYW5kICdwdWJsaWMga2V5Jy4gSWYgdGhlIHNpZ25pbmcgaGVscGVyIGV4aXRzCit3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlLCBpdCBtZWFucyBmYWlsdXJlLgorCitIZXJlJ3MgYW4gZXhhbXBsZSBpbnZvY2F0aW9uOgorCisgL3BhdGgvdG8vbXlfc2lnbmluZ19wcm9ncmFtIFNIQTI1Nl9SU0EyMDQ4IC9wYXRoL3RvL3B1YmxpY2tleS5wZW0KKworLS0gQlVJTEQgU1lTVEVNIElOVEVHUkFUSU9OIE5PVEVTCisKK0FuZHJvaWQgVmVyaWZpZWQgQm9vdCBpcyBlbmFibGVkIGJ5IHRoZSBCT0FSRF9BVkJfRU5BQkxFIHZhcmlhYmxlCisKKyBCT0FSRF9BVkJfRU5BQkxFIDo9IHRydWUKKworVGhpcyB3aWxsIG1ha2UgdGhlIGJ1aWxkIHN5c3RlbSBjcmVhdGUgdmJtZXRhLmltZyB3aGljaCB3aWxsIGNvbnRhaW4gYQoraGFzaCBkZXNjcmlwdG9yIGZvciBib290LmltZywgYSBoYXNodHJlZSBkZXNjcmlwdG9yIGZvciBzeXN0ZW0uaW1nLCBhCitrZXJuZWwtY21kbGluZSBkZXNjcmlwdG9yIGZvciBzZXR0aW5nIHVwIGRtLXZlcml0eSBmb3Igc3lzdGVtLmltZyBhbmQKK2FwcGVuZCBhIGhhc2gtdHJlZSB0byBzeXN0ZW0uaW1nLgorCitCeSBkZWZhdWx0LCB0aGUgYWxnb3JpdGhtIFNIQTI1Nl9SU0E0MDk2IGlzIHVzZWQgd2l0aCBhIHRlc3Qga2V5IGZyb20KK3RoaXMgZGlyZWN0b3J5LiBUaGlzIGNhbiBiZSBvdmVycmlkZW4gYnkgdGhlIEJPQVJEX0FWQl9BTEdPUklUSE0gYW5kCitCT0FSRF9BVkJfS0VZX1BBVEggdmFyaWFibGVzIHRvIHVzZSBlLmcuIGEgNDA5Ni1iaXQgUlNBIGtleSBhbmQKK1NIQS01MTI6CisKKyBCT0FSRF9BVkJfQUxHT1JJVEhNIDo9IFNIQTUxMl9SU0E0MDk2CisgQk9BUkRfQVZCX0tFWV9QQVRIIDo9IC9wYXRoL3RvL3JzYV9rZXlfNDA5NmJpdHMucGVtCisKK1JlbWVtYmVyIHRoYXQgdGhlIHB1YmxpYyBwYXJ0IG9mIHRoaXMga2V5IG5lZWRzIHRvIGJlIGF2YWlsYWJsZSB0byB0aGUKK2Jvb3Rsb2FkZXIgb2YgdGhlIGRldmljZSBleHBlY3RlZCB0byB2ZXJpZnkgcmVzdWx0aW5nIGltYWdlcy4gVXNlCisnYXZidG9vbCBleHRyYWN0X3B1YmxpY19rZXknIHRvIGV4dHJhY3QgdGhlIGtleSBpbiB0aGUgZXhwZWN0ZWQgZm9ybWF0CisoIkFWQl9wayIgaW4gdGhlIGZvbGxvd2luZykuIElmIHRoZSBkZXZpY2UgaXMgdXNpbmcgYSBkaWZmZXJlbnQgcm9vdAorb2YgdHJ1c3QgdGhhbiBBVkJfcGsgdGhlIC0tcHVibGljX2tleV9tZXRhZGF0YSBvcHRpb24gY2FuIGJlIHVzZWQgdG8KK2VtYmVkIGEgYmxvYiAoIkFWQl9wa21kIiBpbiB0aGUgZm9sbG93aW5nKSB0aGF0IGNhbiBiZSB1c2VkIHRvCitlLmcuIGRlcml2ZSBBVkJfcGsuIEJvdGggQVZCX3BrIGFuZCBBVkJfcGttZCBpcyBwYXNzZWQgdG8gdGhlCitib290bG9hZGVyIGZvciB2YWxpZGF0aW9uIGFzIHBhcnQgb2YgdmVyaWZ5aW5nIGEgc2xvdC4KKworVG8gcHJldmVudCByb2xsYmFjayBhdHRhY2tzLCB0aGUgcm9sbGJhY2sgaW5kZXggc2hvdWxkIGJlIGluY3JlYXNlZCBvbgorYSByZWd1bGFyIGJhc2lzLiBUaGUgcm9sbGJhY2sgaW5kZXggY2FuIGJlIHNldCB3aXRoIHRoZQorQk9BUkRfQVZCX1JPTExCQUNLX0lOREVYIHZhcmlhYmxlOgorCisgQk9BUkRfQVZCX1JPTExCQUNLX0lOREVYIDo9IDUKKworSWYgdGhpcyBpcyBub3Qgc2V0LCB0aGUgcm9sbGJhY2sgaW5kZXggZGVmYXVsdHMgdG8gMC4KKworVGhlIHZhcmlhYmxlIEJPQVJEX0FWQl9NQUtFX1ZCTUVUQV9JTUFHRV9BUkdTIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKK2FkZGl0aW9uYWwgb3B0aW9ucyBwYXNzZWQgdG8gJ2F2YnRvb2wgbWFrZV92Ym1ldGFfaW1hZ2UnLiBUeXBpY2FsCitvcHRpb25zIHRvIGJlIHVzZWQgaGVyZSBpbmNsdWRlICctLXByb3AnLCAnLS1wcm9wX2Zyb21fZmlsZScsIGFuZAorJy0tY2hhaW5fcGFydGl0aW9uJy4KKworVGhlIHZhcmlhYmxlIEJPQVJEX0FWQlRPT0xfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUyBjYW4gYmUgdXNlZCB0bworc3BlY2lmeSBhZGRpdGlvbmFsIG9wdGlvbnMgcGFzc2VkIHRvICdhdmJ0b29sIGFkZF9oYXNoX2Zvb3RlcicgZm9yCitib290LmltZy4gVHlwaWNhbCBvcHRpb25zIHRvIGJlIHVzZWQgaGVyZSBpbmNsdWRlICctLWhhc2hfYWxnb3JpdGhtJworYW5kICctLXNhbHQnLgorCitUaGUgdmFyaWFibGUgQk9BUkRfQVZCVE9PTF9TWVNURU1fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTIGNhbiBiZSB1c2VkCit0byBzcGVjaWZ5IGFkZGl0aW9uYWwgb3B0aW9ucyBwYXNzZWQgdG8gJ2F2YnRvb2wgYWRkX2hhc2h0cmVlX2Zvb3RlcicKK2ZvciBzeXN0ZW1zLmltZy4gVHlwaWNhbCBvcHRpb25zIHRvIGJlIHVzZWQgaGVyZSBpbmNsdWRlCisnLS1oYXNoX2FsZ29yaXRobScsICctLXNhbHQnLCBhbmQgJy0tYmxvY2tfc2l6ZScuCmRpZmYgLS1naXQgYS9hdmIvYXZidG9vbCBiL2F2Yi9hdmJ0b29sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2MmJkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvYXZidG9vbApAQCAtMCwwICsxLDMwNzcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIENvcHlyaWdodCAyMDE2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisjIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisjIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyMgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisjIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworIyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisjIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisjIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorIyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisjIFNPRlRXQVJFLgorIworIiIiQ29tbWFuZC1saW5lIHRvb2wgZm9yIHdvcmtpbmcgd2l0aCBBbmRyb2lkIFZlcmlmaWVkIEJvb3QgaW1hZ2VzLiIiIgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBiaW5hc2NpaQoraW1wb3J0IGJpc2VjdAoraW1wb3J0IGhhc2hsaWIKK2ltcG9ydCBvcworaW1wb3J0IHN0cnVjdAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKKworaW1wb3J0IENyeXB0by5QdWJsaWNLZXkuUlNBCisKKyMgS2VlcCBpbiBzeW5jIHdpdGggYXZiX3ZibWV0YV9oZWFkZXIuaC4KK0FWQl9WRVJTSU9OX01BSk9SID0gMQorQVZCX1ZFUlNJT05fTUlOT1IgPSAwCitBVkJfVkJNRVRBX0lNQUdFX0ZMQUdTX0hBU0hUUkVFX0RJU0FCTEVEID0gMQorCitjbGFzcyBBdmJFcnJvcihFeGNlcHRpb24pOgorICAiIiJBcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvcnMuCisKKyAgVGhlc2UgZXJyb3JzIHJlcHJlc2VudCBpc3N1ZXMgZm9yIHdoaWNoIGEgc3RhY2stdHJhY2Ugc2hvdWxkIG5vdCBiZQorICBwcmVzZW50ZWQuCisKKyAgQXR0cmlidXRlczoKKyAgICBtZXNzYWdlOiBFcnJvciBtZXNzYWdlLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSk6CisgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisKKworY2xhc3MgQWxnb3JpdGhtKG9iamVjdCk6CisgICIiIkNvbnRhaW5zIGRldGFpbHMgYWJvdXQgYW4gYWxnb3JpdGhtLgorCisgIFNlZSB0aGUgYXZiX3ZibWV0YV9oZWFkZXIuaCBmaWxlIGZvciBtb3JlIGRldGFpbHMgYWJvdXQKKyAgYWxnb3JpdGhtcy4KKworICBUaGUgY29uc3RhbnQgfEFMR09SSVRITVN8IGlzIGEgZGljdGlvbmFyeSBmcm9tIGh1bWFuLXJlYWRhYmxlCisgIG5hbWVzIChlLmcgJ1NIQTI1Nl9SU0EyMDQ4JykgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCisKKyAgQXR0cmlidXRlczoKKyAgICBhbGdvcml0aG1fdHlwZTogSW50ZWdlciBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gfEF2YkFsZ29yaXRobVR5cGV8LgorICAgIGhhc2hfbnVtX2J5dGVzOiBOdW1iZXIgb2YgYnl0ZXMgdXNlZCB0byBzdG9yZSB0aGUgaGFzaC4KKyAgICBzaWduYXR1cmVfbnVtX2J5dGVzOiBOdW1iZXIgb2YgYnl0ZXMgdXNlZCB0byBzdG9yZSB0aGUgc2lnbmF0dXJlLgorICAgIHB1YmxpY19rZXlfbnVtX2J5dGVzOiBOdW1iZXIgb2YgYnl0ZXMgdXNlZCB0byBzdG9yZSB0aGUgcHVibGljIGtleS4KKyAgICBwYWRkaW5nOiBQYWRkaW5nIHVzZWQgZm9yIHNpZ25hdHVyZSwgaWYgYW55LgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgYWxnb3JpdGhtX3R5cGUsIGhhc2hfbnVtX2J5dGVzLCBzaWduYXR1cmVfbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgcHVibGljX2tleV9udW1fYnl0ZXMsIHBhZGRpbmcpOgorICAgIHNlbGYuYWxnb3JpdGhtX3R5cGUgPSBhbGdvcml0aG1fdHlwZQorICAgIHNlbGYuaGFzaF9udW1fYnl0ZXMgPSBoYXNoX251bV9ieXRlcworICAgIHNlbGYuc2lnbmF0dXJlX251bV9ieXRlcyA9IHNpZ25hdHVyZV9udW1fYnl0ZXMKKyAgICBzZWxmLnB1YmxpY19rZXlfbnVtX2J5dGVzID0gcHVibGljX2tleV9udW1fYnl0ZXMKKyAgICBzZWxmLnBhZGRpbmcgPSBwYWRkaW5nCisKKyMgVGhpcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBhdmJfY3J5cHRvLmggZmlsZS4KKyMKKyMgVGhlIFBLQzEtdjEuNSBwYWRkaW5nIGlzIGEgYmxvYiBvZiBiaW5hcnkgREVSIG9mIEFTTi4xIGFuZCBpcworIyBvYnRhaW5lZCBmcm9tIHNlY3Rpb24gNS4yLjIgb2YgUkZDIDQ4ODAuCitBTEdPUklUSE1TID0geworICAgICdOT05FJzogQWxnb3JpdGhtKAorICAgICAgICBhbGdvcml0aG1fdHlwZT0wLCAgICAgICAgIyBBVkJfQUxHT1JJVEhNX1RZUEVfTk9ORQorICAgICAgICBoYXNoX251bV9ieXRlcz0wLAorICAgICAgICBzaWduYXR1cmVfbnVtX2J5dGVzPTAsCisgICAgICAgIHB1YmxpY19rZXlfbnVtX2J5dGVzPTAsCisgICAgICAgIHBhZGRpbmc9W10pLAorICAgICdTSEEyNTZfUlNBMjA0OCc6IEFsZ29yaXRobSgKKyAgICAgICAgYWxnb3JpdGhtX3R5cGU9MSwgICAgICAgICMgQVZCX0FMR09SSVRITV9UWVBFX1NIQTI1Nl9SU0EyMDQ4CisgICAgICAgIGhhc2hfbnVtX2J5dGVzPTMyLAorICAgICAgICBzaWduYXR1cmVfbnVtX2J5dGVzPTI1NiwKKyAgICAgICAgcHVibGljX2tleV9udW1fYnl0ZXM9OCArIDIqMjA0OC84LAorICAgICAgICBwYWRkaW5nPVsKKyAgICAgICAgICAgICMgUEtDUzEtdjFfNSBwYWRkaW5nCisgICAgICAgICAgICAweDAwLCAweDAxXSArIFsweGZmXSoyMDIgKyBbMHgwMF0gKyBbCisgICAgICAgICAgICAgICAgIyBBU04uMSBoZWFkZXIKKyAgICAgICAgICAgICAgICAweDMwLCAweDMxLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLCAweDg2LAorICAgICAgICAgICAgICAgIDB4NDgsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDQsIDB4MDIsIDB4MDEsIDB4MDUsCisgICAgICAgICAgICAgICAgMHgwMCwgMHgwNCwgMHgyMCwKKyAgICAgICAgICAgIF0pLAorICAgICdTSEEyNTZfUlNBNDA5Nic6IEFsZ29yaXRobSgKKyAgICAgICAgYWxnb3JpdGhtX3R5cGU9MiwgICAgICAgICMgQVZCX0FMR09SSVRITV9UWVBFX1NIQTI1Nl9SU0E0MDk2CisgICAgICAgIGhhc2hfbnVtX2J5dGVzPTMyLAorICAgICAgICBzaWduYXR1cmVfbnVtX2J5dGVzPTUxMiwKKyAgICAgICAgcHVibGljX2tleV9udW1fYnl0ZXM9OCArIDIqNDA5Ni84LAorICAgICAgICBwYWRkaW5nPVsKKyAgICAgICAgICAgICMgUEtDUzEtdjFfNSBwYWRkaW5nCisgICAgICAgICAgICAweDAwLCAweDAxXSArIFsweGZmXSo0NTggKyBbMHgwMF0gKyBbCisgICAgICAgICAgICAgICAgIyBBU04uMSBoZWFkZXIKKyAgICAgICAgICAgICAgICAweDMwLCAweDMxLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLCAweDg2LAorICAgICAgICAgICAgICAgIDB4NDgsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDQsIDB4MDIsIDB4MDEsIDB4MDUsCisgICAgICAgICAgICAgICAgMHgwMCwgMHgwNCwgMHgyMCwKKyAgICAgICAgICAgIF0pLAorICAgICdTSEEyNTZfUlNBODE5Mic6IEFsZ29yaXRobSgKKyAgICAgICAgYWxnb3JpdGhtX3R5cGU9MywgICAgICAgICMgQVZCX0FMR09SSVRITV9UWVBFX1NIQTI1Nl9SU0E4MTkyCisgICAgICAgIGhhc2hfbnVtX2J5dGVzPTMyLAorICAgICAgICBzaWduYXR1cmVfbnVtX2J5dGVzPTEwMjQsCisgICAgICAgIHB1YmxpY19rZXlfbnVtX2J5dGVzPTggKyAyKjgxOTIvOCwKKyAgICAgICAgcGFkZGluZz1bCisgICAgICAgICAgICAjIFBLQ1MxLXYxXzUgcGFkZGluZworICAgICAgICAgICAgMHgwMCwgMHgwMV0gKyBbMHhmZl0qOTcwICsgWzB4MDBdICsgWworICAgICAgICAgICAgICAgICMgQVNOLjEgaGVhZGVyCisgICAgICAgICAgICAgICAgMHgzMCwgMHgzMSwgMHgzMCwgMHgwZCwgMHgwNiwgMHgwOSwgMHg2MCwgMHg4NiwKKyAgICAgICAgICAgICAgICAweDQ4LCAweDAxLCAweDY1LCAweDAzLCAweDA0LCAweDAyLCAweDAxLCAweDA1LAorICAgICAgICAgICAgICAgIDB4MDAsIDB4MDQsIDB4MjAsCisgICAgICAgICAgICBdKSwKKyAgICAnU0hBNTEyX1JTQTIwNDgnOiBBbGdvcml0aG0oCisgICAgICAgIGFsZ29yaXRobV90eXBlPTQsICAgICAgICAjIEFWQl9BTEdPUklUSE1fVFlQRV9TSEE1MTJfUlNBMjA0OAorICAgICAgICBoYXNoX251bV9ieXRlcz02NCwKKyAgICAgICAgc2lnbmF0dXJlX251bV9ieXRlcz0yNTYsCisgICAgICAgIHB1YmxpY19rZXlfbnVtX2J5dGVzPTggKyAyKjIwNDgvOCwKKyAgICAgICAgcGFkZGluZz1bCisgICAgICAgICAgICAjIFBLQ1MxLXYxXzUgcGFkZGluZworICAgICAgICAgICAgMHgwMCwgMHgwMV0gKyBbMHhmZl0qMTcwICsgWzB4MDBdICsgWworICAgICAgICAgICAgICAgICMgQVNOLjEgaGVhZGVyCisgICAgICAgICAgICAgICAgMHgzMCwgMHg1MSwgMHgzMCwgMHgwZCwgMHgwNiwgMHgwOSwgMHg2MCwgMHg4NiwKKyAgICAgICAgICAgICAgICAweDQ4LCAweDAxLCAweDY1LCAweDAzLCAweDA0LCAweDAyLCAweDAzLCAweDA1LAorICAgICAgICAgICAgICAgIDB4MDAsIDB4MDQsIDB4NDAKKyAgICAgICAgICAgIF0pLAorICAgICdTSEE1MTJfUlNBNDA5Nic6IEFsZ29yaXRobSgKKyAgICAgICAgYWxnb3JpdGhtX3R5cGU9NSwgICAgICAgICMgQVZCX0FMR09SSVRITV9UWVBFX1NIQTUxMl9SU0E0MDk2CisgICAgICAgIGhhc2hfbnVtX2J5dGVzPTY0LAorICAgICAgICBzaWduYXR1cmVfbnVtX2J5dGVzPTUxMiwKKyAgICAgICAgcHVibGljX2tleV9udW1fYnl0ZXM9OCArIDIqNDA5Ni84LAorICAgICAgICBwYWRkaW5nPVsKKyAgICAgICAgICAgICMgUEtDUzEtdjFfNSBwYWRkaW5nCisgICAgICAgICAgICAweDAwLCAweDAxXSArIFsweGZmXSo0MjYgKyBbMHgwMF0gKyBbCisgICAgICAgICAgICAgICAgIyBBU04uMSBoZWFkZXIKKyAgICAgICAgICAgICAgICAweDMwLCAweDUxLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLCAweDg2LAorICAgICAgICAgICAgICAgIDB4NDgsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDQsIDB4MDIsIDB4MDMsIDB4MDUsCisgICAgICAgICAgICAgICAgMHgwMCwgMHgwNCwgMHg0MAorICAgICAgICAgICAgXSksCisgICAgJ1NIQTUxMl9SU0E4MTkyJzogQWxnb3JpdGhtKAorICAgICAgICBhbGdvcml0aG1fdHlwZT02LCAgICAgICAgIyBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBNTEyX1JTQTgxOTIKKyAgICAgICAgaGFzaF9udW1fYnl0ZXM9NjQsCisgICAgICAgIHNpZ25hdHVyZV9udW1fYnl0ZXM9MTAyNCwKKyAgICAgICAgcHVibGljX2tleV9udW1fYnl0ZXM9OCArIDIqODE5Mi84LAorICAgICAgICBwYWRkaW5nPVsKKyAgICAgICAgICAgICMgUEtDUzEtdjFfNSBwYWRkaW5nCisgICAgICAgICAgICAweDAwLCAweDAxXSArIFsweGZmXSo5MzggKyBbMHgwMF0gKyBbCisgICAgICAgICAgICAgICAgIyBBU04uMSBoZWFkZXIKKyAgICAgICAgICAgICAgICAweDMwLCAweDUxLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLCAweDg2LAorICAgICAgICAgICAgICAgIDB4NDgsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDQsIDB4MDIsIDB4MDMsIDB4MDUsCisgICAgICAgICAgICAgICAgMHgwMCwgMHgwNCwgMHg0MAorICAgICAgICAgICAgXSksCit9CisKKworZGVmIHJvdW5kX3RvX211bHRpcGxlKG51bWJlciwgc2l6ZSk6CisgICIiIlJvdW5kcyBhIG51bWJlciB1cCB0byBuZWFyZXN0IG11bHRpcGxlIG9mIGFub3RoZXIgbnVtYmVyLgorCisgIEFyZ3M6CisgICAgbnVtYmVyOiBUaGUgbnVtYmVyIHRvIHJvdW5kIHVwLgorICAgIHNpemU6IFRoZSBtdWx0aXBsZSB0byByb3VuZCB1cCB0by4KKworICBSZXR1cm5zOgorICAgIElmIHxudW1iZXJ8IGlzIGEgbXVsdGlwbGUgb2YgfHNpemV8LCByZXR1cm5zIHxudW1iZXJ8LCBvdGhlcndpc2UKKyAgICByZXR1cm5zIHxudW1iZXJ8ICsgfHNpemV8LgorICAiIiIKKyAgcmVtYWluZGVyID0gbnVtYmVyICUgc2l6ZQorICBpZiByZW1haW5kZXIgPT0gMDoKKyAgICByZXR1cm4gbnVtYmVyCisgIHJldHVybiBudW1iZXIgKyBzaXplIC0gcmVtYWluZGVyCisKKworZGVmIHJvdW5kX3RvX3BvdzIobnVtYmVyKToKKyAgIiIiUm91bmRzIGEgbnVtYmVyIHVwIHRvIHRoZSBuZXh0IHBvd2VyIG9mIDIuCisKKyAgQXJnczoKKyAgICBudW1iZXI6IFRoZSBudW1iZXIgdG8gcm91bmQgdXAuCisKKyAgUmV0dXJuczoKKyAgICBJZiB8bnVtYmVyfCBpcyBhbHJlYWR5IGEgcG93ZXIgb2YgMiB0aGVuIHxudW1iZXJ8IGlzCisgICAgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgc21hbGxlc3QgcG93ZXIgb2YgMiBncmVhdGVyIHRoYW4gfG51bWJlcnwKKyAgICBpcyByZXR1cm5lZC4KKyAgIiIiCisgIHJldHVybiAyKiooKG51bWJlciAtIDEpLmJpdF9sZW5ndGgoKSkKKworCitkZWYgd3JpdGVfbG9uZyhvdXRwdXQsIG51bV9iaXRzLCB2YWx1ZSk6CisgICIiIldyaXRlcyBhIGxvbmcgdG8gYW4gb3V0cHV0IHN0cmVhbSB1c2luZyBhIGdpdmVuIGFtb3VudCBvZiBiaXRzLgorCisgIFRoaXMgbnVtYmVyIGlzIHdyaXR0ZW4gYmlnLWVuZGlhbiwgZS5nLiB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50CisgIGJpdCBmaXJzdC4KKworICBBcmd1bWVudHM6CisgICAgb3V0cHV0OiBUaGUgb2JqZWN0IHRvIHdyaXRlIHRoZSBvdXRwdXQgdG8uCisgICAgbnVtX2JpdHM6IFRoZSBudW1iZXIgb2YgYml0cyB0byB3cml0ZSwgZS5nLiAyMDQ4LgorICAgIHZhbHVlOiBUaGUgdmFsdWUgdG8gd3JpdGUuCisgICIiIgorICBmb3IgYml0X3BvcyBpbiByYW5nZShudW1fYml0cywgMCwgLTgpOgorICAgIG9jdGV0ID0gKHZhbHVlID4+IChiaXRfcG9zIC0gOCkpICYgMHhmZgorICAgIG91dHB1dC53cml0ZShzdHJ1Y3QucGFjaygnIUInLCBvY3RldCkpCisKKworZGVmIGVuY29kZV9sb25nKG51bV9iaXRzLCB2YWx1ZSk6CisgICIiIkVuY29kZXMgYSBsb25nIHRvIGEgYnl0ZWFycmF5KCkgdXNpbmcgYSBnaXZlbiBhbW91bnQgb2YgYml0cy4KKworICBUaGlzIG51bWJlciBpcyB3cml0dGVuIGJpZy1lbmRpYW4sIGUuZy4gd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorICBiaXQgZmlyc3QuCisKKyAgQXJndW1lbnRzOgorICAgIG51bV9iaXRzOiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gd3JpdGUsIGUuZy4gMjA0OC4KKyAgICB2YWx1ZTogVGhlIHZhbHVlIHRvIHdyaXRlLgorCisgIFJldHVybnM6CisgICAgQSBieXRlYXJyYXkoKSB3aXRoIHRoZSBlbmNvZGVkIGxvbmcuCisgICIiIgorICByZXQgPSBieXRlYXJyYXkoKQorICBmb3IgYml0X3BvcyBpbiByYW5nZShudW1fYml0cywgMCwgLTgpOgorICAgIG9jdGV0ID0gKHZhbHVlID4+IChiaXRfcG9zIC0gOCkpICYgMHhmZgorICAgIHJldC5leHRlbmQoc3RydWN0LnBhY2soJyFCJywgb2N0ZXQpKQorICByZXR1cm4gcmV0CisKKworZGVmIGVnY2QoYSwgYik6CisgICIiIkNhbGN1bGF0ZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiB0d28gbnVtYmVycy4KKworICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYSByZWN1cnNpdmUgdmVyc2lvbiBvZiB0aGUgZXh0ZW5kZWQKKyAgRXVjbGlkaWFuIGFsZ29yaXRobS4KKworICBBcmd1bWVudHM6CisgICAgYTogRmlyc3QgbnVtYmVyLgorICAgIGI6IFNlY29uZCBudW1iZXIuCisKKyAgUmV0dXJuczoKKyAgICBBIHR1cGxlIChnY2QsIHgsIHkpIHRoYXQgd2hlcmUgfGdjZHwgaXMgdGhlIGdyZWF0ZXN0IGNvbW1vbgorICAgIGRpdmlzb3Igb2YgfGF8IGFuZCB8YnwgYW5kIHxhfCp8eHwgKyB8YnwqfHl8ID0gfGdjZHwuCisgICIiIgorICBpZiBhID09IDA6CisgICAgcmV0dXJuIChiLCAwLCAxKQorICBlbHNlOgorICAgIGcsIHksIHggPSBlZ2NkKGIgJSBhLCBhKQorICAgIHJldHVybiAoZywgeCAtIChiIC8vIGEpICogeSwgeSkKKworCitkZWYgbW9kaW52KGEsIG0pOgorICAiIiJDYWxjdWxhdGUgbW9kdWxhciBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIHxhfCBtb2R1bG8gfG18LgorCisgIFRoaXMgY2FsY3VsYXRlcyB0aGUgbnVtYmVyIHx4fCBzdWNoIHRoYXQgfGF8ICogfHh8ID09IDEgKG1vZHVsbworICB8bXwpLiBUaGlzIG51bWJlciBvbmx5IGV4aXN0cyBpZiB8YXwgYW5kIHxtfCBhcmUgY28tcHJpbWUgLSB8Tm9uZXwKKyAgaXMgcmV0dXJuZWQgaWYgdGhpcyBpc24ndCB0cnVlLgorCisgIEFyZ3VtZW50czoKKyAgICBhOiBUaGUgbnVtYmVyIHRvIGNhbGN1bGF0ZSBhIG1vZHVsYXIgaW52ZXJzZSBvZi4KKyAgICBtOiBUaGUgbW9kdWxvIHRvIHVzZS4KKworICBSZXR1cm5zOgorICAgIFRoZSBtb2R1bGFyIG11bHRpcGxpY2F0aXZlIGludmVyc2Ugb2YgfGF8IGFuZCB8bXwgb3IgfE5vbmV8IGlmCisgICAgdGhlc2UgbnVtYmVycyBhcmUgbm90IGNvLXByaW1lLgorICAiIiIKKyAgZ2NkLCB4LCBfID0gZWdjZChhLCBtKQorICBpZiBnY2QgIT0gMToKKyAgICByZXR1cm4gTm9uZSAgIyBtb2R1bGFyIGludmVyc2UgZG9lcyBub3QgZXhpc3QKKyAgZWxzZToKKyAgICByZXR1cm4geCAlIG0KKworCitkZWYgcGFyc2VfbnVtYmVyKHN0cmluZyk6CisgICIiIlBhcnNlIGEgc3RyaW5nIGFzIGEgbnVtYmVyLgorCisgIFRoaXMgaXMganVzdCBhIHNob3J0LWhhbmQgZm9yIGludChzdHJpbmcsIDApIHN1aXRhYmxlIGZvciB1c2UgaW4gdGhlCisgIHx0eXBlfCBwYXJhbWV0ZXIgb2YgfEFyZ3VtZW50UGFyc2VyfCdzIGFkZF9hcmd1bWVudCgpIGZ1bmN0aW9uLiBBbgorICBpbXByb3ZlbWVudCB0byBqdXN0IHVzaW5nIHR5cGU9aW50IGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBzdXBwb3J0cworICBudW1iZXJzIGluIG90aGVyIGJhc2VzLCBlLmcuICIweDEyMzQiLgorCisgIEFyZ3VtZW50czoKKyAgICBzdHJpbmc6IFRoZSBzdHJpbmcgdG8gcGFyc2UuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgcGFyc2VkIGludGVnZXIuCisKKyAgUmFpc2VzOgorICAgIFZhbHVlRXJyb3I6IElmIHRoZSBudW1iZXIgY291bGQgbm90IGJlIHBhcnNlZC4KKyAgIiIiCisgIHJldHVybiBpbnQoc3RyaW5nLCAwKQorCisKK2RlZiB3cml0ZV9yc2Ffa2V5KG91dHB1dCwga2V5KToKKyAgIiIiV3JpdGVzIGEgcHVibGljIFJTQSBrZXkgaW4gfEF2YlJTQVB1YmxpY0tleUhlYWRlcnwgZm9ybWF0LgorCisgIFRoaXMgd3JpdGVzIHRoZSB8QXZiUlNBUHVibGljS2V5SGVhZGVyfCBhcyB3ZWxsIGFzIHRoZSB0d28gbGFyZ2UKKyAgbnVtYmVycyAofGtleV9udW1fYml0c3wgYml0cyBsb25nKSBmb2xsb3dpbmcgaXQuCisKKyAgQXJndW1lbnRzOgorICAgIG91dHB1dDogVGhlIG9iamVjdCB0byB3cml0ZSB0aGUgb3V0cHV0IHRvLgorICAgIGtleTogQSBDcnlwdG8uUHVibGljS2V5LlJTQSBvYmplY3QuCisgICIiIgorICAjIGtleS5lIGlzIGV4cG9uZW50CisgICMga2V5Lm4gaXMgbW9kdWx1cworICBrZXlfbnVtX2JpdHMgPSBrZXkuc2l6ZSgpICsgMQorICAjIENhbGN1bGF0ZSBuMGludiA9IC0xL25bMF0gKG1vZCAyXjMyKQorICBiID0gMkwqKjMyCisgIG4waW52ID0gYiAtIG1vZGludihrZXkubiwgYikKKyAgIyBDYWxjdWxhdGUgcnIgPSByXjIgKG1vZCBOKSwgd2hlcmUgciA9IDJeKCMgb2Yga2V5IGJpdHMpCisgIHIgPSAyTCoqa2V5Lm4uYml0X2xlbmd0aCgpCisgIHJybW9kbiA9IHIgKiByICUga2V5Lm4KKyAgb3V0cHV0LndyaXRlKHN0cnVjdC5wYWNrKCchSUknLCBrZXlfbnVtX2JpdHMsIG4waW52KSkKKyAgd3JpdGVfbG9uZyhvdXRwdXQsIGtleV9udW1fYml0cywga2V5Lm4pCisgIHdyaXRlX2xvbmcob3V0cHV0LCBrZXlfbnVtX2JpdHMsIHJybW9kbikKKworCitkZWYgZW5jb2RlX3JzYV9rZXkoa2V5KToKKyAgIiIiRW5jb2RlcyBhIHB1YmxpYyBSU0Ega2V5IGluIHxBdmJSU0FQdWJsaWNLZXlIZWFkZXJ8IGZvcm1hdC4KKworICBUaGlzIGNyZWF0ZXMgYSB8QXZiUlNBUHVibGljS2V5SGVhZGVyfCBhcyB3ZWxsIGFzIHRoZSB0d28gbGFyZ2UKKyAgbnVtYmVycyAofGtleV9udW1fYml0c3wgYml0cyBsb25nKSBmb2xsb3dpbmcgaXQuCisKKyAgQXJndW1lbnRzOgorICAgIGtleTogQSBDcnlwdG8uUHVibGljS2V5LlJTQSBvYmplY3QuCisKKyAgUmV0dXJuczoKKyAgICBBIGJ5dGVhcnJheSgpIHdpdGggdGhlIHxBdmJSU0FQdWJsaWNLZXlIZWFkZXJ8LgorICAiIiIKKyAgcmV0ID0gYnl0ZWFycmF5KCkKKyAgIyBrZXkuZSBpcyBleHBvbmVudAorICAjIGtleS5uIGlzIG1vZHVsdXMKKyAga2V5X251bV9iaXRzID0ga2V5LnNpemUoKSArIDEKKyAgIyBDYWxjdWxhdGUgbjBpbnYgPSAtMS9uWzBdIChtb2QgMl4zMikKKyAgYiA9IDJMKiozMgorICBuMGludiA9IGIgLSBtb2RpbnYoa2V5Lm4sIGIpCisgICMgQ2FsY3VsYXRlIHJyID0gcl4yIChtb2QgTiksIHdoZXJlIHIgPSAyXigjIG9mIGtleSBiaXRzKQorICByID0gMkwqKmtleS5uLmJpdF9sZW5ndGgoKQorICBycm1vZG4gPSByICogciAlIGtleS5uCisgIHJldC5leHRlbmQoc3RydWN0LnBhY2soJyFJSScsIGtleV9udW1fYml0cywgbjBpbnYpKQorICByZXQuZXh0ZW5kKGVuY29kZV9sb25nKGtleV9udW1fYml0cywga2V5Lm4pKQorICByZXQuZXh0ZW5kKGVuY29kZV9sb25nKGtleV9udW1fYml0cywgcnJtb2RuKSkKKyAgcmV0dXJuIHJldAorCisKK2RlZiBsb29rdXBfYWxnb3JpdGhtX2J5X3R5cGUoYWxnX3R5cGUpOgorICAiIiJMb29rcyB1cCBhbGdvcml0aG0gYnkgdHlwZS4KKworICBBcmd1bWVudHM6CisgICAgYWxnX3R5cGU6IFRoZSBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgdHlwZS4KKworICBSZXR1cm5zOgorICAgIEEgdHVwbGUgd2l0aCB0aGUgYWxnb3JpdGhtIG5hbWUgYW5kIGFuIHxBbGdvcml0aG18IGluc3RhbmNlLgorCisgIFJhaXNlczoKKyAgICBFeGNlcHRpb246IElmIHRoZSBhbGdvcml0aG0gY2Fubm90IGJlIGZvdW5kCisgICIiIgorICBmb3IgYWxnX25hbWUgaW4gQUxHT1JJVEhNUzoKKyAgICBhbGdfZGF0YSA9IEFMR09SSVRITVNbYWxnX25hbWVdCisgICAgaWYgYWxnX2RhdGEuYWxnb3JpdGhtX3R5cGUgPT0gYWxnX3R5cGU6CisgICAgICByZXR1cm4gKGFsZ19uYW1lLCBhbGdfZGF0YSkKKyAgcmFpc2UgQXZiRXJyb3IoJ1Vua25vd24gYWxnb3JpdGhtIHR5cGUge30nLmZvcm1hdChhbGdfdHlwZSkpCisKKworZGVmIHJhd19zaWduKHNpZ25pbmdfaGVscGVyLCBhbGdvcml0aG1fbmFtZSwga2V5X3BhdGgsIHJhd19kYXRhX3RvX3NpZ24pOgorICAiIiJDb21wdXRlcyBhIHJhdyBSU0Egc2lnbmF0dXJlIHVzaW5nIHxzaWduaW5nX2hlbHBlcnwgb3Igb3BlbnNzbC4KKworICBBcmd1bWVudHM6CisgICAgc2lnbmluZ19oZWxwZXI6IFByb2dyYW0gd2hpY2ggc2lnbnMgYSBoYXNoIGFuZCByZXR1cm5zIHRoZSBzaWduYXR1cmUuCisgICAgYWxnb3JpdGhtX25hbWU6IFRoZSBhbGdvcml0aG0gbmFtZSBhcyBwZXIgdGhlIEFMR09SSVRITVMgZGljdC4KKyAgICBrZXlfcGF0aDogUGF0aCB0byB0aGUgcHJpdmF0ZSBrZXkgZmlsZS4gTXVzdCBiZSBQRU0gZm9ybWF0LgorICAgIHJhd19kYXRhX3RvX3NpZ246IERhdGEgdG8gc2lnbiAoYnl0ZWFycmF5IG9yIHN0ciBleHBlY3RlZCkuCisKKyAgUmV0dXJuczoKKyAgICBBIGJ5dGVhcnJheSBjb250YWluaW5nIHRoZSBzaWduYXR1cmUuCisKKyAgUmFpc2VzOgorICAgIEV4Y2VwdGlvbjogSWYgYW4gZXJyb3Igb2NjdXJzLgorICAiIiIKKyAgcCA9IE5vbmUKKyAgaWYgc2lnbmluZ19oZWxwZXIgaXMgbm90IE5vbmU6CisgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbigKKyAgICAgICAgICBbc2lnbmluZ19oZWxwZXIsIGFsZ29yaXRobV9uYW1lLCBrZXlfcGF0aF0sCisgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgZWxzZToKKyAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgICAgIFsnb3BlbnNzbCcsICdyc2F1dGwnLCAnLXNpZ24nLCAnLWlua2V5Jywga2V5X3BhdGgsICctcmF3J10sCisgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgKHBvdXQsIHBlcnIpID0gcC5jb21tdW5pY2F0ZShzdHIocmF3X2RhdGFfdG9fc2lnbikpCisgIHJldGNvZGUgPSBwLndhaXQoKQorICBpZiByZXRjb2RlICE9IDA6CisgICAgcmFpc2UgQXZiRXJyb3IoJ0Vycm9yIHNpZ25pbmc6IHt9Jy5mb3JtYXQocGVycikpCisgIHJldHVybiBieXRlYXJyYXkocG91dCkKKworCitjbGFzcyBJbWFnZUNodW5rKG9iamVjdCk6CisgICIiIkRhdGEgc3RydWN0dXJlIHVzZWQgZm9yIHJlcHJlc2VudGluZyBjaHVua3MgaW4gQW5kcm9pZCBzcGFyc2UgZmlsZXMuCisKKyAgQXR0cmlidXRlczoKKyAgICBjaHVua190eXBlOiBPbmUgb2YgVFlQRV9SQVcsIFRZUEVfRklMTCwgb3IgVFlQRV9ET05UX0NBUkUuCisgICAgY2h1bmtfb2Zmc2V0OiBPZmZzZXQgaW4gdGhlIHNwYXJzZSBmaWxlIHdoZXJlIHRoaXMgY2h1bmsgYmVnaW5zLgorICAgIG91dHB1dF9vZmZzZXQ6IE9mZnNldCBpbiBkZS1zcGFyc2lmaWVkIGZpbGUgd2hlcmUgb3V0cHV0IGJlZ2lucy4KKyAgICBvdXRwdXRfc2l6ZTogTnVtYmVyIG9mIGJ5dGVzIGluIG91dHB1dC4KKyAgICBpbnB1dF9vZmZzZXQ6IE9mZnNldCBpbiBzcGFyc2UgZmlsZSBmb3IgZGF0YSBpZiBUWVBFX1JBVyBvdGhlcndpc2UgTm9uZS4KKyAgICBmaWxsX2RhdGE6IEJsb2Igd2l0aCBkYXRhIHRvIGZpbGwgaWYgVFlQRV9GSUxMIG90aGVyd2lzZSBOb25lLgorICAiIiIKKworICBGT1JNQVQgPSAnPDJIMkknCisgIFRZUEVfUkFXID0gMHhjYWMxCisgIFRZUEVfRklMTCA9IDB4Y2FjMgorICBUWVBFX0RPTlRfQ0FSRSA9IDB4Y2FjMworICBUWVBFX0NSQzMyID0gMHhjYWM0CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGNodW5rX3R5cGUsIGNodW5rX29mZnNldCwgb3V0cHV0X29mZnNldCwgb3V0cHV0X3NpemUsCisgICAgICAgICAgICAgICBpbnB1dF9vZmZzZXQsIGZpbGxfZGF0YSk6CisgICAgIiIiSW5pdGlhbGl6ZXMgYW4gSW1hZ2VDaHVuayBvYmplY3QuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBjaHVua190eXBlOiBPbmUgb2YgVFlQRV9SQVcsIFRZUEVfRklMTCwgb3IgVFlQRV9ET05UX0NBUkUuCisgICAgICBjaHVua19vZmZzZXQ6IE9mZnNldCBpbiB0aGUgc3BhcnNlIGZpbGUgd2hlcmUgdGhpcyBjaHVuayBiZWdpbnMuCisgICAgICBvdXRwdXRfb2Zmc2V0OiBPZmZzZXQgaW4gZGUtc3BhcnNpZmllZCBmaWxlLgorICAgICAgb3V0cHV0X3NpemU6IE51bWJlciBvZiBieXRlcyBpbiBvdXRwdXQuCisgICAgICBpbnB1dF9vZmZzZXQ6IE9mZnNldCBpbiBzcGFyc2UgZmlsZSBpZiBUWVBFX1JBVyBvdGhlcndpc2UgTm9uZS4KKyAgICAgIGZpbGxfZGF0YTogQmxvYiB3aXRoIGRhdGEgdG8gZmlsbCBpZiBUWVBFX0ZJTEwgb3RoZXJ3aXNlIE5vbmUuCisKKyAgICBSYWlzZXM6CisgICAgICBWYWx1ZUVycm9yOiBJZiBkYXRhIGlzIG5vdCB3ZWxsLWZvcm1lZC4KKyAgICAiIiIKKyAgICBzZWxmLmNodW5rX3R5cGUgPSBjaHVua190eXBlCisgICAgc2VsZi5jaHVua19vZmZzZXQgPSBjaHVua19vZmZzZXQKKyAgICBzZWxmLm91dHB1dF9vZmZzZXQgPSBvdXRwdXRfb2Zmc2V0CisgICAgc2VsZi5vdXRwdXRfc2l6ZSA9IG91dHB1dF9zaXplCisgICAgc2VsZi5pbnB1dF9vZmZzZXQgPSBpbnB1dF9vZmZzZXQKKyAgICBzZWxmLmZpbGxfZGF0YSA9IGZpbGxfZGF0YQorICAgICMgQ2hlY2sgaW52YXJpYW50cy4KKyAgICBpZiBzZWxmLmNodW5rX3R5cGUgPT0gc2VsZi5UWVBFX1JBVzoKKyAgICAgIGlmIHNlbGYuZmlsbF9kYXRhIGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdSQVcgY2h1bmsgY2Fubm90IGhhdmUgZmlsbF9kYXRhIHNldC4nKQorICAgICAgaWYgbm90IHNlbGYuaW5wdXRfb2Zmc2V0OgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdSQVcgY2h1bmsgbXVzdCBoYXZlIGlucHV0X29mZnNldCBzZXQuJykKKyAgICBlbGlmIHNlbGYuY2h1bmtfdHlwZSA9PSBzZWxmLlRZUEVfRklMTDoKKyAgICAgIGlmIHNlbGYuZmlsbF9kYXRhIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ZJTEwgY2h1bmsgbXVzdCBoYXZlIGZpbGxfZGF0YSBzZXQuJykKKyAgICAgIGlmIHNlbGYuaW5wdXRfb2Zmc2V0OgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdGSUxMIGNodW5rIGNhbm5vdCBoYXZlIGlucHV0X29mZnNldCBzZXQuJykKKyAgICBlbGlmIHNlbGYuY2h1bmtfdHlwZSA9PSBzZWxmLlRZUEVfRE9OVF9DQVJFOgorICAgICAgaWYgc2VsZi5maWxsX2RhdGEgaXMgbm90IE5vbmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0RPTlRfQ0FSRSBjaHVuayBjYW5ub3QgaGF2ZSBmaWxsX2RhdGEgc2V0LicpCisgICAgICBpZiBzZWxmLmlucHV0X29mZnNldDoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRE9OVF9DQVJFIGNodW5rIGNhbm5vdCBoYXZlIGlucHV0X29mZnNldCBzZXQuJykKKyAgICBlbHNlOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCBjaHVuayB0eXBlJykKKworCitjbGFzcyBJbWFnZUhhbmRsZXIob2JqZWN0KToKKyAgIiIiQWJzdHJhY3Rpb24gZm9yIGltYWdlIEkvTyB3aXRoIHN1cHBvcnQgZm9yIEFuZHJvaWQgc3BhcnNlIGltYWdlcy4KKworICBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3Igd29ya2luZyB3aXRoIGltYWdlIGZpbGVzIHRoYXQKKyAgbWF5IGJlIHVzaW5nIHRoZSBBbmRyb2lkIFNwYXJzZSBJbWFnZSBmb3JtYXQuIFdoZW4gYW4gaW5zdGFuY2UgaXMKKyAgY29uc3RydWN0ZWQsIHdlIHRlc3Qgd2hldGhlciBpdCdzIGFuIEFuZHJvaWQgc3BhcnNlIGZpbGUuIElmIHNvLAorICBvcGVyYXRpb25zIHdpbGwgYmUgb24gdGhlIHNwYXJzZSBmaWxlIGJ5IGludGVycHJldGluZyB0aGUgc3BhcnNlCisgIGZvcm1hdCwgb3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBkaXJlY3RseSBvbiB0aGUgZmlsZS4gRWl0aGVyIHdheSB0aGUKKyAgb3BlcmF0aW9ucyBkbyB0aGUgc2FtZS4KKworICBGb3IgcmVhZGluZywgdGhpcyBpbnRlcmZhY2UgbWltaWNzIGEgZmlsZSBvYmplY3QgLSBpdCBoYXMgc2VlaygpLAorICB0ZWxsKCksIGFuZCByZWFkKCkgbWV0aG9kcy4gRm9yIHdyaXRpbmcsIG9ubHkgdHJ1bmNhdGlvbgorICAodHJ1bmNhdGUoKSkgYW5kIGFwcGVuZGluZyBpcyBzdXBwb3J0ZWQgKGFwcGVuZF9yYXcoKSBhbmQKKyAgYXBwZW5kX2RvbnRfY2FyZSgpKS4gQWRkaXRpb25hbGx5LCBkYXRhIGNhbiBvbmx5IGJlIHdyaXR0ZW4gaW4gdW5pdHMKKyAgb2YgdGhlIGJsb2NrIHNpemUuCisKKyAgQXR0cmlidXRlczoKKyAgICBpc19zcGFyc2U6IFdoZXRoZXIgdGhlIGZpbGUgYmVpbmcgb3BlcmF0ZWQgb24gaXMgc3BhcnNlLgorICAgIGJsb2NrX3NpemU6IFRoZSBibG9jayBzaXplLCB0eXBpY2FsbHkgNDA5Ni4KKyAgICBpbWFnZV9zaXplOiBUaGUgc2l6ZSBvZiB0aGUgdW5zcGFyc2lmaWVkIGZpbGUuCisgICIiIgorICAjIFNlZSBzeXN0ZW0vY29yZS9saWJzcGFyc2Uvc3BhcnNlX2Zvcm1hdC5oIGZvciBkZXRhaWxzLgorICBNQUdJQyA9IDB4ZWQyNmZmM2EKKyAgSEVBREVSX0ZPUk1BVCA9ICc8STRINEknCisKKyAgIyBUaGVzZSBhcmUgZm9ybWF0cyBhbmQgb2Zmc2V0IG9mIGp1c3QgdGhlIHx0b3RhbF9jaHVua3N8IGFuZAorICAjIHx0b3RhbF9ibG9ja3N8IGZpZWxkcy4KKyAgTlVNX0NIVU5LU19BTkRfQkxPQ0tTX0ZPUk1BVCA9ICc8SUknCisgIE5VTV9DSFVOS1NfQU5EX0JMT0NLU19PRkZTRVQgPSAxNgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBpbWFnZV9maWxlbmFtZSk6CisgICAgIiIiSW5pdGlhbGl6ZXMgYW4gaW1hZ2UgaGFuZGxlci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIGltYWdlX2ZpbGVuYW1lOiBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBvcGVyYXRlIG9uLgorCisgICAgUmFpc2VzOgorICAgICAgVmFsdWVFcnJvcjogSWYgZGF0YSBpbiB0aGUgZmlsZSBpcyBpbnZhbGlkLgorICAgICIiIgorICAgIHNlbGYuX2ltYWdlX2ZpbGVuYW1lID0gaW1hZ2VfZmlsZW5hbWUKKyAgICBzZWxmLl9yZWFkX2hlYWRlcigpCisKKyAgZGVmIF9yZWFkX2hlYWRlcihzZWxmKToKKyAgICAiIiJJbml0aWFsaXplcyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgdXNlZCBmb3IgcmVhZGluZyBmaWxlLgorCisgICAgVGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFuZCBpcyB0eXBpY2FsbHkgY2FsbGVkIGFmdGVyCisgICAgbW9kaWZ5aW5nIHRoZSBmaWxlIChlLmcuIGFwcGVuZGluZywgdHJ1bmNhdGlvbikuCisKKyAgICBSYWlzZXM6CisgICAgICBWYWx1ZUVycm9yOiBJZiBkYXRhIGluIHRoZSBmaWxlIGlzIGludmFsaWQuCisgICAgIiIiCisgICAgc2VsZi5pc19zcGFyc2UgPSBGYWxzZQorICAgIHNlbGYuYmxvY2tfc2l6ZSA9IDQwOTYKKyAgICBzZWxmLl9maWxlX3BvcyA9IDAKKyAgICBzZWxmLl9pbWFnZSA9IG9wZW4oc2VsZi5faW1hZ2VfZmlsZW5hbWUsICdyK2InKQorICAgIHNlbGYuX2ltYWdlLnNlZWsoMCwgb3MuU0VFS19FTkQpCisgICAgc2VsZi5pbWFnZV9zaXplID0gc2VsZi5faW1hZ2UudGVsbCgpCisKKyAgICBzZWxmLl9pbWFnZS5zZWVrKDAsIG9zLlNFRUtfU0VUKQorICAgIGhlYWRlcl9iaW4gPSBzZWxmLl9pbWFnZS5yZWFkKHN0cnVjdC5jYWxjc2l6ZShzZWxmLkhFQURFUl9GT1JNQVQpKQorICAgIChtYWdpYywgbWFqb3JfdmVyc2lvbiwgbWlub3JfdmVyc2lvbiwgZmlsZV9oZHJfc3osIGNodW5rX2hkcl9zeiwKKyAgICAgYmxvY2tfc2l6ZSwgc2VsZi5fbnVtX3RvdGFsX2Jsb2Nrcywgc2VsZi5fbnVtX3RvdGFsX2NodW5rcywKKyAgICAgXykgPSBzdHJ1Y3QudW5wYWNrKHNlbGYuSEVBREVSX0ZPUk1BVCwgaGVhZGVyX2JpbikKKyAgICBpZiBtYWdpYyAhPSBzZWxmLk1BR0lDOgorICAgICAgIyBOb3QgYSBzcGFyc2UgaW1hZ2UsIG91ciBqb2IgaGVyZSBpcyBkb25lLgorICAgICAgcmV0dXJuCisgICAgaWYgbm90IChtYWpvcl92ZXJzaW9uID09IDEgYW5kIG1pbm9yX3ZlcnNpb24gPT0gMCk6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKCdFbmNvdW50ZXJlZCBzcGFyc2UgaW1hZ2UgZm9ybWF0IHZlcnNpb24ge30ue30gYnV0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ29ubHkgMS4wIGlzIHN1cHBvcnRlZCcuZm9ybWF0KG1ham9yX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vcl92ZXJzaW9uKSkKKyAgICBpZiBmaWxlX2hkcl9zeiAhPSBzdHJ1Y3QuY2FsY3NpemUoc2VsZi5IRUFERVJfRk9STUFUKToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuZXhwZWN0ZWQgZmlsZV9oZHJfc3ogdmFsdWUge30uJy4KKyAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KGZpbGVfaGRyX3N6KSkKKyAgICBpZiBjaHVua19oZHJfc3ogIT0gc3RydWN0LmNhbGNzaXplKEltYWdlQ2h1bmsuRk9STUFUKToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuZXhwZWN0ZWQgY2h1bmtfaGRyX3N6IHZhbHVlIHt9LicuCisgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdChjaHVua19oZHJfc3opKQorCisgICAgc2VsZi5ibG9ja19zaXplID0gYmxvY2tfc2l6ZQorCisgICAgIyBCdWlsZCBhbiBsaXN0IG9mIGNodW5rcyBieSBwYXJzaW5nIHRoZSBmaWxlLgorICAgIHNlbGYuX2NodW5rcyA9IFtdCisKKyAgICAjIEZpbmQgdGhlIHNtYWxsZXN0IG9mZnNldCB3aGVyZSBvbmx5ICJEb24ndCBjYXJlIiBjaHVua3MKKyAgICAjIGZvbGxvdy4gVGhpcyB3aWxsIGJlIHRoZSBzaXplIG9mIHRoZSBjb250ZW50IGluIHRoZSBzcGFyc2UKKyAgICAjIGltYWdlLgorICAgIG9mZnNldCA9IDAKKyAgICBvdXRwdXRfb2Zmc2V0ID0gMAorICAgIGZvciBfIGluIHhyYW5nZSgxLCBzZWxmLl9udW1fdG90YWxfY2h1bmtzICsgMSk6CisgICAgICBjaHVua19vZmZzZXQgPSBzZWxmLl9pbWFnZS50ZWxsKCkKKworICAgICAgaGVhZGVyX2JpbiA9IHNlbGYuX2ltYWdlLnJlYWQoc3RydWN0LmNhbGNzaXplKEltYWdlQ2h1bmsuRk9STUFUKSkKKyAgICAgIChjaHVua190eXBlLCBfLCBjaHVua19zeiwgdG90YWxfc3opID0gc3RydWN0LnVucGFjayhJbWFnZUNodW5rLkZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfYmluKQorICAgICAgZGF0YV9zeiA9IHRvdGFsX3N6IC0gc3RydWN0LmNhbGNzaXplKEltYWdlQ2h1bmsuRk9STUFUKQorCisgICAgICBpZiBjaHVua190eXBlID09IEltYWdlQ2h1bmsuVFlQRV9SQVc6CisgICAgICAgIGlmIGRhdGFfc3ogIT0gKGNodW5rX3N6ICogc2VsZi5ibG9ja19zaXplKToKKyAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdSYXcgY2h1bmsgaW5wdXQgc2l6ZSAoe30pIGRvZXMgbm90IG1hdGNoIG91dHB1dCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZSAoe30pJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdChkYXRhX3N6LCBjaHVua19zeipzZWxmLmJsb2NrX3NpemUpKQorICAgICAgICBzZWxmLl9jaHVua3MuYXBwZW5kKEltYWdlQ2h1bmsoSW1hZ2VDaHVuay5UWVBFX1JBVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua19zeipzZWxmLmJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbWFnZS50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lKSkKKyAgICAgICAgc2VsZi5faW1hZ2UucmVhZChkYXRhX3N6KQorCisgICAgICBlbGlmIGNodW5rX3R5cGUgPT0gSW1hZ2VDaHVuay5UWVBFX0ZJTEw6CisgICAgICAgIGlmIGRhdGFfc3ogIT0gNDoKKyAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdGaWxsIGNodW5rIHNob3VsZCBoYXZlIDQgYnl0ZXMgb2YgZmlsbCwgYnV0IHRoaXMgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcyB7fScuZm9ybWF0KGRhdGFfc3opKQorICAgICAgICBmaWxsX2RhdGEgPSBzZWxmLl9pbWFnZS5yZWFkKDQpCisgICAgICAgIHNlbGYuX2NodW5rcy5hcHBlbmQoSW1hZ2VDaHVuayhJbWFnZUNodW5rLlRZUEVfRklMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua19zeipzZWxmLmJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9kYXRhKSkKKyAgICAgIGVsaWYgY2h1bmtfdHlwZSA9PSBJbWFnZUNodW5rLlRZUEVfRE9OVF9DQVJFOgorICAgICAgICBpZiBkYXRhX3N6ICE9IDA6CisgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRG9uXCd0IGNhcmUgY2h1bmsgaW5wdXQgc2l6ZSBpcyBub24temVybyAoe30pJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdChkYXRhX3N6KSkKKyAgICAgICAgc2VsZi5fY2h1bmtzLmFwcGVuZChJbWFnZUNodW5rKEltYWdlQ2h1bmsuVFlQRV9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfc3oqc2VsZi5ibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUpKQorICAgICAgZWxpZiBjaHVua190eXBlID09IEltYWdlQ2h1bmsuVFlQRV9DUkMzMjoKKyAgICAgICAgaWYgZGF0YV9zeiAhPSA0OgorICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0NSQzMyIGNodW5rIHNob3VsZCBoYXZlIDQgYnl0ZXMgb2YgQ1JDLCBidXQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXMgaGFzIHt9Jy5mb3JtYXQoZGF0YV9zeikpCisgICAgICAgIHNlbGYuX2ltYWdlLnJlYWQoNCkKKyAgICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd24gY2h1bmsgdHlwZSB7fScuZm9ybWF0KGNodW5rX3R5cGUpKQorCisgICAgICBvZmZzZXQgKz0gY2h1bmtfc3oKKyAgICAgIG91dHB1dF9vZmZzZXQgKz0gY2h1bmtfc3oqc2VsZi5ibG9ja19zaXplCisKKyAgICAjIFJlY29yZCB3aGVyZSBzcGFyc2UgZGF0YSBlbmQuCisgICAgc2VsZi5fc3BhcnNlX2VuZCA9IHNlbGYuX2ltYWdlLnRlbGwoKQorCisgICAgIyBOb3cgdGhhdCB3ZSd2ZSB0cmF2ZXJzZWQgYWxsIGNodW5rcywgc2FuaXR5IGNoZWNrLgorICAgIGlmIHNlbGYuX251bV90b3RhbF9ibG9ja3MgIT0gb2Zmc2V0OgorICAgICAgcmFpc2UgVmFsdWVFcnJvcignVGhlIGhlYWRlciBzYWlkIHdlIHNob3VsZCBoYXZlIHt9IG91dHB1dCBibG9ja3MsICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ2J1dCB3ZSBzYXcge30nLmZvcm1hdChzZWxmLl9udW1fdG90YWxfYmxvY2tzLCBvZmZzZXQpKQorICAgIGp1bmtfbGVuID0gbGVuKHNlbGYuX2ltYWdlLnJlYWQoKSkKKyAgICBpZiBqdW5rX2xlbiA+IDA6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKCdUaGVyZSB3ZXJlIHt9IGJ5dGVzIG9mIGV4dHJhIGRhdGEgYXQgdGhlIGVuZCBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgICAgICAnZmlsZS4nLmZvcm1hdChqdW5rX2xlbikpCisKKyAgICAjIEFzc2lnbiB8aW1hZ2Vfc2l6ZXwuCisgICAgc2VsZi5pbWFnZV9zaXplID0gb3V0cHV0X29mZnNldAorCisgICAgIyBUaGlzIGlzIHVzZWQgd2hlbiBiaXNlY3RpbmcgaW4gcmVhZCgpIHRvIGZpbmQgdGhlIGluaXRpYWwgc2xpY2UuCisgICAgc2VsZi5fY2h1bmtfb3V0cHV0X29mZnNldHMgPSBbaS5vdXRwdXRfb2Zmc2V0IGZvciBpIGluIHNlbGYuX2NodW5rc10KKworICAgIHNlbGYuaXNfc3BhcnNlID0gVHJ1ZQorCisgIGRlZiBfdXBkYXRlX2NodW5rc19hbmRfYmxvY2tzKHNlbGYpOgorICAgICIiIkhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgdGhlIGltYWdlIGhlYWRlci4KKworICAgIFRoZSB0aGUgfHRvdGFsX2NodW5rc3wgYW5kIHx0b3RhbF9ibG9ja3N8IGZpZWxkcyBpbiB0aGUgaGVhZGVyCisgICAgd2lsbCBiZSBzZXQgdG8gdmFsdWUgb2YgdGhlIHxfbnVtX3RvdGFsX2Jsb2Nrc3wgYW5kCisgICAgfF9udW1fdG90YWxfY2h1bmtzfCBhdHRyaWJ1dGVzLgorCisgICAgIiIiCisgICAgc2VsZi5faW1hZ2Uuc2VlayhzZWxmLk5VTV9DSFVOS1NfQU5EX0JMT0NLU19PRkZTRVQsIG9zLlNFRUtfU0VUKQorICAgIHNlbGYuX2ltYWdlLndyaXRlKHN0cnVjdC5wYWNrKHNlbGYuTlVNX0NIVU5LU19BTkRfQkxPQ0tTX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9udW1fdG90YWxfYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX251bV90b3RhbF9jaHVua3MpKQorCisgIGRlZiBhcHBlbmRfZG9udF9jYXJlKHNlbGYsIG51bV9ieXRlcyk6CisgICAgIiIiQXBwZW5kcyBhIERPTlRfQ0FSRSBjaHVuayB0byB0aGUgc3BhcnNlIGZpbGUuCisKKyAgICBUaGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIG51bV9ieXRlczogU2l6ZSBpbiBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIERPTlRfQ0FSRSBjaHVuay4KKyAgICAiIiIKKyAgICBhc3NlcnQgbnVtX2J5dGVzICUgc2VsZi5ibG9ja19zaXplID09IDAKKworICAgIGlmIG5vdCBzZWxmLmlzX3NwYXJzZToKKyAgICAgIHNlbGYuX2ltYWdlLnNlZWsoMCwgb3MuU0VFS19FTkQpCisgICAgICAjIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhdCB3cml0aW5nIE5VTCBieXRlcyBzaW5jZSBpdCdsbCBhZGQKKyAgICAgICMgYSBob2xlIG9uIGZpbGUgc3lzdGVtcyB0aGF0IHN1cHBvcnQgc3BhcnNlIGZpbGVzIChuYXRpdmUKKyAgICAgICMgc3BhcnNlLCBub3QgQW5kcm9pZCBzcGFyc2UpLgorICAgICAgc2VsZi5faW1hZ2UudHJ1bmNhdGUoc2VsZi5faW1hZ2UudGVsbCgpICsgbnVtX2J5dGVzKQorICAgICAgc2VsZi5fcmVhZF9oZWFkZXIoKQorICAgICAgcmV0dXJuCisKKyAgICBzZWxmLl9udW1fdG90YWxfY2h1bmtzICs9IDEKKyAgICBzZWxmLl9udW1fdG90YWxfYmxvY2tzICs9IG51bV9ieXRlcyAvIHNlbGYuYmxvY2tfc2l6ZQorICAgIHNlbGYuX3VwZGF0ZV9jaHVua3NfYW5kX2Jsb2NrcygpCisKKyAgICBzZWxmLl9pbWFnZS5zZWVrKHNlbGYuX3NwYXJzZV9lbmQsIG9zLlNFRUtfU0VUKQorICAgIHNlbGYuX2ltYWdlLndyaXRlKHN0cnVjdC5wYWNrKEltYWdlQ2h1bmsuRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlQ2h1bmsuVFlQRV9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICMgUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYnl0ZXMgLyBzZWxmLmJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LmNhbGNzaXplKEltYWdlQ2h1bmsuRk9STUFUKSkpCisgICAgc2VsZi5fcmVhZF9oZWFkZXIoKQorCisgIGRlZiBhcHBlbmRfcmF3KHNlbGYsIGRhdGEpOgorICAgICIiIkFwcGVuZHMgYSBSQVcgY2h1bmsgdG8gdGhlIHNwYXJzZSBmaWxlLgorCisgICAgVGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gZGF0YSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBkYXRhOiBEYXRhIHRvIGFwcGVuZC4KKyAgICAiIiIKKyAgICBhc3NlcnQgbGVuKGRhdGEpICUgc2VsZi5ibG9ja19zaXplID09IDAKKworICAgIGlmIG5vdCBzZWxmLmlzX3NwYXJzZToKKyAgICAgIHNlbGYuX2ltYWdlLnNlZWsoMCwgb3MuU0VFS19FTkQpCisgICAgICBzZWxmLl9pbWFnZS53cml0ZShkYXRhKQorICAgICAgc2VsZi5fcmVhZF9oZWFkZXIoKQorICAgICAgcmV0dXJuCisKKyAgICBzZWxmLl9udW1fdG90YWxfY2h1bmtzICs9IDEKKyAgICBzZWxmLl9udW1fdG90YWxfYmxvY2tzICs9IGxlbihkYXRhKSAvIHNlbGYuYmxvY2tfc2l6ZQorICAgIHNlbGYuX3VwZGF0ZV9jaHVua3NfYW5kX2Jsb2NrcygpCisKKyAgICBzZWxmLl9pbWFnZS5zZWVrKHNlbGYuX3NwYXJzZV9lbmQsIG9zLlNFRUtfU0VUKQorICAgIHNlbGYuX2ltYWdlLndyaXRlKHN0cnVjdC5wYWNrKEltYWdlQ2h1bmsuRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlQ2h1bmsuVFlQRV9SQVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICMgUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oZGF0YSkgLyBzZWxmLmJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGRhdGEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QuY2FsY3NpemUoSW1hZ2VDaHVuay5GT1JNQVQpKSkKKyAgICBzZWxmLl9pbWFnZS53cml0ZShkYXRhKQorICAgIHNlbGYuX3JlYWRfaGVhZGVyKCkKKworICBkZWYgYXBwZW5kX2ZpbGwoc2VsZiwgZmlsbF9kYXRhLCBzaXplKToKKyAgICAiIiJBcHBlbmRzIGEgZmlsbCBjaHVuayB0byB0aGUgc3BhcnNlIGZpbGUuCisKKyAgICBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBmaWxsIGRhdGEgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLgorCisgICAgQXJndW1lbnRzOgorICAgICAgZmlsbF9kYXRhOiBGaWxsIGRhdGEgdG8gYXBwZW5kIC0gbXVzdCBiZSBmb3VyIGJ5dGVzLgorICAgICAgc2l6ZTogTnVtYmVyIG9mIGNodW5rIC0gbXVzdCBiZSBhIG11bHRpcGxlIG9mIGZvdXIgYW5kIHRoZSBibG9jayBzaXplLgorICAgICIiIgorICAgIGFzc2VydCBsZW4oZmlsbF9kYXRhKSA9PSA0CisgICAgYXNzZXJ0IHNpemUgJSA0ID09IDAKKyAgICBhc3NlcnQgc2l6ZSAlIHNlbGYuYmxvY2tfc2l6ZSA9PSAwCisKKyAgICBpZiBub3Qgc2VsZi5pc19zcGFyc2U6CisgICAgICBzZWxmLl9pbWFnZS5zZWVrKDAsIG9zLlNFRUtfRU5EKQorICAgICAgc2VsZi5faW1hZ2Uud3JpdGUoZmlsbF9kYXRhICogKHNpemUvNCkpCisgICAgICBzZWxmLl9yZWFkX2hlYWRlcigpCisgICAgICByZXR1cm4KKworICAgIHNlbGYuX251bV90b3RhbF9jaHVua3MgKz0gMQorICAgIHNlbGYuX251bV90b3RhbF9ibG9ja3MgKz0gc2l6ZSAvIHNlbGYuYmxvY2tfc2l6ZQorICAgIHNlbGYuX3VwZGF0ZV9jaHVua3NfYW5kX2Jsb2NrcygpCisKKyAgICBzZWxmLl9pbWFnZS5zZWVrKHNlbGYuX3NwYXJzZV9lbmQsIG9zLlNFRUtfU0VUKQorICAgIHNlbGYuX2ltYWdlLndyaXRlKHN0cnVjdC5wYWNrKEltYWdlQ2h1bmsuRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlQ2h1bmsuVFlQRV9GSUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAjIFJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAvIHNlbGYuYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICsgc3RydWN0LmNhbGNzaXplKEltYWdlQ2h1bmsuRk9STUFUKSkpCisgICAgc2VsZi5faW1hZ2Uud3JpdGUoZmlsbF9kYXRhKQorICAgIHNlbGYuX3JlYWRfaGVhZGVyKCkKKworICBkZWYgc2VlayhzZWxmLCBvZmZzZXQpOgorICAgICIiIlNldHMgdGhlIGN1cnNvciBwb3NpdGlvbiBmb3IgcmVhZGluZyBmcm9tIHVuc3BhcnNpZmllZCBmaWxlLgorCisgICAgQXJndW1lbnRzOgorICAgICAgb2Zmc2V0OiBPZmZzZXQgdG8gc2VlayB0byBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgICAgIiIiCisgICAgc2VsZi5fZmlsZV9wb3MgPSBvZmZzZXQKKworICBkZWYgcmVhZChzZWxmLCBzaXplKToKKyAgICAiIiJSZWFkcyBkYXRhIGZyb20gdGhlIHVuc3BhcnNpZmllZCBmaWxlLgorCisgICAgVGhpcyBtZXRob2QgbWF5IHJldHVybiBmZXdlciB0aGFuIHxzaXplfCBieXRlcyBvZiBkYXRhIGlmIHRoZSBlbmQKKyAgICBvZiB0aGUgZmlsZSB3YXMgZW5jb3VudGVyZWQuCisKKyAgICBUaGUgZmlsZSBjdXJzb3IgZm9yIHJlYWRpbmcgaXMgYWR2YW5jZWQgYnkgdGhlIG51bWJlciBvZiBieXRlcworICAgIHJlYWQuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBzaXplOiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgZGF0YS4KKworICAgICIiIgorICAgIGlmIG5vdCBzZWxmLmlzX3NwYXJzZToKKyAgICAgIHNlbGYuX2ltYWdlLnNlZWsoc2VsZi5fZmlsZV9wb3MpCisgICAgICBkYXRhID0gc2VsZi5faW1hZ2UucmVhZChzaXplKQorICAgICAgc2VsZi5fZmlsZV9wb3MgKz0gbGVuKGRhdGEpCisgICAgICByZXR1cm4gZGF0YQorCisgICAgIyBJdGVyYXRlIG92ZXIgYWxsIGNodW5rcy4KKyAgICBjaHVua19pZHggPSBiaXNlY3QuYmlzZWN0X3JpZ2h0KHNlbGYuX2NodW5rX291dHB1dF9vZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZV9wb3MpIC0gMQorICAgIGRhdGEgPSBieXRlYXJyYXkoKQorICAgIHRvX2dvID0gc2l6ZQorICAgIHdoaWxlIHRvX2dvID4gMDoKKyAgICAgIGNodW5rID0gc2VsZi5fY2h1bmtzW2NodW5rX2lkeF0KKyAgICAgIGNodW5rX3Bvc19vZmZzZXQgPSBzZWxmLl9maWxlX3BvcyAtIGNodW5rLm91dHB1dF9vZmZzZXQKKyAgICAgIGNodW5rX3Bvc190b19nbyA9IG1pbihjaHVuay5vdXRwdXRfc2l6ZSAtIGNodW5rX3Bvc19vZmZzZXQsIHRvX2dvKQorCisgICAgICBpZiBjaHVuay5jaHVua190eXBlID09IEltYWdlQ2h1bmsuVFlQRV9SQVc6CisgICAgICAgIHNlbGYuX2ltYWdlLnNlZWsoY2h1bmsuaW5wdXRfb2Zmc2V0ICsgY2h1bmtfcG9zX29mZnNldCkKKyAgICAgICAgZGF0YS5leHRlbmQoc2VsZi5faW1hZ2UucmVhZChjaHVua19wb3NfdG9fZ28pKQorICAgICAgZWxpZiBjaHVuay5jaHVua190eXBlID09IEltYWdlQ2h1bmsuVFlQRV9GSUxMOgorICAgICAgICBhbGxfZGF0YSA9IGNodW5rLmZpbGxfZGF0YSooY2h1bmtfcG9zX3RvX2dvL2xlbihjaHVuay5maWxsX2RhdGEpICsgMikKKyAgICAgICAgb2Zmc2V0X21vZCA9IGNodW5rX3Bvc19vZmZzZXQgJSBsZW4oY2h1bmsuZmlsbF9kYXRhKQorICAgICAgICBkYXRhLmV4dGVuZChhbGxfZGF0YVtvZmZzZXRfbW9kOihvZmZzZXRfbW9kICsgY2h1bmtfcG9zX3RvX2dvKV0pCisgICAgICBlbHNlOgorICAgICAgICBhc3NlcnQgY2h1bmsuY2h1bmtfdHlwZSA9PSBJbWFnZUNodW5rLlRZUEVfRE9OVF9DQVJFCisgICAgICAgIGRhdGEuZXh0ZW5kKCdcMCcgKiBjaHVua19wb3NfdG9fZ28pCisKKyAgICAgIHRvX2dvIC09IGNodW5rX3Bvc190b19nbworICAgICAgc2VsZi5fZmlsZV9wb3MgKz0gY2h1bmtfcG9zX3RvX2dvCisgICAgICBjaHVua19pZHggKz0gMQorICAgICAgIyBHZW5lcmF0ZSBwYXJ0aWFsIHJlYWQgaW4gY2FzZSBvZiBFT0YuCisgICAgICBpZiBjaHVua19pZHggPj0gbGVuKHNlbGYuX2NodW5rcyk6CisgICAgICAgIGJyZWFrCisKKyAgICByZXR1cm4gZGF0YQorCisgIGRlZiB0ZWxsKHNlbGYpOgorICAgICIiIlJldHVybnMgdGhlIGZpbGUgY3Vyc29yIHBvc2l0aW9uIGZvciByZWFkaW5nIGZyb20gdW5zcGFyc2lmaWVkIGZpbGUuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGZpbGUgY3Vyc29yIHBvc2l0aW9uIGZvciByZWFkaW5nLgorICAgICIiIgorICAgIHJldHVybiBzZWxmLl9maWxlX3BvcworCisgIGRlZiB0cnVuY2F0ZShzZWxmLCBzaXplKToKKyAgICAiIiJUcnVuY2F0ZXMgdGhlIHVuc3BhcnNpZmllZCBmaWxlLgorCisgICAgQXJndW1lbnRzOgorICAgICAgc2l6ZTogRGVzaXJlZCBzaXplIG9mIHVuc3BhcnNpZmllZCBmaWxlLgorCisgICAgUmFpc2VzOgorICAgICAgVmFsdWVFcnJvcjogSWYgZGVzaXJlZCBzaXplIGlzbid0IGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuCisgICAgIiIiCisgICAgaWYgbm90IHNlbGYuaXNfc3BhcnNlOgorICAgICAgc2VsZi5faW1hZ2UudHJ1bmNhdGUoc2l6ZSkKKyAgICAgIHNlbGYuX3JlYWRfaGVhZGVyKCkKKyAgICAgIHJldHVybgorCisgICAgaWYgc2l6ZSAlIHNlbGYuYmxvY2tfc2l6ZSAhPSAwOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcignQ2Fubm90IHRydW5jYXRlIHRvIGEgc2l6ZSB3aGljaCBpcyBub3QgYSBtdWx0aXBsZSAnCisgICAgICAgICAgICAgICAgICAgICAgICdvZiB0aGUgYmxvY2sgc2l6ZScpCisKKyAgICBpZiBzaXplID09IHNlbGYuaW1hZ2Vfc2l6ZToKKyAgICAgICMgVHJpdmlhbCB3aGVyZSB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCisgICAgICByZXR1cm4KKyAgICBlbGlmIHNpemUgPCBzZWxmLmltYWdlX3NpemU6CisgICAgICBjaHVua19pZHggPSBiaXNlY3QuYmlzZWN0X3JpZ2h0KHNlbGYuX2NodW5rX291dHB1dF9vZmZzZXRzLCBzaXplKSAtIDEKKyAgICAgIGNodW5rID0gc2VsZi5fY2h1bmtzW2NodW5rX2lkeF0KKyAgICAgIGlmIGNodW5rLm91dHB1dF9vZmZzZXQgIT0gc2l6ZToKKyAgICAgICAgIyBUcnVuY2F0aW9uIGluIHRoZSBtaWRkbGUgb2YgYSB0cnVuayAtIG5lZWQgdG8ga2VlcCB0aGUgY2h1bmsKKyAgICAgICAgIyBhbmQgbW9kaWZ5IGl0LgorICAgICAgICBjaHVua19pZHhfZm9yX3VwZGF0ZSA9IGNodW5rX2lkeCArIDEKKyAgICAgICAgbnVtX3RvX2tlZXAgPSBzaXplIC0gY2h1bmsub3V0cHV0X29mZnNldAorICAgICAgICBhc3NlcnQgbnVtX3RvX2tlZXAgJSBzZWxmLmJsb2NrX3NpemUgPT0gMAorICAgICAgICBpZiBjaHVuay5jaHVua190eXBlID09IEltYWdlQ2h1bmsuVFlQRV9SQVc6CisgICAgICAgICAgdHJ1bmNhdGVfYXQgPSAoY2h1bmsuY2h1bmtfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QuY2FsY3NpemUoSW1hZ2VDaHVuay5GT1JNQVQpICsgbnVtX3RvX2tlZXApCisgICAgICAgICAgZGF0YV9zeiA9IG51bV90b19rZWVwCisgICAgICAgIGVsaWYgY2h1bmsuY2h1bmtfdHlwZSA9PSBJbWFnZUNodW5rLlRZUEVfRklMTDoKKyAgICAgICAgICB0cnVuY2F0ZV9hdCA9IChjaHVuay5jaHVua19vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5jYWxjc2l6ZShJbWFnZUNodW5rLkZPUk1BVCkgKyA0KQorICAgICAgICAgIGRhdGFfc3ogPSA0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgYXNzZXJ0IGNodW5rLmNodW5rX3R5cGUgPT0gSW1hZ2VDaHVuay5UWVBFX0RPTlRfQ0FSRQorICAgICAgICAgIHRydW5jYXRlX2F0ID0gY2h1bmsuY2h1bmtfb2Zmc2V0ICsgc3RydWN0LmNhbGNzaXplKEltYWdlQ2h1bmsuRk9STUFUKQorICAgICAgICAgIGRhdGFfc3ogPSAwCisgICAgICAgIGNodW5rX3N6ID0gbnVtX3RvX2tlZXAvc2VsZi5ibG9ja19zaXplCisgICAgICAgIHRvdGFsX3N6ID0gZGF0YV9zeiArIHN0cnVjdC5jYWxjc2l6ZShJbWFnZUNodW5rLkZPUk1BVCkKKyAgICAgICAgc2VsZi5faW1hZ2Uuc2VlayhjaHVuay5jaHVua19vZmZzZXQpCisgICAgICAgIHNlbGYuX2ltYWdlLndyaXRlKHN0cnVjdC5wYWNrKEltYWdlQ2h1bmsuRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuay5jaHVua190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgIyBSZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua19zeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfc3opKQorICAgICAgICBjaHVuay5vdXRwdXRfc2l6ZSA9IG51bV90b19rZWVwCisgICAgICBlbHNlOgorICAgICAgICAjIFRydW5jYXRpb24gYXQgdHJ1bmsgYm91bmRhcnkuCisgICAgICAgIHRydW5jYXRlX2F0ID0gY2h1bmsuY2h1bmtfb2Zmc2V0CisgICAgICAgIGNodW5rX2lkeF9mb3JfdXBkYXRlID0gY2h1bmtfaWR4CisKKyAgICAgIHNlbGYuX251bV90b3RhbF9jaHVua3MgPSBjaHVua19pZHhfZm9yX3VwZGF0ZQorICAgICAgc2VsZi5fbnVtX3RvdGFsX2Jsb2NrcyA9IDAKKyAgICAgIGZvciBpIGluIHJhbmdlKDAsIGNodW5rX2lkeF9mb3JfdXBkYXRlKToKKyAgICAgICAgc2VsZi5fbnVtX3RvdGFsX2Jsb2NrcyArPSBzZWxmLl9jaHVua3NbaV0ub3V0cHV0X3NpemUgLyBzZWxmLmJsb2NrX3NpemUKKyAgICAgIHNlbGYuX3VwZGF0ZV9jaHVua3NfYW5kX2Jsb2NrcygpCisgICAgICBzZWxmLl9pbWFnZS50cnVuY2F0ZSh0cnVuY2F0ZV9hdCkKKworICAgICAgIyBXZSd2ZSBtb2RpZmllZCB0aGUgZmlsZSBzbyByZS1yZWFkIGFsbCBkYXRhLgorICAgICAgc2VsZi5fcmVhZF9oZWFkZXIoKQorICAgIGVsc2U6CisgICAgICAjIFRydW5jYXRpbmcgdG8gZ3JvdyAtIGp1c3QgYWRkIGEgRE9OVF9DQVJFIHNlY3Rpb24uCisgICAgICBzZWxmLmFwcGVuZF9kb250X2NhcmUoc2l6ZSAtIHNlbGYuaW1hZ2Vfc2l6ZSkKKworCitjbGFzcyBBdmJEZXNjcmlwdG9yKG9iamVjdCk6CisgICIiIkNsYXNzIGZvciBBVkIgZGVzY3JpcHRvci4KKworICBTZWUgdGhlIHxBdmJEZXNjcmlwdG9yfCBDIHN0cnVjdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICBBdHRyaWJ1dGVzOgorICAgIHRhZzogVGhlIHRhZyBpZGVudGlmeWluZyB3aGF0IGtpbmQgb2YgZGVzY3JpcHRvciB0aGlzIGlzLgorICAgIGRhdGE6IFRoZSBkYXRhIGluIHRoZSBkZXNjcmlwdG9yLgorICAiIiIKKworICBTSVpFID0gMTYKKyAgRk9STUFUX1NUUklORyA9ICgnIVFRJykgICMgdGFnLCBudW1fYnl0ZXNfZm9sbG93aW5nIChkZXNjcmlwdG9yIGhlYWRlcikKKworICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgIiIiSW5pdGlhbGl6ZXMgYSBuZXcgcHJvcGVydHkgZGVzY3JpcHRvci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIGRhdGE6IElmIG5vdCBOb25lLCBtdXN0IGJlIGEgYnl0ZWFycmF5KCkuCisKKyAgICBSYWlzZXM6CisgICAgICBMb29rdXBFcnJvcjogSWYgdGhlIGdpdmVuIGRlc2NyaXB0b3IgaXMgbWFsZm9ybWVkLgorICAgICIiIgorICAgIGFzc2VydCBzdHJ1Y3QuY2FsY3NpemUoc2VsZi5GT1JNQVRfU1RSSU5HKSA9PSBzZWxmLlNJWkUKKworICAgIGlmIGRhdGE6CisgICAgICAoc2VsZi50YWcsIG51bV9ieXRlc19mb2xsb3dpbmcpID0gKAorICAgICAgICAgIHN0cnVjdC51bnBhY2soc2VsZi5GT1JNQVRfU1RSSU5HLCBkYXRhWzA6c2VsZi5TSVpFXSkpCisgICAgICBzZWxmLmRhdGEgPSBkYXRhW3NlbGYuU0laRTpzZWxmLlNJWkUgKyBudW1fYnl0ZXNfZm9sbG93aW5nXQorICAgIGVsc2U6CisgICAgICBzZWxmLnRhZyA9IE5vbmUKKyAgICAgIHNlbGYuZGF0YSA9IE5vbmUKKworICBkZWYgcHJpbnRfZGVzYyhzZWxmLCBvKToKKyAgICAiIiJQcmludCB0aGUgZGVzY3JpcHRvci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIG86IFRoZSBvYmplY3QgdG8gd3JpdGUgdGhlIG91dHB1dCB0by4KKyAgICAiIiIKKyAgICBvLndyaXRlKCcgICAgVW5rbm93biBkZXNjcmlwdG9yOlxuJykKKyAgICBvLndyaXRlKCcgICAgICBUYWc6ICB7fVxuJy5mb3JtYXQoc2VsZi50YWcpKQorICAgIGlmIGxlbihzZWxmLmRhdGEpIDwgMjU2OgorICAgICAgby53cml0ZSgnICAgICAgRGF0YToge30gKHt9IGJ5dGVzKVxuJy5mb3JtYXQoCisgICAgICAgICAgcmVwcihzdHIoc2VsZi5kYXRhKSksIGxlbihzZWxmLmRhdGEpKSkKKyAgICBlbHNlOgorICAgICAgby53cml0ZSgnICAgICAgRGF0YToge30gYnl0ZXNcbicuZm9ybWF0KGxlbihzZWxmLmRhdGEpKSkKKworICBkZWYgZW5jb2RlKHNlbGYpOgorICAgICIiIlNlcmlhbGl6ZXMgdGhlIGRlc2NyaXB0b3IuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBieXRlYXJyYXkoKSB3aXRoIHRoZSBkZXNjcmlwdG9yIGRhdGEuCisgICAgIiIiCisgICAgbnVtX2J5dGVzX2ZvbGxvd2luZyA9IGxlbihzZWxmLmRhdGEpCisgICAgbmJmX3dpdGhfcGFkZGluZyA9IHJvdW5kX3RvX211bHRpcGxlKG51bV9ieXRlc19mb2xsb3dpbmcsIDgpCisgICAgcGFkZGluZ19zaXplID0gbmJmX3dpdGhfcGFkZGluZyAtIG51bV9ieXRlc19mb2xsb3dpbmcKKyAgICBkZXNjID0gc3RydWN0LnBhY2soc2VsZi5GT1JNQVRfU1RSSU5HLCBzZWxmLnRhZywgbmJmX3dpdGhfcGFkZGluZykKKyAgICBwYWRkaW5nID0gc3RydWN0LnBhY2soc3RyKHBhZGRpbmdfc2l6ZSkgKyAneCcpCisgICAgcmV0ID0gZGVzYyArIHNlbGYuZGF0YSArIHBhZGRpbmcKKyAgICByZXR1cm4gYnl0ZWFycmF5KHJldCkKKworCitjbGFzcyBBdmJQcm9wZXJ0eURlc2NyaXB0b3IoQXZiRGVzY3JpcHRvcik6CisgICIiIkEgY2xhc3MgZm9yIHByb3BlcnR5IGRlc2NyaXB0b3JzLgorCisgIFNlZSB0aGUgfEF2YlByb3BlcnR5RGVzY3JpcHRvcnwgQyBzdHJ1Y3QgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgQXR0cmlidXRlczoKKyAgICBrZXk6IFRoZSBrZXkuCisgICAgdmFsdWU6IFRoZSBrZXkuCisgICIiIgorCisgIFRBRyA9IDAKKyAgU0laRSA9IDMyCisgIEZPUk1BVF9TVFJJTkcgPSAoJyFRUScgICMgdGFnLCBudW1fYnl0ZXNfZm9sbG93aW5nIChkZXNjcmlwdG9yIGhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAnUScgICMga2V5IHNpemUgKGJ5dGVzKQorICAgICAgICAgICAgICAgICAgICdRJykgICMgdmFsdWUgc2l6ZSAoYnl0ZXMpCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGE9Tm9uZSk6CisgICAgIiIiSW5pdGlhbGl6ZXMgYSBuZXcgcHJvcGVydHkgZGVzY3JpcHRvci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIGRhdGE6IElmIG5vdCBOb25lLCBtdXN0IGJlIGEgYnl0ZWFycmF5IG9mIHNpemUgfFNJWkV8LgorCisgICAgUmFpc2VzOgorICAgICAgTG9va3VwRXJyb3I6IElmIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGlzIG1hbGZvcm1lZC4KKyAgICAiIiIKKyAgICBBdmJEZXNjcmlwdG9yLl9faW5pdF9fKHNlbGYsIE5vbmUpCisgICAgYXNzZXJ0IHN0cnVjdC5jYWxjc2l6ZShzZWxmLkZPUk1BVF9TVFJJTkcpID09IHNlbGYuU0laRQorCisgICAgaWYgZGF0YToKKyAgICAgICh0YWcsIG51bV9ieXRlc19mb2xsb3dpbmcsIGtleV9zaXplLAorICAgICAgIHZhbHVlX3NpemUpID0gc3RydWN0LnVucGFjayhzZWxmLkZPUk1BVF9TVFJJTkcsIGRhdGFbMDpzZWxmLlNJWkVdKQorICAgICAgZXhwZWN0ZWRfc2l6ZSA9IHJvdW5kX3RvX211bHRpcGxlKAorICAgICAgICAgIHNlbGYuU0laRSAtIDE2ICsga2V5X3NpemUgKyAxICsgdmFsdWVfc2l6ZSArIDEsIDgpCisgICAgICBpZiB0YWcgIT0gc2VsZi5UQUcgb3IgbnVtX2J5dGVzX2ZvbGxvd2luZyAhPSBleHBlY3RlZF9zaXplOgorICAgICAgICByYWlzZSBMb29rdXBFcnJvcignR2l2ZW4gZGF0YSBkb2VzIG5vdCBsb29rIGxpa2UgYSBwcm9wZXJ0eSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yLicpCisgICAgICBzZWxmLmtleSA9IGRhdGFbc2VsZi5TSVpFOihzZWxmLlNJWkUgKyBrZXlfc2l6ZSldCisgICAgICBzZWxmLnZhbHVlID0gZGF0YVsoc2VsZi5TSVpFICsga2V5X3NpemUgKyAxKTooc2VsZi5TSVpFICsga2V5X3NpemUgKyAxICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zaXplKV0KKyAgICBlbHNlOgorICAgICAgc2VsZi5rZXkgPSAnJworICAgICAgc2VsZi52YWx1ZSA9ICcnCisKKyAgZGVmIHByaW50X2Rlc2Moc2VsZiwgbyk6CisgICAgIiIiUHJpbnQgdGhlIGRlc2NyaXB0b3IuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBvOiBUaGUgb2JqZWN0IHRvIHdyaXRlIHRoZSBvdXRwdXQgdG8uCisgICAgIiIiCisgICAgaWYgbGVuKHNlbGYudmFsdWUpIDwgMjU2OgorICAgICAgby53cml0ZSgnICAgIFByb3A6IHt9IC0+IHt9XG4nLmZvcm1hdChzZWxmLmtleSwgcmVwcihzdHIoc2VsZi52YWx1ZSkpKSkKKyAgICBlbHNlOgorICAgICAgby53cml0ZSgnICAgIFByb3A6IHt9IC0+ICh7fSBieXRlcylcbicuZm9ybWF0KHNlbGYua2V5LCBsZW4oc2VsZi52YWx1ZSkpKQorCisgIGRlZiBlbmNvZGUoc2VsZik6CisgICAgIiIiU2VyaWFsaXplcyB0aGUgZGVzY3JpcHRvci4KKworICAgIFJldHVybnM6CisgICAgICBBIGJ5dGVhcnJheSgpIHdpdGggdGhlIGRlc2NyaXB0b3IgZGF0YS4KKyAgICAiIiIKKyAgICBudW1fYnl0ZXNfZm9sbG93aW5nID0gc2VsZi5TSVpFICsgbGVuKHNlbGYua2V5KSArIGxlbihzZWxmLnZhbHVlKSArIDIgLSAxNgorICAgIG5iZl93aXRoX3BhZGRpbmcgPSByb3VuZF90b19tdWx0aXBsZShudW1fYnl0ZXNfZm9sbG93aW5nLCA4KQorICAgIHBhZGRpbmdfc2l6ZSA9IG5iZl93aXRoX3BhZGRpbmcgLSBudW1fYnl0ZXNfZm9sbG93aW5nCisgICAgZGVzYyA9IHN0cnVjdC5wYWNrKHNlbGYuRk9STUFUX1NUUklORywgc2VsZi5UQUcsIG5iZl93aXRoX3BhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIGxlbihzZWxmLmtleSksIGxlbihzZWxmLnZhbHVlKSkKKyAgICBwYWRkaW5nID0gc3RydWN0LnBhY2soc3RyKHBhZGRpbmdfc2l6ZSkgKyAneCcpCisgICAgcmV0ID0gZGVzYyArIHNlbGYua2V5ICsgJ1wwJyArIHNlbGYudmFsdWUgKyAnXDAnICsgcGFkZGluZworICAgIHJldHVybiBieXRlYXJyYXkocmV0KQorCisKK2NsYXNzIEF2Ykhhc2h0cmVlRGVzY3JpcHRvcihBdmJEZXNjcmlwdG9yKToKKyAgIiIiQSBjbGFzcyBmb3IgaGFzaHRyZWUgZGVzY3JpcHRvcnMuCisKKyAgU2VlIHRoZSB8QXZiSGFzaHRyZWVEZXNjcmlwdG9yfCBDIHN0cnVjdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICBBdHRyaWJ1dGVzOgorICAgIGRtX3Zlcml0eV92ZXJzaW9uOiBkbS12ZXJpdHkgdmVyc2lvbiB1c2VkLgorICAgIGltYWdlX3NpemU6IFNpemUgb2YgdGhlIGltYWdlLCBhZnRlciByb3VuZGluZyB1cCB0byB8YmxvY2tfc2l6ZXwuCisgICAgdHJlZV9vZmZzZXQ6IE9mZnNldCBvZiB0aGUgaGFzaCB0cmVlIGluIHRoZSBmaWxlLgorICAgIHRyZWVfc2l6ZTogU2l6ZSBvZiB0aGUgdHJlZS4KKyAgICBkYXRhX2Jsb2NrX3NpemU6IERhdGEgYmxvY2sgc2l6ZQorICAgIGhhc2hfYmxvY2tfc2l6ZTogSGFzaCBibG9jayBzaXplCisgICAgZmVjX251bV9yb290czogTnVtYmVyIG9mIHJvb3RzIHVzZWQgZm9yIEZFQyAoMCBpZiBGRUMgaXMgbm90IHVzZWQpLgorICAgIGZlY19vZmZzZXQ6IE9mZnNldCBvZiBGRUMgZGF0YSAoMCBpZiBGRUMgaXMgbm90IHVzZWQpLgorICAgIGZlY19zaXplOiBTaXplIG9mIEZFQyBkYXRhICgwIGlmIEZFQyBpcyBub3QgdXNlZCkuCisgICAgaGFzaF9hbGdvcml0aG06IEhhc2ggYWxnb3JpdGhtIHVzZWQuCisgICAgcGFydGl0aW9uX25hbWU6IFBhcnRpdGlvbiBuYW1lLgorICAgIHNhbHQ6IFNhbHQgdXNlZC4KKyAgICByb290X2RpZ2VzdDogUm9vdCBkaWdlc3QuCisgICIiIgorCisgIFRBRyA9IDEKKyAgUkVTRVJWRUQgPSA2NAorICBTSVpFID0gMTE2ICsgUkVTRVJWRUQKKyAgRk9STUFUX1NUUklORyA9ICgnIVFRJyAgIyB0YWcsIG51bV9ieXRlc19mb2xsb3dpbmcgKGRlc2NyaXB0b3IgaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICdMJyAgIyBkbS12ZXJpdHkgdmVyc2lvbiB1c2VkCisgICAgICAgICAgICAgICAgICAgJ1EnICAjIGltYWdlIHNpemUgKGJ5dGVzKQorICAgICAgICAgICAgICAgICAgICdRJyAgIyB0cmVlIG9mZnNldCAoYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgJ1EnICAjIHRyZWUgc2l6ZSAoYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgJ0wnICAjIGRhdGEgYmxvY2sgc2l6ZSAoYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgJ0wnICAjIGhhc2ggYmxvY2sgc2l6ZSAoYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgJ0wnICAjIEZFQyBudW1iZXIgb2Ygcm9vdHMKKyAgICAgICAgICAgICAgICAgICAnUScgICMgRkVDIG9mZnNldCAoYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgJ1EnICAjIEZFQyBzaXplIChieXRlcykKKyAgICAgICAgICAgICAgICAgICAnMzJzJyAgIyBoYXNoIGFsZ29yaXRobSB1c2VkCisgICAgICAgICAgICAgICAgICAgJ0wnICAjIHBhcnRpdGlvbiBuYW1lIChieXRlcykKKyAgICAgICAgICAgICAgICAgICAnTCcgICMgc2FsdCBsZW5ndGggKGJ5dGVzKQorICAgICAgICAgICAgICAgICAgICdMJyArICAjIHJvb3QgZGlnZXN0IGxlbmd0aCAoYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgc3RyKFJFU0VSVkVEKSArICdzJykgICMgcmVzZXJ2ZWQKKworICBkZWYgX19pbml0X18oc2VsZiwgZGF0YT1Ob25lKToKKyAgICAiIiJJbml0aWFsaXplcyBhIG5ldyBoYXNodHJlZSBkZXNjcmlwdG9yLgorCisgICAgQXJndW1lbnRzOgorICAgICAgZGF0YTogSWYgbm90IE5vbmUsIG11c3QgYmUgYSBieXRlYXJyYXkgb2Ygc2l6ZSB8U0laRXwuCisKKyAgICBSYWlzZXM6CisgICAgICBMb29rdXBFcnJvcjogSWYgdGhlIGdpdmVuIGRlc2NyaXB0b3IgaXMgbWFsZm9ybWVkLgorICAgICIiIgorICAgIEF2YkRlc2NyaXB0b3IuX19pbml0X18oc2VsZiwgTm9uZSkKKyAgICBhc3NlcnQgc3RydWN0LmNhbGNzaXplKHNlbGYuRk9STUFUX1NUUklORykgPT0gc2VsZi5TSVpFCisKKyAgICBpZiBkYXRhOgorICAgICAgKHRhZywgbnVtX2J5dGVzX2ZvbGxvd2luZywgc2VsZi5kbV92ZXJpdHlfdmVyc2lvbiwgc2VsZi5pbWFnZV9zaXplLAorICAgICAgIHNlbGYudHJlZV9vZmZzZXQsIHNlbGYudHJlZV9zaXplLCBzZWxmLmRhdGFfYmxvY2tfc2l6ZSwKKyAgICAgICBzZWxmLmhhc2hfYmxvY2tfc2l6ZSwgc2VsZi5mZWNfbnVtX3Jvb3RzLCBzZWxmLmZlY19vZmZzZXQsIHNlbGYuZmVjX3NpemUsCisgICAgICAgc2VsZi5oYXNoX2FsZ29yaXRobSwgcGFydGl0aW9uX25hbWVfbGVuLCBzYWx0X2xlbiwKKyAgICAgICByb290X2RpZ2VzdF9sZW4sIF8pID0gc3RydWN0LnVucGFjayhzZWxmLkZPUk1BVF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswOnNlbGYuU0laRV0pCisgICAgICBleHBlY3RlZF9zaXplID0gcm91bmRfdG9fbXVsdGlwbGUoCisgICAgICAgICAgc2VsZi5TSVpFIC0gMTYgKyBwYXJ0aXRpb25fbmFtZV9sZW4gKyBzYWx0X2xlbiArIHJvb3RfZGlnZXN0X2xlbiwgOCkKKyAgICAgIGlmIHRhZyAhPSBzZWxmLlRBRyBvciBudW1fYnl0ZXNfZm9sbG93aW5nICE9IGV4cGVjdGVkX3NpemU6CisgICAgICAgIHJhaXNlIExvb2t1cEVycm9yKCdHaXZlbiBkYXRhIGRvZXMgbm90IGxvb2sgbGlrZSBhIGhhc2h0cmVlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3IuJykKKyAgICAgICMgTnVrZSBOVUwtYnl0ZXMgYXQgdGhlIGVuZC4KKyAgICAgIHNlbGYuaGFzaF9hbGdvcml0aG0gPSBzZWxmLmhhc2hfYWxnb3JpdGhtLnNwbGl0KCdcMCcsIDEpWzBdCisgICAgICBvID0gMAorICAgICAgc2VsZi5wYXJ0aXRpb25fbmFtZSA9IHN0cihkYXRhWyhzZWxmLlNJWkUgKyBvKTooc2VsZi5TSVpFICsgbyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fbmFtZV9sZW4pXSkKKyAgICAgICMgVmFsaWRhdGUgVVRGLTggLSBkZWNvZGUoKSByYWlzZXMgVW5pY29kZURlY29kZUVycm9yIGlmIG5vdCB2YWxpZCBVVEYtOC4KKyAgICAgIHNlbGYucGFydGl0aW9uX25hbWUuZGVjb2RlKCd1dGYtOCcpCisgICAgICBvICs9IHBhcnRpdGlvbl9uYW1lX2xlbgorICAgICAgc2VsZi5zYWx0ID0gZGF0YVsoc2VsZi5TSVpFICsgbyk6KHNlbGYuU0laRSArIG8gKyBzYWx0X2xlbildCisgICAgICBvICs9IHNhbHRfbGVuCisgICAgICBzZWxmLnJvb3RfZGlnZXN0ID0gZGF0YVsoc2VsZi5TSVpFICsgbyk6KHNlbGYuU0laRSArIG8gKyByb290X2RpZ2VzdF9sZW4pXQorICAgICAgaWYgcm9vdF9kaWdlc3RfbGVuICE9IGxlbihoYXNobGliLm5ldyhuYW1lPXNlbGYuaGFzaF9hbGdvcml0aG0pLmRpZ2VzdCgpKToKKyAgICAgICAgcmFpc2UgTG9va3VwRXJyb3IoJ3Jvb3RfZGlnZXN0X2xlbiBkb2VzblwndCBtYXRjaCBoYXNoIGFsZ29yaXRobScpCisKKyAgICBlbHNlOgorICAgICAgc2VsZi5kbV92ZXJpdHlfdmVyc2lvbiA9IDAKKyAgICAgIHNlbGYuaW1hZ2Vfc2l6ZSA9IDAKKyAgICAgIHNlbGYudHJlZV9vZmZzZXQgPSAwCisgICAgICBzZWxmLnRyZWVfc2l6ZSA9IDAKKyAgICAgIHNlbGYuZGF0YV9ibG9ja19zaXplID0gMAorICAgICAgc2VsZi5oYXNoX2Jsb2NrX3NpemUgPSAwCisgICAgICBzZWxmLmZlY19udW1fcm9vdHMgPSAwCisgICAgICBzZWxmLmZlY19vZmZzZXQgPSAwCisgICAgICBzZWxmLmZlY19zaXplID0gMAorICAgICAgc2VsZi5oYXNoX2FsZ29yaXRobSA9ICcnCisgICAgICBzZWxmLnBhcnRpdGlvbl9uYW1lID0gJycKKyAgICAgIHNlbGYuc2FsdCA9IGJ5dGVhcnJheSgpCisgICAgICBzZWxmLnJvb3RfZGlnZXN0ID0gYnl0ZWFycmF5KCkKKworICBkZWYgcHJpbnRfZGVzYyhzZWxmLCBvKToKKyAgICAiIiJQcmludCB0aGUgZGVzY3JpcHRvci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIG86IFRoZSBvYmplY3QgdG8gd3JpdGUgdGhlIG91dHB1dCB0by4KKyAgICAiIiIKKyAgICBvLndyaXRlKCcgICAgSGFzaHRyZWUgZGVzY3JpcHRvcjpcbicpCisgICAgby53cml0ZSgnICAgICAgVmVyc2lvbiBvZiBkbS12ZXJpdHk6ICB7fVxuJy5mb3JtYXQoc2VsZi5kbV92ZXJpdHlfdmVyc2lvbikpCisgICAgby53cml0ZSgnICAgICAgSW1hZ2UgU2l6ZTogICAgICAgICAgICB7fSBieXRlc1xuJy5mb3JtYXQoc2VsZi5pbWFnZV9zaXplKSkKKyAgICBvLndyaXRlKCcgICAgICBUcmVlIE9mZnNldDogICAgICAgICAgIHt9XG4nLmZvcm1hdChzZWxmLnRyZWVfb2Zmc2V0KSkKKyAgICBvLndyaXRlKCcgICAgICBUcmVlIFNpemU6ICAgICAgICAgICAgIHt9IGJ5dGVzXG4nLmZvcm1hdChzZWxmLnRyZWVfc2l6ZSkpCisgICAgby53cml0ZSgnICAgICAgRGF0YSBCbG9jayBTaXplOiAgICAgICB7fSBieXRlc1xuJy5mb3JtYXQoCisgICAgICAgIHNlbGYuZGF0YV9ibG9ja19zaXplKSkKKyAgICBvLndyaXRlKCcgICAgICBIYXNoIEJsb2NrIFNpemU6ICAgICAgIHt9IGJ5dGVzXG4nLmZvcm1hdCgKKyAgICAgICAgc2VsZi5oYXNoX2Jsb2NrX3NpemUpKQorICAgIG8ud3JpdGUoJyAgICAgIEZFQyBudW0gcm9vdHM6ICAgICAgICAge31cbicuZm9ybWF0KHNlbGYuZmVjX251bV9yb290cykpCisgICAgby53cml0ZSgnICAgICAgRkVDIG9mZnNldDogICAgICAgICAgICB7fVxuJy5mb3JtYXQoc2VsZi5mZWNfb2Zmc2V0KSkKKyAgICBvLndyaXRlKCcgICAgICBGRUMgc2l6ZTogICAgICAgICAgICAgIHt9IGJ5dGVzXG4nLmZvcm1hdChzZWxmLmZlY19zaXplKSkKKyAgICBvLndyaXRlKCcgICAgICBIYXNoIEFsZ29yaXRobTogICAgICAgIHt9XG4nLmZvcm1hdChzZWxmLmhhc2hfYWxnb3JpdGhtKSkKKyAgICBvLndyaXRlKCcgICAgICBQYXJ0aXRpb24gTmFtZTogICAgICAgIHt9XG4nLmZvcm1hdChzZWxmLnBhcnRpdGlvbl9uYW1lKSkKKyAgICBvLndyaXRlKCcgICAgICBTYWx0OiAgICAgICAgICAgICAgICAgIHt9XG4nLmZvcm1hdChzdHIoc2VsZi5zYWx0KS5lbmNvZGUoCisgICAgICAgICdoZXgnKSkpCisgICAgby53cml0ZSgnICAgICAgUm9vdCBEaWdlc3Q6ICAgICAgICAgICB7fVxuJy5mb3JtYXQoc3RyKAorICAgICAgICBzZWxmLnJvb3RfZGlnZXN0KS5lbmNvZGUoJ2hleCcpKSkKKworICBkZWYgZW5jb2RlKHNlbGYpOgorICAgICIiIlNlcmlhbGl6ZXMgdGhlIGRlc2NyaXB0b3IuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBieXRlYXJyYXkoKSB3aXRoIHRoZSBkZXNjcmlwdG9yIGRhdGEuCisgICAgIiIiCisgICAgZW5jb2RlZF9uYW1lID0gc2VsZi5wYXJ0aXRpb25fbmFtZS5lbmNvZGUoJ3V0Zi04JykKKyAgICBudW1fYnl0ZXNfZm9sbG93aW5nID0gKHNlbGYuU0laRSArIGxlbihlbmNvZGVkX25hbWUpICsgbGVuKHNlbGYuc2FsdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKHNlbGYucm9vdF9kaWdlc3QpIC0gMTYpCisgICAgbmJmX3dpdGhfcGFkZGluZyA9IHJvdW5kX3RvX211bHRpcGxlKG51bV9ieXRlc19mb2xsb3dpbmcsIDgpCisgICAgcGFkZGluZ19zaXplID0gbmJmX3dpdGhfcGFkZGluZyAtIG51bV9ieXRlc19mb2xsb3dpbmcKKyAgICBkZXNjID0gc3RydWN0LnBhY2soc2VsZi5GT1JNQVRfU1RSSU5HLCBzZWxmLlRBRywgbmJmX3dpdGhfcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kbV92ZXJpdHlfdmVyc2lvbiwgc2VsZi5pbWFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWVfb2Zmc2V0LCBzZWxmLnRyZWVfc2l6ZSwgc2VsZi5kYXRhX2Jsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFzaF9ibG9ja19zaXplLCBzZWxmLmZlY19udW1fcm9vdHMsCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmVjX29mZnNldCwgc2VsZi5mZWNfc2l6ZSwgc2VsZi5oYXNoX2FsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGVuKGVuY29kZWRfbmFtZSksIGxlbihzZWxmLnNhbHQpLCBsZW4oc2VsZi5yb290X2RpZ2VzdCksCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuUkVTRVJWRUQqJ1wwJykKKyAgICBwYWRkaW5nID0gc3RydWN0LnBhY2soc3RyKHBhZGRpbmdfc2l6ZSkgKyAneCcpCisgICAgcmV0ID0gZGVzYyArIGVuY29kZWRfbmFtZSArIHNlbGYuc2FsdCArIHNlbGYucm9vdF9kaWdlc3QgKyBwYWRkaW5nCisgICAgcmV0dXJuIGJ5dGVhcnJheShyZXQpCisKKworY2xhc3MgQXZiSGFzaERlc2NyaXB0b3IoQXZiRGVzY3JpcHRvcik6CisgICIiIkEgY2xhc3MgZm9yIGhhc2ggZGVzY3JpcHRvcnMuCisKKyAgU2VlIHRoZSB8QXZiSGFzaERlc2NyaXB0b3J8IEMgc3RydWN0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisgIEF0dHJpYnV0ZXM6CisgICAgaW1hZ2Vfc2l6ZTogSW1hZ2Ugc2l6ZSwgaW4gYnl0ZXMuCisgICAgaGFzaF9hbGdvcml0aG06IEhhc2ggYWxnb3JpdGhtIHVzZWQuCisgICAgcGFydGl0aW9uX25hbWU6IFBhcnRpdGlvbiBuYW1lLgorICAgIHNhbHQ6IFNhbHQgdXNlZC4KKyAgICBkaWdlc3Q6IFRoZSBoYXNoIHZhbHVlIG9mIHNhbHQgYW5kIGRhdGEgY29tYmluZWQuCisgICIiIgorCisgIFRBRyA9IDIKKyAgUkVTRVJWRUQgPSA2NAorICBTSVpFID0gNjggKyBSRVNFUlZFRAorICBGT1JNQVRfU1RSSU5HID0gKCchUVEnICAjIHRhZywgbnVtX2J5dGVzX2ZvbGxvd2luZyAoZGVzY3JpcHRvciBoZWFkZXIpCisgICAgICAgICAgICAgICAgICAgJ1EnICAjIGltYWdlIHNpemUgKGJ5dGVzKQorICAgICAgICAgICAgICAgICAgICczMnMnICAjIGhhc2ggYWxnb3JpdGhtIHVzZWQKKyAgICAgICAgICAgICAgICAgICAnTCcgICMgcGFydGl0aW9uIG5hbWUgKGJ5dGVzKQorICAgICAgICAgICAgICAgICAgICdMJyAgIyBzYWx0IGxlbmd0aCAoYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgJ0wnICsgICMgZGlnZXN0IGxlbmd0aCAoYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgc3RyKFJFU0VSVkVEKSArICdzJykgICMgcmVzZXJ2ZWQKKworICBkZWYgX19pbml0X18oc2VsZiwgZGF0YT1Ob25lKToKKyAgICAiIiJJbml0aWFsaXplcyBhIG5ldyBoYXNoIGRlc2NyaXB0b3IuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBkYXRhOiBJZiBub3QgTm9uZSwgbXVzdCBiZSBhIGJ5dGVhcnJheSBvZiBzaXplIHxTSVpFfC4KKworICAgIFJhaXNlczoKKyAgICAgIExvb2t1cEVycm9yOiBJZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBpcyBtYWxmb3JtZWQuCisgICAgIiIiCisgICAgQXZiRGVzY3JpcHRvci5fX2luaXRfXyhzZWxmLCBOb25lKQorICAgIGFzc2VydCBzdHJ1Y3QuY2FsY3NpemUoc2VsZi5GT1JNQVRfU1RSSU5HKSA9PSBzZWxmLlNJWkUKKworICAgIGlmIGRhdGE6CisgICAgICAodGFnLCBudW1fYnl0ZXNfZm9sbG93aW5nLCBzZWxmLmltYWdlX3NpemUsIHNlbGYuaGFzaF9hbGdvcml0aG0sCisgICAgICAgcGFydGl0aW9uX25hbWVfbGVuLCBzYWx0X2xlbiwKKyAgICAgICBkaWdlc3RfbGVuLCBfKSA9IHN0cnVjdC51bnBhY2soc2VsZi5GT1JNQVRfU1RSSU5HLCBkYXRhWzA6c2VsZi5TSVpFXSkKKyAgICAgIGV4cGVjdGVkX3NpemUgPSByb3VuZF90b19tdWx0aXBsZSgKKyAgICAgICAgICBzZWxmLlNJWkUgLSAxNiArIHBhcnRpdGlvbl9uYW1lX2xlbiArIHNhbHRfbGVuICsgZGlnZXN0X2xlbiwgOCkKKyAgICAgIGlmIHRhZyAhPSBzZWxmLlRBRyBvciBudW1fYnl0ZXNfZm9sbG93aW5nICE9IGV4cGVjdGVkX3NpemU6CisgICAgICAgIHJhaXNlIExvb2t1cEVycm9yKCdHaXZlbiBkYXRhIGRvZXMgbm90IGxvb2sgbGlrZSBhIGhhc2ggJyAnZGVzY3JpcHRvci4nKQorICAgICAgIyBOdWtlIE5VTC1ieXRlcyBhdCB0aGUgZW5kLgorICAgICAgc2VsZi5oYXNoX2FsZ29yaXRobSA9IHNlbGYuaGFzaF9hbGdvcml0aG0uc3BsaXQoJ1wwJywgMSlbMF0KKyAgICAgIG8gPSAwCisgICAgICBzZWxmLnBhcnRpdGlvbl9uYW1lID0gc3RyKGRhdGFbKHNlbGYuU0laRSArIG8pOihzZWxmLlNJWkUgKyBvICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9uYW1lX2xlbildKQorICAgICAgIyBWYWxpZGF0ZSBVVEYtOCAtIGRlY29kZSgpIHJhaXNlcyBVbmljb2RlRGVjb2RlRXJyb3IgaWYgbm90IHZhbGlkIFVURi04LgorICAgICAgc2VsZi5wYXJ0aXRpb25fbmFtZS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgIG8gKz0gcGFydGl0aW9uX25hbWVfbGVuCisgICAgICBzZWxmLnNhbHQgPSBkYXRhWyhzZWxmLlNJWkUgKyBvKTooc2VsZi5TSVpFICsgbyArIHNhbHRfbGVuKV0KKyAgICAgIG8gKz0gc2FsdF9sZW4KKyAgICAgIHNlbGYuZGlnZXN0ID0gZGF0YVsoc2VsZi5TSVpFICsgbyk6KHNlbGYuU0laRSArIG8gKyBkaWdlc3RfbGVuKV0KKyAgICAgIGlmIGRpZ2VzdF9sZW4gIT0gbGVuKGhhc2hsaWIubmV3KG5hbWU9c2VsZi5oYXNoX2FsZ29yaXRobSkuZGlnZXN0KCkpOgorICAgICAgICByYWlzZSBMb29rdXBFcnJvcignZGlnZXN0X2xlbiBkb2VzblwndCBtYXRjaCBoYXNoIGFsZ29yaXRobScpCisKKyAgICBlbHNlOgorICAgICAgc2VsZi5pbWFnZV9zaXplID0gMAorICAgICAgc2VsZi5oYXNoX2FsZ29yaXRobSA9ICcnCisgICAgICBzZWxmLnBhcnRpdGlvbl9uYW1lID0gJycKKyAgICAgIHNlbGYuc2FsdCA9IGJ5dGVhcnJheSgpCisgICAgICBzZWxmLmRpZ2VzdCA9IGJ5dGVhcnJheSgpCisKKyAgZGVmIHByaW50X2Rlc2Moc2VsZiwgbyk6CisgICAgIiIiUHJpbnQgdGhlIGRlc2NyaXB0b3IuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBvOiBUaGUgb2JqZWN0IHRvIHdyaXRlIHRoZSBvdXRwdXQgdG8uCisgICAgIiIiCisgICAgby53cml0ZSgnICAgIEhhc2ggZGVzY3JpcHRvcjpcbicpCisgICAgby53cml0ZSgnICAgICAgSW1hZ2UgU2l6ZTogICAgICAgICAgICB7fSBieXRlc1xuJy5mb3JtYXQoc2VsZi5pbWFnZV9zaXplKSkKKyAgICBvLndyaXRlKCcgICAgICBIYXNoIEFsZ29yaXRobTogICAgICAgIHt9XG4nLmZvcm1hdChzZWxmLmhhc2hfYWxnb3JpdGhtKSkKKyAgICBvLndyaXRlKCcgICAgICBQYXJ0aXRpb24gTmFtZTogICAgICAgIHt9XG4nLmZvcm1hdChzZWxmLnBhcnRpdGlvbl9uYW1lKSkKKyAgICBvLndyaXRlKCcgICAgICBTYWx0OiAgICAgICAgICAgICAgICAgIHt9XG4nLmZvcm1hdChzdHIoc2VsZi5zYWx0KS5lbmNvZGUoCisgICAgICAgICdoZXgnKSkpCisgICAgby53cml0ZSgnICAgICAgRGlnZXN0OiAgICAgICAgICAgICAgICB7fVxuJy5mb3JtYXQoc3RyKHNlbGYuZGlnZXN0KS5lbmNvZGUoCisgICAgICAgICdoZXgnKSkpCisKKyAgZGVmIGVuY29kZShzZWxmKToKKyAgICAiIiJTZXJpYWxpemVzIHRoZSBkZXNjcmlwdG9yLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgYnl0ZWFycmF5KCkgd2l0aCB0aGUgZGVzY3JpcHRvciBkYXRhLgorICAgICIiIgorICAgIGVuY29kZWRfbmFtZSA9IHNlbGYucGFydGl0aW9uX25hbWUuZW5jb2RlKCd1dGYtOCcpCisgICAgbnVtX2J5dGVzX2ZvbGxvd2luZyA9ICgKKyAgICAgICAgc2VsZi5TSVpFICsgbGVuKGVuY29kZWRfbmFtZSkgKyBsZW4oc2VsZi5zYWx0KSArIGxlbihzZWxmLmRpZ2VzdCkgLSAxNikKKyAgICBuYmZfd2l0aF9wYWRkaW5nID0gcm91bmRfdG9fbXVsdGlwbGUobnVtX2J5dGVzX2ZvbGxvd2luZywgOCkKKyAgICBwYWRkaW5nX3NpemUgPSBuYmZfd2l0aF9wYWRkaW5nIC0gbnVtX2J5dGVzX2ZvbGxvd2luZworICAgIGRlc2MgPSBzdHJ1Y3QucGFjayhzZWxmLkZPUk1BVF9TVFJJTkcsIHNlbGYuVEFHLCBuYmZfd2l0aF9wYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmltYWdlX3NpemUsIHNlbGYuaGFzaF9hbGdvcml0aG0sIGxlbihlbmNvZGVkX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICBsZW4oc2VsZi5zYWx0KSwgbGVuKHNlbGYuZGlnZXN0KSwgc2VsZi5SRVNFUlZFRConXDAnKQorICAgIHBhZGRpbmcgPSBzdHJ1Y3QucGFjayhzdHIocGFkZGluZ19zaXplKSArICd4JykKKyAgICByZXQgPSBkZXNjICsgZW5jb2RlZF9uYW1lICsgc2VsZi5zYWx0ICsgc2VsZi5kaWdlc3QgKyBwYWRkaW5nCisgICAgcmV0dXJuIGJ5dGVhcnJheShyZXQpCisKKworY2xhc3MgQXZiS2VybmVsQ21kbGluZURlc2NyaXB0b3IoQXZiRGVzY3JpcHRvcik6CisgICIiIkEgY2xhc3MgZm9yIGtlcm5lbCBjb21tYW5kLWxpbmUgZGVzY3JpcHRvcnMuCisKKyAgU2VlIHRoZSB8QXZiS2VybmVsQ21kbGluZURlc2NyaXB0b3J8IEMgc3RydWN0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisgIEF0dHJpYnV0ZXM6CisgICAgZmxhZ3M6IEZsYWdzLgorICAgIGtlcm5lbF9jbWRsaW5lOiBUaGUga2VybmVsIGNvbW1hbmQtbGluZS4KKyAgIiIiCisKKyAgVEFHID0gMworICBTSVpFID0gMjQKKyAgRk9STUFUX1NUUklORyA9ICgnIVFRJyAgIyB0YWcsIG51bV9ieXRlc19mb2xsb3dpbmcgKGRlc2NyaXB0b3IgaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICdMJyAgIyBmbGFncworICAgICAgICAgICAgICAgICAgICdMJykgICMgY21kbGluZSBsZW5ndGggKGJ5dGVzKQorCisgIEZMQUdTX1VTRV9PTkxZX0lGX0hBU0hUUkVFX05PVF9ESVNBQkxFRCA9ICgxIDw8IDApCisgIEZMQUdTX1VTRV9PTkxZX0lGX0hBU0hUUkVFX0RJU0FCTEVEID0gKDEgPDwgMSkKKworICBkZWYgX19pbml0X18oc2VsZiwgZGF0YT1Ob25lKToKKyAgICAiIiJJbml0aWFsaXplcyBhIG5ldyBrZXJuZWwgY21kbGluZSBkZXNjcmlwdG9yLgorCisgICAgQXJndW1lbnRzOgorICAgICAgZGF0YTogSWYgbm90IE5vbmUsIG11c3QgYmUgYSBieXRlYXJyYXkgb2Ygc2l6ZSB8U0laRXwuCisKKyAgICBSYWlzZXM6CisgICAgICBMb29rdXBFcnJvcjogSWYgdGhlIGdpdmVuIGRlc2NyaXB0b3IgaXMgbWFsZm9ybWVkLgorICAgICIiIgorICAgIEF2YkRlc2NyaXB0b3IuX19pbml0X18oc2VsZiwgTm9uZSkKKyAgICBhc3NlcnQgc3RydWN0LmNhbGNzaXplKHNlbGYuRk9STUFUX1NUUklORykgPT0gc2VsZi5TSVpFCisKKyAgICBpZiBkYXRhOgorICAgICAgKHRhZywgbnVtX2J5dGVzX2ZvbGxvd2luZywgc2VsZi5mbGFncywga2VybmVsX2NtZGxpbmVfbGVuZ3RoKSA9ICgKKyAgICAgICAgICBzdHJ1Y3QudW5wYWNrKHNlbGYuRk9STUFUX1NUUklORywgZGF0YVswOnNlbGYuU0laRV0pKQorICAgICAgZXhwZWN0ZWRfc2l6ZSA9IHJvdW5kX3RvX211bHRpcGxlKHNlbGYuU0laRSAtIDE2ICsga2VybmVsX2NtZGxpbmVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpCisgICAgICBpZiB0YWcgIT0gc2VsZi5UQUcgb3IgbnVtX2J5dGVzX2ZvbGxvd2luZyAhPSBleHBlY3RlZF9zaXplOgorICAgICAgICByYWlzZSBMb29rdXBFcnJvcignR2l2ZW4gZGF0YSBkb2VzIG5vdCBsb29rIGxpa2UgYSBrZXJuZWwgY21kbGluZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yLicpCisgICAgICAjIE51a2UgTlVMLWJ5dGVzIGF0IHRoZSBlbmQuCisgICAgICBzZWxmLmtlcm5lbF9jbWRsaW5lID0gc3RyKGRhdGFbc2VsZi5TSVpFOihzZWxmLlNJWkUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsX2NtZGxpbmVfbGVuZ3RoKV0pCisgICAgICAjIFZhbGlkYXRlIFVURi04IC0gZGVjb2RlKCkgcmFpc2VzIFVuaWNvZGVEZWNvZGVFcnJvciBpZiBub3QgdmFsaWQgVVRGLTguCisgICAgICBzZWxmLmtlcm5lbF9jbWRsaW5lLmRlY29kZSgndXRmLTgnKQorICAgIGVsc2U6CisgICAgICBzZWxmLmZsYWdzID0gMAorICAgICAgc2VsZi5rZXJuZWxfY21kbGluZSA9ICcnCisKKyAgZGVmIHByaW50X2Rlc2Moc2VsZiwgbyk6CisgICAgIiIiUHJpbnQgdGhlIGRlc2NyaXB0b3IuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBvOiBUaGUgb2JqZWN0IHRvIHdyaXRlIHRoZSBvdXRwdXQgdG8uCisgICAgIiIiCisgICAgby53cml0ZSgnICAgIEtlcm5lbCBDbWRsaW5lIGRlc2NyaXB0b3I6XG4nKQorICAgIG8ud3JpdGUoJyAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAge31cbicuZm9ybWF0KHNlbGYuZmxhZ3MpKQorICAgIG8ud3JpdGUoJyAgICAgIEtlcm5lbCBDbWRsaW5lOiAgICAgICAge31cbicuZm9ybWF0KHJlcHIoCisgICAgICAgIHNlbGYua2VybmVsX2NtZGxpbmUpKSkKKworICBkZWYgZW5jb2RlKHNlbGYpOgorICAgICIiIlNlcmlhbGl6ZXMgdGhlIGRlc2NyaXB0b3IuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBieXRlYXJyYXkoKSB3aXRoIHRoZSBkZXNjcmlwdG9yIGRhdGEuCisgICAgIiIiCisgICAgZW5jb2RlZF9zdHIgPSBzZWxmLmtlcm5lbF9jbWRsaW5lLmVuY29kZSgndXRmLTgnKQorICAgIG51bV9ieXRlc19mb2xsb3dpbmcgPSAoc2VsZi5TSVpFICsgbGVuKGVuY29kZWRfc3RyKSAtIDE2KQorICAgIG5iZl93aXRoX3BhZGRpbmcgPSByb3VuZF90b19tdWx0aXBsZShudW1fYnl0ZXNfZm9sbG93aW5nLCA4KQorICAgIHBhZGRpbmdfc2l6ZSA9IG5iZl93aXRoX3BhZGRpbmcgLSBudW1fYnl0ZXNfZm9sbG93aW5nCisgICAgZGVzYyA9IHN0cnVjdC5wYWNrKHNlbGYuRk9STUFUX1NUUklORywgc2VsZi5UQUcsIG5iZl93aXRoX3BhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmxhZ3MsIGxlbihlbmNvZGVkX3N0cikpCisgICAgcGFkZGluZyA9IHN0cnVjdC5wYWNrKHN0cihwYWRkaW5nX3NpemUpICsgJ3gnKQorICAgIHJldCA9IGRlc2MgKyBlbmNvZGVkX3N0ciArIHBhZGRpbmcKKyAgICByZXR1cm4gYnl0ZWFycmF5KHJldCkKKworCitjbGFzcyBBdmJDaGFpblBhcnRpdGlvbkRlc2NyaXB0b3IoQXZiRGVzY3JpcHRvcik6CisgICIiIkEgY2xhc3MgZm9yIGNoYWluZWQgcGFydGl0aW9uIGRlc2NyaXB0b3JzLgorCisgIFNlZSB0aGUgfEF2YkNoYWluUGFydGl0aW9uRGVzY3JpcHRvcnwgQyBzdHJ1Y3QgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgQXR0cmlidXRlczoKKyAgICByb2xsYmFja19pbmRleF9sb2NhdGlvbjogVGhlIHJvbGxiYWNrIGluZGV4IGxvY2F0aW9uIHRvIHVzZS4KKyAgICBwYXJ0aXRpb25fbmFtZTogUGFydGl0aW9uIG5hbWUuCisgICAgcHVibGljX2tleTogQnl0ZXMgZm9yIHRoZSBwdWJsaWMga2V5LgorICAiIiIKKworICBUQUcgPSA0CisgIFJFU0VSVkVEID0gNjQKKyAgU0laRSA9IDI4ICsgUkVTRVJWRUQKKyAgRk9STUFUX1NUUklORyA9ICgnIVFRJyAgIyB0YWcsIG51bV9ieXRlc19mb2xsb3dpbmcgKGRlc2NyaXB0b3IgaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICdMJyAgIyByb2xsYmFja19pbmRleF9sb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICdMJyAgIyBwYXJ0aXRpb25fbmFtZV9zaXplIChieXRlcykKKyAgICAgICAgICAgICAgICAgICAnTCcgKyAgIyBwdWJsaWNfa2V5X3NpemUgKGJ5dGVzKQorICAgICAgICAgICAgICAgICAgIHN0cihSRVNFUlZFRCkgKyAncycpICAjIHJlc2VydmVkCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGE9Tm9uZSk6CisgICAgIiIiSW5pdGlhbGl6ZXMgYSBuZXcgY2hhaW4gcGFydGl0aW9uIGRlc2NyaXB0b3IuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBkYXRhOiBJZiBub3QgTm9uZSwgbXVzdCBiZSBhIGJ5dGVhcnJheSBvZiBzaXplIHxTSVpFfC4KKworICAgIFJhaXNlczoKKyAgICAgIExvb2t1cEVycm9yOiBJZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBpcyBtYWxmb3JtZWQuCisgICAgIiIiCisgICAgQXZiRGVzY3JpcHRvci5fX2luaXRfXyhzZWxmLCBOb25lKQorICAgIGFzc2VydCBzdHJ1Y3QuY2FsY3NpemUoc2VsZi5GT1JNQVRfU1RSSU5HKSA9PSBzZWxmLlNJWkUKKworICAgIGlmIGRhdGE6CisgICAgICAodGFnLCBudW1fYnl0ZXNfZm9sbG93aW5nLCBzZWxmLnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uLAorICAgICAgIHBhcnRpdGlvbl9uYW1lX2xlbiwKKyAgICAgICBwdWJsaWNfa2V5X2xlbiwgXykgPSBzdHJ1Y3QudW5wYWNrKHNlbGYuRk9STUFUX1NUUklORywgZGF0YVswOnNlbGYuU0laRV0pCisgICAgICBleHBlY3RlZF9zaXplID0gcm91bmRfdG9fbXVsdGlwbGUoCisgICAgICAgICAgc2VsZi5TSVpFIC0gMTYgKyBwYXJ0aXRpb25fbmFtZV9sZW4gKyBwdWJsaWNfa2V5X2xlbiwgOCkKKyAgICAgIGlmIHRhZyAhPSBzZWxmLlRBRyBvciBudW1fYnl0ZXNfZm9sbG93aW5nICE9IGV4cGVjdGVkX3NpemU6CisgICAgICAgIHJhaXNlIExvb2t1cEVycm9yKCdHaXZlbiBkYXRhIGRvZXMgbm90IGxvb2sgbGlrZSBhIGNoYWluIHBhcnRpdGlvbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yLicpCisgICAgICBvID0gMAorICAgICAgc2VsZi5wYXJ0aXRpb25fbmFtZSA9IHN0cihkYXRhWyhzZWxmLlNJWkUgKyBvKTooc2VsZi5TSVpFICsgbyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fbmFtZV9sZW4pXSkKKyAgICAgICMgVmFsaWRhdGUgVVRGLTggLSBkZWNvZGUoKSByYWlzZXMgVW5pY29kZURlY29kZUVycm9yIGlmIG5vdCB2YWxpZCBVVEYtOC4KKyAgICAgIHNlbGYucGFydGl0aW9uX25hbWUuZGVjb2RlKCd1dGYtOCcpCisgICAgICBvICs9IHBhcnRpdGlvbl9uYW1lX2xlbgorICAgICAgc2VsZi5wdWJsaWNfa2V5ID0gZGF0YVsoc2VsZi5TSVpFICsgbyk6KHNlbGYuU0laRSArIG8gKyBwdWJsaWNfa2V5X2xlbildCisKKyAgICBlbHNlOgorICAgICAgc2VsZi5yb2xsYmFja19pbmRleF9sb2NhdGlvbiA9IDAKKyAgICAgIHNlbGYucGFydGl0aW9uX25hbWUgPSAnJworICAgICAgc2VsZi5wdWJsaWNfa2V5ID0gYnl0ZWFycmF5KCkKKworICBkZWYgcHJpbnRfZGVzYyhzZWxmLCBvKToKKyAgICAiIiJQcmludCB0aGUgZGVzY3JpcHRvci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIG86IFRoZSBvYmplY3QgdG8gd3JpdGUgdGhlIG91dHB1dCB0by4KKyAgICAiIiIKKyAgICBvLndyaXRlKCcgICAgQ2hhaW4gUGFydGl0aW9uIGRlc2NyaXB0b3I6XG4nKQorICAgIG8ud3JpdGUoJyAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgICB7fVxuJy5mb3JtYXQoc2VsZi5wYXJ0aXRpb25fbmFtZSkpCisgICAgby53cml0ZSgnICAgICAgUm9sbGJhY2sgSW5kZXggTG9jYXRpb246IHt9XG4nLmZvcm1hdCgKKyAgICAgICAgc2VsZi5yb2xsYmFja19pbmRleF9sb2NhdGlvbikpCisgICAgIyBKdXN0IHNob3cgdGhlIFNIQTEgb2YgdGhlIGtleSwgZm9yIHNpemUgcmVhc29ucy4KKyAgICBoZXhkaWcgPSBoYXNobGliLnNoYTEoc2VsZi5wdWJsaWNfa2V5KS5oZXhkaWdlc3QoKQorICAgIG8ud3JpdGUoJyAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICB7fVxuJy5mb3JtYXQoaGV4ZGlnKSkKKworICBkZWYgZW5jb2RlKHNlbGYpOgorICAgICIiIlNlcmlhbGl6ZXMgdGhlIGRlc2NyaXB0b3IuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBieXRlYXJyYXkoKSB3aXRoIHRoZSBkZXNjcmlwdG9yIGRhdGEuCisgICAgIiIiCisgICAgZW5jb2RlZF9uYW1lID0gc2VsZi5wYXJ0aXRpb25fbmFtZS5lbmNvZGUoJ3V0Zi04JykKKyAgICBudW1fYnl0ZXNfZm9sbG93aW5nID0gKAorICAgICAgICBzZWxmLlNJWkUgKyBsZW4oZW5jb2RlZF9uYW1lKSArIGxlbihzZWxmLnB1YmxpY19rZXkpIC0gMTYpCisgICAgbmJmX3dpdGhfcGFkZGluZyA9IHJvdW5kX3RvX211bHRpcGxlKG51bV9ieXRlc19mb2xsb3dpbmcsIDgpCisgICAgcGFkZGluZ19zaXplID0gbmJmX3dpdGhfcGFkZGluZyAtIG51bV9ieXRlc19mb2xsb3dpbmcKKyAgICBkZXNjID0gc3RydWN0LnBhY2soc2VsZi5GT1JNQVRfU1RSSU5HLCBzZWxmLlRBRywgbmJmX3dpdGhfcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yb2xsYmFja19pbmRleF9sb2NhdGlvbiwgbGVuKGVuY29kZWRfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgIGxlbihzZWxmLnB1YmxpY19rZXkpLCBzZWxmLlJFU0VSVkVEKidcMCcpCisgICAgcGFkZGluZyA9IHN0cnVjdC5wYWNrKHN0cihwYWRkaW5nX3NpemUpICsgJ3gnKQorICAgIHJldCA9IGRlc2MgKyBlbmNvZGVkX25hbWUgKyBzZWxmLnB1YmxpY19rZXkgKyBwYWRkaW5nCisgICAgcmV0dXJuIGJ5dGVhcnJheShyZXQpCisKKworREVTQ1JJUFRPUl9DTEFTU0VTID0gWworICAgIEF2YlByb3BlcnR5RGVzY3JpcHRvciwgQXZiSGFzaHRyZWVEZXNjcmlwdG9yLCBBdmJIYXNoRGVzY3JpcHRvciwKKyAgICBBdmJLZXJuZWxDbWRsaW5lRGVzY3JpcHRvciwgQXZiQ2hhaW5QYXJ0aXRpb25EZXNjcmlwdG9yCitdCisKKworZGVmIHBhcnNlX2Rlc2NyaXB0b3JzKGRhdGEpOgorICAiIiJQYXJzZXMgYSBibG9iIG9mIGRhdGEgaW50byBkZXNjcmlwdG9ycy4KKworICBBcmd1bWVudHM6CisgICAgZGF0YTogQSBieXRlYXJyYXkoKSB3aXRoIGVuY29kZWQgZGVzY3JpcHRvcnMuCisKKyAgUmV0dXJuczoKKyAgICBBIGxpc3Qgb2YgaW5zdGFuY2VzIG9mIG9iamVjdHMgZGVyaXZlZCBmcm9tIEF2YkRlc2NyaXB0b3IuIEZvcgorICAgIHVua25vd24gZGVzY3JpcHRvcnMsIHRoZSBjbGFzcyBBdmJEZXNjcmlwdG9yIGlzIHVzZWQuCisgICIiIgorICBvID0gMAorICByZXQgPSBbXQorICB3aGlsZSBvIDwgbGVuKGRhdGEpOgorICAgIHRhZywgbmJfZm9sbG93aW5nID0gc3RydWN0LnVucGFjaygnITJRJywgZGF0YVtvOm8gKyAxNl0pCisgICAgaWYgdGFnIDwgbGVuKERFU0NSSVBUT1JfQ0xBU1NFUyk6CisgICAgICBjID0gREVTQ1JJUFRPUl9DTEFTU0VTW3RhZ10KKyAgICBlbHNlOgorICAgICAgYyA9IEF2YkRlc2NyaXB0b3IKKyAgICByZXQuYXBwZW5kKGMoYnl0ZWFycmF5KGRhdGFbbzpvICsgMTYgKyBuYl9mb2xsb3dpbmddKSkpCisgICAgbyArPSAxNiArIG5iX2ZvbGxvd2luZworICByZXR1cm4gcmV0CisKKworY2xhc3MgQXZiRm9vdGVyKG9iamVjdCk6CisgICIiIkEgY2xhc3MgZm9yIHBhcnNpbmcgYW5kIHdyaXRpbmcgZm9vdGVycy4KKworICBGb290ZXJzIGFyZSBzdG9yZWQgYXQgdGhlIGVuZCBvZiBwYXJ0aXRpb25zIGFuZCBwb2ludCB0byB3aGVyZSB0aGUKKyAgQXZiVkJNZXRhIGJsb2IgaXMgbG9jYXRlZC4gVGhleSBhbHNvIGNvbnRhaW4gdGhlIG9yaWdpbmFsIHNpemUgb2YKKyAgdGhlIGltYWdlIGJlZm9yZSBBVkIgaW5mb3JtYXRpb24gd2FzIGFkZGVkLgorCisgIEF0dHJpYnV0ZXM6CisgICAgbWFnaWM6IE1hZ2ljIGZvciBpZGVudGlmeWluZyB0aGUgZm9vdGVyLCBzZWUgfE1BR0lDfC4KKyAgICB2ZXJzaW9uX21ham9yOiBUaGUgbWFqb3IgdmVyc2lvbiBvZiBhdmJ0b29sIHRoYXQgd3JvdGUgdGhlIGZvb3Rlci4KKyAgICB2ZXJzaW9uX21pbm9yOiBUaGUgbWlub3IgdmVyc2lvbiBvZiBhdmJ0b29sIHRoYXQgd3JvdGUgdGhlIGZvb3Rlci4KKyAgICBvcmlnaW5hbF9pbWFnZV9zaXplOiBPcmlnaW5hbCBpbWFnZSBzaXplLgorICAgIHZibWV0YV9vZmZzZXQ6IE9mZnNldCBvZiB3aGVyZSB0aGUgQXZiVkJNZXRhIGJsb2IgaXMgc3RvcmVkLgorICAgIHZibWV0YV9zaXplOiBTaXplIG9mIHRoZSBBdmJWQk1ldGEgYmxvYi4KKyAgIiIiCisKKyAgTUFHSUMgPSAnQVZCZicKKyAgU0laRSA9IDY0CisgIFJFU0VSVkVEID0gMjgKKyAgRk9STUFUX1NUUklORyA9ICgnITRzMkwnICAjIG1hZ2ljLCAyIHggdmVyc2lvbi4KKyAgICAgICAgICAgICAgICAgICAnUScgICMgT3JpZ2luYWwgaW1hZ2Ugc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAnUScgICMgT2Zmc2V0IG9mIFZCTWV0YSBibG9iLgorICAgICAgICAgICAgICAgICAgICdRJyArICAjIFNpemUgb2YgVkJNZXRhIGJsb2IuCisgICAgICAgICAgICAgICAgICAgc3RyKFJFU0VSVkVEKSArICd4JykgICMgcGFkZGluZyBmb3IgcmVzZXJ2ZWQgYnl0ZXMKKworICBkZWYgX19pbml0X18oc2VsZiwgZGF0YT1Ob25lKToKKyAgICAiIiJJbml0aWFsaXplcyBhIG5ldyBmb290ZXIgb2JqZWN0LgorCisgICAgQXJndW1lbnRzOgorICAgICAgZGF0YTogSWYgbm90IE5vbmUsIG11c3QgYmUgYSBieXRlYXJyYXkgb2Ygc2l6ZSA0MDk2LgorCisgICAgUmFpc2VzOgorICAgICAgTG9va3VwRXJyb3I6IElmIHRoZSBnaXZlbiBmb290ZXIgaXMgbWFsZm9ybWVkLgorICAgICAgc3RydWN0LmVycm9yOiBJZiB0aGUgZ2l2ZW4gZGF0YSBoYXMgbm8gZm9vdGVyLgorICAgICIiIgorICAgIGFzc2VydCBzdHJ1Y3QuY2FsY3NpemUoc2VsZi5GT1JNQVRfU1RSSU5HKSA9PSBzZWxmLlNJWkUKKworICAgIGlmIGRhdGE6CisgICAgICAoc2VsZi5tYWdpYywgc2VsZi52ZXJzaW9uX21ham9yLCBzZWxmLnZlcnNpb25fbWlub3IsCisgICAgICAgc2VsZi5vcmlnaW5hbF9pbWFnZV9zaXplLCBzZWxmLnZibWV0YV9vZmZzZXQsCisgICAgICAgc2VsZi52Ym1ldGFfc2l6ZSkgPSBzdHJ1Y3QudW5wYWNrKHNlbGYuRk9STUFUX1NUUklORywgZGF0YSkKKyAgICAgIGlmIHNlbGYubWFnaWMgIT0gc2VsZi5NQUdJQzoKKyAgICAgICAgcmFpc2UgTG9va3VwRXJyb3IoJ0dpdmVuIGRhdGEgZG9lcyBub3QgbG9vayBsaWtlIGEgQVZCIGZvb3Rlci4nKQorICAgIGVsc2U6CisgICAgICBzZWxmLm1hZ2ljID0gc2VsZi5NQUdJQworICAgICAgc2VsZi52ZXJzaW9uX21ham9yID0gQVZCX1ZFUlNJT05fTUFKT1IKKyAgICAgIHNlbGYudmVyc2lvbl9taW5vciA9IEFWQl9WRVJTSU9OX01JTk9SCisgICAgICBzZWxmLm9yaWdpbmFsX2ltYWdlX3NpemUgPSAwCisgICAgICBzZWxmLnZibWV0YV9vZmZzZXQgPSAwCisgICAgICBzZWxmLnZibWV0YV9zaXplID0gMAorCisgIGRlZiBlbmNvZGUoc2VsZik6CisgICAgIiIiR2V0cyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGJpbmFyeSBlbmNvZGluZyBvZiB0aGUgZm9vdGVyLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgYnl0ZWFycmF5KCkgd2l0aCBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZm9vdGVyLgorICAgICIiIgorICAgIHJldHVybiBzdHJ1Y3QucGFjayhzZWxmLkZPUk1BVF9TVFJJTkcsIHNlbGYubWFnaWMsIHNlbGYudmVyc2lvbl9tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uX21pbm9yLCBzZWxmLm9yaWdpbmFsX2ltYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmJtZXRhX29mZnNldCwgc2VsZi52Ym1ldGFfc2l6ZSkKKworCitjbGFzcyBBdmJWQk1ldGFIZWFkZXIob2JqZWN0KToKKyAgIiIiQSBjbGFzcyBmb3IgcGFyc2luZyBhbmQgd3JpdGluZyBBVkIgdmJtZXRhIGltYWdlcy4KKworICBBdHRyaWJ1dGVzOgorICAgIFRoZSBhdHRyaWJ1dGVzIGNvcnJlc3BvbmQgdG8gdGhlIHxBdmJWQk1ldGFIZWFkZXJ8IHN0cnVjdAorICAgIGRlZmluZWQgaW4gYXZiX3ZibWV0YV9oZWFkZXIuaC4KKyAgIiIiCisKKyAgU0laRSA9IDI1NgorCisgICMgS2VlcCBpbiBzeW5jIHdpdGggfHJlc2VydmVkfCBmaWVsZCBvZiB8QXZiVkJNZXRhSW1hZ2VIZWFkZXJ8LgorICBSRVNFUlZFRCA9IDEzMgorCisgICMgS2VlcCBpbiBzeW5jIHdpdGggfEF2YlZCTWV0YUltYWdlSGVhZGVyfC4KKyAgRk9STUFUX1NUUklORyA9ICgnITRzMkwnICAjIG1hZ2ljLCAyIHggdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICcyUScgICMgMiB4IGJsb2NrIHNpemUKKyAgICAgICAgICAgICAgICAgICAnTCcgICMgYWxnb3JpdGhtIHR5cGUKKyAgICAgICAgICAgICAgICAgICAnMlEnICAjIG9mZnNldCwgc2l6ZSAoaGFzaCkKKyAgICAgICAgICAgICAgICAgICAnMlEnICAjIG9mZnNldCwgc2l6ZSAoc2lnbmF0dXJlKQorICAgICAgICAgICAgICAgICAgICcyUScgICMgb2Zmc2V0LCBzaXplIChwdWJsaWMga2V5KQorICAgICAgICAgICAgICAgICAgICcyUScgICMgb2Zmc2V0LCBzaXplIChwdWJsaWMga2V5IG1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICcyUScgICMgb2Zmc2V0LCBzaXplIChkZXNjcmlwdG9ycykKKyAgICAgICAgICAgICAgICAgICAnUScgICMgcm9sbGJhY2tfaW5kZXgKKyAgICAgICAgICAgICAgICAgICAnTCcgKyAgIyBmbGFncworICAgICAgICAgICAgICAgICAgIHN0cihSRVNFUlZFRCkgKyAneCcpICAjIHBhZGRpbmcgZm9yIHJlc2VydmVkIGJ5dGVzCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGE9Tm9uZSk6CisgICAgIiIiSW5pdGlhbGl6ZXMgYSBuZXcgaGVhZGVyIG9iamVjdC4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIGRhdGE6IElmIG5vdCBOb25lLCBtdXN0IGJlIGEgYnl0ZWFycmF5IG9mIHNpemUgODE5Mi4KKworICAgIFJhaXNlczoKKyAgICAgIEV4Y2VwdGlvbjogSWYgdGhlIGdpdmVuIGRhdGEgaXMgbWFsZm9ybWVkLgorICAgICIiIgorICAgIGFzc2VydCBzdHJ1Y3QuY2FsY3NpemUoc2VsZi5GT1JNQVRfU1RSSU5HKSA9PSBzZWxmLlNJWkUKKworICAgIGlmIGRhdGE6CisgICAgICAoc2VsZi5tYWdpYywgc2VsZi5oZWFkZXJfdmVyc2lvbl9tYWpvciwgc2VsZi5oZWFkZXJfdmVyc2lvbl9taW5vciwKKyAgICAgICBzZWxmLmF1dGhlbnRpY2F0aW9uX2RhdGFfYmxvY2tfc2l6ZSwgc2VsZi5hdXhpbGlhcnlfZGF0YV9ibG9ja19zaXplLAorICAgICAgIHNlbGYuYWxnb3JpdGhtX3R5cGUsIHNlbGYuaGFzaF9vZmZzZXQsIHNlbGYuaGFzaF9zaXplLAorICAgICAgIHNlbGYuc2lnbmF0dXJlX29mZnNldCwgc2VsZi5zaWduYXR1cmVfc2l6ZSwgc2VsZi5wdWJsaWNfa2V5X29mZnNldCwKKyAgICAgICBzZWxmLnB1YmxpY19rZXlfc2l6ZSwgc2VsZi5wdWJsaWNfa2V5X21ldGFkYXRhX29mZnNldCwKKyAgICAgICBzZWxmLnB1YmxpY19rZXlfbWV0YWRhdGFfc2l6ZSwgc2VsZi5kZXNjcmlwdG9yc19vZmZzZXQsCisgICAgICAgc2VsZi5kZXNjcmlwdG9yc19zaXplLAorICAgICAgIHNlbGYucm9sbGJhY2tfaW5kZXgsCisgICAgICAgc2VsZi5mbGFncykgPSBzdHJ1Y3QudW5wYWNrKHNlbGYuRk9STUFUX1NUUklORywgZGF0YSkKKyAgICAgICMgTnVrZSBOVUwtYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICAgICAgaWYgc2VsZi5tYWdpYyAhPSAnQVZCMCc6CisgICAgICAgIHJhaXNlIEF2YkVycm9yKCdHaXZlbiBpbWFnZSBkb2VzIG5vdCBsb29rIGxpa2UgYSB2Ym1ldGEgaW1hZ2UuJykKKyAgICBlbHNlOgorICAgICAgc2VsZi5tYWdpYyA9ICdBVkIwJworICAgICAgc2VsZi5oZWFkZXJfdmVyc2lvbl9tYWpvciA9IEFWQl9WRVJTSU9OX01BSk9SCisgICAgICBzZWxmLmhlYWRlcl92ZXJzaW9uX21pbm9yID0gQVZCX1ZFUlNJT05fTUlOT1IKKyAgICAgIHNlbGYuYXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplID0gMAorICAgICAgc2VsZi5hdXhpbGlhcnlfZGF0YV9ibG9ja19zaXplID0gMAorICAgICAgc2VsZi5hbGdvcml0aG1fdHlwZSA9IDAKKyAgICAgIHNlbGYuaGFzaF9vZmZzZXQgPSAwCisgICAgICBzZWxmLmhhc2hfc2l6ZSA9IDAKKyAgICAgIHNlbGYuc2lnbmF0dXJlX29mZnNldCA9IDAKKyAgICAgIHNlbGYuc2lnbmF0dXJlX3NpemUgPSAwCisgICAgICBzZWxmLnB1YmxpY19rZXlfb2Zmc2V0ID0gMAorICAgICAgc2VsZi5wdWJsaWNfa2V5X3NpemUgPSAwCisgICAgICBzZWxmLnB1YmxpY19rZXlfbWV0YWRhdGFfb2Zmc2V0ID0gMAorICAgICAgc2VsZi5wdWJsaWNfa2V5X21ldGFkYXRhX3NpemUgPSAwCisgICAgICBzZWxmLmRlc2NyaXB0b3JzX29mZnNldCA9IDAKKyAgICAgIHNlbGYuZGVzY3JpcHRvcnNfc2l6ZSA9IDAKKyAgICAgIHNlbGYucm9sbGJhY2tfaW5kZXggPSAwCisgICAgICBzZWxmLmZsYWdzID0gMAorCisgIGRlZiBzYXZlKHNlbGYsIG91dHB1dCk6CisgICAgIiIiU2VyaWFsaXplcyB0aGUgaGVhZGVyICgyNTYgYnl0ZXMpIHRvIGRpc2suCisKKyAgICBBcmd1bWVudHM6CisgICAgICBvdXRwdXQ6IFRoZSBvYmplY3QgdG8gd3JpdGUgdGhlIG91dHB1dCB0by4KKyAgICAiIiIKKyAgICBvdXRwdXQud3JpdGUoc3RydWN0LnBhY2soCisgICAgICAgIHNlbGYuRk9STUFUX1NUUklORywgc2VsZi5tYWdpYywgc2VsZi5oZWFkZXJfdmVyc2lvbl9tYWpvciwKKyAgICAgICAgc2VsZi5oZWFkZXJfdmVyc2lvbl9taW5vciwgc2VsZi5hdXRoZW50aWNhdGlvbl9kYXRhX2Jsb2NrX3NpemUsCisgICAgICAgIHNlbGYuYXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZSwgc2VsZi5hbGdvcml0aG1fdHlwZSwgc2VsZi5oYXNoX29mZnNldCwKKyAgICAgICAgc2VsZi5oYXNoX3NpemUsIHNlbGYuc2lnbmF0dXJlX29mZnNldCwgc2VsZi5zaWduYXR1cmVfc2l6ZSwKKyAgICAgICAgc2VsZi5wdWJsaWNfa2V5X29mZnNldCwgc2VsZi5wdWJsaWNfa2V5X3NpemUsCisgICAgICAgIHNlbGYucHVibGljX2tleV9tZXRhZGF0YV9vZmZzZXQsIHNlbGYucHVibGljX2tleV9tZXRhZGF0YV9zaXplLAorICAgICAgICBzZWxmLmRlc2NyaXB0b3JzX29mZnNldCwgc2VsZi5kZXNjcmlwdG9yc19zaXplLCBzZWxmLnJvbGxiYWNrX2luZGV4LAorICAgICAgICBzZWxmLmZsYWdzKSkKKworICBkZWYgZW5jb2RlKHNlbGYpOgorICAgICIiIlNlcmlhbGl6ZXMgdGhlIGhlYWRlciAoMjU2KSB0byBhIGJ5dGVhcnJheSgpLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgYnl0ZWFycmF5KCkgd2l0aCB0aGUgZW5jb2RlZCBoZWFkZXIuCisgICAgIiIiCisgICAgcmV0dXJuIHN0cnVjdC5wYWNrKHNlbGYuRk9STUFUX1NUUklORywgc2VsZi5tYWdpYywKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJfdmVyc2lvbl9tYWpvciwgc2VsZi5oZWFkZXJfdmVyc2lvbl9taW5vciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdXRoZW50aWNhdGlvbl9kYXRhX2Jsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZSwgc2VsZi5hbGdvcml0aG1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYXNoX29mZnNldCwgc2VsZi5oYXNoX3NpemUsIHNlbGYuc2lnbmF0dXJlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWduYXR1cmVfc2l6ZSwgc2VsZi5wdWJsaWNfa2V5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wdWJsaWNfa2V5X3NpemUsIHNlbGYucHVibGljX2tleV9tZXRhZGF0YV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHVibGljX2tleV9tZXRhZGF0YV9zaXplLCBzZWxmLmRlc2NyaXB0b3JzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXNjcmlwdG9yc19zaXplLCBzZWxmLnJvbGxiYWNrX2luZGV4LCBzZWxmLmZsYWdzKQorCisKK2NsYXNzIEF2YihvYmplY3QpOgorICAiIiJCdXNpbmVzcyBsb2dpYyBmb3IgYXZidG9vbCBjb21tYW5kLWxpbmUgdG9vbC4iIiIKKworICAjIEtlZXAgaW4gc3luYyB3aXRoIGF2Yl9hYl9mbG93LmguCisgIEFCX0ZPUk1BVF9OT19DUkMgPSAnITRzQkIyeEJCQnhCQkJ4MTJ4JworICBBQl9NQUdJQyA9ICdcMEFCMCcKKyAgQUJfTUFKT1JfVkVSU0lPTiA9IDEKKyAgQUJfTUlOT1JfVkVSU0lPTiA9IDAKKyAgQUJfTUlTQ19NRVRBREFUQV9PRkZTRVQgPSAyMDQ4CisKKyAgIyBDb25zdGFudHMgZm9yIG1heGltdW0gbWV0YWRhdGEgc2l6ZS4gVGhlc2UgYXJlIHVzZWQgdG8gZ2l2ZQorICAjIG1lYW5pbmdmdWwgZXJyb3JzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaW4gdmlhIC0tcGFydGl0aW9uX3NpemUgaXMKKyAgIyB0b28gc21hbGwgYW5kIHdoZW4gLS1jYWxjX21heF9pbWFnZV9zaXplIGlzIHVzZWQuIFdlIHVzZQorICAjIGNvbnNlcnZhdGl2ZSBmaWd1cmVzLgorICBNQVhfVkJNRVRBX1NJWkUgPSA2NCAqIDEwMjQKKyAgTUFYX0ZPT1RFUl9TSVpFID0gNDA5NgorCisgIGRlZiBlcmFzZV9mb290ZXIoc2VsZiwgaW1hZ2VfZmlsZW5hbWUsIGtlZXBfaGFzaHRyZWUpOgorICAgICIiIkltcGxlbWVudHMgdGhlICdlcmFzZV9mb290ZXInIGNvbW1hbmQuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBpbWFnZV9maWxlbmFtZTogRmlsZSB0byBlcmFzZSBhIGZvb3RlciBmcm9tLgorICAgICAga2VlcF9oYXNodHJlZTogSWYgVHJ1ZSwga2VlcCB0aGUgaGFzaHRyZWUgYW5kIEZFQyBhcm91bmQuCisKKyAgICBSYWlzZXM6CisgICAgICBBdmJFcnJvcjogSWYgdGhlcmUncyBubyBmb290ZXIgaW4gdGhlIGltYWdlLgorICAgICIiIgorCisgICAgaW1hZ2UgPSBJbWFnZUhhbmRsZXIoaW1hZ2VfZmlsZW5hbWUpCisKKyAgICAoZm9vdGVyLCBfLCBkZXNjcmlwdG9ycywgXykgPSBzZWxmLl9wYXJzZV9pbWFnZShpbWFnZSkKKworICAgIGlmIG5vdCBmb290ZXI6CisgICAgICByYWlzZSBBdmJFcnJvcignR2l2ZW4gaW1hZ2UgZG9lcyBub3QgaGF2ZSBhIGZvb3Rlci4nKQorCisgICAgbmV3X2ltYWdlX3NpemUgPSBOb25lCisgICAgaWYgbm90IGtlZXBfaGFzaHRyZWU6CisgICAgICBuZXdfaW1hZ2Vfc2l6ZSA9IGZvb3Rlci5vcmlnaW5hbF9pbWFnZV9zaXplCisgICAgZWxzZToKKyAgICAgICMgSWYgcmVxdWVzdGVkIHRvIGtlZXAgdGhlIGhhc2h0cmVlLCBzZWFyY2ggZm9yIGEgaGFzaHRyZWUKKyAgICAgICMgZGVzY3JpcHRvciB0byBmaWd1cmUgb3V0IHRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZiB0aGUgaGFzaHRyZWUKKyAgICAgICMgYW5kIEZFQy4KKyAgICAgIGZvciBkZXNjIGluIGRlc2NyaXB0b3JzOgorICAgICAgICBpZiBpc2luc3RhbmNlKGRlc2MsIEF2Ykhhc2h0cmVlRGVzY3JpcHRvcik6CisgICAgICAgICAgIyBUaGUgaGFzaHRyZWUgaXMgYWx3YXlzIGp1c3QgZm9sbG93aW5nIHRoZSBtYWluIGRhdGEgc28gdGhlCisgICAgICAgICAgIyBuZXcgc2l6ZSBpcyBlYXNpbHkgZGVyaXZlZC4KKyAgICAgICAgICBuZXdfaW1hZ2Vfc2l6ZSA9IGRlc2MudHJlZV9vZmZzZXQgKyBkZXNjLnRyZWVfc2l6ZQorICAgICAgICAgICMgSWYgdGhlIGltYWdlIGhhcyBGRUMgY29kZXMsIGFsc28ga2VlcCB0aG9zZS4KKyAgICAgICAgICBpZiBkZXNjLmZlY19vZmZzZXQgPiAwOgorICAgICAgICAgICAgZmVjX2VuZCA9IGRlc2MuZmVjX29mZnNldCArIGRlc2MuZmVjX3NpemUKKyAgICAgICAgICAgIG5ld19pbWFnZV9zaXplID0gbWF4KG5ld19pbWFnZV9zaXplLCBmZWNfZW5kKQorICAgICAgICAgIGJyZWFrCisgICAgICBpZiBub3QgbmV3X2ltYWdlX3NpemU6CisgICAgICAgIHJhaXNlIEF2YkVycm9yKCdSZXF1ZXN0ZWQgdG8ga2VlcCBoYXNodHJlZSBidXQgbm8gaGFzaHRyZWUgJworICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRvciB3YXMgZm91bmQuJykKKworICAgICMgQW5kIGN1dC4uLgorICAgIGltYWdlLnRydW5jYXRlKG5ld19pbWFnZV9zaXplKQorCisgIGRlZiBzZXRfYWJfbWV0YWRhdGEoc2VsZiwgbWlzY19pbWFnZSwgc2xvdF9kYXRhKToKKyAgICAiIiJJbXBsZW1lbnRzIHRoZSAnc2V0X2FiX21ldGFkYXRhJyBjb21tYW5kLgorCisgICAgVGhlIHxzbG90X2RhdGF8IGFyZ3VtZW50IG11c3QgYmUgb2YgdGhlIGZvcm0gJ0FfcHJpb3JpdHk6QV90cmllc19yZW1haW5pbmc6CisgICAgQV9zdWNjZXNzZnVsX2Jvb3Q6Ql9wcmlvcml0eTpCX3RyaWVzX3JlbWFpbmluZzpCX3N1Y2Nlc3NmdWxfYm9vdCcuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBtaXNjX2ltYWdlOiBUaGUgbWlzYyBpbWFnZSB0byB3cml0ZSB0by4KKyAgICAgIHNsb3RfZGF0YTogU2xvdCBkYXRhIGFzIGEgc3RyaW5nCisKKyAgICBSYWlzZXM6CisgICAgICBBdmJFcnJvcjogSWYgc2xvdCBkYXRhIGlzIG1hbGZvcm1lZC4KKyAgICAiIiIKKyAgICB0b2tlbnMgPSBzbG90X2RhdGEuc3BsaXQoJzonKQorICAgIGlmIGxlbih0b2tlbnMpICE9IDY6CisgICAgICByYWlzZSBBdmJFcnJvcignTWFsZm9ybWVkIHNsb3QgZGF0YSAie30iLicuZm9ybWF0KHNsb3RfZGF0YSkpCisgICAgYV9wcmlvcml0eSA9IGludCh0b2tlbnNbMF0pCisgICAgYV90cmllc19yZW1haW5pbmcgPSBpbnQodG9rZW5zWzFdKQorICAgIGFfc3VjY2VzcyA9IFRydWUgaWYgaW50KHRva2Vuc1syXSkgIT0gMCBlbHNlIEZhbHNlCisgICAgYl9wcmlvcml0eSA9IGludCh0b2tlbnNbM10pCisgICAgYl90cmllc19yZW1haW5pbmcgPSBpbnQodG9rZW5zWzRdKQorICAgIGJfc3VjY2VzcyA9IFRydWUgaWYgaW50KHRva2Vuc1s1XSkgIT0gMCBlbHNlIEZhbHNlCisKKyAgICBhYl9kYXRhX25vX2NyYyA9IHN0cnVjdC5wYWNrKHNlbGYuQUJfRk9STUFUX05PX0NSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQUJfTUFHSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkFCX01BSk9SX1ZFUlNJT04sIHNlbGYuQUJfTUlOT1JfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfcHJpb3JpdHksIGFfdHJpZXNfcmVtYWluaW5nLCBhX3N1Y2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX3ByaW9yaXR5LCBiX3RyaWVzX3JlbWFpbmluZywgYl9zdWNjZXNzKQorICAgICMgRm9yY2UgQ1JDIHRvIGJlIHVuc2lnbmVkLCBzZWUgaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU0OTAzIGZvciB3aHkuCisgICAgY3JjX3ZhbHVlID0gYmluYXNjaWkuY3JjMzIoYWJfZGF0YV9ub19jcmMpICYgMHhmZmZmZmZmZgorICAgIGFiX2RhdGEgPSBhYl9kYXRhX25vX2NyYyArIHN0cnVjdC5wYWNrKCchSScsIGNyY192YWx1ZSkKKyAgICBtaXNjX2ltYWdlLnNlZWsoc2VsZi5BQl9NSVNDX01FVEFEQVRBX09GRlNFVCkKKyAgICBtaXNjX2ltYWdlLndyaXRlKGFiX2RhdGEpCisKKyAgZGVmIGluZm9faW1hZ2Uoc2VsZiwgaW1hZ2VfZmlsZW5hbWUsIG91dHB1dCk6CisgICAgIiIiSW1wbGVtZW50cyB0aGUgJ2luZm9faW1hZ2UnIGNvbW1hbmQuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBpbWFnZV9maWxlbmFtZTogSW1hZ2UgZmlsZSB0byBnZXQgaW5mb3JtYXRpb24gZnJvbSAoZmlsZSBvYmplY3QpLgorICAgICAgb3V0cHV0OiBPdXRwdXQgZmlsZSB0byB3cml0ZSBodW1hbi1yZWFkYWJsZSBpbmZvcm1hdGlvbiB0byAoZmlsZSBvYmplY3QpLgorICAgICIiIgorCisgICAgaW1hZ2UgPSBJbWFnZUhhbmRsZXIoaW1hZ2VfZmlsZW5hbWUpCisKKyAgICBvID0gb3V0cHV0CisKKyAgICAoZm9vdGVyLCBoZWFkZXIsIGRlc2NyaXB0b3JzLCBpbWFnZV9zaXplKSA9IHNlbGYuX3BhcnNlX2ltYWdlKGltYWdlKQorCisgICAgaWYgZm9vdGVyOgorICAgICAgby53cml0ZSgnRm9vdGVyIHZlcnNpb246ICAgICAgICAgICB7fS57fVxuJy5mb3JtYXQoZm9vdGVyLnZlcnNpb25fbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb290ZXIudmVyc2lvbl9taW5vcikpCisgICAgICBvLndyaXRlKCdJbWFnZSBzaXplOiAgICAgICAgICAgICAgIHt9IGJ5dGVzXG4nLmZvcm1hdChpbWFnZV9zaXplKSkKKyAgICAgIG8ud3JpdGUoJ09yaWdpbmFsIGltYWdlIHNpemU6ICAgICAge30gYnl0ZXNcbicuZm9ybWF0KAorICAgICAgICAgIGZvb3Rlci5vcmlnaW5hbF9pbWFnZV9zaXplKSkKKyAgICAgIG8ud3JpdGUoJ1ZCTWV0YSBvZmZzZXQ6ICAgICAgICAgICAge31cbicuZm9ybWF0KGZvb3Rlci52Ym1ldGFfb2Zmc2V0KSkKKyAgICAgIG8ud3JpdGUoJ1ZCTWV0YSBzaXplOiAgICAgICAgICAgICAge30gYnl0ZXNcbicuZm9ybWF0KGZvb3Rlci52Ym1ldGFfc2l6ZSkpCisgICAgICBvLndyaXRlKCctLVxuJykKKworICAgIChhbGdfbmFtZSwgXykgPSBsb29rdXBfYWxnb3JpdGhtX2J5X3R5cGUoaGVhZGVyLmFsZ29yaXRobV90eXBlKQorCisgICAgby53cml0ZSgnVkJNZXRhIGltYWdlIHZlcnNpb246ICAgICB7fS57fXt9XG4nLmZvcm1hdCgKKyAgICAgICAgaGVhZGVyLmhlYWRlcl92ZXJzaW9uX21ham9yLCBoZWFkZXIuaGVhZGVyX3ZlcnNpb25fbWlub3IsCisgICAgICAgICcgKFNwYXJzZSknIGlmIGltYWdlLmlzX3NwYXJzZSBlbHNlICcnKSkKKyAgICBvLndyaXRlKCdIZWFkZXIgQmxvY2s6ICAgICAgICAgICAgIHt9IGJ5dGVzXG4nLmZvcm1hdChBdmJWQk1ldGFIZWFkZXIuU0laRSkpCisgICAgby53cml0ZSgnQXV0aGVudGljYXRpb24gQmxvY2s6ICAgICB7fSBieXRlc1xuJy5mb3JtYXQoCisgICAgICAgIGhlYWRlci5hdXRoZW50aWNhdGlvbl9kYXRhX2Jsb2NrX3NpemUpKQorICAgIG8ud3JpdGUoJ0F1eGlsaWFyeSBCbG9jazogICAgICAgICAge30gYnl0ZXNcbicuZm9ybWF0KAorICAgICAgICBoZWFkZXIuYXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZSkpCisgICAgby53cml0ZSgnQWxnb3JpdGhtOiAgICAgICAgICAgICAgICB7fVxuJy5mb3JtYXQoYWxnX25hbWUpKQorICAgIG8ud3JpdGUoJ1JvbGxiYWNrIEluZGV4OiAgICAgICAgICAge31cbicuZm9ybWF0KGhlYWRlci5yb2xsYmFja19pbmRleCkpCisgICAgby53cml0ZSgnRmxhZ3M6ICAgICAgICAgICAgICAgICAgICB7fVxuJy5mb3JtYXQoaGVhZGVyLmZsYWdzKSkKKworICAgICMgUHJpbnQgZGVzY3JpcHRvcnMuCisgICAgbnVtX3ByaW50ZWQgPSAwCisgICAgby53cml0ZSgnRGVzY3JpcHRvcnM6XG4nKQorICAgIGZvciBkZXNjIGluIGRlc2NyaXB0b3JzOgorICAgICAgZGVzYy5wcmludF9kZXNjKG8pCisgICAgICBudW1fcHJpbnRlZCArPSAxCisgICAgaWYgbnVtX3ByaW50ZWQgPT0gMDoKKyAgICAgIG8ud3JpdGUoJyAgICAobm9uZSlcbicpCisKKyAgZGVmIF9wYXJzZV9pbWFnZShzZWxmLCBpbWFnZSk6CisgICAgIiIiR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbWFnZS4KKworICAgIFRoZSBpbWFnZSBjYW4gZWl0aGVyIGJlIGEgdmJtZXRhIG9yIGFuIGltYWdlIHdpdGggYSBmb290ZXIuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBpbWFnZTogQW4gSW1hZ2VIYW5kbGVyICh2Ym1ldGEgb3IgZm9vdGVyKSB3aXRoIGEgaGFzaHRyZWUgZGVzY3JpcHRvci4KKworICAgIFJldHVybnM6CisgICAgICBBIHR1cGxlIHdoZXJlIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIEF2YkZvb3RlciAoTm9uZSBpZiB0aGVyZQorICAgICAgaXMgbm8gZm9vdGVyIG9uIHRoZSBpbWFnZSksIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYQorICAgICAgQXZiVkJNZXRhSGVhZGVyLCB0aGUgdGhpcmQgYXJndW1lbnQgaXMgYSBsaXN0IG9mCisgICAgICBBdmJEZXNjcmlwdG9yLWRlcml2ZWQgaW5zdGFuY2VzLCBhbmQgdGhlIGZvdXJ0aCBhcmd1bWVudCBpcyB0aGUKKyAgICAgIHNpemUgb2YgfGltYWdlfC4KKyAgICAiIiIKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShpbWFnZSwgSW1hZ2VIYW5kbGVyKQorICAgIGZvb3RlciA9IE5vbmUKKyAgICBpbWFnZS5zZWVrKGltYWdlLmltYWdlX3NpemUgLSBBdmJGb290ZXIuU0laRSkKKyAgICB0cnk6CisgICAgICBmb290ZXIgPSBBdmJGb290ZXIoaW1hZ2UucmVhZChBdmJGb290ZXIuU0laRSkpCisgICAgZXhjZXB0IChMb29rdXBFcnJvciwgc3RydWN0LmVycm9yKToKKyAgICAgICMgTm9wZSwganVzdCBzZWVrIGJhY2sgdG8gdGhlIHN0YXJ0LgorICAgICAgaW1hZ2Uuc2VlaygwKQorCisgICAgdmJtZXRhX29mZnNldCA9IDAKKyAgICBpZiBmb290ZXI6CisgICAgICB2Ym1ldGFfb2Zmc2V0ID0gZm9vdGVyLnZibWV0YV9vZmZzZXQKKworICAgIGltYWdlLnNlZWsodmJtZXRhX29mZnNldCkKKyAgICBoID0gQXZiVkJNZXRhSGVhZGVyKGltYWdlLnJlYWQoQXZiVkJNZXRhSGVhZGVyLlNJWkUpKQorCisgICAgYXV0aF9ibG9ja19vZmZzZXQgPSB2Ym1ldGFfb2Zmc2V0ICsgQXZiVkJNZXRhSGVhZGVyLlNJWkUKKyAgICBhdXhfYmxvY2tfb2Zmc2V0ID0gYXV0aF9ibG9ja19vZmZzZXQgKyBoLmF1dGhlbnRpY2F0aW9uX2RhdGFfYmxvY2tfc2l6ZQorICAgIGRlc2Nfc3RhcnRfb2Zmc2V0ID0gYXV4X2Jsb2NrX29mZnNldCArIGguZGVzY3JpcHRvcnNfb2Zmc2V0CisgICAgaW1hZ2Uuc2VlayhkZXNjX3N0YXJ0X29mZnNldCkKKyAgICBkZXNjcmlwdG9ycyA9IHBhcnNlX2Rlc2NyaXB0b3JzKGltYWdlLnJlYWQoaC5kZXNjcmlwdG9yc19zaXplKSkKKworICAgIHJldHVybiBmb290ZXIsIGgsIGRlc2NyaXB0b3JzLCBpbWFnZS5pbWFnZV9zaXplCisKKyAgZGVmIF9nZXRfY21kbGluZV9kZXNjcmlwdG9yc19mb3JfZG1fdmVyaXR5KHNlbGYsIGltYWdlKToKKyAgICAiIiJHZW5lcmF0ZSBrZXJuZWwgY21kbGluZSBkZXNjcmlwdG9ycyBmb3IgZG0tdmVyaXR5LgorCisgICAgQXJndW1lbnRzOgorICAgICAgaW1hZ2U6IEFuIEltYWdlSGFuZGxlciAodmJtZXRhIG9yIGZvb3Rlcikgd2l0aCBhIGhhc2h0cmVlIGRlc2NyaXB0b3IuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBsaXN0IHdpdGggdHdvIEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yIHdpdGggZG0tdmVyaXR5IGtlcm5lbCBjbWRsaW5lCisgICAgICBpbnN0cnVjdGlvbnMuIFRoZXJlIGlzIG9uZSBmb3Igd2hlbiBoYXNodHJlZSBpcyBub3QgZGlzYWJsZWQgYW5kIG9uZSBmb3IKKyAgICAgIHdoZW4gaXQgaXMuCisKKyAgICBSYWlzZXM6CisgICAgICBBdmJFcnJvcjogSWYgIHxpbWFnZXwgZG9lc24ndCBoYXZlIGEgaGFzaHRyZWUgZGVzY3JpcHRvci4KKworICAgICIiIgorCisgICAgKF8sIF8sIGRlc2NyaXB0b3JzLCBfKSA9IHNlbGYuX3BhcnNlX2ltYWdlKGltYWdlKQorCisgICAgaHQgPSBOb25lCisgICAgZm9yIGRlc2MgaW4gZGVzY3JpcHRvcnM6CisgICAgICBpZiBpc2luc3RhbmNlKGRlc2MsIEF2Ykhhc2h0cmVlRGVzY3JpcHRvcik6CisgICAgICAgIGh0ID0gZGVzYworICAgICAgICBicmVhaworCisgICAgaWYgbm90IGh0OgorICAgICAgcmFpc2UgQXZiRXJyb3IoJ05vIGhhc2h0cmVlIGRlc2NyaXB0b3IgaW4gZ2l2ZW4gaW1hZ2UnKQorCisgICAgYyA9ICdkbT0iMSB2cm9vdCBub25lIHJvIDEsJworICAgIGMgKz0gJzAnICAjIHN0YXJ0CisgICAgYyArPSAnIHt9Jy5mb3JtYXQoKGh0LmltYWdlX3NpemUgLyA1MTIpKSAgIyBzaXplICgjIHNlY3RvcnMpCisgICAgYyArPSAnIHZlcml0eSB7fScuZm9ybWF0KGh0LmRtX3Zlcml0eV92ZXJzaW9uKSAgIyB0eXBlIGFuZCB2ZXJzaW9uCisgICAgYyArPSAnIFBBUlRVVUlEPSQoQU5EUk9JRF9TWVNURU1fUEFSVFVVSUQpJyAgIyBkYXRhX2RldgorICAgIGMgKz0gJyBQQVJUVVVJRD0kKEFORFJPSURfU1lTVEVNX1BBUlRVVUlEKScgICMgaGFzaF9kZXYKKyAgICBjICs9ICcge30nLmZvcm1hdChodC5kYXRhX2Jsb2NrX3NpemUpICAjIGRhdGFfYmxvY2sKKyAgICBjICs9ICcge30nLmZvcm1hdChodC5oYXNoX2Jsb2NrX3NpemUpICAjIGhhc2hfYmxvY2sKKyAgICBjICs9ICcge30nLmZvcm1hdChodC5pbWFnZV9zaXplIC8gaHQuZGF0YV9ibG9ja19zaXplKSAgIyAjYmxvY2tzCisgICAgYyArPSAnIHt9Jy5mb3JtYXQoaHQuaW1hZ2Vfc2l6ZSAvIGh0LmRhdGFfYmxvY2tfc2l6ZSkgICMgaGFzaF9vZmZzZXQKKyAgICBjICs9ICcge30nLmZvcm1hdChodC5oYXNoX2FsZ29yaXRobSkgICMgaGFzaF9hbGcKKyAgICBjICs9ICcge30nLmZvcm1hdChzdHIoaHQucm9vdF9kaWdlc3QpLmVuY29kZSgnaGV4JykpICAjIHJvb3RfZGlnZXN0CisgICAgYyArPSAnIHt9Jy5mb3JtYXQoc3RyKGh0LnNhbHQpLmVuY29kZSgnaGV4JykpICAjIHNhbHQKKyAgICBpZiBodC5mZWNfbnVtX3Jvb3RzID4gMDoKKyAgICAgIGMgKz0gJyAxMCcgICMgbnVtYmVyIG9mIG9wdGlvbmFsIGFyZ3MKKyAgICAgIGMgKz0gJyByZXN0YXJ0X29uX2NvcnJ1cHRpb24nCisgICAgICBjICs9ICcgaWdub3JlX3plcm9fYmxvY2tzJworICAgICAgYyArPSAnIHVzZV9mZWNfZnJvbV9kZXZpY2UgUEFSVFVVSUQ9JChBTkRST0lEX1NZU1RFTV9QQVJUVVVJRCknCisgICAgICBjICs9ICcgZmVjX3Jvb3RzIHt9Jy5mb3JtYXQoaHQuZmVjX251bV9yb290cykKKyAgICAgICMgTm90ZSB0aGF0IGZlY19ibG9ja3MgaXMgdGhlIHNpemUgdGhhdCBGRUMgY292ZXJzLCAqbm90KiB0aGUKKyAgICAgICMgc2l6ZSBvZiB0aGUgRkVDIGRhdGEuIFNpbmNlIHdlIHVzZSBGRUMgZm9yIGV2ZXJ5dGhpbmcgdXAgdW50aWwKKyAgICAgICMgdGhlIEZFQyBkYXRhLCBpdCdzIHRoZSBzYW1lIGFzIHRoZSBvZmZzZXQuCisgICAgICBjICs9ICcgZmVjX2Jsb2NrcyB7fScuZm9ybWF0KGh0LmZlY19vZmZzZXQvaHQuZGF0YV9ibG9ja19zaXplKQorICAgICAgYyArPSAnIGZlY19zdGFydCB7fScuZm9ybWF0KGh0LmZlY19vZmZzZXQvaHQuZGF0YV9ibG9ja19zaXplKQorICAgIGVsc2U6CisgICAgICBjICs9ICcgMicgICMgbnVtYmVyIG9mIG9wdGlvbmFsIGFyZ3MKKyAgICAgIGMgKz0gJyByZXN0YXJ0X29uX2NvcnJ1cHRpb24nCisgICAgICBjICs9ICcgaWdub3JlX3plcm9fYmxvY2tzJworICAgIGMgKz0gJyIgcm9vdD0weGZkMDAnCisKKyAgICAjIE5vdyB0aGF0IHdlIGhhdmUgdGhlIGNvbW1hbmQtbGluZSwgZ2VuZXJhdGUgdGhlIGRlc2NyaXB0b3IuCisgICAgZGVzYyA9IEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yKCkKKyAgICBkZXNjLmtlcm5lbF9jbWRsaW5lID0gYworICAgIGRlc2MuZmxhZ3MgPSAoCisgICAgICAgIEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yLkZMQUdTX1VTRV9PTkxZX0lGX0hBU0hUUkVFX05PVF9ESVNBQkxFRCkKKworICAgICMgVGhlIGRlc2NyaXB0b3IgZm9yIHdoZW4gaGFzaHRyZWUgdmVyaWZpY2F0aW9uIGlzIGRpc2FibGVkIGlzIGEgbG90CisgICAgIyBzaW1wbGVyIC0gd2UganVzdCBzZXQgdGhlIHJvb3QgdG8gdGhlIHBhcnRpdGlvbi4KKyAgICBkZXNjX25vX2h0ID0gQXZiS2VybmVsQ21kbGluZURlc2NyaXB0b3IoKQorICAgIGRlc2Nfbm9faHQua2VybmVsX2NtZGxpbmUgPSAncm9vdD1QQVJUVVVJRD0kKEFORFJPSURfU1lTVEVNX1BBUlRVVUlEKScKKyAgICBkZXNjX25vX2h0LmZsYWdzID0gKAorICAgICAgICBBdmJLZXJuZWxDbWRsaW5lRGVzY3JpcHRvci5GTEFHU19VU0VfT05MWV9JRl9IQVNIVFJFRV9ESVNBQkxFRCkKKworICAgIHJldHVybiBbZGVzYywgZGVzY19ub19odF0KKworICBkZWYgbWFrZV92Ym1ldGFfaW1hZ2Uoc2VsZiwgb3V0cHV0LCBjaGFpbl9wYXJ0aXRpb25zLCBhbGdvcml0aG1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleV9wYXRoLCBwdWJsaWNfa2V5X21ldGFkYXRhX3BhdGgsIHJvbGxiYWNrX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHByb3BzLCBwcm9wc19mcm9tX2ZpbGUsIGtlcm5lbF9jbWRsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwX3Jvb3Rmc19mcm9tX2tlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9pbWFnZSwgc2lnbmluZ19oZWxwZXIpOgorICAgICIiIkltcGxlbWVudHMgdGhlICdtYWtlX3ZibWV0YV9pbWFnZScgY29tbWFuZC4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIG91dHB1dDogRmlsZSB0byB3cml0ZSB0aGUgaW1hZ2UgdG8uCisgICAgICBjaGFpbl9wYXJ0aXRpb25zOiBMaXN0IG9mIHBhcnRpdGlvbnMgdG8gY2hhaW4uCisgICAgICBhbGdvcml0aG1fbmFtZTogTmFtZSBvZiBhbGdvcml0aG0gdG8gdXNlLgorICAgICAga2V5X3BhdGg6IFBhdGggdG8ga2V5IHRvIHVzZSBvciBOb25lLgorICAgICAgcHVibGljX2tleV9tZXRhZGF0YV9wYXRoOiBQYXRoIHRvIHB1YmxpYyBrZXkgbWV0YWRhdGEgb3IgTm9uZS4KKyAgICAgIHJvbGxiYWNrX2luZGV4OiBUaGUgcm9sbGJhY2sgaW5kZXggdG8gdXNlLgorICAgICAgZmxhZ3M6IEZsYWdzIHZhbHVlIHRvIHVzZSBpbiB0aGUgaW1hZ2UuCisgICAgICBwcm9wczogUHJvcGVydGllcyB0byBpbnNlcnQgKGxpc3Qgb2Ygc3RyaW5ncyBvZiB0aGUgZm9ybSAna2V5OnZhbHVlJykuCisgICAgICBwcm9wc19mcm9tX2ZpbGU6IFByb3BlcnRpZXMgdG8gaW5zZXJ0IChsaXN0IG9mIHN0cmluZ3MgJ2tleTo8cGF0aD4nKS4KKyAgICAgIGtlcm5lbF9jbWRsaW5lczogS2VybmVsIGNtZGxpbmVzIHRvIGluc2VydCAobGlzdCBvZiBzdHJpbmdzKS4KKyAgICAgIHNldHVwX3Jvb3Rmc19mcm9tX2tlcm5lbDogTm9uZSBvciBmaWxlIHRvIGdlbmVyYXRlIGZyb20uCisgICAgICBpbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2U6IExpc3Qgb2YgZmlsZSBvYmplY3RzIHdpdGggZGVzY3JpcHRvcnMuCisgICAgICBzaWduaW5nX2hlbHBlcjogUHJvZ3JhbSB3aGljaCBzaWducyBhIGhhc2ggYW5kIHJldHVybiBzaWduYXR1cmUuCisKKyAgICBSYWlzZXM6CisgICAgICBBdmJFcnJvcjogSWYgYSBjaGFpbmVkIHBhcnRpdGlvbiBpcyBtYWxmb3JtZWQuCisgICAgIiIiCisKKyAgICBkZXNjcmlwdG9ycyA9IFtdCisKKyAgICAjIEluc2VydCBjaGFpbmVkIHBhcnRpdGlvbiBkZXNjcmlwdG9ycy4KKyAgICBpZiBjaGFpbl9wYXJ0aXRpb25zOgorICAgICAgZm9yIGNwIGluIGNoYWluX3BhcnRpdGlvbnM6CisgICAgICAgIGNwX3Rva2VucyA9IGNwLnNwbGl0KCc6JykKKyAgICAgICAgaWYgbGVuKGNwX3Rva2VucykgIT0gMzoKKyAgICAgICAgICByYWlzZSBBdmJFcnJvcignTWFsZm9ybWVkIGNoYWluZWQgcGFydGl0aW9uICJ7fSIuJy5mb3JtYXQoY3ApKQorICAgICAgICBkZXNjID0gQXZiQ2hhaW5QYXJ0aXRpb25EZXNjcmlwdG9yKCkKKyAgICAgICAgZGVzYy5wYXJ0aXRpb25fbmFtZSA9IGNwX3Rva2Vuc1swXQorICAgICAgICBkZXNjLnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uID0gaW50KGNwX3Rva2Vuc1sxXSkKKyAgICAgICAgaWYgZGVzYy5yb2xsYmFja19pbmRleF9sb2NhdGlvbiA8IDE6CisgICAgICAgICAgcmFpc2UgQXZiRXJyb3IoJ1JvbGxiYWNrIGluZGV4IGxvY2F0aW9uIG11c3QgYmUgMSBvciBsYXJnZXIuJykKKyAgICAgICAgZmlsZV9wYXRoID0gY3BfdG9rZW5zWzJdCisgICAgICAgIGRlc2MucHVibGljX2tleSA9IG9wZW4oZmlsZV9wYXRoLCAncmInKS5yZWFkKCkKKyAgICAgICAgZGVzY3JpcHRvcnMuYXBwZW5kKGRlc2MpCisKKyAgICB2Ym1ldGFfYmxvYiA9IHNlbGYuX2dlbmVyYXRlX3ZibWV0YV9ibG9iKAorICAgICAgICBhbGdvcml0aG1fbmFtZSwga2V5X3BhdGgsIHB1YmxpY19rZXlfbWV0YWRhdGFfcGF0aCwgZGVzY3JpcHRvcnMsCisgICAgICAgIHJvbGxiYWNrX2luZGV4LCBmbGFncywgcHJvcHMsIHByb3BzX2Zyb21fZmlsZSwga2VybmVsX2NtZGxpbmVzLAorICAgICAgICBzZXR1cF9yb290ZnNfZnJvbV9rZXJuZWwsCisgICAgICAgIGluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9pbWFnZSwgc2lnbmluZ19oZWxwZXIpCisKKyAgICAjIFdyaXRlIGVudGlyZSB2Ym1ldGEgYmxvYiAoaGVhZGVyLCBhdXRoZW50aWNhdGlvbiwgYXV4aWxpYXJ5KS4KKyAgICBvdXRwdXQuc2VlaygwKQorICAgIG91dHB1dC53cml0ZSh2Ym1ldGFfYmxvYikKKworICBkZWYgX2dlbmVyYXRlX3ZibWV0YV9ibG9iKHNlbGYsIGFsZ29yaXRobV9uYW1lLCBrZXlfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNfa2V5X21ldGFkYXRhX3BhdGgsIGRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrX2luZGV4LCBmbGFncywgcHJvcHMsIHByb3BzX2Zyb21fZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWxfY21kbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXBfcm9vdGZzX2Zyb21fa2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9pbWFnZSwgc2lnbmluZ19oZWxwZXIpOgorICAgICIiIkdlbmVyYXRlcyBhIFZCTWV0YSBibG9iLgorCisgICAgVGhpcyBibG9iIGNvbnRhaW5zIHRoZSBoZWFkZXIgKHN0cnVjdCBBdmJWQk1ldGFIZWFkZXIpLCB0aGUKKyAgICBhdXRoZW50aWNhdGlvbiBkYXRhIGJsb2NrICh3aGljaCBjb250YWlucyB0aGUgaGFzaCBhbmQgc2lnbmF0dXJlCisgICAgZm9yIHRoZSBoZWFkZXIgYW5kIGF1eGlsaWFyeSBibG9jayksIGFuZCB0aGUgYXV4aWxpYXJ5IGJsb2NrCisgICAgKHdoaWNoIGNvbnRhaW5zIGRlc2NyaXB0b3JzLCB0aGUgcHVibGljIGtleSB1c2VkLCBhbmQgb3RoZXIgZGF0YSkuCisKKyAgICBUaGUgfGtleXwgcGFyYW1ldGVyIGNhbiB8Tm9uZXwgb25seSBpZiB0aGUgfGFsZ29yaXRobV9uYW1lfCBpcworICAgICdOT05FJy4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIGFsZ29yaXRobV9uYW1lOiBUaGUgYWxnb3JpdGhtIG5hbWUgYXMgcGVyIHRoZSBBTEdPUklUSE1TIGRpY3QuCisgICAgICBrZXlfcGF0aDogVGhlIHBhdGggdG8gdGhlIC5wZW0gZmlsZSB1c2VkIHRvIHNpZ24gdGhlIGJsb2IuCisgICAgICBwdWJsaWNfa2V5X21ldGFkYXRhX3BhdGg6IFBhdGggdG8gcHVibGljIGtleSBtZXRhZGF0YSBvciBOb25lLgorICAgICAgZGVzY3JpcHRvcnM6IEEgbGlzdCBvZiBkZXNjcmlwdG9ycyB0byBpbnNlcnQgb3IgTm9uZS4KKyAgICAgIHJvbGxiYWNrX2luZGV4OiBUaGUgcm9sbGJhY2sgaW5kZXggdG8gdXNlLgorICAgICAgZmxhZ3M6IEZsYWdzIHRvIHVzZSBpbiB0aGUgaW1hZ2UuCisgICAgICBwcm9wczogUHJvcGVydGllcyB0byBpbnNlcnQgKExpc3Qgb2Ygc3RyaW5ncyBvZiB0aGUgZm9ybSAna2V5OnZhbHVlJykuCisgICAgICBwcm9wc19mcm9tX2ZpbGU6IFByb3BlcnRpZXMgdG8gaW5zZXJ0IChMaXN0IG9mIHN0cmluZ3MgJ2tleTo8cGF0aD4nKS4KKyAgICAgIGtlcm5lbF9jbWRsaW5lczogS2VybmVsIGNtZGxpbmVzIHRvIGluc2VydCAobGlzdCBvZiBzdHJpbmdzKS4KKyAgICAgIHNldHVwX3Jvb3Rmc19mcm9tX2tlcm5lbDogTm9uZSBvciBmaWxlIHRvIGdlbmVyYXRlCisgICAgICAgIGRtLXZlcml0eSBrZXJuZWwgY21kbGluZSBmcm9tLgorICAgICAgaW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlOiBMaXN0IG9mIGZpbGUgb2JqZWN0cyBmb3Igd2hpY2gKKyAgICAgICAgdG8gaW5zZXJ0IGRlc2NyaXB0b3JzIGZyb20uCisgICAgICBzaWduaW5nX2hlbHBlcjogUHJvZ3JhbSB3aGljaCBzaWducyBhIGhhc2ggYW5kIHJldHVybiBzaWduYXR1cmUuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBieXRlYXJyYXkoKSB3aXRoIHRoZSBWQk1ldGEgYmxvYi4KKworICAgIFJhaXNlczoKKyAgICAgIEV4Y2VwdGlvbjogSWYgdGhlIHxhbGdvcml0aG1fbmFtZXwgaXMgbm90IGZvdW5kLCBpZiBubyBrZXkgaGFzCisgICAgICAgIGJlZW4gZ2l2ZW4gYW5kIHRoZSBnaXZlbiBhbGdvcml0aG0gcmVxdWlyZXMgb25lLCBvciB0aGUga2V5IGlzCisgICAgICAgIG9mIHRoZSB3cm9uZyBzaXplLgorCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgYWxnID0gQUxHT1JJVEhNU1thbGdvcml0aG1fbmFtZV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICByYWlzZSBBdmJFcnJvcignVW5rbm93biBhbGdvcml0aG0gd2l0aCBuYW1lIHt9Jy5mb3JtYXQoYWxnb3JpdGhtX25hbWUpKQorCisgICAgIyBEZXNjcmlwdG9ycy4KKyAgICBlbmNvZGVkX2Rlc2NyaXB0b3JzID0gYnl0ZWFycmF5KCkKKyAgICBpZiBkZXNjcmlwdG9yczoKKyAgICAgIGZvciBkZXNjIGluIGRlc2NyaXB0b3JzOgorICAgICAgICBlbmNvZGVkX2Rlc2NyaXB0b3JzLmV4dGVuZChkZXNjLmVuY29kZSgpKQorCisgICAgIyBBZGQgcHJvcGVydGllcy4KKyAgICBpZiBwcm9wczoKKyAgICAgIGZvciBwcm9wIGluIHByb3BzOgorICAgICAgICBpZHggPSBwcm9wLmZpbmQoJzonKQorICAgICAgICBpZiBpZHggPT0gLTE6CisgICAgICAgICAgcmFpc2UgQXZiRXJyb3IoJ01hbGZvcm1lZCBwcm9wZXJ0eSAie30iLicuZm9ybWF0KHByb3ApKQorICAgICAgICBkZXNjID0gQXZiUHJvcGVydHlEZXNjcmlwdG9yKCkKKyAgICAgICAgZGVzYy5rZXkgPSBwcm9wWzA6aWR4XQorICAgICAgICBkZXNjLnZhbHVlID0gcHJvcFsoaWR4ICsgMSk6XQorICAgICAgICBlbmNvZGVkX2Rlc2NyaXB0b3JzLmV4dGVuZChkZXNjLmVuY29kZSgpKQorICAgIGlmIHByb3BzX2Zyb21fZmlsZToKKyAgICAgIGZvciBwcm9wIGluIHByb3BzX2Zyb21fZmlsZToKKyAgICAgICAgaWR4ID0gcHJvcC5maW5kKCc6JykKKyAgICAgICAgaWYgaWR4ID09IC0xOgorICAgICAgICAgIHJhaXNlIEF2YkVycm9yKCdNYWxmb3JtZWQgcHJvcGVydHkgInt9Ii4nLmZvcm1hdChwcm9wKSkKKyAgICAgICAgZGVzYyA9IEF2YlByb3BlcnR5RGVzY3JpcHRvcigpCisgICAgICAgIGRlc2Mua2V5ID0gcHJvcFswOmlkeF0KKyAgICAgICAgZGVzYy52YWx1ZSA9IHByb3BbKGlkeCArIDEpOl0KKyAgICAgICAgZmlsZV9wYXRoID0gcHJvcFsoaWR4ICsgMSk6XQorICAgICAgICBkZXNjLnZhbHVlID0gb3BlbihmaWxlX3BhdGgsICdyYicpLnJlYWQoKQorICAgICAgICBlbmNvZGVkX2Rlc2NyaXB0b3JzLmV4dGVuZChkZXNjLmVuY29kZSgpKQorCisgICAgIyBBZGQgQXZiS2VybmVsQ21kbGluZSBkZXNjcmlwdG9yIGZvciBkbS12ZXJpdHksIGlmIHJlcXVlc3RlZC4KKyAgICBpZiBzZXR1cF9yb290ZnNfZnJvbV9rZXJuZWw6CisgICAgICBpbWFnZV9oYW5kbGVyID0gSW1hZ2VIYW5kbGVyKAorICAgICAgICAgIHNldHVwX3Jvb3Rmc19mcm9tX2tlcm5lbC5uYW1lKQorICAgICAgY21kbGluZV9kZXNjID0gc2VsZi5fZ2V0X2NtZGxpbmVfZGVzY3JpcHRvcnNfZm9yX2RtX3Zlcml0eShpbWFnZV9oYW5kbGVyKQorICAgICAgZW5jb2RlZF9kZXNjcmlwdG9ycy5leHRlbmQoY21kbGluZV9kZXNjWzBdLmVuY29kZSgpKQorICAgICAgZW5jb2RlZF9kZXNjcmlwdG9ycy5leHRlbmQoY21kbGluZV9kZXNjWzFdLmVuY29kZSgpKQorCisgICAgIyBBZGQga2VybmVsIGNvbW1hbmQtbGluZXMuCisgICAgaWYga2VybmVsX2NtZGxpbmVzOgorICAgICAgZm9yIGkgaW4ga2VybmVsX2NtZGxpbmVzOgorICAgICAgICBkZXNjID0gQXZiS2VybmVsQ21kbGluZURlc2NyaXB0b3IoKQorICAgICAgICBkZXNjLmtlcm5lbF9jbWRsaW5lID0gaQorICAgICAgICBlbmNvZGVkX2Rlc2NyaXB0b3JzLmV4dGVuZChkZXNjLmVuY29kZSgpKQorCisgICAgIyBBZGQgZGVzY3JpcHRvcnMgZnJvbSBvdGhlciBpbWFnZXMuCisgICAgaWYgaW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlOgorICAgICAgZm9yIGltYWdlIGluIGluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9pbWFnZToKKyAgICAgICAgaW1hZ2VfaGFuZGxlciA9IEltYWdlSGFuZGxlcihpbWFnZS5uYW1lKQorICAgICAgICAoXywgXywgaW1hZ2VfZGVzY3JpcHRvcnMsIF8pID0gc2VsZi5fcGFyc2VfaW1hZ2UoaW1hZ2VfaGFuZGxlcikKKyAgICAgICAgZm9yIGRlc2MgaW4gaW1hZ2VfZGVzY3JpcHRvcnM6CisgICAgICAgICAgZW5jb2RlZF9kZXNjcmlwdG9ycy5leHRlbmQoZGVzYy5lbmNvZGUoKSkKKworICAgICMgTG9hZCBwdWJsaWMga2V5IG1ldGFkYXRhIGJsb2IsIGlmIHJlcXVlc3RlZC4KKyAgICBwa21kX2Jsb2IgPSBbXQorICAgIGlmIHB1YmxpY19rZXlfbWV0YWRhdGFfcGF0aDoKKyAgICAgIHdpdGggb3BlbihwdWJsaWNfa2V5X21ldGFkYXRhX3BhdGgpIGFzIGY6CisgICAgICAgIHBrbWRfYmxvYiA9IGYucmVhZCgpCisKKyAgICBrZXkgPSBOb25lCisgICAgZW5jb2RlZF9rZXkgPSBieXRlYXJyYXkoKQorICAgIGlmIGFsZy5wdWJsaWNfa2V5X251bV9ieXRlcyA+IDA6CisgICAgICBpZiBub3Qga2V5X3BhdGg6CisgICAgICAgIHJhaXNlIEF2YkVycm9yKCdLZXkgaXMgcmVxdWlyZWQgZm9yIGFsZ29yaXRobSB7fScuZm9ybWF0KAorICAgICAgICAgICAgYWxnb3JpdGhtX25hbWUpKQorICAgICAga2V5ID0gQ3J5cHRvLlB1YmxpY0tleS5SU0EuaW1wb3J0S2V5KG9wZW4oa2V5X3BhdGgpLnJlYWQoKSkKKyAgICAgIGVuY29kZWRfa2V5ID0gZW5jb2RlX3JzYV9rZXkoa2V5KQorICAgICAgaWYgbGVuKGVuY29kZWRfa2V5KSAhPSBhbGcucHVibGljX2tleV9udW1fYnl0ZXM6CisgICAgICAgIHJhaXNlIEF2YkVycm9yKCdLZXkgaXMgd3Jvbmcgc2l6ZSBmb3IgYWxnb3JpdGhtIHt9Jy5mb3JtYXQoCisgICAgICAgICAgICBhbGdvcml0aG1fbmFtZSkpCisKKyAgICBoID0gQXZiVkJNZXRhSGVhZGVyKCkKKworICAgICMgRm9yIHRoZSBBdXhpbGlhcnkgZGF0YSBibG9jaywgZGVzY3JpcHRvcnMgYXJlIHN0b3JlZCBhdCBvZmZzZXQgMCwKKyAgICAjIGZvbGxvd2VkIGJ5IHRoZSBwdWJsaWMga2V5LCBmb2xsb3dlZCBieSB0aGUgcHVibGljIGtleSBtZXRhZGF0YSBibG9iLgorICAgIGguYXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZSA9IHJvdW5kX3RvX211bHRpcGxlKAorICAgICAgICBsZW4oZW5jb2RlZF9kZXNjcmlwdG9ycykgKyBsZW4oZW5jb2RlZF9rZXkpICsgbGVuKHBrbWRfYmxvYiksIDY0KQorICAgIGguZGVzY3JpcHRvcnNfb2Zmc2V0ID0gMAorICAgIGguZGVzY3JpcHRvcnNfc2l6ZSA9IGxlbihlbmNvZGVkX2Rlc2NyaXB0b3JzKQorICAgIGgucHVibGljX2tleV9vZmZzZXQgPSBoLmRlc2NyaXB0b3JzX3NpemUKKyAgICBoLnB1YmxpY19rZXlfc2l6ZSA9IGxlbihlbmNvZGVkX2tleSkKKyAgICBoLnB1YmxpY19rZXlfbWV0YWRhdGFfb2Zmc2V0ID0gaC5wdWJsaWNfa2V5X29mZnNldCArIGgucHVibGljX2tleV9zaXplCisgICAgaC5wdWJsaWNfa2V5X21ldGFkYXRhX3NpemUgPSBsZW4ocGttZF9ibG9iKQorCisgICAgIyBGb3IgdGhlIEF1dGhlbnRpY2F0aW9uIGRhdGEgYmxvY2ssIHRoZSBoYXNoIGlzIGZpcnN0IGFuZCB0aGVuCisgICAgIyB0aGUgc2lnbmF0dXJlLgorICAgIGguYXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplID0gcm91bmRfdG9fbXVsdGlwbGUoCisgICAgICAgIGFsZy5oYXNoX251bV9ieXRlcyArIGFsZy5zaWduYXR1cmVfbnVtX2J5dGVzLCA2NCkKKyAgICBoLmFsZ29yaXRobV90eXBlID0gYWxnLmFsZ29yaXRobV90eXBlCisgICAgaC5oYXNoX29mZnNldCA9IDAKKyAgICBoLmhhc2hfc2l6ZSA9IGFsZy5oYXNoX251bV9ieXRlcworICAgICMgU2lnbmF0dXJlIG9mZnNldCBhbmQgc2l6ZSAtIGl0J3Mgc3RvcmVkIHJpZ2h0IGFmdGVyIHRoZSBoYXNoCisgICAgIyAoaW4gQXV0aGVudGljYXRpb24gZGF0YSBibG9jaykuCisgICAgaC5zaWduYXR1cmVfb2Zmc2V0ID0gYWxnLmhhc2hfbnVtX2J5dGVzCisgICAgaC5zaWduYXR1cmVfc2l6ZSA9IGFsZy5zaWduYXR1cmVfbnVtX2J5dGVzCisKKyAgICBoLnJvbGxiYWNrX2luZGV4ID0gcm9sbGJhY2tfaW5kZXgKKyAgICBoLmZsYWdzID0gZmxhZ3MKKworICAgICMgR2VuZXJhdGUgSGVhZGVyIGRhdGEgYmxvY2suCisgICAgaGVhZGVyX2RhdGFfYmxvYiA9IGguZW5jb2RlKCkKKworICAgICMgR2VuZXJhdGUgQXV4aWxpYXJ5IGRhdGEgYmxvY2suCisgICAgYXV4X2RhdGFfYmxvYiA9IGJ5dGVhcnJheSgpCisgICAgYXV4X2RhdGFfYmxvYi5leHRlbmQoZW5jb2RlZF9kZXNjcmlwdG9ycykKKyAgICBhdXhfZGF0YV9ibG9iLmV4dGVuZChlbmNvZGVkX2tleSkKKyAgICBhdXhfZGF0YV9ibG9iLmV4dGVuZChwa21kX2Jsb2IpCisgICAgcGFkZGluZ19ieXRlcyA9IGguYXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZSAtIGxlbihhdXhfZGF0YV9ibG9iKQorICAgIGF1eF9kYXRhX2Jsb2IuZXh0ZW5kKCdcMCcgKiBwYWRkaW5nX2J5dGVzKQorCisgICAgIyBDYWxjdWxhdGUgdGhlIGhhc2guCisgICAgYmluYXJ5X2hhc2ggPSBieXRlYXJyYXkoKQorICAgIGJpbmFyeV9zaWduYXR1cmUgPSBieXRlYXJyYXkoKQorICAgIGlmIGFsZ29yaXRobV9uYW1lICE9ICdOT05FJzoKKyAgICAgIGlmIGFsZ29yaXRobV9uYW1lWzA6Nl0gPT0gJ1NIQTI1Nic6CisgICAgICAgIGhhID0gaGFzaGxpYi5zaGEyNTYoKQorICAgICAgZWxpZiBhbGdvcml0aG1fbmFtZVswOjZdID09ICdTSEE1MTInOgorICAgICAgICBoYSA9IGhhc2hsaWIuc2hhNTEyKCkKKyAgICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEF2YkVycm9yKCdVbnN1cHBvcnRlZCBhbGdvcml0aG0ge30uJy5mb3JtYXQoYWxnb3JpdGhtX25hbWUpKQorICAgICAgaGEudXBkYXRlKGhlYWRlcl9kYXRhX2Jsb2IpCisgICAgICBoYS51cGRhdGUoYXV4X2RhdGFfYmxvYikKKyAgICAgIGJpbmFyeV9oYXNoLmV4dGVuZChoYS5kaWdlc3QoKSkKKworICAgICAgIyBDYWxjdWxhdGUgdGhlIHNpZ25hdHVyZS4KKyAgICAgIHBhZGRpbmdfYW5kX2hhc2ggPSBzdHIoYnl0ZWFycmF5KGFsZy5wYWRkaW5nKSkgKyBiaW5hcnlfaGFzaAorICAgICAgYmluYXJ5X3NpZ25hdHVyZS5leHRlbmQocmF3X3NpZ24oc2lnbmluZ19oZWxwZXIsIGFsZ29yaXRobV9uYW1lLCBrZXlfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdfYW5kX2hhc2gpKQorCisgICAgIyBHZW5lcmF0ZSBBdXRoZW50aWNhdGlvbiBkYXRhIGJsb2NrLgorICAgIGF1dGhfZGF0YV9ibG9iID0gYnl0ZWFycmF5KCkKKyAgICBhdXRoX2RhdGFfYmxvYi5leHRlbmQoYmluYXJ5X2hhc2gpCisgICAgYXV0aF9kYXRhX2Jsb2IuZXh0ZW5kKGJpbmFyeV9zaWduYXR1cmUpCisgICAgcGFkZGluZ19ieXRlcyA9IGguYXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplIC0gbGVuKGF1dGhfZGF0YV9ibG9iKQorICAgIGF1dGhfZGF0YV9ibG9iLmV4dGVuZCgnXDAnICogcGFkZGluZ19ieXRlcykKKworICAgIHJldHVybiBoZWFkZXJfZGF0YV9ibG9iICsgYXV0aF9kYXRhX2Jsb2IgKyBhdXhfZGF0YV9ibG9iCisKKyAgZGVmIGV4dHJhY3RfcHVibGljX2tleShzZWxmLCBrZXlfcGF0aCwgb3V0cHV0KToKKyAgICAiIiJJbXBsZW1lbnRzIHRoZSAnZXh0cmFjdF9wdWJsaWNfa2V5JyBjb21tYW5kLgorCisgICAgQXJndW1lbnRzOgorICAgICAga2V5X3BhdGg6IFRoZSBwYXRoIHRvIGEgUlNBIHByaXZhdGUga2V5IGZpbGUuCisgICAgICBvdXRwdXQ6IFRoZSBmaWxlIHRvIHdyaXRlIHRvLgorICAgICIiIgorICAgIGtleSA9IENyeXB0by5QdWJsaWNLZXkuUlNBLmltcG9ydEtleShvcGVuKGtleV9wYXRoKS5yZWFkKCkpCisgICAgd3JpdGVfcnNhX2tleShvdXRwdXQsIGtleSkKKworICBkZWYgYWRkX2hhc2hfZm9vdGVyKHNlbGYsIGltYWdlX2ZpbGVuYW1lLCBwYXJ0aXRpb25fc2l6ZSwgcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgaGFzaF9hbGdvcml0aG0sIHNhbHQsIGFsZ29yaXRobV9uYW1lLCBrZXlfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNfa2V5X21ldGFkYXRhX3BhdGgsIHJvbGxiYWNrX2luZGV4LCBwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICBwcm9wc19mcm9tX2ZpbGUsIGtlcm5lbF9jbWRsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICBzZXR1cF9yb290ZnNfZnJvbV9rZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlLCBzaWduaW5nX2hlbHBlcik6CisgICAgIiIiSW1wbGVtZW50YXRpb24gb2YgdGhlIGFkZF9oYXNoX2Zvb3RlciBvbiB1bnNwYXJzZSBpbWFnZXMuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBpbWFnZV9maWxlbmFtZTogRmlsZSB0byBhZGQgdGhlIGZvb3RlciB0by4KKyAgICAgIHBhcnRpdGlvbl9zaXplOiBTaXplIG9mIHBhcnRpdGlvbi4KKyAgICAgIHBhcnRpdGlvbl9uYW1lOiBOYW1lIG9mIHBhcnRpdGlvbiAod2l0aG91dCBBL0Igc3VmZml4KS4KKyAgICAgIGhhc2hfYWxnb3JpdGhtOiBIYXNoIGFsZ29yaXRobSB0byB1c2UuCisgICAgICBzYWx0OiBTYWx0IHRvIHVzZSBhcyBhIGhleGFkZWNpbWFsIHN0cmluZyBvciBOb25lIHRvIHVzZSAvZGV2L3VyYW5kb20uCisgICAgICBhbGdvcml0aG1fbmFtZTogTmFtZSBvZiBhbGdvcml0aG0gdG8gdXNlLgorICAgICAga2V5X3BhdGg6IFBhdGggdG8ga2V5IHRvIHVzZSBvciBOb25lLgorICAgICAgcHVibGljX2tleV9tZXRhZGF0YV9wYXRoOiBQYXRoIHRvIHB1YmxpYyBrZXkgbWV0YWRhdGEgb3IgTm9uZS4KKyAgICAgIHJvbGxiYWNrX2luZGV4OiBSb2xsYmFjayBpbmRleC4KKyAgICAgIHByb3BzOiBQcm9wZXJ0aWVzIHRvIGluc2VydCAoTGlzdCBvZiBzdHJpbmdzIG9mIHRoZSBmb3JtICdrZXk6dmFsdWUnKS4KKyAgICAgIHByb3BzX2Zyb21fZmlsZTogUHJvcGVydGllcyB0byBpbnNlcnQgKExpc3Qgb2Ygc3RyaW5ncyAna2V5OjxwYXRoPicpLgorICAgICAga2VybmVsX2NtZGxpbmVzOiBLZXJuZWwgY21kbGluZXMgdG8gaW5zZXJ0IChsaXN0IG9mIHN0cmluZ3MpLgorICAgICAgc2V0dXBfcm9vdGZzX2Zyb21fa2VybmVsOiBOb25lIG9yIGZpbGUgdG8gZ2VuZXJhdGUKKyAgICAgICAgZG0tdmVyaXR5IGtlcm5lbCBjbWRsaW5lIGZyb20uCisgICAgICBpbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2U6IExpc3Qgb2YgZmlsZSBvYmplY3RzIGZvciB3aGljaAorICAgICAgICB0byBpbnNlcnQgZGVzY3JpcHRvcnMgZnJvbS4KKyAgICAgIHNpZ25pbmdfaGVscGVyOiBQcm9ncmFtIHdoaWNoIHNpZ25zIGEgaGFzaCBhbmQgcmV0dXJuIHNpZ25hdHVyZS4KKworICAgIFJhaXNlczoKKyAgICAgIEF2YkVycm9yOiBJZiBhbiBhcmd1bWVudCBpcyBpbmNvcnJlY3QuCisgICAgIiIiCisgICAgaW1hZ2UgPSBJbWFnZUhhbmRsZXIoaW1hZ2VfZmlsZW5hbWUpCisKKyAgICBpZiBwYXJ0aXRpb25fc2l6ZSAlIGltYWdlLmJsb2NrX3NpemUgIT0gMDoKKyAgICAgIHJhaXNlIEF2YkVycm9yKCdQYXJ0aXRpb24gc2l6ZSBvZiB7fSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgaW1hZ2UgJworICAgICAgICAgICAgICAgICAgICAgJ2Jsb2NrIHNpemUge30uJy5mb3JtYXQocGFydGl0aW9uX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5ibG9ja19zaXplKSkKKworICAgICMgSWYgdGhlcmUncyBhbHJlYWR5IGEgZm9vdGVyLCB0cnVuY2F0ZSB0aGUgaW1hZ2UgdG8gaXRzIG9yaWdpbmFsCisgICAgIyBzaXplLiBUaGlzIHdheSAnYXZidG9vbCBhZGRfaGFzaF9mb290ZXInIGlzIGlkZW1wb3RlbnQgKG1vZHVsbworICAgICMgc2FsdHMpLgorICAgIGltYWdlLnNlZWsoaW1hZ2UuaW1hZ2Vfc2l6ZSAtIEF2YkZvb3Rlci5TSVpFKQorICAgIHRyeToKKyAgICAgIGZvb3RlciA9IEF2YkZvb3RlcihpbWFnZS5yZWFkKEF2YkZvb3Rlci5TSVpFKSkKKyAgICAgICMgRXhpc3RpbmcgZm9vdGVyIGZvdW5kLiBKdXN0IHRydW5jYXRlLgorICAgICAgb3JpZ2luYWxfaW1hZ2Vfc2l6ZSA9IGZvb3Rlci5vcmlnaW5hbF9pbWFnZV9zaXplCisgICAgICBpbWFnZS50cnVuY2F0ZShmb290ZXIub3JpZ2luYWxfaW1hZ2Vfc2l6ZSkKKyAgICBleGNlcHQgKExvb2t1cEVycm9yLCBzdHJ1Y3QuZXJyb3IpOgorICAgICAgb3JpZ2luYWxfaW1hZ2Vfc2l6ZSA9IGltYWdlLmltYWdlX3NpemUKKworICAgICMgSWYgYW55dGhpbmcgZ29lcyB3cm9uZyBmcm9tIGhlcmUtb24sIHJlc3RvcmUgdGhlIGltYWdlIGJhY2sgdG8KKyAgICAjIGl0cyBvcmlnaW5hbCBzaXplLgorICAgIHRyeToKKyAgICAgICMgRmlyc3QsIGNhbGN1bGF0ZSB0aGUgbWF4aW11bSBpbWFnZSBzaXplIHN1Y2ggdGhhdCBhbiBpbWFnZQorICAgICAgIyB0aGlzIHNpemUgKyBtZXRhZGF0YSAoZm9vdGVyICsgdmJtZXRhIHN0cnVjdCkgZml0cyBpbgorICAgICAgIyB8cGFydGl0aW9uX3NpemV8LgorICAgICAgbWF4X21ldGFkYXRhX3NpemUgPSBzZWxmLk1BWF9WQk1FVEFfU0laRSArIHNlbGYuTUFYX0ZPT1RFUl9TSVpFCisgICAgICBtYXhfaW1hZ2Vfc2l6ZSA9IHBhcnRpdGlvbl9zaXplIC0gbWF4X21ldGFkYXRhX3NpemUKKworICAgICAgIyBJZiBpbWFnZSBzaXplIGV4Y2VlZHMgdGhlIG1heGltdW0gaW1hZ2Ugc2l6ZSwgZmFpbC4KKyAgICAgIGlmIGltYWdlLmltYWdlX3NpemUgPiBtYXhfaW1hZ2Vfc2l6ZToKKyAgICAgICAgcmFpc2UgQXZiRXJyb3IoJ0ltYWdlIHNpemUgb2Yge30gZXhjZWVkcyBtYXhpbXVtIGltYWdlICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ3NpemUgb2Yge30gaW4gb3JkZXIgdG8gZml0IGluIGEgcGFydGl0aW9uICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ3NpemUgb2Yge30uJy5mb3JtYXQoaW1hZ2UuaW1hZ2Vfc2l6ZSwgbWF4X2ltYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplKSkKKworICAgICAgZGlnZXN0X3NpemUgPSBsZW4oaGFzaGxpYi5uZXcobmFtZT1oYXNoX2FsZ29yaXRobSkuZGlnZXN0KCkpCisgICAgICBpZiBzYWx0OgorICAgICAgICBzYWx0ID0gc2FsdC5kZWNvZGUoJ2hleCcpCisgICAgICBlbHNlOgorICAgICAgICBpZiBzYWx0IGlzIE5vbmU6CisgICAgICAgICAgIyBJZiBzYWx0IGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCwgY2hvb3NlIGEgaGFzaAorICAgICAgICAgICMgdGhhdCdzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGhhc2ggc2l6ZS4KKyAgICAgICAgICBoYXNoX3NpemUgPSBkaWdlc3Rfc2l6ZQorICAgICAgICAgIHNhbHQgPSBvcGVuKCcvZGV2L3VyYW5kb20nKS5yZWFkKGhhc2hfc2l6ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBzYWx0ID0gJycKKworICAgICAgaGFzaGVyID0gaGFzaGxpYi5uZXcobmFtZT1oYXNoX2FsZ29yaXRobSwgc3RyaW5nPXNhbHQpCisgICAgICAjIFRPRE8oemV1dGhlbik6IG1pZ2h0IHdhbnQgdG8gcmVhZCB0aGlzIGluIGNodW5rcyB0byBhdm9pZAorICAgICAgIyBtZW1vcnkgcHJlc3N1cmUsIHRoZW4gYWdhaW4sIHRoaXMgaXMgb25seSBzdXBwb3NlZCB0byBiZSB1c2VkCisgICAgICAjIG9uIGtlcm5lbC9pbml0cmFtZnMgcGFydGl0aW9ucy4gUG9zc2libGUgb3B0aW1pemF0aW9uLgorICAgICAgaW1hZ2Uuc2VlaygwKQorICAgICAgaGFzaGVyLnVwZGF0ZShpbWFnZS5yZWFkKGltYWdlLmltYWdlX3NpemUpKQorICAgICAgZGlnZXN0ID0gaGFzaGVyLmRpZ2VzdCgpCisKKyAgICAgIGhfZGVzYyA9IEF2Ykhhc2hEZXNjcmlwdG9yKCkKKyAgICAgIGhfZGVzYy5pbWFnZV9zaXplID0gaW1hZ2UuaW1hZ2Vfc2l6ZQorICAgICAgaF9kZXNjLmhhc2hfYWxnb3JpdGhtID0gaGFzaF9hbGdvcml0aG0KKyAgICAgIGhfZGVzYy5wYXJ0aXRpb25fbmFtZSA9IHBhcnRpdGlvbl9uYW1lCisgICAgICBoX2Rlc2Muc2FsdCA9IHNhbHQKKyAgICAgIGhfZGVzYy5kaWdlc3QgPSBkaWdlc3QKKworICAgICAgIyBGbGFncyBhcmUgb25seSBhbGxvd2VkIG9uIHRvcC1sZXZlbCB2Ym1ldGEgc3RydWN0LgorICAgICAgZmxhZ3MgPSAwCisKKyAgICAgICMgR2VuZXJhdGUgdGhlIFZCTWV0YSBmb290ZXIuCisgICAgICB2Ym1ldGFfYmxvYiA9IHNlbGYuX2dlbmVyYXRlX3ZibWV0YV9ibG9iKAorICAgICAgICAgIGFsZ29yaXRobV9uYW1lLCBrZXlfcGF0aCwgcHVibGljX2tleV9tZXRhZGF0YV9wYXRoLCBbaF9kZXNjXSwKKyAgICAgICAgICByb2xsYmFja19pbmRleCwgZmxhZ3MsIHByb3BzLCBwcm9wc19mcm9tX2ZpbGUsIGtlcm5lbF9jbWRsaW5lcywKKyAgICAgICAgICBzZXR1cF9yb290ZnNfZnJvbV9rZXJuZWwsCisgICAgICAgICAgaW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlLCBzaWduaW5nX2hlbHBlcikKKworICAgICAgIyBJZiB0aGUgaW1hZ2UgaXNuJ3Qgc3BhcnNlLCBpdHMgc2l6ZSBtaWdodCBub3QgYmUgYSBtdWx0aXBsZSBvZgorICAgICAgIyB0aGUgYmxvY2sgc2l6ZS4gVGhpcyB3aWxsIHNjcmV3IHVwIHBhZGRpbmcgbGF0ZXIgc28ganVzdCBncm93IGl0LgorICAgICAgaWYgaW1hZ2UuaW1hZ2Vfc2l6ZSAlIGltYWdlLmJsb2NrX3NpemUgIT0gMDoKKyAgICAgICAgYXNzZXJ0IG5vdCBpbWFnZS5pc19zcGFyc2UKKyAgICAgICAgcGFkZGluZ19uZWVkZWQgPSBpbWFnZS5ibG9ja19zaXplIC0gKGltYWdlLmltYWdlX3NpemUlaW1hZ2UuYmxvY2tfc2l6ZSkKKyAgICAgICAgaW1hZ2UudHJ1bmNhdGUoaW1hZ2UuaW1hZ2Vfc2l6ZSArIHBhZGRpbmdfbmVlZGVkKQorCisgICAgICAjIFRoZSBhcHBlbmRfcmF3KCkgbWV0aG9kIHJlcXVpcmVzIGNvbnRlbnQgd2l0aCBzaXplIGJlaW5nIGEKKyAgICAgICMgbXVsdGlwbGUgb2YgfGJsb2NrX3NpemV8IHNvIGFkZCBwYWRkaW5nIGFzIG5lZWRlZC4gQWxzbyByZWNvcmQKKyAgICAgICMgd2hlcmUgdGhpcyBpcyB3cml0dGVuIHRvIHNpbmNlIHdlJ2xsIG5lZWQgdG8gcHV0IHRoYXQgaW4gdGhlCisgICAgICAjIGZvb3Rlci4KKyAgICAgIHZibWV0YV9vZmZzZXQgPSBpbWFnZS5pbWFnZV9zaXplCisgICAgICBwYWRkaW5nX25lZWRlZCA9IChyb3VuZF90b19tdWx0aXBsZShsZW4odmJtZXRhX2Jsb2IpLCBpbWFnZS5ibG9ja19zaXplKSAtCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4odmJtZXRhX2Jsb2IpKQorICAgICAgdmJtZXRhX2Jsb2Jfd2l0aF9wYWRkaW5nID0gdmJtZXRhX2Jsb2IgKyAnXDAnKnBhZGRpbmdfbmVlZGVkCisgICAgICBpbWFnZS5hcHBlbmRfcmF3KHZibWV0YV9ibG9iX3dpdGhfcGFkZGluZykKKyAgICAgIHZibWV0YV9lbmRfb2Zmc2V0ID0gdmJtZXRhX29mZnNldCArIGxlbih2Ym1ldGFfYmxvYl93aXRoX3BhZGRpbmcpCisKKyAgICAgICMgTm93IGluc2VydCBhIERPTlRfQ0FSRSBjaHVuayB3aXRoIGVub3VnaCBieXRlcyBzdWNoIHRoYXQgdGhlCisgICAgICAjIGZpbmFsIEZvb3RlciBibG9jayBpcyBhdCB0aGUgZW5kIG9mIHBhcnRpdGlvbl9zaXplLi4KKyAgICAgIGltYWdlLmFwcGVuZF9kb250X2NhcmUocGFydGl0aW9uX3NpemUgLSB2Ym1ldGFfZW5kX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEqaW1hZ2UuYmxvY2tfc2l6ZSkKKworICAgICAgIyBHZW5lcmF0ZSB0aGUgRm9vdGVyIHRoYXQgdGVsbHMgd2hlcmUgdGhlIFZCTWV0YSBmb290ZXIKKyAgICAgICMgaXMuIEFsc28gcHV0IGVub3VnaCBwYWRkaW5nIGluIHRoZSBmcm9udCBvZiB0aGUgZm9vdGVyIHNpbmNlCisgICAgICAjIHdlJ2xsIHdyaXRlIG91dCBhbiBlbnRpcmUgYmxvY2suCisgICAgICBmb290ZXIgPSBBdmJGb290ZXIoKQorICAgICAgZm9vdGVyLm9yaWdpbmFsX2ltYWdlX3NpemUgPSBvcmlnaW5hbF9pbWFnZV9zaXplCisgICAgICBmb290ZXIudmJtZXRhX29mZnNldCA9IHZibWV0YV9vZmZzZXQKKyAgICAgIGZvb3Rlci52Ym1ldGFfc2l6ZSA9IGxlbih2Ym1ldGFfYmxvYikKKyAgICAgIGZvb3Rlcl9ibG9iID0gZm9vdGVyLmVuY29kZSgpCisgICAgICBmb290ZXJfYmxvYl93aXRoX3BhZGRpbmcgPSAoJ1wwJyooaW1hZ2UuYmxvY2tfc2l6ZSAtIEF2YkZvb3Rlci5TSVpFKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vdGVyX2Jsb2IpCisgICAgICBpbWFnZS5hcHBlbmRfcmF3KGZvb3Rlcl9ibG9iX3dpdGhfcGFkZGluZykKKworICAgIGV4Y2VwdDoKKyAgICAgICMgVHJ1bmNhdGUgYmFjayB0byBvcmlnaW5hbCBzaXplLCB0aGVuIHJlLXJhaXNlCisgICAgICBpbWFnZS50cnVuY2F0ZShvcmlnaW5hbF9pbWFnZV9zaXplKQorICAgICAgcmFpc2UKKworICBkZWYgYWRkX2hhc2h0cmVlX2Zvb3RlcihzZWxmLCBpbWFnZV9maWxlbmFtZSwgcGFydGl0aW9uX3NpemUsIHBhcnRpdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9mZWMsIGZlY19udW1fcm9vdHMsIGhhc2hfYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19zaXplLCBzYWx0LCBhbGdvcml0aG1fbmFtZSwga2V5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY19rZXlfbWV0YWRhdGFfcGF0aCwgcm9sbGJhY2tfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLCBwcm9wc19mcm9tX2ZpbGUsIGtlcm5lbF9jbWRsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXBfcm9vdGZzX2Zyb21fa2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNfbWF4X2ltYWdlX3NpemUsIHNpZ25pbmdfaGVscGVyKToKKyAgICAiIiJJbXBsZW1lbnRzIHRoZSAnYWRkX2hhc2h0cmVlX2Zvb3RlcicgY29tbWFuZC4KKworICAgIFNlZSBodHRwczovL2dpdGxhYi5jb20vY3J5cHRzZXR1cC9jcnlwdHNldHVwL3dpa2lzL0RNVmVyaXR5IGZvcgorICAgIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZG0tdmVyaXR5IGFuZCB0aGVzZSBoYXNoZXMuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBpbWFnZV9maWxlbmFtZTogRmlsZSB0byBhZGQgdGhlIGZvb3RlciB0by4KKyAgICAgIHBhcnRpdGlvbl9zaXplOiBTaXplIG9mIHBhcnRpdGlvbi4KKyAgICAgIHBhcnRpdGlvbl9uYW1lOiBOYW1lIG9mIHBhcnRpdGlvbiAod2l0aG91dCBBL0Igc3VmZml4KS4KKyAgICAgIGdlbmVyYXRlX2ZlYzogSWYgVHJ1ZSwgZ2VuZXJhdGUgRkVDIGNvZGVzLgorICAgICAgZmVjX251bV9yb290czogTnVtYmVyIG9mIHJvb3RzIGZvciBGRUMuCisgICAgICBoYXNoX2FsZ29yaXRobTogSGFzaCBhbGdvcml0aG0gdG8gdXNlLgorICAgICAgYmxvY2tfc2l6ZTogQmxvY2sgc2l6ZSB0byB1c2UuCisgICAgICBzYWx0OiBTYWx0IHRvIHVzZSBhcyBhIGhleGFkZWNpbWFsIHN0cmluZyBvciBOb25lIHRvIHVzZSAvZGV2L3VyYW5kb20uCisgICAgICBhbGdvcml0aG1fbmFtZTogTmFtZSBvZiBhbGdvcml0aG0gdG8gdXNlLgorICAgICAga2V5X3BhdGg6IFBhdGggdG8ga2V5IHRvIHVzZSBvciBOb25lLgorICAgICAgcHVibGljX2tleV9tZXRhZGF0YV9wYXRoOiBQYXRoIHRvIHB1YmxpYyBrZXkgbWV0YWRhdGEgb3IgTm9uZS4KKyAgICAgIHJvbGxiYWNrX2luZGV4OiBSb2xsYmFjayBpbmRleC4KKyAgICAgIHByb3BzOiBQcm9wZXJ0aWVzIHRvIGluc2VydCAoTGlzdCBvZiBzdHJpbmdzIG9mIHRoZSBmb3JtICdrZXk6dmFsdWUnKS4KKyAgICAgIHByb3BzX2Zyb21fZmlsZTogUHJvcGVydGllcyB0byBpbnNlcnQgKExpc3Qgb2Ygc3RyaW5ncyAna2V5OjxwYXRoPicpLgorICAgICAga2VybmVsX2NtZGxpbmVzOiBLZXJuZWwgY21kbGluZXMgdG8gaW5zZXJ0IChsaXN0IG9mIHN0cmluZ3MpLgorICAgICAgc2V0dXBfcm9vdGZzX2Zyb21fa2VybmVsOiBOb25lIG9yIGZpbGUgdG8gZ2VuZXJhdGUKKyAgICAgICAgZG0tdmVyaXR5IGtlcm5lbCBjbWRsaW5lIGZyb20uCisgICAgICBpbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2U6IExpc3Qgb2YgZmlsZSBvYmplY3RzIGZvciB3aGljaAorICAgICAgICB0byBpbnNlcnQgZGVzY3JpcHRvcnMgZnJvbS4KKyAgICAgIGNhbGNfbWF4X2ltYWdlX3NpemU6IERvbid0IHN0b3JlIHRoZSBoYXNodHJlZSBvciBmb290ZXIgLSBpbnN0ZWFkCisgICAgICAgIGNhbGN1bGF0ZSB0aGUgbWF4aW11bSBpbWFnZSBzaXplIGxlYXZpbmcgZW5vdWdoIHJvb20gZm9yIGhhc2h0cmVlCisgICAgICAgIGFuZCBtZXRhZGF0YSB3aXRoIHRoZSBnaXZlbiB8cGFydGl0aW9uX3NpemV8LgorICAgICAgc2lnbmluZ19oZWxwZXI6IFByb2dyYW0gd2hpY2ggc2lnbnMgYSBoYXNoIGFuZCByZXR1cm4gc2lnbmF0dXJlLgorCisgICAgUmFpc2VzOgorICAgICAgQXZiRXJyb3I6IElmIGFuIGFyZ3VtZW50IGlzIGluY29ycmVjdC4KKyAgICAiIiIKKyAgICBkaWdlc3Rfc2l6ZSA9IGxlbihoYXNobGliLm5ldyhuYW1lPWhhc2hfYWxnb3JpdGhtKS5kaWdlc3QoKSkKKyAgICBkaWdlc3RfcGFkZGluZyA9IHJvdW5kX3RvX3BvdzIoZGlnZXN0X3NpemUpIC0gZGlnZXN0X3NpemUKKworICAgICMgRmlyc3QsIGNhbGN1bGF0ZSB0aGUgbWF4aW11bSBpbWFnZSBzaXplIHN1Y2ggdGhhdCBhbiBpbWFnZQorICAgICMgdGhpcyBzaXplICsgdGhlIGhhc2h0cmVlICsgbWV0YWRhdGEgKGZvb3RlciArIHZibWV0YSBzdHJ1Y3QpCisgICAgIyBmaXRzIGluIHxwYXJ0aXRpb25fc2l6ZXwuIFdlIHVzZSB2ZXJ5IGNvbnNlcnZhdGl2ZSBmaWd1cmVzIGZvcgorICAgICMgbWV0YWRhdGEuCisgICAgKF8sIG1heF90cmVlX3NpemUpID0gY2FsY19oYXNoX2xldmVsX29mZnNldHMoCisgICAgICAgIHBhcnRpdGlvbl9zaXplLCBibG9ja19zaXplLCBkaWdlc3Rfc2l6ZSArIGRpZ2VzdF9wYWRkaW5nKQorICAgIG1heF9mZWNfc2l6ZSA9IDAKKyAgICBpZiBnZW5lcmF0ZV9mZWM6CisgICAgICBtYXhfZmVjX3NpemUgPSBjYWxjX2ZlY19kYXRhX3NpemUocGFydGl0aW9uX3NpemUsIGZlY19udW1fcm9vdHMpCisgICAgbWF4X21ldGFkYXRhX3NpemUgPSAobWF4X2ZlY19zaXplICsgbWF4X3RyZWVfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5NQVhfVkJNRVRBX1NJWkUgKworICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTUFYX0ZPT1RFUl9TSVpFKQorICAgIG1heF9pbWFnZV9zaXplID0gcGFydGl0aW9uX3NpemUgLSBtYXhfbWV0YWRhdGFfc2l6ZQorCisgICAgIyBJZiB3ZSdyZSBhc2tlZCB0byBvbmx5IGNhbGN1bGF0ZSB0aGUgbWF4aW11bSBpbWFnZSBzaXplLCB3ZSdyZSBkb25lLgorICAgIGlmIGNhbGNfbWF4X2ltYWdlX3NpemU6CisgICAgICBwcmludCAne30nLmZvcm1hdChtYXhfaW1hZ2Vfc2l6ZSkKKyAgICAgIHJldHVybgorCisgICAgaW1hZ2UgPSBJbWFnZUhhbmRsZXIoaW1hZ2VfZmlsZW5hbWUpCisKKyAgICBpZiBwYXJ0aXRpb25fc2l6ZSAlIGltYWdlLmJsb2NrX3NpemUgIT0gMDoKKyAgICAgIHJhaXNlIEF2YkVycm9yKCdQYXJ0aXRpb24gc2l6ZSBvZiB7fSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgaW1hZ2UgJworICAgICAgICAgICAgICAgICAgICAgJ2Jsb2NrIHNpemUge30uJy5mb3JtYXQocGFydGl0aW9uX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5ibG9ja19zaXplKSkKKworICAgICMgSWYgdGhlcmUncyBhbHJlYWR5IGEgZm9vdGVyLCB0cnVuY2F0ZSB0aGUgaW1hZ2UgdG8gaXRzIG9yaWdpbmFsCisgICAgIyBzaXplLiBUaGlzIHdheSAnYXZidG9vbCBhZGRfaGFzaHRyZWVfZm9vdGVyJyBpcyBpZGVtcG90ZW50CisgICAgIyAobW9kdWxvIHNhbHRzKS4KKyAgICBpbWFnZS5zZWVrKGltYWdlLmltYWdlX3NpemUgLSBBdmJGb290ZXIuU0laRSkKKyAgICB0cnk6CisgICAgICBmb290ZXIgPSBBdmJGb290ZXIoaW1hZ2UucmVhZChBdmJGb290ZXIuU0laRSkpCisgICAgICAjIEV4aXN0aW5nIGZvb3RlciBmb3VuZC4gSnVzdCB0cnVuY2F0ZS4KKyAgICAgIG9yaWdpbmFsX2ltYWdlX3NpemUgPSBmb290ZXIub3JpZ2luYWxfaW1hZ2Vfc2l6ZQorICAgICAgaW1hZ2UudHJ1bmNhdGUoZm9vdGVyLm9yaWdpbmFsX2ltYWdlX3NpemUpCisgICAgZXhjZXB0IChMb29rdXBFcnJvciwgc3RydWN0LmVycm9yKToKKyAgICAgIG9yaWdpbmFsX2ltYWdlX3NpemUgPSBpbWFnZS5pbWFnZV9zaXplCisKKyAgICAjIElmIGFueXRoaW5nIGdvZXMgd3JvbmcgZnJvbSBoZXJlLW9uLCByZXN0b3JlIHRoZSBpbWFnZSBiYWNrIHRvCisgICAgIyBpdHMgb3JpZ2luYWwgc2l6ZS4KKyAgICB0cnk6CisgICAgICAjIEVuc3VyZSBpbWFnZSBpcyBtdWx0aXBsZSBvZiBibG9ja19zaXplLgorICAgICAgcm91bmRlZF9pbWFnZV9zaXplID0gcm91bmRfdG9fbXVsdGlwbGUoaW1hZ2UuaW1hZ2Vfc2l6ZSwgYmxvY2tfc2l6ZSkKKyAgICAgIGlmIHJvdW5kZWRfaW1hZ2Vfc2l6ZSA+IGltYWdlLmltYWdlX3NpemU6CisgICAgICAgIGltYWdlLmFwcGVuZF9yYXcoJ1wwJyAqIChyb3VuZGVkX2ltYWdlX3NpemUgLSBpbWFnZS5pbWFnZV9zaXplKSkKKworICAgICAgIyBJZiBpbWFnZSBzaXplIGV4Y2VlZHMgdGhlIG1heGltdW0gaW1hZ2Ugc2l6ZSwgZmFpbC4KKyAgICAgIGlmIGltYWdlLmltYWdlX3NpemUgPiBtYXhfaW1hZ2Vfc2l6ZToKKyAgICAgICAgcmFpc2UgQXZiRXJyb3IoJ0ltYWdlIHNpemUgb2Yge30gZXhjZWVkcyBtYXhpbXVtIGltYWdlICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ3NpemUgb2Yge30gaW4gb3JkZXIgdG8gZml0IGluIGEgcGFydGl0aW9uICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ3NpemUgb2Yge30uJy5mb3JtYXQoaW1hZ2UuaW1hZ2Vfc2l6ZSwgbWF4X2ltYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplKSkKKworICAgICAgaWYgc2FsdDoKKyAgICAgICAgc2FsdCA9IHNhbHQuZGVjb2RlKCdoZXgnKQorICAgICAgZWxzZToKKyAgICAgICAgaWYgc2FsdCBpcyBOb25lOgorICAgICAgICAgICMgSWYgc2FsdCBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQsIGNob29zZSBhIGhhc2gKKyAgICAgICAgICAjIHRoYXQncyB0aGUgc2FtZSBzaXplIGFzIHRoZSBoYXNoIHNpemUuCisgICAgICAgICAgaGFzaF9zaXplID0gZGlnZXN0X3NpemUKKyAgICAgICAgICBzYWx0ID0gb3BlbignL2Rldi91cmFuZG9tJykucmVhZChoYXNoX3NpemUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgc2FsdCA9ICcnCisKKyAgICAgICMgSGFzaGVzIGFyZSBzdG9yZWQgdXBzaWRlIGRvd24gc28gd2UgbmVlZCB0byBjYWxjdWxhdGUgaGFzaAorICAgICAgIyBvZmZzZXRzIGluIGFkdmFuY2UuCisgICAgICAoaGFzaF9sZXZlbF9vZmZzZXRzLCB0cmVlX3NpemUpID0gY2FsY19oYXNoX2xldmVsX29mZnNldHMoCisgICAgICAgICAgaW1hZ2UuaW1hZ2Vfc2l6ZSwgYmxvY2tfc2l6ZSwgZGlnZXN0X3NpemUgKyBkaWdlc3RfcGFkZGluZykKKworICAgICAgIyBJZiB0aGUgaW1hZ2UgaXNuJ3Qgc3BhcnNlLCBpdHMgc2l6ZSBtaWdodCBub3QgYmUgYSBtdWx0aXBsZSBvZgorICAgICAgIyB0aGUgYmxvY2sgc2l6ZS4gVGhpcyB3aWxsIHNjcmV3IHVwIHBhZGRpbmcgbGF0ZXIgc28ganVzdCBncm93IGl0LgorICAgICAgaWYgaW1hZ2UuaW1hZ2Vfc2l6ZSAlIGltYWdlLmJsb2NrX3NpemUgIT0gMDoKKyAgICAgICAgYXNzZXJ0IG5vdCBpbWFnZS5pc19zcGFyc2UKKyAgICAgICAgcGFkZGluZ19uZWVkZWQgPSBpbWFnZS5ibG9ja19zaXplIC0gKGltYWdlLmltYWdlX3NpemUlaW1hZ2UuYmxvY2tfc2l6ZSkKKyAgICAgICAgaW1hZ2UudHJ1bmNhdGUoaW1hZ2UuaW1hZ2Vfc2l6ZSArIHBhZGRpbmdfbmVlZGVkKQorCisgICAgICAjIEdlbmVyYXRlIHRoZSB0cmVlIGFuZCBhZGQgcGFkZGluZyBhcyBuZWVkZWQuCisgICAgICB0cmVlX29mZnNldCA9IGltYWdlLmltYWdlX3NpemUKKyAgICAgIHJvb3RfZGlnZXN0LCBoYXNoX3RyZWUgPSBnZW5lcmF0ZV9oYXNoX3RyZWUoaW1hZ2UsIGltYWdlLmltYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYWxnb3JpdGhtLCBzYWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3RfcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9sZXZlbF9vZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlX3NpemUpCisKKyAgICAgICMgR2VuZXJhdGUgSGFzaHRyZWVEZXNjcmlwdG9yIHdpdGggZGV0YWlscyBhYm91dCB0aGUgdHJlZSB3ZQorICAgICAgIyBqdXN0IGdlbmVyYXRlZC4KKyAgICAgIGh0X2Rlc2MgPSBBdmJIYXNodHJlZURlc2NyaXB0b3IoKQorICAgICAgaHRfZGVzYy5kbV92ZXJpdHlfdmVyc2lvbiA9IDEKKyAgICAgIGh0X2Rlc2MuaW1hZ2Vfc2l6ZSA9IGltYWdlLmltYWdlX3NpemUKKyAgICAgIGh0X2Rlc2MudHJlZV9vZmZzZXQgPSB0cmVlX29mZnNldAorICAgICAgaHRfZGVzYy50cmVlX3NpemUgPSB0cmVlX3NpemUKKyAgICAgIGh0X2Rlc2MuZGF0YV9ibG9ja19zaXplID0gYmxvY2tfc2l6ZQorICAgICAgaHRfZGVzYy5oYXNoX2Jsb2NrX3NpemUgPSBibG9ja19zaXplCisgICAgICBodF9kZXNjLmhhc2hfYWxnb3JpdGhtID0gaGFzaF9hbGdvcml0aG0KKyAgICAgIGh0X2Rlc2MucGFydGl0aW9uX25hbWUgPSBwYXJ0aXRpb25fbmFtZQorICAgICAgaHRfZGVzYy5zYWx0ID0gc2FsdAorICAgICAgaHRfZGVzYy5yb290X2RpZ2VzdCA9IHJvb3RfZGlnZXN0CisKKyAgICAgICMgV3JpdGUgdGhlIGhhc2ggdHJlZQorICAgICAgcGFkZGluZ19uZWVkZWQgPSAocm91bmRfdG9fbXVsdGlwbGUobGVuKGhhc2hfdHJlZSksIGltYWdlLmJsb2NrX3NpemUpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbihoYXNoX3RyZWUpKQorICAgICAgaGFzaF90cmVlX3dpdGhfcGFkZGluZyA9IGhhc2hfdHJlZSArICdcMCcqcGFkZGluZ19uZWVkZWQKKyAgICAgIGltYWdlLmFwcGVuZF9yYXcoaGFzaF90cmVlX3dpdGhfcGFkZGluZykKKyAgICAgIGxlbl9oYXNodHJlZV9hbmRfZmVjID0gbGVuKGhhc2hfdHJlZV93aXRoX3BhZGRpbmcpCisKKyAgICAgICMgR2VuZXJhdGUgRkVDIGNvZGVzLCBpZiByZXF1ZXN0ZWQuCisgICAgICBpZiBnZW5lcmF0ZV9mZWM6CisgICAgICAgIGZlY19kYXRhID0gZ2VuZXJhdGVfZmVjX2RhdGEoaW1hZ2VfZmlsZW5hbWUsIGZlY19udW1fcm9vdHMpCisgICAgICAgIHBhZGRpbmdfbmVlZGVkID0gKHJvdW5kX3RvX211bHRpcGxlKGxlbihmZWNfZGF0YSksIGltYWdlLmJsb2NrX3NpemUpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGZlY19kYXRhKSkKKyAgICAgICAgZmVjX2RhdGFfd2l0aF9wYWRkaW5nID0gZmVjX2RhdGEgKyAnXDAnKnBhZGRpbmdfbmVlZGVkCisgICAgICAgIGZlY19vZmZzZXQgPSBpbWFnZS5pbWFnZV9zaXplCisgICAgICAgIGltYWdlLmFwcGVuZF9yYXcoZmVjX2RhdGFfd2l0aF9wYWRkaW5nKQorICAgICAgICBsZW5faGFzaHRyZWVfYW5kX2ZlYyArPSBsZW4oZmVjX2RhdGFfd2l0aF9wYWRkaW5nKQorICAgICAgICAjIFVwZGF0ZSB0aGUgaGFzaHRyZWUgZGVzY3JpcHRvci4KKyAgICAgICAgaHRfZGVzYy5mZWNfbnVtX3Jvb3RzID0gZmVjX251bV9yb290cworICAgICAgICBodF9kZXNjLmZlY19vZmZzZXQgPSBmZWNfb2Zmc2V0CisgICAgICAgIGh0X2Rlc2MuZmVjX3NpemUgPSBsZW4oZmVjX2RhdGEpCisKKyAgICAgICMgRmxhZ3MgYXJlIG9ubHkgYWxsb3dlZCBvbiB0b3AtbGV2ZWwgdmJtZXRhIHN0cnVjdC4KKyAgICAgIGZsYWdzID0gMAorCisgICAgICAjIEdlbmVyYXRlIHRoZSBWQk1ldGEgZm9vdGVyIGFuZCBhZGQgcGFkZGluZyBhcyBuZWVkZWQuCisgICAgICB2Ym1ldGFfb2Zmc2V0ID0gdHJlZV9vZmZzZXQgKyBsZW5faGFzaHRyZWVfYW5kX2ZlYworICAgICAgdmJtZXRhX2Jsb2IgPSBzZWxmLl9nZW5lcmF0ZV92Ym1ldGFfYmxvYigKKyAgICAgICAgICBhbGdvcml0aG1fbmFtZSwga2V5X3BhdGgsIHB1YmxpY19rZXlfbWV0YWRhdGFfcGF0aCwgW2h0X2Rlc2NdLAorICAgICAgICAgIHJvbGxiYWNrX2luZGV4LCBmbGFncywgcHJvcHMsIHByb3BzX2Zyb21fZmlsZSwga2VybmVsX2NtZGxpbmVzLAorICAgICAgICAgIHNldHVwX3Jvb3Rmc19mcm9tX2tlcm5lbCwKKyAgICAgICAgICBpbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2UsIHNpZ25pbmdfaGVscGVyKQorICAgICAgcGFkZGluZ19uZWVkZWQgPSAocm91bmRfdG9fbXVsdGlwbGUobGVuKHZibWV0YV9ibG9iKSwgaW1hZ2UuYmxvY2tfc2l6ZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuKHZibWV0YV9ibG9iKSkKKyAgICAgIHZibWV0YV9ibG9iX3dpdGhfcGFkZGluZyA9IHZibWV0YV9ibG9iICsgJ1wwJypwYWRkaW5nX25lZWRlZAorICAgICAgaW1hZ2UuYXBwZW5kX3Jhdyh2Ym1ldGFfYmxvYl93aXRoX3BhZGRpbmcpCisKKyAgICAgICMgTm93IGluc2VydCBhIERPTlRfQ0FSRSBjaHVuayB3aXRoIGVub3VnaCBieXRlcyBzdWNoIHRoYXQgdGhlCisgICAgICAjIGZpbmFsIEZvb3RlciBibG9jayBpcyBhdCB0aGUgZW5kIG9mIHBhcnRpdGlvbl9zaXplLi4KKyAgICAgIGltYWdlLmFwcGVuZF9kb250X2NhcmUocGFydGl0aW9uX3NpemUgLSBpbWFnZS5pbWFnZV9zaXplIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSppbWFnZS5ibG9ja19zaXplKQorCisgICAgICAjIEdlbmVyYXRlIHRoZSBGb290ZXIgdGhhdCB0ZWxscyB3aGVyZSB0aGUgVkJNZXRhIGZvb3RlcgorICAgICAgIyBpcy4gQWxzbyBwdXQgZW5vdWdoIHBhZGRpbmcgaW4gdGhlIGZyb250IG9mIHRoZSBmb290ZXIgc2luY2UKKyAgICAgICMgd2UnbGwgd3JpdGUgb3V0IGFuIGVudGlyZSBibG9jay4KKyAgICAgIGZvb3RlciA9IEF2YkZvb3RlcigpCisgICAgICBmb290ZXIub3JpZ2luYWxfaW1hZ2Vfc2l6ZSA9IG9yaWdpbmFsX2ltYWdlX3NpemUKKyAgICAgIGZvb3Rlci52Ym1ldGFfb2Zmc2V0ID0gdmJtZXRhX29mZnNldAorICAgICAgZm9vdGVyLnZibWV0YV9zaXplID0gbGVuKHZibWV0YV9ibG9iKQorICAgICAgZm9vdGVyX2Jsb2IgPSBmb290ZXIuZW5jb2RlKCkKKyAgICAgIGZvb3Rlcl9ibG9iX3dpdGhfcGFkZGluZyA9ICgnXDAnKihpbWFnZS5ibG9ja19zaXplIC0gQXZiRm9vdGVyLlNJWkUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb290ZXJfYmxvYikKKyAgICAgIGltYWdlLmFwcGVuZF9yYXcoZm9vdGVyX2Jsb2Jfd2l0aF9wYWRkaW5nKQorCisgICAgZXhjZXB0OgorICAgICAgIyBUcnVuY2F0ZSBiYWNrIHRvIG9yaWdpbmFsIHNpemUsIHRoZW4gcmUtcmFpc2UuCisgICAgICBpbWFnZS50cnVuY2F0ZShvcmlnaW5hbF9pbWFnZV9zaXplKQorICAgICAgcmFpc2UKKworICBkZWYgbWFrZV9hdHhfY2VydGlmaWNhdGUoc2VsZiwgb3V0cHV0LCBhdXRob3JpdHlfa2V5X3BhdGgsIHN1YmplY3Rfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdF9rZXlfdmVyc2lvbiwgc3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2ludGVybWVkaWF0ZV9hdXRob3JpdHksIHNpZ25pbmdfaGVscGVyKToKKyAgICAiIiJJbXBsZW1lbnRzIHRoZSAnbWFrZV9hdHhfY2VydGlmaWNhdGUnIGNvbW1hbmQuCisKKyAgICBBbmRyb2lkIFRoaW5ncyBjZXJ0aWZpY2F0ZXMgYXJlIHJlcXVpcmVkIGZvciBBbmRyb2lkIFRoaW5ncyBwdWJsaWMga2V5CisgICAgbWV0YWRhdGEuIFRoZXkgY2hhaW4gdGhlIHZibWV0YSBzaWduaW5nIGtleSBmb3IgYSBwYXJ0aWN1bGFyIHByb2R1Y3QgYmFjayB0bworICAgIGEgZnVzZWQsIHBlcm1hbmVudCByb290IGtleS4gVGhlc2UgY2VydGlmaWNhdGVzIGFyZSBmaXhlZC1sZW5ndGggYW5kIGZpeGVkLQorICAgIGZvcm1hdCB3aXRoIHRoZSBleHBsaWNpdCBnb2FsIG9mIG5vdCBwYXJzaW5nIEFTTi4xIGluIGJvb3Rsb2FkZXIgY29kZS4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIG91dHB1dDogQ2VydGlmaWNhdGUgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgZmlsZSBvbiBzdWNjZXNzLgorICAgICAgYXV0aG9yaXR5X2tleV9wYXRoOiBBIFBFTSBmaWxlIHBhdGggd2l0aCB0aGUgYXV0aG9yaXR5IHByaXZhdGUga2V5LgorICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBOb25lLCB0aGVuIGEgY2VydGlmaWNhdGUgd2lsbCBiZSBjcmVhdGVkIHdpdGhvdXQgYQorICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUuIFRoZSBzaWduYXR1cmUgY2FuIGJlIGNyZWF0ZWQgb3V0LW9mLWJhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFwcGVuZGVkLgorICAgICAgc3ViamVjdF9rZXk6IEEgUEVNIG9yIERFUiBzdWJqZWN0IHB1YmxpYyBrZXkuCisgICAgICBzdWJqZWN0X2tleV92ZXJzaW9uOiBBIDY0LWJpdCB2ZXJzaW9uIHZhbHVlLiBJZiB0aGlzIGlzIE5vbmUsIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoIGlzIHVzZWQuCisgICAgICBzdWJqZWN0OiBBIHN1YmplY3QgaWRlbnRpZmllci4gRm9yIFByb2R1Y3QgU2lnbmluZyBLZXkgY2VydGlmaWNhdGVzIHRoaXMKKyAgICAgICAgICAgICAgIHNob3VsZCBiZSB0aGUgc2FtZSBQcm9kdWN0IElEIGZvdW5kIGluIHRoZSBwZXJtYW5lbnQgYXR0cmlidXRlcy4KKyAgICAgIGlzX2ludGVybWVkaWF0ZV9hdXRob3JpdHk6IFRydWUgaWYgdGhlIGNlcnRpZmljYXRlIGlzIGZvciBhbiBpbnRlcm1lZGlhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eS4KKyAgICAgIHNpZ25pbmdfaGVscGVyOiBQcm9ncmFtIHdoaWNoIHNpZ25zIGEgaGFzaCBhbmQgcmV0dXJucyB0aGUgc2lnbmF0dXJlLgorICAgICIiIgorICAgIHNpZ25lZF9kYXRhID0gYnl0ZWFycmF5KCkKKyAgICBzaWduZWRfZGF0YS5leHRlbmQoc3RydWN0LnBhY2soJzxJJywgMSkpICAjIEZvcm1hdCBWZXJzaW9uCisgICAgc2lnbmVkX2RhdGEuZXh0ZW5kKAorICAgICAgICBlbmNvZGVfcnNhX2tleShDcnlwdG8uUHVibGljS2V5LlJTQS5pbXBvcnRLZXkoc3ViamVjdF9rZXkpKSkKKyAgICBoYXNoZXIgPSBoYXNobGliLnNoYTI1NigpCisgICAgaGFzaGVyLnVwZGF0ZShzdWJqZWN0KQorICAgIHNpZ25lZF9kYXRhLmV4dGVuZChoYXNoZXIuZGlnZXN0KCkpCisgICAgdXNhZ2UgPSAnY29tLmdvb2dsZS5hbmRyb2lkLnRoaW5ncy52Ym9vdCcKKyAgICBpZiBpc19pbnRlcm1lZGlhdGVfYXV0aG9yaXR5OgorICAgICAgdXNhZ2UgKz0gJy5jYScKKyAgICBoYXNoZXIgPSBoYXNobGliLnNoYTI1NigpCisgICAgaGFzaGVyLnVwZGF0ZSh1c2FnZSkKKyAgICBzaWduZWRfZGF0YS5leHRlbmQoaGFzaGVyLmRpZ2VzdCgpKQorICAgIGlmIG5vdCBzdWJqZWN0X2tleV92ZXJzaW9uOgorICAgICAgc3ViamVjdF9rZXlfdmVyc2lvbiA9IGludCh0aW1lLnRpbWUoKSkKKyAgICBzaWduZWRfZGF0YS5leHRlbmQoc3RydWN0LnBhY2soJzxRJywgc3ViamVjdF9rZXlfdmVyc2lvbikpCisgICAgc2lnbmF0dXJlID0gYnl0ZWFycmF5KCkKKyAgICBpZiBhdXRob3JpdHlfa2V5X3BhdGg6CisgICAgICBwYWRkaW5nX2FuZF9oYXNoID0gYnl0ZWFycmF5KCkKKyAgICAgIGFsZ29yaXRobV9uYW1lID0gTm9uZQorICAgICAgaGFzaGVyID0gTm9uZQorICAgICAgaWYgaXNfaW50ZXJtZWRpYXRlX2F1dGhvcml0eToKKyAgICAgICAgaGFzaGVyID0gaGFzaGxpYi5zaGE1MTIoKQorICAgICAgICBhbGdvcml0aG1fbmFtZSA9ICdTSEE1MTJfUlNBNDA5NicKKyAgICAgIGVsc2U6CisgICAgICAgIGhhc2hlciA9IGhhc2hsaWIuc2hhMjU2KCkKKyAgICAgICAgYWxnb3JpdGhtX25hbWUgPSAnU0hBMjU2X1JTQTIwNDgnCisgICAgICBwYWRkaW5nX2FuZF9oYXNoLmV4dGVuZChBTEdPUklUSE1TW2FsZ29yaXRobV9uYW1lXS5wYWRkaW5nKQorICAgICAgaGFzaGVyLnVwZGF0ZShzaWduZWRfZGF0YSkKKyAgICAgIHBhZGRpbmdfYW5kX2hhc2guZXh0ZW5kKGhhc2hlci5kaWdlc3QoKSkKKyAgICAgIHNpZ25hdHVyZS5leHRlbmQocmF3X3NpZ24oc2lnbmluZ19oZWxwZXIsIGFsZ29yaXRobV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdHlfa2V5X3BhdGgsIHBhZGRpbmdfYW5kX2hhc2gpKQorICAgIG91dHB1dC53cml0ZShzaWduZWRfZGF0YSkKKyAgICBvdXRwdXQud3JpdGUoc2lnbmF0dXJlKQorCisgIGRlZiBtYWtlX2F0eF9wZXJtYW5lbnRfYXR0cmlidXRlcyhzZWxmLCBvdXRwdXQsIHJvb3RfYXV0aG9yaXR5X2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RfaWQpOgorICAgICIiIkltcGxlbWVudHMgdGhlICdtYWtlX2F0eF9wZXJtYW5lbnRfYXR0cmlidXRlcycgY29tbWFuZC4KKworICAgIEFuZHJvaWQgVGhpbmdzIHBlcm1hbmVudCBhdHRyaWJ1dGVzIGFyZSBkZXNpZ25lZCB0byBiZSBwZXJtYW5lbnQgZm9yIGEKKyAgICBwYXJ0aWN1bGFyIHByb2R1Y3QgYW5kIGEgaGFzaCBvZiB0aGVzZSBhdHRyaWJ1dGVzIHNob3VsZCBiZSBmdXNlZCBpbnRvCisgICAgaGFyZHdhcmUgdG8gZW5mb3JjZSB0aGlzLgorCisgICAgQXJndW1lbnRzOgorICAgICAgb3V0cHV0OiBBdHRyaWJ1dGVzIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZpbGUgb24gc3VjY2Vzcy4KKyAgICAgIHJvb3RfYXV0aG9yaXR5X2tleTogQSBQRU0gb3IgREVSIHB1YmxpYyBrZXkgZm9yIHRoZSByb290IGF1dGhvcml0eS4KKyAgICAgIHByb2R1Y3RfaWQ6IEEgMTYtYnl0ZSBQcm9kdWN0IElELgorCisgICAgUmFpc2VzOgorICAgICAgQXZiRXJyb3I6IElmIGFuIGFyZ3VtZW50IGlzIGluY29ycmVjdC4KKyAgICAiIiIKKyAgICBpZiBsZW4ocHJvZHVjdF9pZCkgIT0gMTY6CisgICAgICByYWlzZSBBdmJFcnJvcignSW52YWxpZCBQcm9kdWN0IElEIGxlbmd0aC4nKQorICAgIG91dHB1dC53cml0ZShzdHJ1Y3QucGFjaygnPEknLCAxKSkgICMgRm9ybWF0IFZlcnNpb24KKyAgICB3cml0ZV9yc2Ffa2V5KG91dHB1dCwgQ3J5cHRvLlB1YmxpY0tleS5SU0EuaW1wb3J0S2V5KHJvb3RfYXV0aG9yaXR5X2tleSkpCisgICAgb3V0cHV0LndyaXRlKHByb2R1Y3RfaWQpCisKKyAgZGVmIG1ha2VfYXR4X21ldGFkYXRhKHNlbGYsIG91dHB1dCwgaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfa2V5X2NlcnRpZmljYXRlLCBnb29nbGVfa2V5X3ZlcnNpb24pOgorICAgICIiIkltcGxlbWVudHMgdGhlICdtYWtlX2F0eF9tZXRhZGF0YScgY29tbWFuZC4KKworICAgIEFuZHJvaWQgVGhpbmdzIG1ldGFkYXRhIGFyZSBpbmNsdWRlZCBpbiB2Ym1ldGEgaW1hZ2VzIHRvIGZhY2lsaXRhdGUKKyAgICB2ZXJpZmljYXRpb24uIFRoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIGFzIHRoZQorICAgIHB1YmxpY19rZXlfbWV0YWRhdGEgYXJndW1lbnQgdG8gb3RoZXIgY29tbWFuZHMuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBvdXRwdXQ6IE1ldGFkYXRhIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZpbGUgb24gc3VjY2Vzcy4KKyAgICAgIGludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGU6IEEgY2VydGlmaWNhdGUgZmlsZSBhcyBvdXRwdXQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfYXR4X2NlcnRpZmljYXRlIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2ludGVybWVkaWF0ZV9hdXRob3JpdHkgc2V0IHRvIHRydWUuCisgICAgICBwcm9kdWN0X2tleV9jZXJ0aWZpY2F0ZTogQSBjZXJ0aWZpY2F0ZSBmaWxlIGFzIG91dHB1dCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfYXR4X2NlcnRpZmljYXRlIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19pbnRlcm1lZGlhdGVfYXV0aG9yaXR5IHNldCB0byBmYWxzZS4KKyAgICAgIGdvb2dsZV9rZXlfdmVyc2lvbjogVGhlIHZlcnNpb24gb2YgdGhlIEdvb2dsZSBTaWduaW5nIEtleSB1c2VkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHZibWV0YSBpbWFnZS4KKworICAgIFJhaXNlczoKKyAgICAgIEF2YkVycm9yOiBJZiBhbiBhcmd1bWVudCBpcyBpbmNvcnJlY3QuCisgICAgIiIiCisgICAgaWYgbGVuKGludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUpICE9IDExMDg6CisgICAgICByYWlzZSBBdmJFcnJvcignSW52YWxpZCBpbnRlcm1lZGlhdGUga2V5IGNlcnRpZmljYXRlIGxlbmd0aC4nKQorICAgIGlmIGxlbihwcm9kdWN0X2tleV9jZXJ0aWZpY2F0ZSkgIT0gODUyOgorICAgICAgcmFpc2UgQXZiRXJyb3IoJ0ludmFsaWQgcHJvZHVjdCBrZXkgY2VydGlmaWNhdGUgbGVuZ3RoLicpCisgICAgb3V0cHV0LndyaXRlKHN0cnVjdC5wYWNrKCc8SScsIDEpKSAgIyBGb3JtYXQgVmVyc2lvbgorICAgIG91dHB1dC53cml0ZShpbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlKQorICAgIG91dHB1dC53cml0ZShwcm9kdWN0X2tleV9jZXJ0aWZpY2F0ZSkKKyAgICBvdXRwdXQud3JpdGUoc3RydWN0LnBhY2soJzxRJywgZ29vZ2xlX2tleV92ZXJzaW9uKSkKKworCitkZWYgY2FsY19oYXNoX2xldmVsX29mZnNldHMoaW1hZ2Vfc2l6ZSwgYmxvY2tfc2l6ZSwgZGlnZXN0X3NpemUpOgorICAiIiJDYWxjdWxhdGUgdGhlIG9mZnNldHMgb2YgYWxsIHRoZSBoYXNoLWxldmVscyBpbiBhIE1lcmtsZS10cmVlLgorCisgIEFyZ3VtZW50czoKKyAgICBpbWFnZV9zaXplOiBUaGUgc2l6ZSBvZiB0aGUgaW1hZ2UgdG8gY2FsY3VsYXRlIGEgTWVya2xlLXRyZWUgZm9yLgorICAgIGJsb2NrX3NpemU6IFRoZSBibG9jayBzaXplLCBlLmcuIDQwOTYuCisgICAgZGlnZXN0X3NpemU6IFRoZSBzaXplIG9mIGVhY2ggaGFzaCwgZS5nLiAzMiBmb3IgU0hBLTI1Ni4KKworICBSZXR1cm5zOgorICAgIEEgdHVwbGUgd2hlcmUgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFuIGFycmF5IG9mIG9mZnNldHMgYW5kIHRoZQorICAgIHNlY29uZCBpcyBzaXplIG9mIHRoZSB0cmVlLCBpbiBieXRlcy4KKyAgIiIiCisgIGxldmVsX29mZnNldHMgPSBbXQorICBsZXZlbF9zaXplcyA9IFtdCisgIHRyZWVfc2l6ZSA9IDAKKworICBudW1fbGV2ZWxzID0gMAorICBzaXplID0gaW1hZ2Vfc2l6ZQorICB3aGlsZSBzaXplID4gYmxvY2tfc2l6ZToKKyAgICBudW1fYmxvY2tzID0gKHNpemUgKyBibG9ja19zaXplIC0gMSkgLyBibG9ja19zaXplCisgICAgbGV2ZWxfc2l6ZSA9IHJvdW5kX3RvX211bHRpcGxlKG51bV9ibG9ja3MgKiBkaWdlc3Rfc2l6ZSwgYmxvY2tfc2l6ZSkKKworICAgIGxldmVsX3NpemVzLmFwcGVuZChsZXZlbF9zaXplKQorICAgIHRyZWVfc2l6ZSArPSBsZXZlbF9zaXplCisgICAgbnVtX2xldmVscyArPSAxCisKKyAgICBzaXplID0gbGV2ZWxfc2l6ZQorCisgIGZvciBuIGluIHJhbmdlKDAsIG51bV9sZXZlbHMpOgorICAgIG9mZnNldCA9IDAKKyAgICBmb3IgbSBpbiByYW5nZShuICsgMSwgbnVtX2xldmVscyk6CisgICAgICBvZmZzZXQgKz0gbGV2ZWxfc2l6ZXNbbV0KKyAgICBsZXZlbF9vZmZzZXRzLmFwcGVuZChvZmZzZXQpCisKKyAgcmV0dXJuIGxldmVsX29mZnNldHMsIHRyZWVfc2l6ZQorCisKKyMgU2VlIHN5c3RlbS9leHRyYXMvbGliZmVjL2luY2x1ZGUvZmVjL2lvLmggZm9yIHRoZXNlIGRlZmluaXRpb25zLgorRkVDX0ZPT1RFUl9GT1JNQVQgPSAnPExMTExMUTMycycKK0ZFQ19NQUdJQyA9IDB4ZmVjZmVjZmUKKworCitkZWYgY2FsY19mZWNfZGF0YV9zaXplKGltYWdlX3NpemUsIG51bV9yb290cyk6CisgICIiIkNhbGN1bGF0ZXMgaG93IG11Y2ggc3BhY2UgRkVDIGRhdGEgd2lsbCB0YWtlLgorCisgIEFyZ3M6CisgICAgaW1hZ2Vfc2l6ZTogVGhlIHNpemUgb2YgdGhlIGltYWdlLgorICAgIG51bV9yb290czogTnVtYmVyIG9mIHJvb3RzLgorCisgIFJldHVybnM6CisgICAgVGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgZm9yIEZFQyBmb3IgYW4gaW1hZ2Ugb2YgdGhlIGdpdmVuIHNpemUKKyAgICBhbmQgd2l0aCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBGRUMgcm9vdHMuCisKKyAgUmFpc2VzOgorICAgIFZhbHVlRXJyb3I6IElmIG91dHB1dCBmcm9tIHRoZSAnZmVjJyB0b29sIGlzIGludmFsaWQuCisKKyAgIiIiCisgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgWydmZWMnLCAnLS1wcmludC1mZWMtc2l6ZScsIHN0cihpbWFnZV9zaXplKSwgJy0tcm9vdHMnLCBzdHIobnVtX3Jvb3RzKV0sCisgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgKHBvdXQsIHBlcnIpID0gcC5jb21tdW5pY2F0ZSgpCisgIHJldGNvZGUgPSBwLndhaXQoKQorICBpZiByZXRjb2RlICE9IDA6CisgICAgcmFpc2UgVmFsdWVFcnJvcignRXJyb3IgaW52b2tpbmcgZmVjOiB7fScuZm9ybWF0KHBlcnIpKQorICByZXR1cm4gaW50KHBvdXQpCisKKworZGVmIGdlbmVyYXRlX2ZlY19kYXRhKGltYWdlX2ZpbGVuYW1lLCBudW1fcm9vdHMpOgorICAiIiJHZW5lcmF0ZSBGRUMgY29kZXMgZm9yIGFuIGltYWdlLgorCisgIEFyZ3M6CisgICAgaW1hZ2VfZmlsZW5hbWU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgaW1hZ2UuCisgICAgbnVtX3Jvb3RzOiBOdW1iZXIgb2Ygcm9vdHMuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgRkVDIGRhdGEgYmxvYi4KKworICBSYWlzZXM6CisgICAgVmFsdWVFcnJvcjogSWYgb3V0cHV0IGZyb20gdGhlICdmZWMnIHRvb2wgaXMgaW52YWxpZC4KKyAgIiIiCisgIGZlY190bXBmaWxlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKKyAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAorICAgICAgWydmZWMnLCAnLS1lbmNvZGUnLCAnLS1yb290cycsIHN0cihudW1fcm9vdHMpLCBpbWFnZV9maWxlbmFtZSwKKyAgICAgICBmZWNfdG1wZmlsZS5uYW1lXSwKKyAgICAgIHN0ZGVycj1vcGVuKG9zLmRldm51bGwpKQorICBmZWNfZGF0YSA9IGZlY190bXBmaWxlLnJlYWQoKQorICBmb290ZXJfc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZShGRUNfRk9PVEVSX0ZPUk1BVCkKKyAgZm9vdGVyX2RhdGEgPSBmZWNfZGF0YVstZm9vdGVyX3NpemU6XQorICAobWFnaWMsIF8sIF8sIG51bV9yb290cywgZmVjX3NpemUsIF8sIF8pID0gc3RydWN0LnVucGFjayhGRUNfRk9PVEVSX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vdGVyX2RhdGEpCisgIGlmIG1hZ2ljICE9IEZFQ19NQUdJQzoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmV4cGVjdGVkIG1hZ2ljIGluIEZFQyBmb290ZXInKQorICByZXR1cm4gZmVjX2RhdGFbMDpmZWNfc2l6ZV0KKworCitkZWYgZ2VuZXJhdGVfaGFzaF90cmVlKGltYWdlLCBpbWFnZV9zaXplLCBibG9ja19zaXplLCBoYXNoX2FsZ19uYW1lLCBzYWx0LAorICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3RfcGFkZGluZywgaGFzaF9sZXZlbF9vZmZzZXRzLCB0cmVlX3NpemUpOgorICAiIiJHZW5lcmF0ZXMgYSBNZXJrbGUtdHJlZSBmb3IgYSBmaWxlLgorCisgIEFyZ3M6CisgICAgaW1hZ2U6IFRoZSBpbWFnZSwgYXMgYSBmaWxlLgorICAgIGltYWdlX3NpemU6IFRoZSBzaXplIG9mIHRoZSBpbWFnZS4KKyAgICBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSwgZS5nLiA0MDk2LgorICAgIGhhc2hfYWxnX25hbWU6IFRoZSBoYXNoIGFsZ29yaXRobSwgZS5nLiAnc2hhMjU2JyBvciAnc2hhMScuCisgICAgc2FsdDogVGhlIHNhbHQgdG8gdXNlLgorICAgIGRpZ2VzdF9wYWRkaW5nOiBUaGUgcGFkZGluZyBmb3IgZWFjaCBkaWdlc3QuCisgICAgaGFzaF9sZXZlbF9vZmZzZXRzOiBUaGUgb2Zmc2V0cyBmcm9tIGNhbGNfaGFzaF9sZXZlbF9vZmZzZXRzKCkuCisgICAgdHJlZV9zaXplOiBUaGUgc2l6ZSBvZiB0aGUgdHJlZSwgaW4gbnVtYmVyIG9mIGJ5dGVzLgorCisgIFJldHVybnM6CisgICAgQSB0dXBsZSB3aGVyZSB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgdG9wLWxldmVsIGhhc2ggYW5kIHRoZQorICAgIHNlY29uZCBlbGVtZW50IGlzIHRoZSBoYXNoLXRyZWUuCisgICIiIgorICBoYXNoX3JldCA9IGJ5dGVhcnJheSh0cmVlX3NpemUpCisgIGhhc2hfc3JjX29mZnNldCA9IDAKKyAgaGFzaF9zcmNfc2l6ZSA9IGltYWdlX3NpemUKKyAgbGV2ZWxfbnVtID0gMAorICB3aGlsZSBoYXNoX3NyY19zaXplID4gYmxvY2tfc2l6ZToKKyAgICBsZXZlbF9vdXRwdXQgPSAnJworICAgIHJlbWFpbmluZyA9IGhhc2hfc3JjX3NpemUKKyAgICB3aGlsZSByZW1haW5pbmcgPiAwOgorICAgICAgaGFzaGVyID0gaGFzaGxpYi5uZXcobmFtZT1oYXNoX2FsZ19uYW1lLCBzdHJpbmc9c2FsdCkKKyAgICAgICMgT25seSByZWFkIGZyb20gdGhlIGZpbGUgZm9yIHRoZSBmaXJzdCBsZXZlbCAtIGZvciBzdWJzZXF1ZW50CisgICAgICAjIGxldmVscywgYWNjZXNzIHRoZSBhcnJheSB3ZSdyZSBidWlsZGluZy4KKyAgICAgIGlmIGxldmVsX251bSA9PSAwOgorICAgICAgICBpbWFnZS5zZWVrKGhhc2hfc3JjX29mZnNldCArIGhhc2hfc3JjX3NpemUgLSByZW1haW5pbmcpCisgICAgICAgIGRhdGEgPSBpbWFnZS5yZWFkKG1pbihyZW1haW5pbmcsIGJsb2NrX3NpemUpKQorICAgICAgZWxzZToKKyAgICAgICAgb2Zmc2V0ID0gaGFzaF9sZXZlbF9vZmZzZXRzW2xldmVsX251bSAtIDFdICsgaGFzaF9zcmNfc2l6ZSAtIHJlbWFpbmluZworICAgICAgICBkYXRhID0gaGFzaF9yZXRbb2Zmc2V0Om9mZnNldCArIGJsb2NrX3NpemVdCisgICAgICBoYXNoZXIudXBkYXRlKGRhdGEpCisKKyAgICAgIHJlbWFpbmluZyAtPSBsZW4oZGF0YSkKKyAgICAgIGlmIGxlbihkYXRhKSA8IGJsb2NrX3NpemU6CisgICAgICAgIGhhc2hlci51cGRhdGUoJ1wwJyAqIChibG9ja19zaXplIC0gbGVuKGRhdGEpKSkKKyAgICAgIGxldmVsX291dHB1dCArPSBoYXNoZXIuZGlnZXN0KCkKKyAgICAgIGlmIGRpZ2VzdF9wYWRkaW5nID4gMDoKKyAgICAgICAgbGV2ZWxfb3V0cHV0ICs9ICdcMCcgKiBkaWdlc3RfcGFkZGluZworCisgICAgcGFkZGluZ19uZWVkZWQgPSAocm91bmRfdG9fbXVsdGlwbGUoCisgICAgICAgIGxlbihsZXZlbF9vdXRwdXQpLCBibG9ja19zaXplKSAtIGxlbihsZXZlbF9vdXRwdXQpKQorICAgIGxldmVsX291dHB1dCArPSAnXDAnICogcGFkZGluZ19uZWVkZWQKKworICAgICMgQ29weSBsZXZlbC1vdXRwdXQgaW50byByZXN1bHRpbmcgdHJlZS4KKyAgICBvZmZzZXQgPSBoYXNoX2xldmVsX29mZnNldHNbbGV2ZWxfbnVtXQorICAgIGhhc2hfcmV0W29mZnNldDpvZmZzZXQgKyBsZW4obGV2ZWxfb3V0cHV0KV0gPSBsZXZlbF9vdXRwdXQKKworICAgICMgQ29udGludWUgb24gdG8gdGhlIG5leHQgbGV2ZWwuCisgICAgaGFzaF9zcmNfc2l6ZSA9IGxlbihsZXZlbF9vdXRwdXQpCisgICAgbGV2ZWxfbnVtICs9IDEKKworICBoYXNoZXIgPSBoYXNobGliLm5ldyhuYW1lPWhhc2hfYWxnX25hbWUsIHN0cmluZz1zYWx0KQorICBoYXNoZXIudXBkYXRlKGxldmVsX291dHB1dCkKKyAgcmV0dXJuIGhhc2hlci5kaWdlc3QoKSwgaGFzaF9yZXQKKworCitjbGFzcyBBdmJUb29sKG9iamVjdCk6CisgICIiIk9iamVjdCBmb3IgYXZidG9vbCBjb21tYW5kLWxpbmUgdG9vbC4iIiIKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgIiIiSW5pdGlhbGl6ZXIgbWV0aG9kLiIiIgorICAgIHNlbGYuYXZiID0gQXZiKCkKKworICBkZWYgX2FkZF9jb21tb25fYXJncyhzZWxmLCBzdWJfcGFyc2VyKToKKyAgICAiIiJBZGRzIGFyZ3VtZW50cyB1c2VkIGJ5IHNldmVyYWwgc3ViLWNvbW1hbmRzLgorCisgICAgQXJndW1lbnRzOgorICAgICAgc3ViX3BhcnNlcjogVGhlIHBhcnNlciB0byBhZGQgYXJndW1lbnRzIHRvLgorICAgICIiIgorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWFsZ29yaXRobScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nQWxnb3JpdGhtIHRvIHVzZSAoZGVmYXVsdDogTk9ORSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9J0FMR09SSVRITScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nTk9ORScpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0ta2V5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIFJTQSBwcml2YXRlIGtleSBmaWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSdLRVknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNpZ25pbmdfaGVscGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIGhlbHBlciB1c2VkIGZvciBzaWduaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSdBUFAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wdWJsaWNfa2V5X21ldGFkYXRhJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIHB1YmxpYyBrZXkgbWV0YWRhdGEgZmlsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0nS0VZX01FVEFEQVRBJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1yb2xsYmFja19pbmRleCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUm9sbGJhY2sgSW5kZXgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cGFyc2VfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MCkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wcm9wJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdBZGQgcHJvcGVydHknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9J0tFWTpWQUxVRScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXByb3BfZnJvbV9maWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdBZGQgcHJvcGVydHkgZnJvbSBmaWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSdLRVk6UEFUSCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWtlcm5lbF9jbWRsaW5lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdBZGQga2VybmVsIGNtZGxpbmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9J0NNRExJTkUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nYXBwZW5kJykKKyAgICAjIFRPRE8oemV1dGhlbik6IHRoZSAtLXNldHVwX3Jvb3Rmc19mcm9tX2tlcm5lbCBvcHRpb24gdXNlZCB0byBiZSBjYWxsZWQKKyAgICAjIC0tZ2VuZXJhdGVfZG1fdmVyaXR5X2NtZGxpbmVfZnJvbV9oYXNodHJlZS4gUmVtb3ZlIHN1cHBvcnQgZm9yIHRoZSBsYXR0ZXIKKyAgICAjIGF0IHNvbWUgZnV0dXJlIHBvaW50LgorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNldHVwX3Jvb3Rmc19mcm9tX2tlcm5lbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tZ2VuZXJhdGVfZG1fdmVyaXR5X2NtZGxpbmVfZnJvbV9oYXNodHJlZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0nSU1BR0UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0FkZHMga2VybmVsIGNtZGxpbmUgdG8gc2V0IHVwIElNQUdFJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyYicpKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9pbWFnZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nSW5jbHVkZSBkZXNjcmlwdG9ycyBmcm9tIGltYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSdJTUFHRScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3JiJykpCisKKyAgZGVmIHJ1bihzZWxmLCBhcmd2KToKKyAgICAiIiJDb21tYW5kLWxpbmUgcHJvY2Vzc29yLgorCisgICAgQXJndW1lbnRzOgorICAgICAgYXJndjogUGFzcyBzeXMuYXJndiBmcm9tIG1haW4uCisgICAgIiIiCisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIHN1YnBhcnNlcnMgPSBwYXJzZXIuYWRkX3N1YnBhcnNlcnModGl0bGU9J3N1YmNvbW1hbmRzJykKKworICAgIHN1Yl9wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoJ3ZlcnNpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUHJpbnRzIHZlcnNpb24gb2YgYXZidG9vbC4nKQorICAgIHN1Yl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9c2VsZi52ZXJzaW9uKQorCisgICAgc3ViX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignZXh0cmFjdF9wdWJsaWNfa2V5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0V4dHJhY3QgcHVibGljIGtleS4nKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWtleScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byBSU0EgcHJpdmF0ZSBrZXkgZmlsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J091dHB1dCBmaWxlIG5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3diJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBzdWJfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPXNlbGYuZXh0cmFjdF9wdWJsaWNfa2V5KQorCisgICAgc3ViX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignbWFrZV92Ym1ldGFfaW1hZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nTWFrZXMgYSB2Ym1ldGEgaW1hZ2UuJykKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J091dHB1dCBmaWxlIG5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3diJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBzZWxmLl9hZGRfY29tbW9uX2FyZ3Moc3ViX3BhcnNlcikKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jaGFpbl9wYXJ0aXRpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0FsbG93IHNpZ25lZCBpbnRlZ3JpdHktZGF0YSBmb3IgcGFydGl0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSdQQVJUX05BTUU6Uk9MTEJBQ0tfU0xPVDpLRVlfUEFUSCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZsYWdzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdWQk1ldGEgZmxhZ3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cGFyc2VfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MCkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zZXRfaGFzaHRyZWVfZGlzYWJsZWRfZmxhZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU2V0IHRoZSBIQVNIVFJFRV9ESVNBQkxFRCBmbGFnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHN1Yl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9c2VsZi5tYWtlX3ZibWV0YV9pbWFnZSkKKworICAgIHN1Yl9wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoJ2FkZF9oYXNoX2Zvb3RlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdBZGQgaGFzaGVzIGFuZCBmb290ZXIgdG8gaW1hZ2UuJykKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1pbWFnZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nSW1hZ2UgdG8gYWRkIGhhc2hlcyB0bycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncmFiKycpKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBhcnRpdGlvbl9zaXplJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXJ0aXRpb24gc2l6ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1wYXJzZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXJ0aXRpb25fbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGFydGl0aW9uIG5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0taGFzaF9hbGdvcml0aG0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0hhc2ggYWxnb3JpdGhtIHRvIHVzZSAoZGVmYXVsdDogc2hhMjU2KScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nc2hhMjU2JykKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zYWx0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTYWx0IGluIGhleCAoZGVmYXVsdDogL2Rldi91cmFuZG9tKScpCisgICAgc2VsZi5fYWRkX2NvbW1vbl9hcmdzKHN1Yl9wYXJzZXIpCisgICAgc3ViX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1zZWxmLmFkZF9oYXNoX2Zvb3RlcikKKworICAgIHN1Yl9wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoJ2FkZF9oYXNodHJlZV9mb290ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nQWRkIGhhc2h0cmVlIGFuZCBmb290ZXIgdG8gaW1hZ2UuJykKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1pbWFnZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nSW1hZ2UgdG8gYWRkIGhhc2h0cmVlIHRvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyYWIrJykpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tcGFydGl0aW9uX3NpemUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhcnRpdGlvbiBzaXplJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXBhcnNlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBhcnRpdGlvbl9uYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXJ0aXRpb24gbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWhhc2hfYWxnb3JpdGhtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdIYXNoIGFsZ29yaXRobSB0byB1c2UgKGRlZmF1bHQ6IHNoYTEpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSdzaGExJykKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zYWx0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTYWx0IGluIGhleCAoZGVmYXVsdDogL2Rldi91cmFuZG9tKScpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYmxvY2tfc2l6ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nQmxvY2sgc2l6ZSAoZGVmYXVsdDogNDA5NiknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cGFyc2VfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9NDA5NikKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1nZW5lcmF0ZV9mZWMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0FkZCBmb3J3YXJkLWVycm9yLWNvcnJlY3Rpb24gY29kZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tZmVjX251bV9yb290cycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nTnVtYmVyIG9mIHJvb3RzIGZvciBGRUMgKGRlZmF1bHQ6IDIpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXBhcnNlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PTIpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tY2FsY19tYXhfaW1hZ2Vfc2l6ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0oJ0RvblwndCBzdG9yZSB0aGUgaGFzaHRyZWUgb3IgZm9vdGVyIC0gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnN0ZWFkIGNhbGN1bGF0ZSB0aGUgbWF4aW11bSBpbWFnZSBzaXplICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGVhdmluZyBlbm91Z2ggcm9vbSBmb3IgaGFzaHRyZWUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmQgbWV0YWRhdGEgd2l0aCB0aGUgZ2l2ZW4gcGFydGl0aW9uICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZS4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHNlbGYuX2FkZF9jb21tb25fYXJncyhzdWJfcGFyc2VyKQorICAgIHN1Yl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9c2VsZi5hZGRfaGFzaHRyZWVfZm9vdGVyKQorCisgICAgc3ViX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignZXJhc2VfZm9vdGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0VyYXNlIGZvb3RlciBmcm9tIGFuIGltYWdlLicpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0taW1hZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0ltYWdlIHdpdGggYSBmb290ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3J3YisnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWtlZXBfaGFzaHRyZWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0tlZXAgdGhlIGhhc2h0cmVlIGFuZCBGRUMgaW4gdGhlIGltYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHN1Yl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9c2VsZi5lcmFzZV9mb290ZXIpCisKKyAgICBzdWJfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKAorICAgICAgICAnaW5mb19pbWFnZScsCisgICAgICAgIGhlbHA9J1Nob3cgaW5mb3JtYXRpb24gYWJvdXQgdmJtZXRhIG9yIGZvb3Rlci4nKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWltYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdJbWFnZSB0byBzaG93IGluZm9ybWF0aW9uIGFib3V0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdXcml0ZSBpbmZvIHRvIGZpbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3d0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1zeXMuc3Rkb3V0KQorICAgIHN1Yl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9c2VsZi5pbmZvX2ltYWdlKQorCisgICAgc3ViX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignc2V0X2FiX21ldGFkYXRhJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1NldCBBL0IgbWV0YWRhdGEuJykKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1taXNjX2ltYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIG1pc2MgaW1hZ2UgdG8gbW9kaWZ5LiBJZiB0aGUgaW1hZ2UgZG9lcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3IrYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tc2xvdF9kYXRhJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSgnU2xvdCBkYXRhIG9mIHRoZSBmb3JtICJwcmlvcml0eSIsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnInRyaWVzX3JlbWFpbmluZyIsICJzdWNlc3NmdWxfYm9vdCIgZm9yICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2xvdCBBIGZvbGxvd2VkIGJ5IHRoZSBzYW1lIGZvciBzbG90IEIsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VwYXJhdGVkIGJ5IGNvbG9ucy4gVGhlIGRlZmF1bHQgdmFsdWUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcyAxNTo3OjA6MTQ6NzowLicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9JzE1Ojc6MDoxNDo3OjAnKQorICAgIHN1Yl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9c2VsZi5zZXRfYWJfbWV0YWRhdGEpCisKKyAgICBzdWJfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKAorICAgICAgICAnbWFrZV9hdHhfY2VydGlmaWNhdGUnLAorICAgICAgICBoZWxwPSdDcmVhdGUgYW4gQW5kcm9pZCBUaGluZ3MgZVh0ZW5zaW9uIChBVFgpIGNlcnRpZmljYXRlLicpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdXcml0ZSBjZXJ0aWZpY2F0ZSB0byBmaWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCd3YicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9c3lzLnN0ZG91dCkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zdWJqZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSgnUGF0aCB0byBzdWJqZWN0IGZpbGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tc3ViamVjdF9rZXknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9KCdQYXRoIHRvIHN1YmplY3QgUlNBIHB1YmxpYyBrZXkgZmlsZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3JiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zdWJqZWN0X2tleV92ZXJzaW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVmVyc2lvbiBvZiB0aGUgc3ViamVjdCBrZXknKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXBhcnNlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zdWJqZWN0X2lzX2ludGVybWVkaWF0ZV9hdXRob3JpdHknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9KCdHZW5lcmF0ZSBhbiBpbnRlcm1lZGlhdGUgYXV0aG9yaXR5ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2VydGlmaWNhdGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWF1dGhvcml0eV9rZXknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gYXV0aG9yaXR5IFJTQSBwcml2YXRlIGtleSBmaWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zaWduaW5nX2hlbHBlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byBoZWxwZXIgdXNlZCBmb3Igc2lnbmluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0nQVBQJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9RmFsc2UpCisgICAgc3ViX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1zZWxmLm1ha2VfYXR4X2NlcnRpZmljYXRlKQorCisgICAgc3ViX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcigKKyAgICAgICAgJ21ha2VfYXR4X3Blcm1hbmVudF9hdHRyaWJ1dGVzJywKKyAgICAgICAgaGVscD0nQ3JlYXRlIEFuZHJvaWQgVGhpbmdzIGVYdGVuc2lvbiAoQVRYKSBwZXJtYW5lbnQgYXR0cmlidXRlcy4nKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nV3JpdGUgYXR0cmlidXRlcyB0byBmaWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCd3YicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9c3lzLnN0ZG91dCkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1yb290X2F1dGhvcml0eV9rZXknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gYXV0aG9yaXR5IFJTQSBwdWJsaWMga2V5IGZpbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3JiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wcm9kdWN0X2lkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSgnUGF0aCB0byBQcm9kdWN0IElEIGZpbGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgc3ViX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1zZWxmLm1ha2VfYXR4X3Blcm1hbmVudF9hdHRyaWJ1dGVzKQorCisgICAgc3ViX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcigKKyAgICAgICAgJ21ha2VfYXR4X21ldGFkYXRhJywKKyAgICAgICAgaGVscD0nQ3JlYXRlIEFuZHJvaWQgVGhpbmdzIGVYdGVuc2lvbiAoQVRYKSBtZXRhZGF0YS4nKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nV3JpdGUgbWV0YWRhdGEgdG8gZmlsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgnd2InKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PXN5cy5zdGRvdXQpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0taW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byBpbnRlcm1lZGlhdGUga2V5IGNlcnRpZmljYXRlIGZpbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3JiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wcm9kdWN0X2tleV9jZXJ0aWZpY2F0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byBwcm9kdWN0IGtleSBjZXJ0aWZpY2F0ZSBmaWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tZ29vZ2xlX2tleV92ZXJzaW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVmVyc2lvbiBvZiB0aGUgR29vZ2xlIHNpZ25pbmcga2V5JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1wYXJzZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0wKQorICAgIHN1Yl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9c2VsZi5tYWtlX2F0eF9tZXRhZGF0YSkKKworICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2WzE6XSkKKyAgICB0cnk6CisgICAgICBhcmdzLmZ1bmMoYXJncykKKyAgICBleGNlcHQgQXZiRXJyb3IgYXMgZToKKyAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ3t9OiB7fVxuJy5mb3JtYXQoYXJndlswXSwgZS5tZXNzYWdlKSkKKyAgICAgIHN5cy5leGl0KDEpCisKKyAgZGVmIHZlcnNpb24oc2VsZiwgXyk6CisgICAgIiIiSW1wbGVtZW50cyB0aGUgJ3ZlcnNpb24nIHN1Yi1jb21tYW5kLiIiIgorICAgIHByaW50ICd7fS57fScuZm9ybWF0KEFWQl9WRVJTSU9OX01BSk9SLCBBVkJfVkVSU0lPTl9NSU5PUikKKworICBkZWYgZXh0cmFjdF9wdWJsaWNfa2V5KHNlbGYsIGFyZ3MpOgorICAgICIiIkltcGxlbWVudHMgdGhlICdleHRyYWN0X3B1YmxpY19rZXknIHN1Yi1jb21tYW5kLiIiIgorICAgIHNlbGYuYXZiLmV4dHJhY3RfcHVibGljX2tleShhcmdzLmtleSwgYXJncy5vdXRwdXQpCisKKyAgZGVmIG1ha2VfdmJtZXRhX2ltYWdlKHNlbGYsIGFyZ3MpOgorICAgICIiIkltcGxlbWVudHMgdGhlICdtYWtlX3ZibWV0YV9pbWFnZScgc3ViLWNvbW1hbmQuIiIiCisgICAgaWYgYXJncy5zZXRfaGFzaHRyZWVfZGlzYWJsZWRfZmxhZzoKKyAgICAgIGFyZ3MuZmxhZ3MgfD0gQVZCX1ZCTUVUQV9JTUFHRV9GTEFHU19IQVNIVFJFRV9ESVNBQkxFRAorICAgIHNlbGYuYXZiLm1ha2VfdmJtZXRhX2ltYWdlKGFyZ3Mub3V0cHV0LCBhcmdzLmNoYWluX3BhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFsZ29yaXRobSwgYXJncy5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wdWJsaWNfa2V5X21ldGFkYXRhLCBhcmdzLnJvbGxiYWNrX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZmxhZ3MsIGFyZ3MucHJvcCwgYXJncy5wcm9wX2Zyb21fZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmtlcm5lbF9jbWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc2V0dXBfcm9vdGZzX2Zyb21fa2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuaW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlLCBhcmdzLnNpZ25pbmdfaGVscGVyKQorCisgIGRlZiBhZGRfaGFzaF9mb290ZXIoc2VsZiwgYXJncyk6CisgICAgIiIiSW1wbGVtZW50cyB0aGUgJ2FkZF9oYXNoX2Zvb3Rlcicgc3ViLWNvbW1hbmQuIiIiCisgICAgc2VsZi5hdmIuYWRkX2hhc2hfZm9vdGVyKGFyZ3MuaW1hZ2UubmFtZSwgYXJncy5wYXJ0aXRpb25fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wYXJ0aXRpb25fbmFtZSwgYXJncy5oYXNoX2FsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zYWx0LCBhcmdzLmFsZ29yaXRobSwgYXJncy5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVibGljX2tleV9tZXRhZGF0YSwgYXJncy5yb2xsYmFja19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wcm9wLCBhcmdzLnByb3BfZnJvbV9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmtlcm5lbF9jbWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnNldHVwX3Jvb3Rmc19mcm9tX2tlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5pbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2UsIGFyZ3Muc2lnbmluZ19oZWxwZXIpCisKKyAgZGVmIGFkZF9oYXNodHJlZV9mb290ZXIoc2VsZiwgYXJncyk6CisgICAgIiIiSW1wbGVtZW50cyB0aGUgJ2FkZF9oYXNodHJlZV9mb290ZXInIHN1Yi1jb21tYW5kLiIiIgorICAgIHNlbGYuYXZiLmFkZF9oYXNodHJlZV9mb290ZXIoYXJncy5pbWFnZS5uYW1lIGlmIGFyZ3MuaW1hZ2UgZWxzZSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wYXJ0aXRpb25fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmdlbmVyYXRlX2ZlYywgYXJncy5mZWNfbnVtX3Jvb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5oYXNoX2FsZ29yaXRobSwgYXJncy5ibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zYWx0LCBhcmdzLmFsZ29yaXRobSwgYXJncy5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1YmxpY19rZXlfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnJvbGxiYWNrX2luZGV4LCBhcmdzLnByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnByb3BfZnJvbV9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5rZXJuZWxfY21kbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc2V0dXBfcm9vdGZzX2Zyb21fa2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5pbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmNhbGNfbWF4X2ltYWdlX3NpemUsIGFyZ3Muc2lnbmluZ19oZWxwZXIpCisKKyAgZGVmIGVyYXNlX2Zvb3RlcihzZWxmLCBhcmdzKToKKyAgICAiIiJJbXBsZW1lbnRzIHRoZSAnZXJhc2VfZm9vdGVyJyBzdWItY29tbWFuZC4iIiIKKyAgICBzZWxmLmF2Yi5lcmFzZV9mb290ZXIoYXJncy5pbWFnZS5uYW1lLCBhcmdzLmtlZXBfaGFzaHRyZWUpCisKKyAgZGVmIHNldF9hYl9tZXRhZGF0YShzZWxmLCBhcmdzKToKKyAgICAiIiJJbXBsZW1lbnRzIHRoZSAnc2V0X2FiX21ldGFkYXRhJyBzdWItY29tbWFuZC4iIiIKKyAgICBzZWxmLmF2Yi5zZXRfYWJfbWV0YWRhdGEoYXJncy5taXNjX2ltYWdlLCBhcmdzLnNsb3RfZGF0YSkKKworICBkZWYgaW5mb19pbWFnZShzZWxmLCBhcmdzKToKKyAgICAiIiJJbXBsZW1lbnRzIHRoZSAnaW5mb19pbWFnZScgc3ViLWNvbW1hbmQuIiIiCisgICAgc2VsZi5hdmIuaW5mb19pbWFnZShhcmdzLmltYWdlLm5hbWUsIGFyZ3Mub3V0cHV0KQorCisgIGRlZiBtYWtlX2F0eF9jZXJ0aWZpY2F0ZShzZWxmLCBhcmdzKToKKyAgICAiIiJJbXBsZW1lbnRzIHRoZSAnbWFrZV9hdHhfY2VydGlmaWNhdGUnIHN1Yi1jb21tYW5kLiIiIgorICAgIHNlbGYuYXZiLm1ha2VfYXR4X2NlcnRpZmljYXRlKGFyZ3Mub3V0cHV0LCBhcmdzLmF1dGhvcml0eV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zdWJqZWN0X2tleS5yZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zdWJqZWN0X2tleV92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3ViamVjdC5yZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zdWJqZWN0X2lzX2ludGVybWVkaWF0ZV9hdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zaWduaW5nX2hlbHBlcikKKworICBkZWYgbWFrZV9hdHhfcGVybWFuZW50X2F0dHJpYnV0ZXMoc2VsZiwgYXJncyk6CisgICAgIiIiSW1wbGVtZW50cyB0aGUgJ21ha2VfYXR4X3Blcm1hbmVudF9hdHRyaWJ1dGVzJyBzdWItY29tbWFuZC4iIiIKKyAgICBzZWxmLmF2Yi5tYWtlX2F0eF9wZXJtYW5lbnRfYXR0cmlidXRlcyhhcmdzLm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnJvb3RfYXV0aG9yaXR5X2tleS5yZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wcm9kdWN0X2lkLnJlYWQoKSkKKworICBkZWYgbWFrZV9hdHhfbWV0YWRhdGEoc2VsZiwgYXJncyk6CisgICAgIiIiSW1wbGVtZW50cyB0aGUgJ21ha2VfYXR4X21ldGFkYXRhJyBzdWItY29tbWFuZC4iIiIKKyAgICBzZWxmLmF2Yi5tYWtlX2F0eF9tZXRhZGF0YShhcmdzLm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUucmVhZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHJvZHVjdF9rZXlfY2VydGlmaWNhdGUucmVhZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZ29vZ2xlX2tleV92ZXJzaW9uKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHRvb2wgPSBBdmJUb29sKCkKKyAgdG9vbC5ydW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS9hdmIvYm9vdF9jb250cm9sL2F2Yl9vcHNfZGV2aWNlLmMgYi9hdmIvYm9vdF9jb250cm9sL2F2Yl9vcHNfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlZTc2YwotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9ib290X2NvbnRyb2wvYXZiX29wc19kZXZpY2UuYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZzX21nci5oPgorCisjaW5jbHVkZSAiYXZiX29wc19kZXZpY2UuaCIKKworLyogT3BlbiB0aGUgYXBwcm9wcmlhdGUgZnN0YWIgZmlsZSBhbmQgZmFsbGJhY2sgdG8gL2ZzdGFiLmRldmljZSBpZgorICogdGhhdCdzIHdoYXQncyBiZWluZyB1c2VkLgorICovCitzdGF0aWMgc3RydWN0IGZzdGFiKiBvcGVuX2ZzdGFiKHZvaWQpIHsKKyAgY2hhciBwcm9wYnVmW1BST1BFUlRZX1ZBTFVFX01BWF07CisgIGNoYXIgZnN0YWJfbmFtZVtQUk9QRVJUWV9WQUxVRV9NQVggKyAzMl07CisgIHN0cnVjdCBmc3RhYiogZnN0YWI7CisKKyAgcHJvcGVydHlfZ2V0KCJyby5oYXJkd2FyZSIsIHByb3BidWYsICIiKTsKKyAgc25wcmludGYoZnN0YWJfbmFtZSwgc2l6ZW9mKGZzdGFiX25hbWUpLCAiL2ZzdGFiLiVzIiwgcHJvcGJ1Zik7CisgIGZzdGFiID0gZnNfbWdyX3JlYWRfZnN0YWIoZnN0YWJfbmFtZSk7CisgIGlmIChmc3RhYiAhPSBOVUxMKSB7CisgICAgcmV0dXJuIGZzdGFiOworICB9CisKKyAgZnN0YWIgPSBmc19tZ3JfcmVhZF9mc3RhYigiL2ZzdGFiLmRldmljZSIpOworICByZXR1cm4gZnN0YWI7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9wYXJ0aXRpb24oY29uc3QgY2hhciogbmFtZSwgaW50IGZsYWdzKSB7CisgIGNoYXIqIHBhdGg7CisgIGludCBmZDsKKyAgc3RydWN0IGZzdGFiKiBmc3RhYjsKKyAgc3RydWN0IGZzdGFiX3JlYyogcmVjb3JkOworCisgIC8qIFdlIGNhbid0IHVzZSBmc19tZ3IgdG8gbG9vayB1cCB8bmFtZXwgYmVjYXVzZSBmc3RhYiBkb2Vzbid0IGxpc3QKKyAgICogZXZlcnkgc2xvdCBwYXJ0aXRpb24gKGl0IHVzZXMgdGhlIHNsb3RzZWxlY3Qgb3B0aW9uIHRvIG1hc2sgdGhlCisgICAqIHN1ZmZpeCkgYW5kIHxzbG90fCBpcyBleHBlY3RlZCB0byBiZSBvZiB0aGF0IGZvcm0sIGUuZy4gYm9vdF9hLgorICAgKgorICAgKiBXZSBjYW4gaG93ZXZlciBhc3N1bWUgdGhhdCB0aGVyZSdzIGFuIGVudHJ5IGZvciB0aGUgL21pc2MgbW91bnQKKyAgICogcG9pbnQgYW5kIHVzZSB0aGF0IHRvIGdldCB0aGUgZGV2aWNlIGZpbGUgZm9yIHRoZSBtaXNjCisgICAqIHBhcnRpdGlvbi4gRnJvbSB0aGVyZSB3ZSdsbCBhc3N1bWUgdGhhdCBhIGJ5LW5hbWUgc2NoZW1lIGlzIHVzZWQKKyAgICogc28gd2UgY2FuIGp1c3QgcmVwbGFjZSB0aGUgdHJhaWxpbmcgIm1pc2MiIGJ5IHRoZSBnaXZlbiB8bmFtZXwsCisgICAqIGUuZy4KKyAgICoKKyAgICogICAvZGV2L2Jsb2NrL3BsYXRmb3JtL3NvYy4wLzc4MjQ5MDAuc2RoY2kvYnktbmFtZS9taXNjIC0+CisgICAqICAgL2Rldi9ibG9jay9wbGF0Zm9ybS9zb2MuMC83ODI0OTAwLnNkaGNpL2J5LW5hbWUvYm9vdF9hCisgICAqCisgICAqIElmIG5lZWRlZCwgaXQncyBwb3NzaWJsZSB0byByZWxheCB0aGlzIGFzc3VtcHRpb24gaW4gdGhlIGZ1dHVyZQorICAgKiBieSB0cmF3bGluZyAvc3lzL2Jsb2NrIGxvb2tpbmcgZm9yIHRoZSBhcHByb3ByaWF0ZSBzaWJsaW5nIG9mCisgICAqIG1pc2MgYW5kIHRoZW4gZmluZGluZyBhbiBlbnRyeSBpbiAvZGV2IG1hdGNoaW5nIHRoZSBzeXNmcyBlbnRyeS4KKyAgICovCisKKyAgZnN0YWIgPSBvcGVuX2ZzdGFiKCk7CisgIGlmIChmc3RhYiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJlY29yZCA9IGZzX21ncl9nZXRfZW50cnlfZm9yX21vdW50X3BvaW50KGZzdGFiLCAiL21pc2MiKTsKKyAgaWYgKHJlY29yZCA9PSBOVUxMKSB7CisgICAgZnNfbWdyX2ZyZWVfZnN0YWIoZnN0YWIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoc3RyY21wKG5hbWUsICJtaXNjIikgPT0gMCkgeworICAgIHBhdGggPSBzdHJkdXAocmVjb3JkLT5ibGtfZGV2aWNlKTsKKyAgfSBlbHNlIHsKKyAgICBzaXplX3QgdHJpbW1lZF9sZW4sIG5hbWVfbGVuOworICAgIGNvbnN0IGNoYXIqIGVuZF9zbGFzaCA9IHN0cnJjaHIocmVjb3JkLT5ibGtfZGV2aWNlLCAnLycpOworICAgIGlmIChlbmRfc2xhc2ggPT0gTlVMTCkgeworICAgICAgZnNfbWdyX2ZyZWVfZnN0YWIoZnN0YWIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB0cmltbWVkX2xlbiA9IGVuZF9zbGFzaCAtIHJlY29yZC0+YmxrX2RldmljZSArIDE7CisgICAgbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CisgICAgcGF0aCA9IGNhbGxvYyh0cmltbWVkX2xlbiArIG5hbWVfbGVuICsgMSwgMSk7CisgICAgc3RybmNweShwYXRoLCByZWNvcmQtPmJsa19kZXZpY2UsIHRyaW1tZWRfbGVuKTsKKyAgICBzdHJuY3B5KHBhdGggKyB0cmltbWVkX2xlbiwgbmFtZSwgbmFtZV9sZW4pOworICB9CisgIGZzX21ncl9mcmVlX2ZzdGFiKGZzdGFiKTsKKworICBmZCA9IG9wZW4ocGF0aCwgZmxhZ3MpOworICBmcmVlKHBhdGgpOworCisgIHJldHVybiBmZDsKK30KKworc3RhdGljIEF2YklPUmVzdWx0IHJlYWRfZnJvbV9wYXJ0aXRpb24oQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIG91dF9udW1fcmVhZCkgeworICBpbnQgZmQ7CisgIG9mZl90IHdoZXJlOworICBzc2l6ZV90IG51bV9yZWFkOworICBBdmJJT1Jlc3VsdCByZXQ7CisKKyAgZmQgPSBvcGVuX3BhcnRpdGlvbihwYXJ0aXRpb24sIE9fUkRPTkxZKTsKKyAgaWYgKGZkID09IC0xKSB7CisgICAgYXZiX2Vycm9ydigiRXJyb3Igb3BlbmluZyBcIiIsIHBhcnRpdGlvbiwgIlwiIHBhcnRpdGlvbi5cbiIsIE5VTEwpOworICAgIHJldCA9IEFWQl9JT19SRVNVTFRfRVJST1JfSU87CisgICAgZ290byBvdXQ7CisgIH0KKworICB3aGVyZSA9IGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKKyAgaWYgKHdoZXJlID09IC0xKSB7CisgICAgYXZiX2Vycm9yKCJFcnJvciBzZWVraW5nIHRvIG9mZnNldC5cbiIpOworICAgIHJldCA9IEFWQl9JT19SRVNVTFRfRVJST1JfSU87CisgICAgZ290byBvdXQ7CisgIH0KKyAgaWYgKHdoZXJlICE9IG9mZnNldCkgeworICAgIGF2Yl9lcnJvcigiRXJyb3Igc2Vla2luZyB0byBvZmZzZXQuXG4iKTsKKyAgICByZXQgPSBBVkJfSU9fUkVTVUxUX0VSUk9SX1JBTkdFX09VVFNJREVfUEFSVElUSU9OOworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogT24gTGludXgsIHdlIG5ldmVyIGdldCBwYXJ0aWFsIHJlYWRzIGZyb20gYmxvY2sgZGV2aWNlcyAoZXhjZXB0CisgICAqIGZvciBFT0YpLgorICAgKi8KKyAgbnVtX3JlYWQgPSByZWFkKGZkLCBidWZmZXIsIG51bV9ieXRlcyk7CisgIGlmIChudW1fcmVhZCA9PSAtMSkgeworICAgIGF2Yl9lcnJvcigiRXJyb3IgcmVhZGluZyBkYXRhLlxuIik7CisgICAgcmV0ID0gQVZCX0lPX1JFU1VMVF9FUlJPUl9JTzsKKyAgICBnb3RvIG91dDsKKyAgfQorICBpZiAob3V0X251bV9yZWFkICE9IE5VTEwpIHsKKyAgICAqb3V0X251bV9yZWFkID0gbnVtX3JlYWQ7CisgIH0KKworICByZXQgPSBBVkJfSU9fUkVTVUxUX09LOworCitvdXQ6CisgIGlmIChmZCAhPSAtMSkgeworICAgIGlmIChjbG9zZShmZCkgIT0gMCkgeworICAgICAgYXZiX2Vycm9yKCJFcnJvciBjbG9zaW5nIGZpbGUgZGVzY3JpcHRvci5cbiIpOworICAgIH0KKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgQXZiSU9SZXN1bHQgd3JpdGVfdG9fcGFydGl0aW9uKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWZmZXIpIHsKKyAgaW50IGZkOworICBvZmZfdCB3aGVyZTsKKyAgc3NpemVfdCBudW1fd3JpdHRlbjsKKyAgQXZiSU9SZXN1bHQgcmV0OworCisgIGZkID0gb3Blbl9wYXJ0aXRpb24ocGFydGl0aW9uLCBPX1dST05MWSk7CisgIGlmIChmZCA9PSAtMSkgeworICAgIGF2Yl9lcnJvcnYoIkVycm9yIG9wZW5pbmcgXCIiLCBwYXJ0aXRpb24sICJcIiBwYXJ0aXRpb24uXG4iLCBOVUxMKTsKKyAgICByZXQgPSBBVkJfSU9fUkVTVUxUX0VSUk9SX0lPOworICAgIGdvdG8gb3V0OworICB9CisKKyAgd2hlcmUgPSBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgIGlmICh3aGVyZSA9PSAtMSkgeworICAgIGF2Yl9lcnJvcigiRXJyb3Igc2Vla2luZyB0byBvZmZzZXQuXG4iKTsKKyAgICByZXQgPSBBVkJfSU9fUkVTVUxUX0VSUk9SX0lPOworICAgIGdvdG8gb3V0OworICB9CisgIGlmICh3aGVyZSAhPSBvZmZzZXQpIHsKKyAgICBhdmJfZXJyb3IoIkVycm9yIHNlZWtpbmcgdG8gb2Zmc2V0LlxuIik7CisgICAgcmV0ID0gQVZCX0lPX1JFU1VMVF9FUlJPUl9SQU5HRV9PVVRTSURFX1BBUlRJVElPTjsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIE9uIExpbnV4LCB3ZSBuZXZlciBnZXQgcGFydGlhbCB3cml0ZXMgb24gYmxvY2sgZGV2aWNlcy4gKi8KKyAgbnVtX3dyaXR0ZW4gPSB3cml0ZShmZCwgYnVmZmVyLCBudW1fYnl0ZXMpOworICBpZiAobnVtX3dyaXR0ZW4gPT0gLTEpIHsKKyAgICBhdmJfZXJyb3IoIkVycm9yIHdyaXRpbmcgZGF0YS5cbiIpOworICAgIHJldCA9IEFWQl9JT19SRVNVTFRfRVJST1JfSU87CisgICAgZ290byBvdXQ7CisgIH0KKworICByZXQgPSBBVkJfSU9fUkVTVUxUX09LOworCitvdXQ6CisgIGlmIChmZCAhPSAtMSkgeworICAgIGlmIChjbG9zZShmZCkgIT0gMCkgeworICAgICAgYXZiX2Vycm9yKCJFcnJvciBjbG9zaW5nIGZpbGUgZGVzY3JpcHRvci5cbiIpOworICAgIH0KKyAgfQorICByZXR1cm4gcmV0OworfQorCitBdmJBQk9wcyogYXZiX29wc19kZXZpY2VfbmV3KHZvaWQpIHsKKyAgQXZiQUJPcHMqIGFiX29wczsKKworICBhYl9vcHMgPSBjYWxsb2MoMSwgc2l6ZW9mKEF2YkFCT3BzKSk7CisgIGlmIChhYl9vcHMgPT0gTlVMTCkgeworICAgIGF2Yl9lcnJvcigiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIEF2YkFCT3BzLlxuIik7CisgICAgZ290byBvdXQ7CisgIH0KKworICBhYl9vcHMtPm9wcyA9IGNhbGxvYygxLCBzaXplb2YoQXZiT3BzKSk7CisgIGlmIChhYl9vcHMtPm9wcyA9PSBOVUxMKSB7CisgICAgYXZiX2Vycm9yKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgQXZiT3BzLlxuIik7CisgICAgZnJlZShhYl9vcHMpOworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogV2Ugb25seSBuZWVkIHRoZXNlIG9wZXJhdGlvbnMgc2luY2UgdGhhdCdzIGFsbCB3aGF0IGlzIGJlaW5nIHVzZWQKKyAgICogYnkgdGhlIEEvQiByb3V0aW5lcy4KKyAgICovCisgIGFiX29wcy0+b3BzLT5yZWFkX2Zyb21fcGFydGl0aW9uID0gcmVhZF9mcm9tX3BhcnRpdGlvbjsKKyAgYWJfb3BzLT5vcHMtPndyaXRlX3RvX3BhcnRpdGlvbiA9IHdyaXRlX3RvX3BhcnRpdGlvbjsKKyAgYWJfb3BzLT5yZWFkX2FiX21ldGFkYXRhID0gYXZiX2FiX2RhdGFfcmVhZDsKKyAgYWJfb3BzLT53cml0ZV9hYl9tZXRhZGF0YSA9IGF2Yl9hYl9kYXRhX3dyaXRlOworCitvdXQ6CisgIHJldHVybiBhYl9vcHM7Cit9CisKK3ZvaWQgYXZiX29wc19kZXZpY2VfZnJlZShBdmJBQk9wcyogYWJfb3BzKSB7CisgIGZyZWUoYWJfb3BzLT5vcHMpOworICBmcmVlKGFiX29wcyk7Cit9CmRpZmYgLS1naXQgYS9hdmIvYm9vdF9jb250cm9sL2F2Yl9vcHNfZGV2aWNlLmggYi9hdmIvYm9vdF9jb250cm9sL2F2Yl9vcHNfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3YmRkYgotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9ib290X2NvbnRyb2wvYXZiX29wc19kZXZpY2UuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEFWQl9PUFNfREVWSUNFX0hfCisjZGVmaW5lIEFWQl9PUFNfREVWSUNFX0hfCisKKyNpbmNsdWRlIDxsaWJhdmJfYWIvbGliYXZiX2FiLmg+CisKKy8qIEFsbG9jYXRlcyBhbiBBdmJPcHMgaW5zdGFuY2Ugc3VpdGFibGUgZm9yIHVzZSBvbiB0aGUKKyAqIGRldmljZS4gUmV0dXJucyBOVUxMIG9uIE9PTS4KKyAqCisgKiBGcmVlIHdpdGggYXZiX29wc19kZXZpY2VfZnJlZSgpLgorICovCitBdmJBQk9wcyogYXZiX29wc19kZXZpY2VfbmV3KHZvaWQpOworCisvKiBGcmVlcyBhbiBBdmJPcHMgaW5zdGFuY2UgcHJldmlvdXNseSBhbGxvY2F0ZWQgd2l0aCBhdmJfb3BzX2RldmljZV9uZXcoKS4gKi8KK3ZvaWQgYXZiX29wc19kZXZpY2VfZnJlZShBdmJBQk9wcyogYWJfb3BzKTsKKworI2VuZGlmIC8qIEFWQl9PUFNfREVWSUNFX0hfICovCmRpZmYgLS1naXQgYS9hdmIvYm9vdF9jb250cm9sL2Jvb3RfY29udHJvbF9hdmIuYyBiL2F2Yi9ib290X2NvbnRyb2wvYm9vdF9jb250cm9sX2F2Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzVkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvYm9vdF9jb250cm9sL2Jvb3RfY29udHJvbF9hdmIuYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2Jvb3RfY29udHJvbC5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlICJhdmJfb3BzX2RldmljZS5oIgorCitzdGF0aWMgQXZiQUJPcHMqIGFiX29wcyA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIG1vZHVsZV9pbml0KGJvb3RfY29udHJvbF9tb2R1bGVfdCogbW9kdWxlKSB7CisgIGlmIChhYl9vcHMgIT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGFiX29wcyA9IGF2Yl9vcHNfZGV2aWNlX25ldygpOworICBpZiAoYWJfb3BzID09IE5VTEwpIHsKKyAgICBhdmJfZXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBBdmJPcHMgaW5zdGFuY2UuXG4iKTsKKyAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1vZHVsZV9nZXROdW1iZXJTbG90cyhib290X2NvbnRyb2xfbW9kdWxlX3QqIG1vZHVsZSkgeworICByZXR1cm4gMjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBtb2R1bGVfZ2V0Q3VycmVudFNsb3QoYm9vdF9jb250cm9sX21vZHVsZV90KiBtb2R1bGUpIHsKKyAgY2hhciBwcm9wYnVmW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgcHJvcGVydHlfZ2V0KCJyby5ib290LnNsb3Rfc3VmZml4IiwgcHJvcGJ1ZiwgIiIpOworICBpZiAoc3RyY21wKHByb3BidWYsICJfYSIpID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIGlmIChzdHJjbXAocHJvcGJ1ZiwgIl9iIikgPT0gMCkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIGF2Yl9lcnJvcnYoIlVuZXhwZWN0ZWQgc2xvdCBzdWZmaXggJyIsIHByb3BidWYsICInLlxuIiwgTlVMTCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW9kdWxlX21hcmtCb290U3VjY2Vzc2Z1bChib290X2NvbnRyb2xfbW9kdWxlX3QqIG1vZHVsZSkgeworICBpZiAoYXZiX2FiX21hcmtfc2xvdF9zdWNjZXNzZnVsKGFiX29wcywgbW9kdWxlX2dldEN1cnJlbnRTbG90KG1vZHVsZSkpID09CisgICAgICBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC1FSU87CisgIH0KK30KKworc3RhdGljIGludCBtb2R1bGVfc2V0QWN0aXZlQm9vdFNsb3QoYm9vdF9jb250cm9sX21vZHVsZV90KiBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2xvdCkgeworICBpZiAoYXZiX2FiX21hcmtfc2xvdF9hY3RpdmUoYWJfb3BzLCBzbG90KSA9PSBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC1FSU87CisgIH0KK30KKworc3RhdGljIGludCBtb2R1bGVfc2V0U2xvdEFzVW5ib290YWJsZShzdHJ1Y3QgYm9vdF9jb250cm9sX21vZHVsZSogbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2xvdCkgeworICBpZiAoYXZiX2FiX21hcmtfc2xvdF91bmJvb3RhYmxlKGFiX29wcywgc2xvdCkgPT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiAtRUlPOworICB9Cit9CisKK3N0YXRpYyBpbnQgbW9kdWxlX2lzU2xvdEJvb3RhYmxlKHN0cnVjdCBib290X2NvbnRyb2xfbW9kdWxlKiBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2xvdCkgeworICBBdmJBQkRhdGEgYWJfZGF0YTsKKyAgYm9vbCBpc19ib290YWJsZTsKKworICBhdmJfYXNzZXJ0KHNsb3QgPCAyKTsKKworICBpZiAoYXZiX2FiX2RhdGFfcmVhZChhYl9vcHMsICZhYl9kYXRhKSAhPSBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgcmV0dXJuIC1FSU87CisgIH0KKworICBpc19ib290YWJsZSA9IChhYl9kYXRhLnNsb3RzW3Nsb3RdLnByaW9yaXR5ID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoYWJfZGF0YS5zbG90c1tzbG90XS5zdWNjZXNzZnVsX2Jvb3QgfHwKKyAgICAgICAgICAgICAgICAgKGFiX2RhdGEuc2xvdHNbc2xvdF0udHJpZXNfcmVtYWluaW5nID4gMCkpOworCisgIHJldHVybiBpc19ib290YWJsZSA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IG1vZHVsZV9pc1Nsb3RNYXJrZWRTdWNjZXNzZnVsKHN0cnVjdCBib290X2NvbnRyb2xfbW9kdWxlKiBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzbG90KSB7CisgIEF2YkFCRGF0YSBhYl9kYXRhOworICBib29sIGlzX21hcmtlZF9zdWNjZXNzZnVsOworCisgIGF2Yl9hc3NlcnQoc2xvdCA8IDIpOworCisgIGlmIChhdmJfYWJfZGF0YV9yZWFkKGFiX29wcywgJmFiX2RhdGEpICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICByZXR1cm4gLUVJTzsKKyAgfQorCisgIGlzX21hcmtlZF9zdWNjZXNzZnVsID0gYWJfZGF0YS5zbG90c1tzbG90XS5zdWNjZXNzZnVsX2Jvb3Q7CisKKyAgcmV0dXJuIGlzX21hcmtlZF9zdWNjZXNzZnVsID8gMSA6IDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBtb2R1bGVfZ2V0U3VmZml4KGJvb3RfY29udHJvbF9tb2R1bGVfdCogbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNsb3QpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIHN1ZmZpeFsyXSA9IHsiX2EiLCAiX2IifTsKKyAgaWYgKHNsb3QgPj0gMikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBzdWZmaXhbc2xvdF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfbW9kdWxlX21ldGhvZHNfdCBtb2R1bGVfbWV0aG9kcyA9IHsKKyAgICAub3BlbiA9IE5VTEwsCit9OworCitib290X2NvbnRyb2xfbW9kdWxlX3QgSEFMX01PRFVMRV9JTkZPX1NZTSA9IHsKKyAgICAuY29tbW9uID0KKyAgICAgICAgeworICAgICAgICAgICAgLnRhZyA9IEhBUkRXQVJFX01PRFVMRV9UQUcsCisgICAgICAgICAgICAubW9kdWxlX2FwaV92ZXJzaW9uID0gQk9PVF9DT05UUk9MX01PRFVMRV9BUElfVkVSU0lPTl8wXzEsCisgICAgICAgICAgICAuaGFsX2FwaV92ZXJzaW9uID0gSEFSRFdBUkVfSEFMX0FQSV9WRVJTSU9OLAorICAgICAgICAgICAgLmlkID0gQk9PVF9DT05UUk9MX0hBUkRXQVJFX01PRFVMRV9JRCwKKyAgICAgICAgICAgIC5uYW1lID0gIkFWQiBpbXBsZW1lbnRhdGlvbiBvZiBib290X2NvbnRyb2wgSEFMIiwKKyAgICAgICAgICAgIC5hdXRob3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgICAgICAgICAubWV0aG9kcyA9ICZtb2R1bGVfbWV0aG9kcywKKyAgICAgICAgfSwKKyAgICAuaW5pdCA9IG1vZHVsZV9pbml0LAorICAgIC5nZXROdW1iZXJTbG90cyA9IG1vZHVsZV9nZXROdW1iZXJTbG90cywKKyAgICAuZ2V0Q3VycmVudFNsb3QgPSBtb2R1bGVfZ2V0Q3VycmVudFNsb3QsCisgICAgLm1hcmtCb290U3VjY2Vzc2Z1bCA9IG1vZHVsZV9tYXJrQm9vdFN1Y2Nlc3NmdWwsCisgICAgLnNldEFjdGl2ZUJvb3RTbG90ID0gbW9kdWxlX3NldEFjdGl2ZUJvb3RTbG90LAorICAgIC5zZXRTbG90QXNVbmJvb3RhYmxlID0gbW9kdWxlX3NldFNsb3RBc1VuYm9vdGFibGUsCisgICAgLmlzU2xvdEJvb3RhYmxlID0gbW9kdWxlX2lzU2xvdEJvb3RhYmxlLAorICAgIC5nZXRTdWZmaXggPSBtb2R1bGVfZ2V0U3VmZml4LAorICAgIC5pc1Nsb3RNYXJrZWRTdWNjZXNzZnVsID0gbW9kdWxlX2lzU2xvdE1hcmtlZFN1Y2Nlc3NmdWwsCit9OwpkaWZmIC0tZ2l0IGEvYXZiL2V4YW1wbGVzL3VlZmkvTWFrZWZpbGUgYi9hdmIvZXhhbXBsZXMvdWVmaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWU1ODlmCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL2V4YW1wbGVzL3VlZmkvTWFrZWZpbGUKQEAgLTAsMCArMSw5OCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorIyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorIyBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisjIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorIyBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworIyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyMgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyMgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorIyBTT0ZUV0FSRS4KKyMKKworIyBUT0RPKHpldXRoZW4pOiBUaGlzIGlzIG5vdCBpbnZva2VkIGJ5IEFuZHJvaWQgYnVpbGQgc3lzdGVtIGFuZCBpcworIyBpbnRlbmRlZCB0byBhaWQgdXNlcnMgdG8gbG9jYWxseSBidWlsZCB0aGUgRUZJIGFwcGxpY2F0aW9uLiBJdCB3b3VsZAorIyBiZSBuaWNlIHRvIGFkZCBnbnUtZWZpLyB0byBleHRlcm5hbCBhbmQgcmV3cml0ZSB0aGlzIGFzIGFuCisjIEFuZHJvaWQubWsgZmlsZS4KKworRUZJX0NDICAgICAgPSBnY2MKK0VGSV9MRCAgICAgID0gbGQKK0VGSV9PQkpDT1BZID0gb2JqY29weQorQVZCICAgICAgICAgPSAuLi8uLgorR05VRUZJICAgICAgPSAvdXNyL2luY2x1ZGUvZWZpCisKK0VGSV9TUkNfRklMRVMgPSBcCisgICAgbWFpbi5jIFwKKyAgICB1ZWZpX2F2Yl9zeXNkZXBzLmMgXAorICAgIHVlZmlfYXZiX29wcy5jIFwKKyAgICB1ZWZpX2F2Yl91dGlsLmMgXAorICAgIHVlZmlfYXZiX2Jvb3QuYyBcCisJJChBVkIpL2xpYmF2Yi9hdmJfY2hhaW5fcGFydGl0aW9uX2Rlc2NyaXB0b3IuYyBcCisgICAgJChBVkIpL2xpYmF2Yi9hdmJfY3JjMzIuYyBcCisgICAgJChBVkIpL2xpYmF2Yi9hdmJfY3J5cHRvLmMgXAorICAgICQoQVZCKS9saWJhdmIvYXZiX2Rlc2NyaXB0b3IuYyBcCisgICAgJChBVkIpL2xpYmF2Yi9hdmJfZm9vdGVyLmMgXAorICAgICQoQVZCKS9saWJhdmIvYXZiX2hhc2hfZGVzY3JpcHRvci5jIFwKKyAgICAkKEFWQikvbGliYXZiL2F2Yl9oYXNodHJlZV9kZXNjcmlwdG9yLmMgXAorICAgICQoQVZCKS9saWJhdmIvYXZiX2tlcm5lbF9jbWRsaW5lX2Rlc2NyaXB0b3IuYyBcCisgICAgJChBVkIpL2xpYmF2Yi9hdmJfcHJvcGVydHlfZGVzY3JpcHRvci5jIFwKKyAgICAkKEFWQikvbGliYXZiL2F2Yl9yc2EuYyBcCisgICAgJChBVkIpL2xpYmF2Yi9hdmJfc2hhMjU2LmMgXAorICAgICQoQVZCKS9saWJhdmIvYXZiX3NoYTUxMi5jIFwKKyAgICAkKEFWQikvbGliYXZiL2F2Yl9zbG90X3ZlcmlmeS5jIFwKKyAgICAkKEFWQikvbGliYXZiL2F2Yl91dGlsLmMgXAorICAgICQoQVZCKS9saWJhdmIvYXZiX3ZibWV0YV9pbWFnZS5jIFwKKyAgICAkKEFWQikvbGliYXZiX2FiL2F2Yl9hYl9mbG93LmMKKworRUZJX09CSl9GSUxFUyAgID0gJChub3RkaXIgJChwYXRzdWJzdCAlLlMsJS5vLCQocGF0c3Vic3QgJS5jLCUubywkKEVGSV9TUkNfRklMRVMpKSkpCitFRklfVEFSR0VUICAgICAgPSBhdmJfYm9vdGxvYWRlci5lZmkKK0VGSV9TSEFSRURfT0JKICA9ICQocGF0c3Vic3QgJS5lZmksJS5zbywkKEVGSV9UQVJHRVQpKQorCitFRklfQ0ZMQUdTID0gXAorICAgIC1EQVZCX0NPTVBJTEFUSU9OIC1zdGQ9Z251OTkgXAorCS1JJChBTkRST0lEX0JVSUxEX1RPUCkvc3lzdGVtL2NvcmUvbWtib290aW1nLyBcCisgICAgLUkkKEFWQikgXAorICAgIC1JJChHTlVFRkkpIFwKKyAgICAtSSQoR05VRUZJKS94ODZfNjQgXAorICAgIC1JJChHTlVFRkkpL3Byb3RvY29sIFwKKyAgICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZnBpYyBcCisgICAgLWZzaG9ydC13Y2hhciAtbW5vLXJlZC16b25lIC1XYWxsIFwKKyAgICAtREVGSV9GVU5DVElPTl9XUkFQUEVSCisKK0VGSV9MREZMQUdTID0gXAorICAgIC1ub3N0ZGxpYiAtem5vY29tYnJlbG9jIC1UIC91c3IvbGliL2VsZl94ODZfNjRfZWZpLmxkcyAtc2hhcmVkIFwKKyAgICAtQnN5bWJvbGljIC1MIC91c3IvbGliLyAvdXNyL2xpYi9jcnQwLWVmaS14ODZfNjQubyBcCisgICAgL3Vzci9saWIvZWxmX3g4Nl82NF9lZmkubGRzCisKK0VGSV9MRExJQlMgID0gLWxlZmkgLWxnbnVlZmkKKworRUZJX09CSkNPUFlfU0VDVElPTlMgICAgPSAtaiAudGV4dCAtaiAuc2RhdGEgLWogLmRhdGEgLWogLmR5bmFtaWMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1qIC5keW5zeW0gIC1qIC5yZWwgLWogLnJlbGEgLWogLnJlbG9jCisKK0VGSV9PQkpDT1BZX1RBUkdFVCAgICAgID0gLS10YXJnZXQ9ZWZpLWFwcC14ODZfNjQKKworYWxsOiAkKEVGSV9UQVJHRVQpCisKKyQoRUZJX09CSl9GSUxFUyk6ICQoRUZJX1NSQ19GSUxFUykKKwkkKEVGSV9DQykgJChFRklfQ0ZMQUdTKSAtYyAkKEVGSV9TUkNfRklMRVMpCisKKyQoRUZJX1NIQVJFRF9PQkopOiAkKEVGSV9PQkpfRklMRVMpCisJJChFRklfTEQpICQoRUZJX0xERkxBR1MpICQoRUZJX09CSl9GSUxFUykgLW8gJEAgJChFRklfTERMSUJTKQorCiskKEVGSV9UQVJHRVQpOiAkKEVGSV9TSEFSRURfT0JKKQorCSQoRUZJX09CSkNPUFkpICQoRUZJX09CSkNPUFlfU0VDVElPTlMpICQoRUZJX09CSkNPUFlfVEFSR0VUKSAkXiAkQAorCitjbGVhbjoKKwlybSAtZiAgJChFRklfT0JKX0ZJTEVTKSAkKEVGSV9TSEFSRURfT0JKKSAkKEVGSV9UQVJHRVQpICp+CmRpZmYgLS1naXQgYS9hdmIvZXhhbXBsZXMvdWVmaS9tYWluLmMgYi9hdmIvZXhhbXBsZXMvdWVmaS9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5YzBlZQotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9leGFtcGxlcy91ZWZpL21haW4uYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8ZWZpLmg+CisjaW5jbHVkZSA8ZWZpbGliLmg+CisKKyNpbmNsdWRlIDxsaWJhdmJfYWIvbGliYXZiX2FiLmg+CisKKyNpbmNsdWRlICJ1ZWZpX2F2Yl9ib290LmgiCisjaW5jbHVkZSAidWVmaV9hdmJfb3BzLmgiCisKK0VGSV9TVEFUVVMgRUZJQVBJIGVmaV9tYWluKEVGSV9IQU5ETEUgSW1hZ2VIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFRklfU1lTVEVNX1RBQkxFKiBTeXN0ZW1UYWJsZSkgeworICBBdmJPcHMqIG9wczsKKyAgQXZiQUJGbG93UmVzdWx0IGFiX3Jlc3VsdDsKKyAgQXZiU2xvdFZlcmlmeURhdGEqIHNsb3RfZGF0YTsKKyAgVUVGSUF2YkJvb3RLZXJuZWxSZXN1bHQgYm9vdF9yZXN1bHQ7CisgIGNvbnN0IGNoYXIqIHJlcXVlc3RlZF9wYXJ0aXRpb25zW10gPSB7ImJvb3QiLCBOVUxMfTsKKyAgYm9vbCB1bmxvY2tlZCA9IHRydWU7CisKKyAgSW5pdGlhbGl6ZUxpYihJbWFnZUhhbmRsZSwgU3lzdGVtVGFibGUpOworCisgIGF2Yl9wcmludCgiVUVGSSBBVkItYmFzZWQgYm9vdGxvYWRlclxuIik7CisKKyAgb3BzID0gdWVmaV9hdmJfb3BzX25ldyhJbWFnZUhhbmRsZSk7CisgIGlmIChvcHMgPT0gTlVMTCkgeworICAgIGF2Yl9mYXRhbCgiRXJyb3IgYWxsb2NhdGluZyBBdmJPcHMuXG4iKTsKKyAgfQorCisgIGlmIChvcHMtPnJlYWRfaXNfZGV2aWNlX3VubG9ja2VkKG9wcywgJnVubG9ja2VkKSAhPSBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgYXZiX2ZhdGFsKCJFcnJvciBkZXRlcm1pbmluZyB3aGV0aGVyIGRldmljZSBpcyB1bmxvY2tlZC5cbiIpOworICB9CisgIGF2Yl9wcmludHYoInJlYWRfaXNfZGV2aWNlX3VubG9ja2VkKCkgb3BzIHJldHVybmVkIHRoYXQgZGV2aWNlIGlzICIsCisgICAgICAgICAgICAgdW5sb2NrZWQgPyAiVU5MT0NLRUQiIDogIkxPQ0tFRCIsCisgICAgICAgICAgICAgIlxuIiwKKyAgICAgICAgICAgICBOVUxMKTsKKworICBhYl9yZXN1bHQgPSBhdmJfYWJfZmxvdyhvcHMtPmFiX29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVubG9ja2VkIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3RfZGF0YSk7CisgIGF2Yl9wcmludHYoImF2Yl9hYl9mbG93KCkgcmV0dXJuZWQgIiwKKyAgICAgICAgICAgICBhdmJfYWJfZmxvd19yZXN1bHRfdG9fc3RyaW5nKGFiX3Jlc3VsdCksCisgICAgICAgICAgICAgIlxuIiwKKyAgICAgICAgICAgICBOVUxMKTsKKyAgc3dpdGNoIChhYl9yZXN1bHQpIHsKKyAgICBjYXNlIEFWQl9BQl9GTE9XX1JFU1VMVF9PSzoKKyAgICBjYXNlIEFWQl9BQl9GTE9XX1JFU1VMVF9PS19XSVRIX1ZFUklGSUNBVElPTl9FUlJPUjoKKyAgICAgIGF2Yl9wcmludHYoInNsb3Rfc3VmZml4OiAiLCBzbG90X2RhdGEtPmFiX3N1ZmZpeCwgIlxuIiwgTlVMTCk7CisgICAgICBhdmJfcHJpbnR2KCJjbWRsaW5lOiAgICAgIiwgc2xvdF9kYXRhLT5jbWRsaW5lLCAiXG4iLCBOVUxMKTsKKyAgICAgIC8qIFBhc3MgJ3NraXBfaW5pdHJhbWZzJyBzaW5jZSB3ZSdyZSBub3QgYm9vdGluZyBpbnRvIHJlY292ZXJ5IG1vZGUuICovCisgICAgICBib290X3Jlc3VsdCA9CisgICAgICAgICAgdWVmaV9hdmJfYm9vdF9rZXJuZWwoSW1hZ2VIYW5kbGUsIHNsb3RfZGF0YSwgInNraXBfaW5pdHJhbWZzIik7CisgICAgICBhdmJfZmF0YWx2KCJ1ZWZpX2F2Yl9ib290X2tlcm5lbCgpIGZhaWxlZCB3aXRoIGVycm9yICIsCisgICAgICAgICAgICAgICAgIHVlZmlfYXZiX2Jvb3Rfa2VybmVsX3Jlc3VsdF90b19zdHJpbmcoYm9vdF9yZXN1bHQpLAorICAgICAgICAgICAgICAgICAiXG4iLAorICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoc2xvdF9kYXRhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX09PTToKKyAgICAgIGF2Yl9mYXRhbCgiT09NIGVycm9yIHdoaWxlIGRvaW5nIEEvQiBzZWxlY3QgZmxvdy5cbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBVkJfQUJfRkxPV19SRVNVTFRfRVJST1JfSU86CisgICAgICBhdmJfZmF0YWwoIkkvTyBlcnJvciB3aGlsZSBkb2luZyBBL0Igc2VsZWN0IGZsb3cuXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX05PX0JPT1RBQkxFX1NMT1RTOgorICAgICAgYXZiX2ZhdGFsKCJObyBib290YWJsZSBzbG90cyAtIGVudGVyIHJlcGFpciBtb2RlXG4iKTsKKyAgICAgIGJyZWFrOworICB9CisgIHVlZmlfYXZiX29wc19mcmVlKG9wcyk7CisKKyAgcmV0dXJuIEVGSV9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYXZiL2V4YW1wbGVzL3VlZmkvdWVmaV9hdmJfYm9vdC5jIGIvYXZiL2V4YW1wbGVzL3VlZmkvdWVmaV9hdmJfYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMGM5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvZXhhbXBsZXMvdWVmaS91ZWZpX2F2Yl9ib290LmMKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxlZmkuaD4KKyNpbmNsdWRlIDxlZmlsaWIuaD4KKworI2luY2x1ZGUgImJvb3RpbWcuaCIKKworI2luY2x1ZGUgInVlZmlfYXZiX2Jvb3QuaCIKKyNpbmNsdWRlICJ1ZWZpX2F2Yl91dGlsLmgiCisKKy8qIFNlZSBEb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dCBmb3IgdGhpcyBzdHJ1Y3QgYW5kIG1vcmUgaW5mb3JtYXRpb24KKyAqIGFib3V0IHRoZSBib290L2hhbmRvdmVyIHByb3RvY29sLgorICovCisKKyNkZWZpbmUgU0VUVVBfTUFHSUMgMHg1MzcyNjQ0OCAvKiAiSGRyUyIgKi8KKworc3RydWN0IFNldHVwSGVhZGVyIHsKKyAgVUlOVDggYm9vdF9zZWN0b3JbMHgwMWYxXTsKKyAgVUlOVDggc2V0dXBfc2VjczsKKyAgVUlOVDE2IHJvb3RfZmxhZ3M7CisgIFVJTlQzMiBzeXNfc2l6ZTsKKyAgVUlOVDE2IHJhbV9zaXplOworICBVSU5UMTYgdmlkZW9fbW9kZTsKKyAgVUlOVDE2IHJvb3RfZGV2OworICBVSU5UMTYgc2lnbmF0dXJlOworICBVSU5UMTYganVtcDsKKyAgVUlOVDMyIGhlYWRlcjsKKyAgVUlOVDE2IHZlcnNpb247CisgIFVJTlQxNiBzdV9zd2l0Y2g7CisgIFVJTlQxNiBzZXR1cF9zZWc7CisgIFVJTlQxNiBzdGFydF9zeXM7CisgIFVJTlQxNiBrZXJuZWxfdmVyOworICBVSU5UOCBsb2FkZXJfaWQ7CisgIFVJTlQ4IGxvYWRfZmxhZ3M7CisgIFVJTlQxNiBtb3Zlc2l6ZTsKKyAgVUlOVDMyIGNvZGUzMl9zdGFydDsKKyAgVUlOVDMyIHJhbWRpc2tfc3RhcnQ7CisgIFVJTlQzMiByYW1kaXNrX2xlbjsKKyAgVUlOVDMyIGJvb3RzZWN0X2tsdWRnZTsKKyAgVUlOVDE2IGhlYXBfZW5kOworICBVSU5UOCBleHRfbG9hZGVyX3ZlcjsKKyAgVUlOVDggZXh0X2xvYWRlcl90eXBlOworICBVSU5UMzIgY21kX2xpbmVfcHRyOworICBVSU5UMzIgcmFtZGlza19tYXg7CisgIFVJTlQzMiBrZXJuZWxfYWxpZ25tZW50OworICBVSU5UOCByZWxvY2F0YWJsZV9rZXJuZWw7CisgIFVJTlQ4IG1pbl9hbGlnbm1lbnQ7CisgIFVJTlQxNiB4bG9hZGZsYWdzOworICBVSU5UMzIgY21kbGluZV9zaXplOworICBVSU5UMzIgaGFyZHdhcmVfc3ViYXJjaDsKKyAgVUlOVDY0IGhhcmR3YXJlX3N1YmFyY2hfZGF0YTsKKyAgVUlOVDMyIHBheWxvYWRfb2Zmc2V0OworICBVSU5UMzIgcGF5bG9hZF9sZW5ndGg7CisgIFVJTlQ2NCBzZXR1cF9kYXRhOworICBVSU5UNjQgcHJlZl9hZGRyZXNzOworICBVSU5UMzIgaW5pdF9zaXplOworICBVSU5UMzIgaGFuZG92ZXJfb2Zmc2V0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2lmZGVmIF9feDg2XzY0X18KK3R5cGVkZWYgVk9JRCAoKmhhbmRvdmVyX2YpKFZPSUQqIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZJX1NZU1RFTV9UQUJMRSogdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU2V0dXBIZWFkZXIqIHNldHVwKTsKK3N0YXRpYyBpbmxpbmUgVk9JRCBsaW51eF9lZmlfaGFuZG92ZXIoRUZJX0hBTkRMRSBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNldHVwSGVhZGVyKiBzZXR1cCkgeworICBoYW5kb3Zlcl9mIGhhbmRvdmVyOworCisgIGFzbSB2b2xhdGlsZSgiY2xpIik7CisgIGhhbmRvdmVyID0KKyAgICAgIChoYW5kb3Zlcl9mKSgoVUlOVE4pc2V0dXAtPmNvZGUzMl9zdGFydCArIDUxMiArIHNldHVwLT5oYW5kb3Zlcl9vZmZzZXQpOworICBoYW5kb3ZlcihpbWFnZSwgU1QsIHNldHVwKTsKK30KKyNlbHNlCit0eXBlZGVmIFZPSUQgKCpoYW5kb3Zlcl9mKShWT0lEKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGSV9TWVNURU1fVEFCTEUqIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNldHVwSGVhZGVyKiBzZXR1cCkKKyAgICBfX2F0dHJpYnV0ZV9fKChyZWdwYXJtKDApKSk7CitzdGF0aWMgaW5saW5lIFZPSUQgbGludXhfZWZpX2hhbmRvdmVyKEVGSV9IQU5ETEUgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTZXR1cEhlYWRlciogc2V0dXApIHsKKyAgaGFuZG92ZXJfZiBoYW5kb3ZlcjsKKworICBoYW5kb3ZlciA9IChoYW5kb3Zlcl9mKSgoVUlOVE4pc2V0dXAtPmNvZGUzMl9zdGFydCArIHNldHVwLT5oYW5kb3Zlcl9vZmZzZXQpOworICBoYW5kb3ZlcihpbWFnZSwgU1QsIHNldHVwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc2l6ZV90IHJvdW5kX3VwKHNpemVfdCB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2l6ZV90IHJldCA9IHZhbHVlICsgc2l6ZSAtIDE7CisgIHJldCAvPSBzaXplOworICByZXQgKj0gc2l6ZTsKKyAgcmV0dXJuIHJldDsKK30KKworVUVGSUF2YkJvb3RLZXJuZWxSZXN1bHQgdWVmaV9hdmJfYm9vdF9rZXJuZWwoRUZJX0hBTkRMRSBlZmlfaW1hZ2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZiU2xvdFZlcmlmeURhdGEqIHNsb3RfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNtZGxpbmVfZXh0cmEpIHsKKyAgVUVGSUF2YkJvb3RLZXJuZWxSZXN1bHQgcmV0OworICBjb25zdCBib290X2ltZ19oZHIqIGhlYWRlcjsKKyAgRUZJX1NUQVRVUyBlcnI7CisgIFVJTlQ4KiBrZXJuZWxfYnVmID0gTlVMTDsKKyAgVUlOVDgqIGluaXRyYW1mc19idWYgPSBOVUxMOworICBVSU5UOCogY21kbGluZV91dGY4ID0gTlVMTDsKKyAgQXZiUGFydGl0aW9uRGF0YSogYm9vdDsKKyAgc2l6ZV90IG9mZnNldDsKKyAgdWludDY0X3QgdG90YWxfc2l6ZTsKKyAgc2l6ZV90IGluaXRyYW1mc19zaXplOworICBzaXplX3QgY21kbGluZV9maXJzdF9sZW47CisgIHNpemVfdCBjbWRsaW5lX3NlY29uZF9sZW47CisgIHNpemVfdCBjbWRsaW5lX2V4dHJhX2xlbjsKKyAgc2l6ZV90IGNtZGxpbmVfdXRmOF9sZW47CisgIHN0cnVjdCBTZXR1cEhlYWRlciogaW1hZ2Vfc2V0dXA7CisgIHN0cnVjdCBTZXR1cEhlYWRlciogc2V0dXA7CisgIEVGSV9QSFlTSUNBTF9BRERSRVNTIGFkZHI7CisKKyAgaWYgKHNsb3RfZGF0YS0+bnVtX2xvYWRlZF9wYXJ0aXRpb25zICE9IDEpIHsKKyAgICBhdmJfZXJyb3IoIk5vIGJvb3QgcGFydGl0aW9uLlxuIik7CisgICAgcmV0ID0gVUVGSV9BVkJfQk9PVF9LRVJORUxfUkVTVUxUX0VSUk9SX1BBUlRJVElPTl9JTlZBTElEX0ZPUk1BVDsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGJvb3QgPSAmc2xvdF9kYXRhLT5sb2FkZWRfcGFydGl0aW9uc1swXTsKKyAgaWYgKGF2Yl9zdHJjbXAoYm9vdC0+cGFydGl0aW9uX25hbWUsICJib290IikgIT0gMCkgeworICAgIGF2Yl9lcnJvcnYoCisgICAgICAgICJVbmV4cGVjdGVkIHBhcnRpdGlvbiBuYW1lICciLCBib290LT5wYXJ0aXRpb25fbmFtZSwgIicuXG4iLCBOVUxMKTsKKyAgICByZXQgPSBVRUZJX0FWQl9CT09UX0tFUk5FTF9SRVNVTFRfRVJST1JfUEFSVElUSU9OX0lOVkFMSURfRk9STUFUOworICAgIGdvdG8gb3V0OworICB9CisKKyAgaGVhZGVyID0gKGNvbnN0IGJvb3RfaW1nX2hkciopYm9vdC0+ZGF0YTsKKworICAvKiBDaGVjayBib290IGltYWdlIGhlYWRlciBtYWdpYyBmaWVsZC4gKi8KKyAgaWYgKGF2Yl9tZW1jbXAoQk9PVF9NQUdJQywgaGVhZGVyLT5tYWdpYywgQk9PVF9NQUdJQ19TSVpFKSkgeworICAgIGF2Yl9lcnJvcigiV3JvbmcgYm9vdCBpbWFnZSBoZWFkZXIgbWFnaWMuXG4iKTsKKyAgICByZXQgPSBVRUZJX0FWQl9CT09UX0tFUk5FTF9SRVNVTFRfRVJST1JfUEFSVElUSU9OX0lOVkFMSURfRk9STUFUOworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogU2FuaXR5IGNoZWNrIGhlYWRlci4gKi8KKyAgdG90YWxfc2l6ZSA9IGhlYWRlci0+a2VybmVsX3NpemU7CisgIGlmICghYXZiX3NhZmVfYWRkX3RvKCZ0b3RhbF9zaXplLCBoZWFkZXItPnJhbWRpc2tfc2l6ZSkgfHwKKyAgICAgICFhdmJfc2FmZV9hZGRfdG8oJnRvdGFsX3NpemUsIGhlYWRlci0+c2Vjb25kX3NpemUpKSB7CisgICAgYXZiX2Vycm9yKCJPdmVyZmxvdyB3aGlsZSBhZGRpbmcgc2l6ZXMgb2Yga2VybmVsIGFuZCBpbml0cmFtZnMuXG4iKTsKKyAgICByZXQgPSBVRUZJX0FWQl9CT09UX0tFUk5FTF9SRVNVTFRfRVJST1JfUEFSVElUSU9OX0lOVkFMSURfRk9STUFUOworICAgIGdvdG8gb3V0OworICB9CisgIGlmICh0b3RhbF9zaXplID4gYm9vdC0+ZGF0YV9zaXplKSB7CisgICAgYXZiX2Vycm9yKCJJbnZhbGlkIGtlcm5lbC9pbml0cmFtZnMgc2l6ZXMuXG4iKTsKKyAgICByZXQgPSBVRUZJX0FWQl9CT09UX0tFUk5FTF9SRVNVTFRfRVJST1JfUEFSVElUSU9OX0lOVkFMSURfRk9STUFUOworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogVGhlIGtlcm5lbCBoYXMgdG8gYmUgaW4gaXRzIG93biBzcGVjaWZpYyBtZW1vcnkgcG9vbC4gKi8KKyAgZXJyID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkFsbG9jYXRlUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVNX0FSR1NfQUxMT0NBVEVfUE9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRWZpTG9hZGVyQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5rZXJuZWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtlcm5lbF9idWYpOworICBpZiAoRUZJX0VSUk9SKGVycikpIHsKKyAgICBhdmJfZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBrZXJuZWwgYnVmZmVyLlxuIik7CisgICAgcmV0ID0gVUVGSV9BVkJfQk9PVF9LRVJORUxfUkVTVUxUX0VSUk9SX09PTTsKKyAgICBnb3RvIG91dDsKKyAgfQorICBhdmJfbWVtY3B5KGtlcm5lbF9idWYsIGJvb3QtPmRhdGEgKyBoZWFkZXItPnBhZ2Vfc2l6ZSwgaGVhZGVyLT5rZXJuZWxfc2l6ZSk7CisKKyAgLyogRGl0dG8gZm9yIHRoZSBpbml0cmQuICovCisgIGluaXRyYW1mc19idWYgPSBOVUxMOworICBpbml0cmFtZnNfc2l6ZSA9IGhlYWRlci0+cmFtZGlza19zaXplICsgaGVhZGVyLT5zZWNvbmRfc2l6ZTsKKyAgaWYgKGluaXRyYW1mc19zaXplID4gMCkgeworICAgIGVyciA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5BbGxvY2F0ZVBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVNX0FSR1NfQUxMT0NBVEVfUE9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmlMb2FkZXJDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRyYW1mc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0cmFtZnNfYnVmKTsKKyAgICBpZiAoRUZJX0VSUk9SKGVycikpIHsKKyAgICAgIGF2Yl9lcnJvcigiQ291bGQgbm90IGFsbG9jYXRlIGluaXRyZCBidWZmZXIuXG4iKTsKKyAgICAgIHJldCA9IFVFRklfQVZCX0JPT1RfS0VSTkVMX1JFU1VMVF9FUlJPUl9PT007CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgLyogQ29uY2F0ZW50ZSB0aGUgZmlyc3QgYW5kIHNlY29uZCBpbml0cmFtZnMuICovCisgICAgb2Zmc2V0ID0gaGVhZGVyLT5wYWdlX3NpemU7CisgICAgb2Zmc2V0ICs9IHJvdW5kX3VwKGhlYWRlci0+a2VybmVsX3NpemUsIGhlYWRlci0+cGFnZV9zaXplKTsKKyAgICBhdmJfbWVtY3B5KGluaXRyYW1mc19idWYsIGJvb3QtPmRhdGEgKyBvZmZzZXQsIGhlYWRlci0+cmFtZGlza19zaXplKTsKKyAgICBvZmZzZXQgKz0gcm91bmRfdXAoaGVhZGVyLT5yYW1kaXNrX3NpemUsIGhlYWRlci0+cGFnZV9zaXplKTsKKyAgICBhdmJfbWVtY3B5KGluaXRyYW1mc19idWYsIGJvb3QtPmRhdGEgKyBvZmZzZXQsIGhlYWRlci0+c2Vjb25kX3NpemUpOworICB9CisKKyAgLyogUHJlcGFyZSB0aGUgY29tbWFuZC1saW5lLiAqLworICBjbWRsaW5lX2ZpcnN0X2xlbiA9IGF2Yl9zdHJsZW4oKGNvbnN0IGNoYXIqKWhlYWRlci0+Y21kbGluZSk7CisgIGNtZGxpbmVfc2Vjb25kX2xlbiA9IGF2Yl9zdHJsZW4oc2xvdF9kYXRhLT5jbWRsaW5lKTsKKyAgY21kbGluZV9leHRyYV9sZW4gPSBjbWRsaW5lX2V4dHJhICE9IE5VTEwgPyBhdmJfc3RybGVuKGNtZGxpbmVfZXh0cmEpIDogMDsKKyAgaWYgKGNtZGxpbmVfZXh0cmFfbGVuID4gMCkgeworICAgIGNtZGxpbmVfZXh0cmFfbGVuICs9IDE7CisgIH0KKyAgY21kbGluZV91dGY4X2xlbiA9CisgICAgICBjbWRsaW5lX2ZpcnN0X2xlbiArIDEgKyBjbWRsaW5lX3NlY29uZF9sZW4gKyAxICsgY21kbGluZV9leHRyYV9sZW47CisgIGVyciA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5BbGxvY2F0ZVBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTV9BUkdTX0FMTE9DQVRFX1BPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVmaUxvYWRlckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZGxpbmVfdXRmOF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWRsaW5lX3V0ZjgpOworICBpZiAoRUZJX0VSUk9SKGVycikpIHsKKyAgICBhdmJfZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBrZXJuZWwgY21kbGluZS5cbiIpOworICAgIHJldCA9IFVFRklfQVZCX0JPT1RfS0VSTkVMX1JFU1VMVF9FUlJPUl9PT007CisgICAgZ290byBvdXQ7CisgIH0KKyAgb2Zmc2V0ID0gMDsKKyAgYXZiX21lbWNweShjbWRsaW5lX3V0ZjgsIGhlYWRlci0+Y21kbGluZSwgY21kbGluZV9maXJzdF9sZW4pOworICBvZmZzZXQgKz0gY21kbGluZV9maXJzdF9sZW47CisgIGNtZGxpbmVfdXRmOFtvZmZzZXRdID0gJyAnOworICBvZmZzZXQgKz0gMTsKKyAgYXZiX21lbWNweShjbWRsaW5lX3V0ZjggKyBvZmZzZXQsIHNsb3RfZGF0YS0+Y21kbGluZSwgY21kbGluZV9zZWNvbmRfbGVuKTsKKyAgb2Zmc2V0ICs9IGNtZGxpbmVfc2Vjb25kX2xlbjsKKyAgaWYgKGNtZGxpbmVfZXh0cmFfbGVuID4gMCkgeworICAgIGNtZGxpbmVfdXRmOFtvZmZzZXRdID0gJyAnOworICAgIGF2Yl9tZW1jcHkoY21kbGluZV91dGY4ICsgb2Zmc2V0ICsgMSwgY21kbGluZV9leHRyYSwgY21kbGluZV9leHRyYV9sZW4gLSAxKTsKKyAgICBvZmZzZXQgKz0gY21kbGluZV9leHRyYV9sZW47CisgIH0KKyAgY21kbGluZV91dGY4W29mZnNldF0gPSAnXDAnOworICBvZmZzZXQgKz0gMTsKKyAgYXZiX2Fzc2VydChvZmZzZXQgPT0gY21kbGluZV91dGY4X2xlbik7CisKKyAgLyogTm93IHNldCB1cCB0aGUgRUZJIGhhbmRvdmVyLiAqLworICBpbWFnZV9zZXR1cCA9IChzdHJ1Y3QgU2V0dXBIZWFkZXIqKWtlcm5lbF9idWY7CisgIGlmIChpbWFnZV9zZXR1cC0+c2lnbmF0dXJlICE9IDB4QUE1NSB8fCBpbWFnZV9zZXR1cC0+aGVhZGVyICE9IFNFVFVQX01BR0lDKSB7CisgICAgYXZiX2Vycm9yKCJXcm9uZyBrZXJuZWwgaGVhZGVyIG1hZ2ljLlxuIik7CisgICAgcmV0ID0gVUVGSV9BVkJfQk9PVF9LRVJORUxfUkVTVUxUX0VSUk9SX0tFUk5FTF9JTlZBTElEX0ZPUk1BVDsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGlmIChpbWFnZV9zZXR1cC0+dmVyc2lvbiA8IDB4MjBiKSB7CisgICAgYXZiX2Vycm9yKCJXcm9uZyB2ZXJzaW9uLlxuIik7CisgICAgcmV0ID0gVUVGSV9BVkJfQk9PVF9LRVJORUxfUkVTVUxUX0VSUk9SX0tFUk5FTF9JTlZBTElEX0ZPUk1BVDsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGlmICghaW1hZ2Vfc2V0dXAtPnJlbG9jYXRhYmxlX2tlcm5lbCkgeworICAgIGF2Yl9lcnJvcigiS2VybmVsIGlzIG5vdCByZWxvY2F0YWJsZS5cbiIpOworICAgIHJldCA9IFVFRklfQVZCX0JPT1RfS0VSTkVMX1JFU1VMVF9FUlJPUl9LRVJORUxfSU5WQUxJRF9GT1JNQVQ7CisgICAgZ290byBvdXQ7CisgIH0KKworICBhZGRyID0gMHgzZmZmZmZmZjsKKyAgZXJyID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkFsbG9jYXRlUGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRlTWF4QWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRWZpTG9hZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRUZJX1NJWkVfVE9fUEFHRVMoMHg0MDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZHIpOworICBpZiAoRUZJX0VSUk9SKGVycikpIHsKKyAgICBhdmJfZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBzZXR1cCBidWZmZXIuXG4iKTsKKyAgICByZXQgPSBVRUZJX0FWQl9CT09UX0tFUk5FTF9SRVNVTFRfRVJST1JfT09NOworICAgIGdvdG8gb3V0OworICB9CisgIHNldHVwID0gKHN0cnVjdCBTZXR1cEhlYWRlciopKFVJTlROKWFkZHI7CisgIGF2Yl9tZW1zZXQoc2V0dXAsICdcMCcsIDB4NDAwMCk7CisgIGF2Yl9tZW1jcHkoc2V0dXAsIGltYWdlX3NldHVwLCBzaXplb2Yoc3RydWN0IFNldHVwSGVhZGVyKSk7CisgIHNldHVwLT5sb2FkZXJfaWQgPSAweGZmOworICBzZXR1cC0+Y29kZTMyX3N0YXJ0ID0KKyAgICAgICgodWludHB0cl90KWtlcm5lbF9idWYpICsgKGltYWdlX3NldHVwLT5zZXR1cF9zZWNzICsgMSkgKiA1MTI7CisgIHNldHVwLT5jbWRfbGluZV9wdHIgPSAodWludHB0cl90KWNtZGxpbmVfdXRmODsKKworICBzZXR1cC0+cmFtZGlza19zdGFydCA9ICh1aW50cHRyX3QpaW5pdHJhbWZzX2J1ZjsKKyAgc2V0dXAtPnJhbWRpc2tfbGVuID0gKHVpbnRwdHJfdClpbml0cmFtZnNfc2l6ZTsKKworICAvKiBKdW1wIHRvIHRoZSBrZXJuZWwuICovCisgIGxpbnV4X2VmaV9oYW5kb3ZlcihlZmlfaW1hZ2VfaGFuZGxlLCBzZXR1cCk7CisKKyAgcmV0ID0gVUVGSV9BVkJfQk9PVF9LRVJORUxfUkVTVUxUX0VSUk9SX1NUQVJUX0tFUk5FTDsKK291dDoKKyAgcmV0dXJuIHJldDsKK30KKworY29uc3QgY2hhciogdWVmaV9hdmJfYm9vdF9rZXJuZWxfcmVzdWx0X3RvX3N0cmluZygKKyAgICBVRUZJQXZiQm9vdEtlcm5lbFJlc3VsdCByZXN1bHQpIHsKKyAgY29uc3QgY2hhciogcmV0ID0gTlVMTDsKKworICBzd2l0Y2ggKHJlc3VsdCkgeworICAgIGNhc2UgVUVGSV9BVkJfQk9PVF9LRVJORUxfUkVTVUxUX09LOgorICAgICAgcmV0ID0gIk9LIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVUVGSV9BVkJfQk9PVF9LRVJORUxfUkVTVUxUX0VSUk9SX09PTToKKyAgICAgIHJldCA9ICJFUlJPUl9PRU0iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVRUZJX0FWQl9CT09UX0tFUk5FTF9SRVNVTFRfRVJST1JfSU86CisgICAgICByZXQgPSAiRVJST1JfSU8iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVRUZJX0FWQl9CT09UX0tFUk5FTF9SRVNVTFRfRVJST1JfUEFSVElUSU9OX0lOVkFMSURfRk9STUFUOgorICAgICAgcmV0ID0gIkVSUk9SX1BBUlRJVElPTl9JTlZBTElEX0ZPUk1BVCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVFRklfQVZCX0JPT1RfS0VSTkVMX1JFU1VMVF9FUlJPUl9LRVJORUxfSU5WQUxJRF9GT1JNQVQ6CisgICAgICByZXQgPSAiRVJST1JfS0VSTkVMX0lOVkFMSURfRk9STUFUIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVUVGSV9BVkJfQk9PVF9LRVJORUxfUkVTVUxUX0VSUk9SX1NUQVJUX0tFUk5FTDoKKyAgICAgIHJldCA9ICJFUlJPUl9TVEFSVF9LRVJORUwiOworICAgICAgYnJlYWs7CisgICAgICAvKiBEbyBub3QgYWRkIGEgJ2RlZmF1bHQ6JyBjYXNlIGhlcmUgYmVjYXVzZSBvZiAtV3N3aXRjaC4gKi8KKyAgfQorCisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIGF2Yl9lcnJvcigiVW5rbm93biBVRUZJQXZiQm9vdEtlcm5lbFJlc3VsdCB2YWx1ZS5cbiIpOworICAgIHJldCA9ICIodW5rbm93bikiOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2F2Yi9leGFtcGxlcy91ZWZpL3VlZmlfYXZiX2Jvb3QuaCBiL2F2Yi9leGFtcGxlcy91ZWZpL3VlZmlfYXZiX2Jvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmI4YjM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL2V4YW1wbGVzL3VlZmkvdWVmaV9hdmJfYm9vdC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgVUVGSV9BVkJfQk9PVF9IXworI2RlZmluZSBVRUZJX0FWQl9CT09UX0hfCisKKyNpbmNsdWRlIDxlZmkuaD4KKyNpbmNsdWRlIDxsaWJhdmIvbGliYXZiLmg+CisKKy8qIFJldHVybiBjb2RlcyB1c2VkIGluIHVlZmlfYXZiX2Jvb3Rfa2VybmVsKCkuCisgKgorICogVXNlIHVlZmlfYXZiX2Jvb3Rfa2VybmVsX3Jlc3VsdF90b19zdHJpbmcgdG8gZ2V0IGEgdGV4dHVhbAorICogcmVwcmVzZW50YXRpb24gdXNhYmxlIGZvciBlcnJvci9kZWJ1ZyBvdXRwdXQuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIFVFRklfQVZCX0JPT1RfS0VSTkVMX1JFU1VMVF9PSywKKyAgVUVGSV9BVkJfQk9PVF9LRVJORUxfUkVTVUxUX0VSUk9SX09PTSwKKyAgVUVGSV9BVkJfQk9PVF9LRVJORUxfUkVTVUxUX0VSUk9SX0lPLAorICBVRUZJX0FWQl9CT09UX0tFUk5FTF9SRVNVTFRfRVJST1JfUEFSVElUSU9OX0lOVkFMSURfRk9STUFULAorICBVRUZJX0FWQl9CT09UX0tFUk5FTF9SRVNVTFRfRVJST1JfS0VSTkVMX0lOVkFMSURfRk9STUFULAorICBVRUZJX0FWQl9CT09UX0tFUk5FTF9SRVNVTFRfRVJST1JfU1RBUlRfS0VSTkVMCit9IFVFRklBdmJCb290S2VybmVsUmVzdWx0OworCisvKiBKdW1wcyB0byB0aGUgTGludXgga2VybmVsIGVtYmVkZGVkIGluIHRoZSBBbmRyb2lkIGJvb3QgaW1hZ2Ugd2hpY2gKKyAqIGhhcyBiZWVuIGxvYWRlZCBpbiB8c2xvdF9kYXRhfC4gVGhpcyBhbHNvIHN1cHBvcnRzIHNldHRpbmcgdXAgdGhlCisgKiBpbml0cmFtZnMgZnJvbSB0aGUgYm9vdCBpbWFnZS4gVGhlIGNvbW1hbmQtbGluZSB0byBiZSBwYXNzZWQgdG8gdGhlCisgKiBrZXJuZWwgd2lsbCBiZSB0aGUgY29uY2F0ZW5hdGlvbiBvZgorICoKKyAqICAxLiB0aGUgY21kbGluZSBpbiB0aGUgQW5kcm9pZCBib290IGltYWdlOyBhbmQKKyAqICAyLiB0aGUgY21kbGluZSBpbiB8c2xvdF9kYXRhfDsgYW5kCisgKiAgMy4gfGNtZGxpbmVfZXh0cmF8IGlmIG5vdCBOVUxMCisgKgorICogaW4gdGhhdCBvcmRlciB3aXRoIHNwYWNlcyBpbnNlcnRlZCBhcyBuZWNlc3NhcnkuCisgKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgaWYgYW4gZXJyb3Igb2NjdXJzLgorICovCitVRUZJQXZiQm9vdEtlcm5lbFJlc3VsdCB1ZWZpX2F2Yl9ib290X2tlcm5lbChFRklfSEFORExFIGVmaV9pbWFnZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmJTbG90VmVyaWZ5RGF0YSogc2xvdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY21kbGluZV9leHRyYSk7CisKKy8qIEdldCBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgfHJlc3VsdHwuICovCitjb25zdCBjaGFyKiB1ZWZpX2F2Yl9ib290X2tlcm5lbF9yZXN1bHRfdG9fc3RyaW5nKAorICAgIFVFRklBdmJCb290S2VybmVsUmVzdWx0IHJlc3VsdCk7CisKKyNlbmRpZiAvKiBVRUZJX0FWQl9CT09UX0hfICovCmRpZmYgLS1naXQgYS9hdmIvZXhhbXBsZXMvdWVmaS91ZWZpX2F2Yl9vcHMuYyBiL2F2Yi9leGFtcGxlcy91ZWZpL3VlZmlfYXZiX29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjJkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvZXhhbXBsZXMvdWVmaS91ZWZpX2F2Yl9vcHMuYwpAQCAtMCwwICsxLDYzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGVmaS5oPgorI2luY2x1ZGUgPGVmaWxpYi5oPgorCisjaW5jbHVkZSA8bGliYXZiX2FiL2xpYmF2Yl9hYi5oPgorCisjaW5jbHVkZSAidWVmaV9hdmJfb3BzLmgiCisjaW5jbHVkZSAidWVmaV9hdmJfdXRpbC5oIgorCisjaW5jbHVkZSA8ZWZpLmg+CisjaW5jbHVkZSA8ZWZpbGliLmg+CisKKy8qIEdQVCByZWxhdGVkIGNvbnN0YW50cy4gKi8KKyNkZWZpbmUgR1BUX1JFVklTSU9OIDB4MDAwMTAwMDAKKyNkZWZpbmUgR1BUX01BR0lDICJFRkkgUEFSVCIKKyNkZWZpbmUgR1BUX01JTl9TSVpFIDkyCisjZGVmaW5lIEdQVF9FTlRSSUVTX0xCQSAyCisjZGVmaW5lIEFWQl9CTE9DS19TSVpFIDUxMgorI2RlZmluZSBFTlRSSUVTX1BFUl9CTE9DSyA0CisjZGVmaW5lIEVOVFJZX05BTUVfTEVOIDM2CisjZGVmaW5lIE1BWF9HUFRfRU5UUklFUyAxMjgKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IHNpZ25hdHVyZVs4XTsKKyAgdWludDMyX3QgcmV2aXNpb247CisgIHVpbnQzMl90IGhlYWRlcl9zaXplOworICB1aW50MzJfdCBoZWFkZXJfY3JjMzI7CisgIHVpbnQzMl90IHJlc2VydmVkOworICB1aW50NjRfdCBoZWFkZXJfbGJhOworICB1aW50NjRfdCBhbHRlcm5hdGVfaGVhZGVyX2xiYTsKKyAgdWludDY0X3QgZmlyc3RfdXNhYmxlX2xiYTsKKyAgdWludDY0X3QgbGFzdF91c2FibGVfbGJhOworICB1aW50OF90IGRpc2tfZ3VpZFsxNl07CisgIHVpbnQ2NF90IGVudHJ5X2xiYTsKKyAgdWludDMyX3QgZW50cnlfY291bnQ7CisgIHVpbnQzMl90IGVudHJ5X3NpemU7CisgIHVpbnQzMl90IGVudHJ5X2NyYzMyOworICB1aW50OF90IHJlc2VydmVkMls0MjBdOworfSBHUFRIZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCB0eXBlX0dVSURbMTZdOworICB1aW50OF90IHVuaXF1ZV9HVUlEWzE2XTsKKyAgdWludDY0X3QgZmlyc3RfbGJhOworICB1aW50NjRfdCBsYXN0X2xiYTsKKyAgdWludDY0X3QgZmxhZ3M7CisgIHVpbnQxNl90IG5hbWVbRU5UUllfTkFNRV9MRU5dOworfSBHUFRFbnRyeTsKKworc3RhdGljIEVGSV9TVEFUVVMgZmluZF9wYXJ0aXRpb25fZW50cnlfYnlfbmFtZShJTiBFRklfQkxPQ0tfSU8qIGJsb2NrX2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BURW50cnkqKiBlbnRyeV9idWYpIHsKKyAgRUZJX1NUQVRVUyBlcnI7CisgIEdQVEhlYWRlciogZ3B0X2hlYWRlciA9IE5VTEw7CisgIEdQVEVudHJ5IGFsbF9ncHRfZW50cmllc1tNQVhfR1BUX0VOVFJJRVNdOworICB1aW50MTZfdCogcGFydGl0aW9uX25hbWVfdWNzMiA9IE5VTEw7CisgIHNpemVfdCBwYXJ0aXRpb25fbmFtZV9ieXRlczsKKyAgc2l6ZV90IHBhcnRpdGlvbl9uYW1lX3VjczJfY2FwYWNpdHk7CisgIHNpemVfdCBwYXJ0aXRpb25fbmFtZV91Y3MyX2xlbjsKKworICBncHRfaGVhZGVyID0gKEdQVEhlYWRlciopYXZiX21hbGxvYyhzaXplb2YoR1BUSGVhZGVyKSk7CisgIGlmIChncHRfaGVhZGVyID09IE5VTEwpIHsKKyAgICBhdmJfZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmb3IgR1BUIGhlYWRlclxuIik7CisgICAgcmV0dXJuIEVGSV9OT1RfRk9VTkQ7CisgIH0KKworICAqZW50cnlfYnVmID0gKEdQVEVudHJ5KilhdmJfbWFsbG9jKHNpemVvZihHUFRFbnRyeSkgKiBFTlRSSUVTX1BFUl9CTE9DSyk7CisgIGlmIChlbnRyeV9idWYgPT0gTlVMTCkgeworICAgIGF2Yl9lcnJvcigiQ291bGQgbm90IGFsbG9jYXRlIGZvciBwYXJ0aXRpb24gZW50cnlcbiIpOworICAgIGF2Yl9mcmVlKGdwdF9oZWFkZXIpOworICAgIHJldHVybiBFRklfTk9UX0ZPVU5EOworICB9CisKKyAgZXJyID0gdWVmaV9jYWxsX3dyYXBwZXIoYmxvY2tfaW8tPlJlYWRCbG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTV9BUkdTX1JFQURfQkxPQ0tTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19pbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaW8tPk1lZGlhLT5NZWRpYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR1BUSGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B0X2hlYWRlcik7CisgIGlmIChFRklfRVJST1IoZXJyKSkgeworICAgIGF2Yl9lcnJvcigiQ291bGQgbm90IFJlYWRCbG9ja3MgZm9yIGdwdCBoZWFkZXJcbiIpOworICAgIGF2Yl9mcmVlKGdwdF9oZWFkZXIpOworICAgIGF2Yl9mcmVlKCplbnRyeV9idWYpOworICAgICplbnRyeV9idWYgPSBOVUxMOworICAgIHJldHVybiBFRklfTk9UX0ZPVU5EOworICB9CisKKyAgcGFydGl0aW9uX25hbWVfYnl0ZXMgPSBhdmJfc3RybGVuKHBhcnRpdGlvbl9uYW1lKTsKKyAgcGFydGl0aW9uX25hbWVfdWNzMl9jYXBhY2l0eSA9IHNpemVvZih1aW50MTZfdCkgKiAocGFydGl0aW9uX25hbWVfYnl0ZXMgKyAxKTsKKyAgcGFydGl0aW9uX25hbWVfdWNzMiA9IGF2Yl9jYWxsb2MocGFydGl0aW9uX25hbWVfdWNzMl9jYXBhY2l0eSk7CisgIGlmIChwYXJ0aXRpb25fbmFtZV91Y3MyID09IE5VTEwpIHsKKyAgICBhdmJfZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmb3IgdWNzMiBwYXJ0aXRpb24gbmFtZVxuIik7CisgICAgYXZiX2ZyZWUoZ3B0X2hlYWRlcik7CisgICAgYXZiX2ZyZWUoKmVudHJ5X2J1Zik7CisgICAgKmVudHJ5X2J1ZiA9IE5VTEw7CisgICAgcmV0dXJuIEVGSV9OT1RfRk9VTkQ7CisgIH0KKyAgaWYgKCF1ZWZpX2F2Yl91dGY4X3RvX3VjczIoKGNvbnN0IHVpbnQ4X3QqKXBhcnRpdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fbmFtZV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX25hbWVfdWNzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX25hbWVfdWNzMl9jYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKKyAgICBhdmJfZXJyb3IoIkNvdWxkIG5vdCBjb252ZXJ0IHBhcnRpdGlvbiBuYW1lIHRvIFVDUy0yXG4iKTsKKyAgICBhdmJfZnJlZShncHRfaGVhZGVyKTsKKyAgICBhdmJfZnJlZShwYXJ0aXRpb25fbmFtZV91Y3MyKTsKKyAgICBhdmJfZnJlZSgqZW50cnlfYnVmKTsKKyAgICAqZW50cnlfYnVmID0gTlVMTDsKKyAgICByZXR1cm4gRUZJX05PVF9GT1VORDsKKyAgfQorICBwYXJ0aXRpb25fbmFtZV91Y3MyX2xlbiA9IFN0ckxlbihwYXJ0aXRpb25fbmFtZV91Y3MyKTsKKworICAvKiBCbG9jay1hbGlnbmVkIGJ5dGVzIGZvciBlbnRyaWVzLiAqLworICBVSU5UTiBlbnRyaWVzX251bV9ieXRlcyA9CisgICAgICBibG9ja19pby0+TWVkaWEtPkJsb2NrU2l6ZSAqIChNQVhfR1BUX0VOVFJJRVMgLyBFTlRSSUVTX1BFUl9CTE9DSyk7CisKKyAgZXJyID0gdWVmaV9jYWxsX3dyYXBwZXIoYmxvY2tfaW8tPlJlYWRCbG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTV9BUkdTX1JFQURfQkxPQ0tTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19pbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaW8tPk1lZGlhLT5NZWRpYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHUFRfRU5UUklFU19MQkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXNfbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxsX2dwdF9lbnRyaWVzKTsKKyAgaWYgKEVGSV9FUlJPUihlcnIpKSB7CisgICAgYXZiX2Vycm9yKCJDb3VsZCBub3QgUmVhZEJsb2NrcyBmb3IgR1BUIGhlYWRlclxuIik7CisgICAgYXZiX2ZyZWUoZ3B0X2hlYWRlcik7CisgICAgYXZiX2ZyZWUocGFydGl0aW9uX25hbWVfdWNzMik7CisgICAgYXZiX2ZyZWUoKmVudHJ5X2J1Zik7CisgICAgKmVudHJ5X2J1ZiA9IE5VTEw7CisgICAgcmV0dXJuIEVGSV9OT1RfRk9VTkQ7CisgIH0KKworICAvKiBGaW5kIG1hdGNoaW5nIHBhcnRpdGlvbiBuYW1lLiAqLworICBmb3IgKGludCBuID0gMDsgbiA8IGdwdF9oZWFkZXItPmVudHJ5X2NvdW50OyBuKyspIHsKKyAgICBpZiAoKHBhcnRpdGlvbl9uYW1lX3VjczJfbGVuID09IFN0ckxlbihhbGxfZ3B0X2VudHJpZXNbbl0ubmFtZSkpICYmCisgICAgICAgIGF2Yl9tZW1jbXAoYWxsX2dwdF9lbnRyaWVzW25dLm5hbWUsCisgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX25hbWVfdWNzMiwKKyAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fbmFtZV91Y3MyX2xlbiAqIDIpID09IDApIHsKKyAgICAgIGF2Yl9tZW1jcHkoKCplbnRyeV9idWYpLCAmYWxsX2dwdF9lbnRyaWVzW25dLCBzaXplb2YoR1BURW50cnkpKTsKKyAgICAgIGF2Yl9mcmVlKHBhcnRpdGlvbl9uYW1lX3VjczIpOworICAgICAgYXZiX2ZyZWUoZ3B0X2hlYWRlcik7CisgICAgICByZXR1cm4gRUZJX1NVQ0NFU1M7CisgICAgfQorICB9CisKKyAgYXZiX2ZyZWUocGFydGl0aW9uX25hbWVfdWNzMik7CisgIGF2Yl9mcmVlKGdwdF9oZWFkZXIpOworICBhdmJfZnJlZSgqZW50cnlfYnVmKTsKKyAgKmVudHJ5X2J1ZiA9IE5VTEw7CisgIHJldHVybiBFRklfTk9UX0ZPVU5EOworfQorCitzdGF0aWMgQXZiSU9SZXN1bHQgcmVhZF9mcm9tX3BhcnRpdGlvbihBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcnRpdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXRfZnJvbV9wYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBvdXRfbnVtX3JlYWQpIHsKKyAgRUZJX1NUQVRVUyBlcnI7CisgIEdQVEVudHJ5KiBwYXJ0aXRpb25fZW50cnk7CisgIHVpbnQ2NF90IHBhcnRpdGlvbl9zaXplOworICBVRUZJQXZiT3BzRGF0YSogZGF0YSA9IChVRUZJQXZiT3BzRGF0YSopb3BzLT51c2VyX2RhdGE7CisKKyAgYXZiX2Fzc2VydChwYXJ0aXRpb25fbmFtZSAhPSBOVUxMKTsKKyAgYXZiX2Fzc2VydChidWYgIT0gTlVMTCk7CisgIGF2Yl9hc3NlcnQob3V0X251bV9yZWFkICE9IE5VTEwpOworCisgIGVyciA9IGZpbmRfcGFydGl0aW9uX2VudHJ5X2J5X25hbWUoCisgICAgICBkYXRhLT5ibG9ja19pbywgcGFydGl0aW9uX25hbWUsICZwYXJ0aXRpb25fZW50cnkpOworICBpZiAoRUZJX0VSUk9SKGVycikpIHsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9OT19TVUNIX1BBUlRJVElPTjsKKyAgfQorCisgIHBhcnRpdGlvbl9zaXplID0gKHBhcnRpdGlvbl9lbnRyeS0+bGFzdF9sYmEgLSBwYXJ0aXRpb25fZW50cnktPmZpcnN0X2xiYSkgKgorICAgICAgICAgICAgICAgICAgIGRhdGEtPmJsb2NrX2lvLT5NZWRpYS0+QmxvY2tTaXplOworCisgIGlmIChvZmZzZXRfZnJvbV9wYXJ0aXRpb24gPCAwKSB7CisgICAgaWYgKCgtb2Zmc2V0X2Zyb21fcGFydGl0aW9uKSA+IHBhcnRpdGlvbl9zaXplKSB7CisgICAgICBhdmJfZXJyb3IoIk9mZnNldCBvdXRzaWRlIHJhbmdlLlxuIik7CisgICAgICBhdmJfZnJlZShwYXJ0aXRpb25fZW50cnkpOworICAgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfUkFOR0VfT1VUU0lERV9QQVJUSVRJT047CisgICAgfQorICAgIG9mZnNldF9mcm9tX3BhcnRpdGlvbiA9IHBhcnRpdGlvbl9zaXplIC0gKC1vZmZzZXRfZnJvbV9wYXJ0aXRpb24pOworICB9CisKKyAgLyogQ2hlY2sgaWYgbnVtX2J5dGVzIGdvZXMgYmV5b25kIHBhcnRpdGlvbiBlbmQuIElmIHNvLCBkb24ndCByZWFkIGJleW9uZAorICAgKiB0aGlzIGJvdW5kYXJ5IC0tIGRvIGEgcGFydGlhbCBJL08gaW5zdGVhZC4KKyAgICovCisgIGlmIChudW1fYnl0ZXMgPiBwYXJ0aXRpb25fc2l6ZSAtIG9mZnNldF9mcm9tX3BhcnRpdGlvbikKKyAgICAqb3V0X251bV9yZWFkID0gcGFydGl0aW9uX3NpemUgLSBvZmZzZXRfZnJvbV9wYXJ0aXRpb247CisgIGVsc2UKKyAgICAqb3V0X251bV9yZWFkID0gbnVtX2J5dGVzOworCisgIGVyciA9IHVlZmlfY2FsbF93cmFwcGVyKAorICAgICAgZGF0YS0+ZGlza19pby0+UmVhZERpc2ssCisgICAgICA1LAorICAgICAgZGF0YS0+ZGlza19pbywKKyAgICAgIGRhdGEtPmJsb2NrX2lvLT5NZWRpYS0+TWVkaWFJZCwKKyAgICAgIChwYXJ0aXRpb25fZW50cnktPmZpcnN0X2xiYSAqIGRhdGEtPmJsb2NrX2lvLT5NZWRpYS0+QmxvY2tTaXplKSArCisgICAgICAgICAgb2Zmc2V0X2Zyb21fcGFydGl0aW9uLAorICAgICAgKm91dF9udW1fcmVhZCwKKyAgICAgIGJ1Zik7CisgIGlmIChFRklfRVJST1IoZXJyKSkgeworICAgIGF2Yl9lcnJvcigiQ291bGQgbm90IHJlYWQgZnJvbSBEaXNrLlxuIik7CisgICAgKm91dF9udW1fcmVhZCA9IDA7CisgICAgYXZiX2ZyZWUocGFydGl0aW9uX2VudHJ5KTsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9JTzsKKyAgfQorCisgIGF2Yl9mcmVlKHBhcnRpdGlvbl9lbnRyeSk7CisgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworfQorCitzdGF0aWMgQXZiSU9SZXN1bHQgd3JpdGVfdG9fcGFydGl0aW9uKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXRfZnJvbV9wYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZikgeworICBFRklfU1RBVFVTIGVycjsKKyAgR1BURW50cnkqIHBhcnRpdGlvbl9lbnRyeTsKKyAgdWludDY0X3QgcGFydGl0aW9uX3NpemU7CisgIFVFRklBdmJPcHNEYXRhKiBkYXRhID0gKFVFRklBdmJPcHNEYXRhKilvcHMtPnVzZXJfZGF0YTsKKworICBhdmJfYXNzZXJ0KHBhcnRpdGlvbl9uYW1lICE9IE5VTEwpOworICBhdmJfYXNzZXJ0KGJ1ZiAhPSBOVUxMKTsKKworICBlcnIgPSBmaW5kX3BhcnRpdGlvbl9lbnRyeV9ieV9uYW1lKAorICAgICAgZGF0YS0+YmxvY2tfaW8sIHBhcnRpdGlvbl9uYW1lLCAmcGFydGl0aW9uX2VudHJ5KTsKKyAgaWYgKEVGSV9FUlJPUihlcnIpKSB7CisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfTk9fU1VDSF9QQVJUSVRJT047CisgIH0KKworICBwYXJ0aXRpb25fc2l6ZSA9IChwYXJ0aXRpb25fZW50cnktPmxhc3RfbGJhIC0gcGFydGl0aW9uX2VudHJ5LT5maXJzdF9sYmEpICoKKyAgICAgICAgICAgICAgICAgICBkYXRhLT5ibG9ja19pby0+TWVkaWEtPkJsb2NrU2l6ZTsKKworICBpZiAob2Zmc2V0X2Zyb21fcGFydGl0aW9uIDwgMCkgeworICAgIGlmICgoLW9mZnNldF9mcm9tX3BhcnRpdGlvbikgPiBwYXJ0aXRpb25fc2l6ZSkgeworICAgICAgYXZiX2Vycm9yKCJPZmZzZXQgb3V0c2lkZSByYW5nZS5cbiIpOworICAgICAgYXZiX2ZyZWUocGFydGl0aW9uX2VudHJ5KTsKKyAgICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX0VSUk9SX1JBTkdFX09VVFNJREVfUEFSVElUSU9OOworICAgIH0KKyAgICBvZmZzZXRfZnJvbV9wYXJ0aXRpb24gPSBwYXJ0aXRpb25fc2l6ZSAtICgtb2Zmc2V0X2Zyb21fcGFydGl0aW9uKTsKKyAgfQorCisgIC8qIENoZWNrIGlmIG51bV9ieXRlcyBnb2VzIGJleW9uZCBwYXJ0aXRpb24gZW5kLiBJZiBzbywgZXJyb3Igb3V0IC0tIG5vCisgICAqIHBhcnRpYWwgSS9PLgorICAgKi8KKyAgaWYgKG51bV9ieXRlcyA+IHBhcnRpdGlvbl9zaXplIC0gb2Zmc2V0X2Zyb21fcGFydGl0aW9uKSB7CisgICAgYXZiX2Vycm9yKCJDYW5ub3Qgd3JpdGUgYmV5b25kIHBhcnRpdGlvbiBib3VuZGFyeS5cbiIpOworICAgIGF2Yl9mcmVlKHBhcnRpdGlvbl9lbnRyeSk7CisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfUkFOR0VfT1VUU0lERV9QQVJUSVRJT047CisgIH0KKworICBlcnIgPSB1ZWZpX2NhbGxfd3JhcHBlcigKKyAgICAgIGRhdGEtPmRpc2tfaW8tPldyaXRlRGlzaywKKyAgICAgIDUsCisgICAgICBkYXRhLT5kaXNrX2lvLAorICAgICAgZGF0YS0+YmxvY2tfaW8tPk1lZGlhLT5NZWRpYUlkLAorICAgICAgKHBhcnRpdGlvbl9lbnRyeS0+Zmlyc3RfbGJhICogZGF0YS0+YmxvY2tfaW8tPk1lZGlhLT5CbG9ja1NpemUpICsKKyAgICAgICAgICBvZmZzZXRfZnJvbV9wYXJ0aXRpb24sCisgICAgICBudW1fYnl0ZXMsCisgICAgICBidWYpOworCisgIGlmIChFRklfRVJST1IoZXJyKSkgeworICAgIGF2Yl9lcnJvcigiQ291bGQgbm90IHdyaXRlIHRvIERpc2suXG4iKTsKKyAgICBhdmJfZnJlZShwYXJ0aXRpb25fZW50cnkpOworICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX0VSUk9SX0lPOworICB9CisKKyAgYXZiX2ZyZWUocGFydGl0aW9uX2VudHJ5KTsKKyAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7Cit9CisKKy8qIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBwYXJlbnQgcGF0aCB0byB0aGUgY3VycmVudCB8d2Fsa2VyfCBwYXRoCisgKiBnaXZlbiB0aGUgaW5pdGlhbCBwYXRoLCB8aW5pdHwuIFJlc3VsdGluZyBwYXRoIGlzIHN0b3JlZCBpbiB8bmV4dHwuCisgKiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgfG5leHR8LiBTdG9yZXMgYWxsb2NhdGVkIGJ5dGVzCisgKiBmb3IgfG5leHR8IGluIHxvdXRfYnl0ZXN8LiBSZXR1cm5zIEVGSV9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBFRklfU1RBVFVTIHdhbGtfcGF0aChJTiBFRklfREVWSUNFX1BBVEgqIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU4gRUZJX0RFVklDRV9QQVRIKiB3YWxrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUIEVGSV9ERVZJQ0VfUEFUSCoqIG5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUIFVJTlROKiBvdXRfYnl0ZXMpIHsKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIGZyb20gaW5pdGlhbCBwYXRoIHRvIGN1cnJlbnQgd2Fsa2VyLiAqLworICBVSU5UTiB3YWxrZXJfYnl0ZXMgPSAodWludDhfdCopTmV4dERldmljZVBhdGhOb2RlKHdhbGtlcikgLSAodWludDhfdCopaW5pdDsKKyAgKm91dF9ieXRlcyA9IHNpemVvZihFRklfREVWSUNFX1BBVEgpICsgd2Fsa2VyX2J5dGVzOworCisgICpuZXh0ID0gKEVGSV9ERVZJQ0VfUEFUSCopYXZiX21hbGxvYygqb3V0X2J5dGVzKTsKKyAgaWYgKCpuZXh0ID09IE5VTEwpIHsKKyAgICAqb3V0X2J5dGVzID0gMDsKKyAgICByZXR1cm4gRUZJX05PVF9GT1VORDsKKyAgfQorCisgIC8qIENvcHkgaW4gdGhlIHByZXZpb3VzIHBhdGhzLiAqLworICBhdmJfbWVtY3B5KCgqbmV4dCksIGluaXQsIHdhbGtlcl9ieXRlcyk7CisgIC8qIENvcHkgaW4gdGhlIG5ldyBlbmRpbmcgb2YgdGhlIHBhdGguICovCisgIGF2Yl9tZW1jcHkoCisgICAgICAodWludDhfdCopKCpuZXh0KSArIHdhbGtlcl9ieXRlcywgRW5kRGV2aWNlUGF0aCwgc2l6ZW9mKEVGSV9ERVZJQ0VfUEFUSCkpOworICByZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisKKy8qIEhlbHBlciBtZXRob2QgdG8gdmFsaWRhdGUgYSBHUFQgaGVhZGVyLCB8Z3B0aHwuCisgKgorICogQHJldHVybiBFRklfU1RBVFVTIEVGSV9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBFRklfU1RBVFVTIHZhbGlkYXRlX2dwdChjb25zdCBJTiBHUFRIZWFkZXIqIGdwdGgpIHsKKyAgaWYgKGF2Yl9tZW1jbXAoZ3B0aC0+c2lnbmF0dXJlLCBHUFRfTUFHSUMsIHNpemVvZihncHRoLT5zaWduYXR1cmUpKSAhPSAwKSB7CisgICAgYXZiX2Vycm9yKCJHUFQgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoLlxuIik7CisgICAgcmV0dXJuIEVGSV9OT1RfRk9VTkQ7CisgIH0KKyAgLyogTWFrZSBzdXJlIEdQVCBoZWFkZXIgYnl0ZXMgYXJlIHdpdGhpbiBtaW5pbXVuIGFuZCBibG9jayBzaXplLiAqLworICBpZiAoZ3B0aC0+aGVhZGVyX3NpemUgPCBHUFRfTUlOX1NJWkUpIHsKKyAgICBhdmJfZXJyb3IoIkdQVCBoZWFkZXIgdG9vIHNtYWxsLlxuIik7CisgICAgcmV0dXJuIEVGSV9OT1RfRk9VTkQ7CisgIH0KKyAgaWYgKGdwdGgtPmhlYWRlcl9zaXplID4gQVZCX0JMT0NLX1NJWkUpIHsKKyAgICBhdmJfZXJyb3IoIkdQVCBoZWFkZXIgdG9vIGJpZy5cbiIpOworICAgIHJldHVybiBFRklfTk9UX0ZPVU5EOworICB9CisKKyAgR1BUSGVhZGVyIGdwdGhfdG1wID0ge3swfX07CisgIGF2Yl9tZW1jcHkoJmdwdGhfdG1wLCBncHRoLCBzaXplb2YoR1BUSGVhZGVyKSk7CisgIHVpbnQzMl90IGdwdF9oZWFkZXJfY3JjID0gZ3B0aF90bXAuaGVhZGVyX2NyYzMyOworICBncHRoX3RtcC5oZWFkZXJfY3JjMzIgPSAwOworICB1aW50MzJfdCBncHRfaGVhZGVyX2NyY19jYWxjID0KKyAgICAgIENhbGN1bGF0ZUNyYygodWludDhfdCopJmdwdGhfdG1wLCBncHRoX3RtcC5oZWFkZXJfc2l6ZSk7CisKKyAgaWYgKGdwdF9oZWFkZXJfY3JjICE9IGdwdF9oZWFkZXJfY3JjX2NhbGMpIHsKKyAgICBhdmJfZXJyb3IoIkdQVCBoZWFkZXIgY3JjIGludmFsaWQuXG4iKTsKKyAgICByZXR1cm4gRUZJX05PVF9GT1VORDsKKyAgfQorCisgIGlmIChncHRoLT5yZXZpc2lvbiAhPSBHUFRfUkVWSVNJT04pIHsKKyAgICBhdmJfZXJyb3IoIkdQVCBoZWFkZXIgd3JvbmcgcmV2aXNpb24uXG4iKTsKKyAgICByZXR1cm4gRUZJX05PVF9GT1VORDsKKyAgfQorCisgIHJldHVybiBFRklfU1VDQ0VTUzsKK30KKworLyogUXVlcmllcyB8ZGlza19oYW5kbGV8IGZvciBhIHxibG9ja19pb3wgZGV2aWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZworICogcGF0aCwgfGJsb2NrX3BhdGh8LiAgVGhlIHxibG9ja19pb3wgZGV2aWNlIGlzIGZvdW5kIGJ5IGl0ZXJhdGl2ZWx5CisgKiBxdWVyeWluZyBwYXJlbnQgZGV2aWNlcyBhbmQgY2hlY2tpbmcgZm9yIGEgR1BUIEhlYWRlci4gIFRoaXMKKyAqIGVuc3VyZXMgdGhlIHJlc3VsdGluZyB8YmxvY2tfaW98IGRldmljZSBpcyB0aGUgdG9wIGxldmVsIGJsb2NrCisgKiBkZXZpY2UgaGF2aW5nIGFjY2VzcyB0byBwYXJ0aXRpb24gZW50cmllcy4gUmV0dXJucyBFRklfU1RBVFVTCisgKiBFRklfTk9UX0ZPVU5EIG9uIGZhaWx1cmUsIEVGSV9TVUNDRVNTIG90aGVyd2lzZS4KKyAqLworc3RhdGljIEVGSV9TVEFUVVMgZ2V0X2Rpc2tfYmxvY2tfaW8oSU4gRUZJX0hBTkRMRSogYmxvY2tfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUIEVGSV9CTE9DS19JTyoqIGJsb2NrX2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUIEVGSV9ESVNLX0lPKiogZGlza19pbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVCBFRklfREVWSUNFX1BBVEgqKiBpb19wYXRoKSB7CisgIEVGSV9TVEFUVVMgZXJyOworICBFRklfSEFORExFIGRpc2tfaGFuZGxlOworICBVSU5UTiBwYXRoX2J5dGVzOworICBFRklfREVWSUNFX1BBVEgqIGRpc2tfcGF0aDsKKyAgRUZJX0RFVklDRV9QQVRIKiB3YWxrZXJfcGF0aDsKKyAgRUZJX0RFVklDRV9QQVRIKiBpbml0X3BhdGg7CisgIEdQVEhlYWRlciBncHRfaGVhZGVyID0ge3swfX07CisgIGluaXRfcGF0aCA9IERldmljZVBhdGhGcm9tSGFuZGxlKGJsb2NrX2hhbmRsZSk7CisKKyAgaWYgKCFpbml0X3BhdGgpIHsKKyAgICByZXR1cm4gRUZJX05PVF9GT1VORDsKKyAgfQorCisgIHdhbGtlcl9wYXRoID0gaW5pdF9wYXRoOworICB3aGlsZSAoIUlzRGV2aWNlUGF0aEVuZCh3YWxrZXJfcGF0aCkpIHsKKyAgICB3YWxrZXJfcGF0aCA9IE5leHREZXZpY2VQYXRoTm9kZSh3YWxrZXJfcGF0aCk7CisKKyAgICBlcnIgPSB3YWxrX3BhdGgoaW5pdF9wYXRoLCB3YWxrZXJfcGF0aCwgJigqaW9fcGF0aCksICZwYXRoX2J5dGVzKTsKKyAgICBpZiAoRUZJX0VSUk9SKGVycikpIHsKKyAgICAgIGF2Yl9lcnJvcigiQ2Fubm90IHdhbGsgZGV2aWNlIHBhdGguXG4iKTsKKyAgICAgIHJldHVybiBFRklfTk9UX0ZPVU5EOworICAgIH0KKworICAgIGRpc2tfcGF0aCA9IChFRklfREVWSUNFX1BBVEgqKWF2Yl9tYWxsb2MocGF0aF9ieXRlcyk7CisgICAgYXZiX21lbWNweShkaXNrX3BhdGgsICppb19wYXRoLCBwYXRoX2J5dGVzKTsKKyAgICBlcnIgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+TG9jYXRlRGV2aWNlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fQVJHU19MT0NBVEVfREVWSUNFX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJsb2NrSW9Qcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKCppb19wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2tfaGFuZGxlKTsKKyAgICBpZiAoRUZJX0VSUk9SKGVycikpIHsKKyAgICAgIGF2Yl9mcmVlKCppb19wYXRoKTsKKyAgICAgIGF2Yl9mcmVlKGRpc2tfcGF0aCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZXJyID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkxvY2F0ZURldmljZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVNX0FSR1NfTE9DQVRFX0RFVklDRV9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEaXNrSW9Qcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlza19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNrX2hhbmRsZSk7CisgICAgaWYgKEVGSV9FUlJPUihlcnIpKSB7CisgICAgICBhdmJfZXJyb3IoIkxvY2F0ZURldmljZVBhdGgsIERJU0tfSU9fUFJPVE9DT0wuXG4iKTsKKyAgICAgIGF2Yl9mcmVlKCppb19wYXRoKTsKKyAgICAgIGF2Yl9mcmVlKGRpc2tfcGF0aCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgQmxvY2sgYW5kIERpc2sgSS9PLiBBdHRlbXB0IHRvIGdldCBoYW5kbGUgb24gZGV2aWNlLAorICAgICAqIG11c3QgYmUgQmxvY2svRGlzayBJbyB0eXBlLgorICAgICAqLworICAgIGVyciA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5IYW5kbGVQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fQVJHU19IQU5ETEVfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCbG9ja0lvUHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZPSUQqKikmKCpibG9ja19pbykpOworICAgIGlmIChFRklfRVJST1IoZXJyKSkgeworICAgICAgYXZiX2Vycm9yKCJDYW5ub3QgZ2V0IGhhbmRsZSBvbiBibG9jayBkZXZpY2UuXG4iKTsKKyAgICAgIGF2Yl9mcmVlKCppb19wYXRoKTsKKyAgICAgIGF2Yl9mcmVlKGRpc2tfcGF0aCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZXJyID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkhhbmRsZVByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTV9BUkdTX0hBTkRMRV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNrX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRGlza0lvUHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZPSUQqKikmKCpkaXNrX2lvKSk7CisgICAgaWYgKEVGSV9FUlJPUihlcnIpKSB7CisgICAgICBhdmJfZXJyb3IoIkNhbm5vdCBnZXQgaGFuZGxlIG9uIGRpc2sgZGV2aWNlLlxuIik7CisgICAgICBhdmJfZnJlZSgqaW9fcGF0aCk7CisgICAgICBhdmJfZnJlZShkaXNrX3BhdGgpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCgqYmxvY2tfaW8pLT5NZWRpYS0+TG9naWNhbFBhcnRpdGlvbiB8fAorICAgICAgICAhKCpibG9ja19pbyktPk1lZGlhLT5NZWRpYVByZXNlbnQpIHsKKyAgICAgIGF2Yl9lcnJvcigiTG9naWNhbCBwYXJ0aW9uIG9yIE5vIE1lZGlhIFByZXNlbnQsIGNvbnRpbnVlLi4uXG4iKTsKKyAgICAgIGF2Yl9mcmVlKCppb19wYXRoKTsKKyAgICAgIGF2Yl9mcmVlKGRpc2tfcGF0aCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBlcnIgPSB1ZWZpX2NhbGxfd3JhcHBlcigoKmJsb2NrX2lvKS0+UmVhZEJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fQVJHU19SRUFEX0JMT0NLUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmJsb2NrX2lvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmJsb2NrX2lvKS0+TWVkaWEtPk1lZGlhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR1BUSGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3B0X2hlYWRlcik7CisKKyAgICBpZiAoRUZJX0VSUk9SKGVycikpIHsKKyAgICAgIGF2Yl9lcnJvcigiUmVhZEJsb2NrcywgQmxvY2sgTWVkaWEgZXJyb3IuXG4iKTsKKyAgICAgIGF2Yl9mcmVlKCppb19wYXRoKTsKKyAgICAgIGF2Yl9mcmVlKGRpc2tfcGF0aCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBlcnIgPSB2YWxpZGF0ZV9ncHQoJmdwdF9oZWFkZXIpOworICAgIGlmIChFRklfRVJST1IoZXJyKSkgeworICAgICAgYXZiX2Vycm9yKCJJbnZhbGlkIEdQVEhlYWRlclxuIik7CisgICAgICBhdmJfZnJlZSgqaW9fcGF0aCk7CisgICAgICBhdmJfZnJlZShkaXNrX3BhdGgpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgcmV0dXJuIEVGSV9TVUNDRVNTOworICB9CisKKyAgKCpibG9ja19pbykgPSBOVUxMOworICByZXR1cm4gRUZJX05PVF9GT1VORDsKK30KKworc3RhdGljIEF2YklPUmVzdWx0IHZhbGlkYXRlX3ZibWV0YV9wdWJsaWNfa2V5KAorICAgIEF2Yk9wcyogb3BzLAorICAgIGNvbnN0IHVpbnQ4X3QqIHB1YmxpY19rZXlfZGF0YSwKKyAgICBzaXplX3QgcHVibGljX2tleV9sZW5ndGgsCisgICAgY29uc3QgdWludDhfdCogcHVibGljX2tleV9tZXRhZGF0YSwKKyAgICBzaXplX3QgcHVibGljX2tleV9tZXRhZGF0YV9sZW5ndGgsCisgICAgYm9vbCogb3V0X2tleV9pc190cnVzdGVkKSB7CisgIC8qIEZvciBub3cgd2UganVzdCBhbGxvdyBhbnkga2V5LiAqLworICBpZiAob3V0X2tleV9pc190cnVzdGVkICE9IE5VTEwpIHsKKyAgICAqb3V0X2tleV9pc190cnVzdGVkID0gdHJ1ZTsKKyAgfQorICBhdmJfZGVidWcoIlRPRE86IGltcGxlbWVudCB2YWxpZGF0ZV92Ym1ldGFfcHVibGljX2tleSgpLlxuIik7CisgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworfQorCitzdGF0aWMgQXZiSU9SZXN1bHQgcmVhZF9yb2xsYmFja19pbmRleChBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByb2xsYmFja19pbmRleF9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIG91dF9yb2xsYmFja19pbmRleCkgeworICAvKiBGb3Igbm93IHdlIGFsd2F5cyByZXR1cm4gMCBhcyB0aGUgc3RvcmVkIHJvbGxiYWNrIGluZGV4LiAqLworICBhdmJfZGVidWcoIlRPRE86IGltcGxlbWVudCByZWFkX3JvbGxiYWNrX2luZGV4KCkuXG4iKTsKKyAgaWYgKG91dF9yb2xsYmFja19pbmRleCAhPSBOVUxMKSB7CisgICAgKm91dF9yb2xsYmFja19pbmRleCA9IDA7CisgIH0KKyAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7Cit9CisKK3N0YXRpYyBBdmJJT1Jlc3VsdCB3cml0ZV9yb2xsYmFja19pbmRleChBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm9sbGJhY2tfaW5kZXhfc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCByb2xsYmFja19pbmRleCkgeworICAvKiBGb3Igbm93IHRoaXMgaXMgYSBuby1vcC4gKi8KKyAgYXZiX2RlYnVnKCJUT0RPOiBpbXBsZW1lbnQgd3JpdGVfcm9sbGJhY2tfaW5kZXgoKS5cbiIpOworICByZXR1cm4gQVZCX0lPX1JFU1VMVF9PSzsKK30KKworc3RhdGljIEF2YklPUmVzdWx0IHJlYWRfaXNfZGV2aWNlX3VubG9ja2VkKEF2Yk9wcyogb3BzLCBib29sKiBvdXRfaXNfdW5sb2NrZWQpIHsKKyAgLyogRm9yIG5vdyB3ZSBhbHdheXMgcmV0dXJuIHRoYXQgdGhlIGRldmljZSBpcyB1bmxvY2tlZC4gKi8KKyAgYXZiX2RlYnVnKCJUT0RPOiBpbXBsZW1lbnQgcmVhZF9pc19kZXZpY2VfdW5sb2NrZWQoKS5cbiIpOworICAqb3V0X2lzX3VubG9ja2VkID0gdHJ1ZTsKKyAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9oZXgoY2hhciogYnVmLCB1aW50OF90IHZhbHVlKSB7CisgIGNoYXIgaGV4X2RpZ2l0c1sxN10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgIGJ1ZlswXSA9IGhleF9kaWdpdHNbdmFsdWUgPj4gNF07CisgIGJ1ZlsxXSA9IGhleF9kaWdpdHNbdmFsdWUgJiAweDBmXTsKK30KKworc3RhdGljIEF2YklPUmVzdWx0IGdldF91bmlxdWVfZ3VpZF9mb3JfcGFydGl0aW9uKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBndWlkX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZ3VpZF9idWZfc2l6ZSkgeworICBFRklfU1RBVFVTIGVycjsKKyAgR1BURW50cnkqIHBhcnRpdGlvbl9lbnRyeTsKKyAgVUVGSUF2Yk9wc0RhdGEqIGRhdGEgPSAoVUVGSUF2Yk9wc0RhdGEqKW9wcy0+dXNlcl9kYXRhOworCisgIGF2Yl9hc3NlcnQocGFydGl0aW9uICE9IE5VTEwpOworICBhdmJfYXNzZXJ0KGd1aWRfYnVmICE9IE5VTEwpOworCisgIGVyciA9CisgICAgICBmaW5kX3BhcnRpdGlvbl9lbnRyeV9ieV9uYW1lKGRhdGEtPmJsb2NrX2lvLCBwYXJ0aXRpb24sICZwYXJ0aXRpb25fZW50cnkpOworICBpZiAoRUZJX0VSUk9SKGVycikpIHsKKyAgICBhdmJfZXJyb3IoIkVycm9yIGdldHRpbmcgdW5pcXVlIEdVSUQgZm9yIHBhcnRpdGlvbi5cbiIpOworICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX0VSUk9SX0lPOworICB9CisKKyAgaWYgKGd1aWRfYnVmX3NpemUgPCAzNykgeworICAgIGF2Yl9lcnJvcigiR1VJRCBidWZmZXIgc2l6ZSB0b28gc21hbGwuXG4iKTsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9JTzsKKyAgfQorCisgIC8qIFRoZSBHVUlEIGVuY29kaW5nIGlzIHNvbWV3aGF0IHBlY3VsaWFyIGluIHRlcm1zIG9mIGJ5dGUgb3JkZXIuIEl0CisgICAqIGlzIHdoYXQgaXQgaXMuCisgICAqLworICBzZXRfaGV4KGd1aWRfYnVmICsgMCwgcGFydGl0aW9uX2VudHJ5LT51bmlxdWVfR1VJRFszXSk7CisgIHNldF9oZXgoZ3VpZF9idWYgKyAyLCBwYXJ0aXRpb25fZW50cnktPnVuaXF1ZV9HVUlEWzJdKTsKKyAgc2V0X2hleChndWlkX2J1ZiArIDQsIHBhcnRpdGlvbl9lbnRyeS0+dW5pcXVlX0dVSURbMV0pOworICBzZXRfaGV4KGd1aWRfYnVmICsgNiwgcGFydGl0aW9uX2VudHJ5LT51bmlxdWVfR1VJRFswXSk7CisgIGd1aWRfYnVmWzhdID0gJy0nOworICBzZXRfaGV4KGd1aWRfYnVmICsgOSwgcGFydGl0aW9uX2VudHJ5LT51bmlxdWVfR1VJRFs1XSk7CisgIHNldF9oZXgoZ3VpZF9idWYgKyAxMSwgcGFydGl0aW9uX2VudHJ5LT51bmlxdWVfR1VJRFs0XSk7CisgIGd1aWRfYnVmWzEzXSA9ICctJzsKKyAgc2V0X2hleChndWlkX2J1ZiArIDE0LCBwYXJ0aXRpb25fZW50cnktPnVuaXF1ZV9HVUlEWzddKTsKKyAgc2V0X2hleChndWlkX2J1ZiArIDE2LCBwYXJ0aXRpb25fZW50cnktPnVuaXF1ZV9HVUlEWzZdKTsKKyAgZ3VpZF9idWZbMThdID0gJy0nOworICBzZXRfaGV4KGd1aWRfYnVmICsgMTksIHBhcnRpdGlvbl9lbnRyeS0+dW5pcXVlX0dVSURbOF0pOworICBzZXRfaGV4KGd1aWRfYnVmICsgMjEsIHBhcnRpdGlvbl9lbnRyeS0+dW5pcXVlX0dVSURbOV0pOworICBndWlkX2J1ZlsyM10gPSAnLSc7CisgIHNldF9oZXgoZ3VpZF9idWYgKyAyNCwgcGFydGl0aW9uX2VudHJ5LT51bmlxdWVfR1VJRFsxMF0pOworICBzZXRfaGV4KGd1aWRfYnVmICsgMjYsIHBhcnRpdGlvbl9lbnRyeS0+dW5pcXVlX0dVSURbMTFdKTsKKyAgc2V0X2hleChndWlkX2J1ZiArIDI4LCBwYXJ0aXRpb25fZW50cnktPnVuaXF1ZV9HVUlEWzEyXSk7CisgIHNldF9oZXgoZ3VpZF9idWYgKyAzMCwgcGFydGl0aW9uX2VudHJ5LT51bmlxdWVfR1VJRFsxM10pOworICBzZXRfaGV4KGd1aWRfYnVmICsgMzIsIHBhcnRpdGlvbl9lbnRyeS0+dW5pcXVlX0dVSURbMTRdKTsKKyAgc2V0X2hleChndWlkX2J1ZiArIDM0LCBwYXJ0aXRpb25fZW50cnktPnVuaXF1ZV9HVUlEWzE1XSk7CisgIGd1aWRfYnVmWzM2XSA9ICdcMCc7CisgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworfQorCitBdmJPcHMqIHVlZmlfYXZiX29wc19uZXcoRUZJX0hBTkRMRSBhcHBfaW1hZ2UpIHsKKyAgVUVGSUF2Yk9wc0RhdGEqIGRhdGE7CisgIEVGSV9TVEFUVVMgZXJyOworICBFRklfTE9BREVEX0lNQUdFKiBsb2FkZWRfYXBwX2ltYWdlID0gTlVMTDsKKyAgRUZJX0dVSUQgbG9hZGVkX2ltYWdlX3Byb3RvY29sID0gTE9BREVEX0lNQUdFX1BST1RPQ09MOworCisgIGRhdGEgPSBhdmJfY2FsbG9jKHNpemVvZihVRUZJQXZiT3BzRGF0YSkpOworICBkYXRhLT5vcHMudXNlcl9kYXRhID0gZGF0YTsKKworICBkYXRhLT5lZmlfaW1hZ2VfaGFuZGxlID0gYXBwX2ltYWdlOworICBlcnIgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+SGFuZGxlUHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTV9BUkdTX0hBTkRMRV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9hZGVkX2ltYWdlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoVk9JRCoqKSZsb2FkZWRfYXBwX2ltYWdlKTsKKyAgaWYgKEVGSV9FUlJPUihlcnIpKSB7CisgICAgYXZiX2Vycm9yKCJIYW5kbGVQcm90b2NvbCwgTE9BREVEX0lNQUdFX1BST1RPQ09MLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBHZXQgcGFyZW50IGRldmljZSBkaXNrIGFuZCBibG9jayBJL08uICovCisgIGVyciA9IGdldF9kaXNrX2Jsb2NrX2lvKGxvYWRlZF9hcHBfaW1hZ2UtPkRldmljZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPmJsb2NrX2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+ZGlza19pbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPnBhdGgpOworICBpZiAoRUZJX0VSUk9SKGVycikpIHsKKyAgICBhdmJfZXJyb3IoIkNvdWxkIG5vdCBhY3F1aXJlIGJsb2NrIG9yIGRpc2sgZGV2aWNlIGhhbmRsZS5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgZGF0YS0+b3BzLmFiX29wcyA9ICZkYXRhLT5hYl9vcHM7CisgIGRhdGEtPm9wcy5yZWFkX2Zyb21fcGFydGl0aW9uID0gcmVhZF9mcm9tX3BhcnRpdGlvbjsKKyAgZGF0YS0+b3BzLndyaXRlX3RvX3BhcnRpdGlvbiA9IHdyaXRlX3RvX3BhcnRpdGlvbjsKKyAgZGF0YS0+b3BzLnZhbGlkYXRlX3ZibWV0YV9wdWJsaWNfa2V5ID0gdmFsaWRhdGVfdmJtZXRhX3B1YmxpY19rZXk7CisgIGRhdGEtPm9wcy5yZWFkX3JvbGxiYWNrX2luZGV4ID0gcmVhZF9yb2xsYmFja19pbmRleDsKKyAgZGF0YS0+b3BzLndyaXRlX3JvbGxiYWNrX2luZGV4ID0gd3JpdGVfcm9sbGJhY2tfaW5kZXg7CisgIGRhdGEtPm9wcy5yZWFkX2lzX2RldmljZV91bmxvY2tlZCA9IHJlYWRfaXNfZGV2aWNlX3VubG9ja2VkOworICBkYXRhLT5vcHMuZ2V0X3VuaXF1ZV9ndWlkX2Zvcl9wYXJ0aXRpb24gPSBnZXRfdW5pcXVlX2d1aWRfZm9yX3BhcnRpdGlvbjsKKworICBkYXRhLT5hYl9vcHMub3BzID0gJmRhdGEtPm9wczsKKyAgZGF0YS0+YWJfb3BzLnJlYWRfYWJfbWV0YWRhdGEgPSBhdmJfYWJfZGF0YV9yZWFkOworICBkYXRhLT5hYl9vcHMud3JpdGVfYWJfbWV0YWRhdGEgPSBhdmJfYWJfZGF0YV93cml0ZTsKKworICByZXR1cm4gJmRhdGEtPm9wczsKK30KKwordm9pZCB1ZWZpX2F2Yl9vcHNfZnJlZShBdmJPcHMqIG9wcykgeworICBVRUZJQXZiT3BzRGF0YSogZGF0YSA9IG9wcy0+dXNlcl9kYXRhOworICBhdmJfZnJlZShkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2F2Yi9leGFtcGxlcy91ZWZpL3VlZmlfYXZiX29wcy5oIGIvYXZiL2V4YW1wbGVzL3VlZmkvdWVmaV9hdmJfb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkMTNlZQotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9leGFtcGxlcy91ZWZpL3VlZmlfYXZiX29wcy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgVUVGSV9BVkJfT1BTX0hfCisjZGVmaW5lIFVFRklfQVZCX09QU19IXworCisjaW5jbHVkZSA8ZWZpLmg+CisjaW5jbHVkZSA8bGliYXZiX2FiL2xpYmF2Yl9hYi5oPgorCisvKiBUaGUgfHVzZXJfZGF0YXwgbWVtYmVyIG9mIEF2Yk9wcyBwb2ludHMgdG8gYSBzdHJ1Y3Qgb2YgdGhpcyB0eXBlLiAqLwordHlwZWRlZiBzdHJ1Y3QgVUVGSUF2Yk9wc0RhdGEgeworICBBdmJPcHMgb3BzOworICBBdmJBQk9wcyBhYl9vcHM7CisKKyAgRUZJX0hBTkRMRSBlZmlfaW1hZ2VfaGFuZGxlOworICBFRklfREVWSUNFX1BBVEgqIHBhdGg7CisgIEVGSV9CTE9DS19JTyogYmxvY2tfaW87CisgIEVGSV9ESVNLX0lPKiBkaXNrX2lvOworfSBVRUZJQXZiT3BzRGF0YTsKKworLyogUmV0dXJucyBhbiBBdmJPcHMgZm9yIHVzZSB3aXRoIFVFRkkuICovCitBdmJPcHMqIHVlZmlfYXZiX29wc19uZXcoRUZJX0hBTkRMRSBhcHBfaW1hZ2UpOworCisvKiBGcmVlcyB0aGUgQXZiT3BzIGFsbG9jYXRlZCB3aXRoIHVlZmlfYXZiX29wc19uZXcoKS4gKi8KK3ZvaWQgdWVmaV9hdmJfb3BzX2ZyZWUoQXZiT3BzKiBvcHMpOworCisjZW5kaWYgLyogVUVGSV9BVkJfT1BTX0hfICovCmRpZmYgLS1naXQgYS9hdmIvZXhhbXBsZXMvdWVmaS91ZWZpX2F2Yl9zeXNkZXBzLmMgYi9hdmIvZXhhbXBsZXMvdWVmaS91ZWZpX2F2Yl9zeXNkZXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE0MWM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9leGFtcGxlcy91ZWZpL3VlZmlfYXZiX3N5c2RlcHMuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGVmaS5oPgorI2luY2x1ZGUgPGVmaWxpYi5oPgorI2luY2x1ZGUgPGVmaXN0ZGFyZy5oPgorCisjaW5jbHVkZSA8bGliYXZiL2xpYmF2Yi5oPgorCisjaW5jbHVkZSAidWVmaV9hdmJfdXRpbC5oIgorCitpbnQgYXZiX21lbWNtcChjb25zdCB2b2lkKiBzcmMxLCBjb25zdCB2b2lkKiBzcmMyLCBzaXplX3QgbikgeworICByZXR1cm4gKGludClDb21wYXJlTWVtKChWT0lEKilzcmMxLCAoVk9JRCopc3JjMiwgKFVJTlROKW4pOworfQorCitpbnQgYXZiX3N0cmNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKKyAgcmV0dXJuIChpbnQpc3RyY21wYSgoQ0hBUjgqKXMxLCAoQ0hBUjgqKXMyKTsKK30KKwordm9pZCogYXZiX21lbWNweSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBuKSB7CisgIENvcHlNZW0oZGVzdCwgKFZPSUQqKXNyYywgKFVJTlROKW4pOworICByZXR1cm4gZGVzdDsKK30KKwordm9pZCogYXZiX21lbXNldCh2b2lkKiBkZXN0LCBjb25zdCBpbnQgYywgc2l6ZV90IG4pIHsKKyAgU2V0TWVtKGRlc3QsIChVSU5UTiluLCAoVUlOVDgpYyk7CisgIHJldHVybiBkZXN0OworfQorCit2b2lkIGF2Yl9wcmludChjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgIHNpemVfdCB1dGY4X251bV9ieXRlcyA9IGF2Yl9zdHJsZW4obWVzc2FnZSkgKyAxOworICBzaXplX3QgbWF4X3VjczJfYnl0ZXMgPSB1dGY4X251bV9ieXRlcyAqIDI7CisgIHVpbnQxNl90KiBtZXNzYWdlX3VjczIgPSAodWludDE2X3QqKWF2Yl9jYWxsb2MobWF4X3VjczJfYnl0ZXMpOworICBpZiAobWVzc2FnZV91Y3MyID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHVlZmlfYXZiX3V0ZjhfdG9fdWNzMigoY29uc3QgdWludDhfdCopbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGY4X251bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3VjczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3VjczJfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKKyAgICBQcmludChtZXNzYWdlX3VjczIpOworICB9CisgIGF2Yl9mcmVlKG1lc3NhZ2VfdWNzMik7Cit9CisKK3ZvaWQgYXZiX3ByaW50dihjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pIHsKKyAgdmFfbGlzdCBhcDsKKworICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgIGRvIHsKKyAgICBhdmJfcHJpbnQobWVzc2FnZSk7CisgICAgbWVzc2FnZSA9IHZhX2FyZyhhcCwgY29uc3QgY2hhciopOworICB9IHdoaWxlIChtZXNzYWdlICE9IE5VTEwpOworICB2YV9lbmQoYXApOworfQorCit2b2lkIGF2Yl9hYm9ydCh2b2lkKSB7CisgIGF2Yl9wcmludCgiXG5BQk9SVElORy4uLlxuIik7CisgIHVlZmlfY2FsbF93cmFwcGVyKEJTLT5TdGFsbCwgMSwgNSAqIDEwMDAgKiAxMDAwKTsKKyAgdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkV4aXQsIDQsIE5VTEwsIEVGSV9OT1RfRk9VTkQsIDAsIE5VTEwpOworICB3aGlsZSAodHJ1ZSkgeworICAgIDsKKyAgfQorfQorCit2b2lkKiBhdmJfbWFsbG9jXyhzaXplX3Qgc2l6ZSkgeworICBFRklfU1RBVFVTIGVycjsKKyAgdm9pZCogeDsKKworICBlcnIgPSB1ZWZpX2NhbGxfd3JhcHBlcigKKyAgICAgIEJTLT5BbGxvY2F0ZVBvb2wsIDMsIEVmaUJvb3RTZXJ2aWNlc0RhdGEsIChVSU5UTilzaXplLCAmeCk7CisgIGlmIChFRklfRVJST1IoZXJyKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIHg7Cit9CisKK3ZvaWQgYXZiX2ZyZWUodm9pZCogcHRyKSB7CisgIEVGSV9TVEFUVVMgZXJyOworICBlcnIgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+RnJlZVBvb2wsIDEsIHB0cik7CisKKyAgaWYgKEVGSV9FUlJPUihlcnIpKSB7CisgICAgUHJpbnQoTCJXYXJuaW5nOiBCYWQgYXZiX2ZyZWU6ICVyXG4iLCBlcnIpOworICAgIHVlZmlfY2FsbF93cmFwcGVyKEJTLT5TdGFsbCwgMSwgMyAqIDEwMDAgKiAxMDAwKTsKKyAgfQorfQorCitzaXplX3QgYXZiX3N0cmxlbihjb25zdCBjaGFyKiBzdHIpIHsKKyAgcmV0dXJuIHN0cmxlbmEoKENIQVI4KilzdHIpOworfQpkaWZmIC0tZ2l0IGEvYXZiL2V4YW1wbGVzL3VlZmkvdWVmaV9hdmJfdXRpbC5jIGIvYXZiL2V4YW1wbGVzL3VlZmkvdWVmaV9hdmJfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNTlhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvZXhhbXBsZXMvdWVmaS91ZWZpX2F2Yl91dGlsLmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgInVlZmlfYXZiX3V0aWwuaCIKKworYm9vbCB1ZWZpX2F2Yl91dGY4X3RvX3VjczIoY29uc3QgdWludDhfdCogdXRmOF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHV0ZjhfbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHVjczJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1Y3MyX2RhdGFfY2FwYWNpdHlfbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBvdXRfdWNzMl9kYXRhX251bV9ieXRlcykgeworICB1aW50MzJfdCBpOCA9IDA7CisgIHVpbnQzMl90IGkyID0gMDsKKworICBkbyB7CisgICAgaWYgKGkyID49IHVjczJfZGF0YV9jYXBhY2l0eV9udW1fYnl0ZXMpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIGNhbm5vdCByZXByZXNlbnQgdGhpcyBjaGFyYWN0ZXIsIHRvbyBsb25nCisgICAgaWYgKCh1dGY4X2RhdGFbaThdICYgMHhGOCkgPT0gMHhGMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoKHV0ZjhfZGF0YVtpOF0gJiAweEYwKSA9PSAweEUwKSB7CisgICAgICB1Y3MyX2RhdGFbaTJdID0gKHVpbnQxNl90KSgodWludDE2X3QpdXRmOF9kYXRhW2k4XSA8PCAxMikgfAorICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkoKCh1aW50MTZfdCl1dGY4X2RhdGFbaTggKyAxXSA8PCA2KSAmIDB4MEZDMCkgfAorICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkoKHVpbnQxNl90KXV0ZjhfZGF0YVtpOCArIDJdICYgMHgwMDNGKTsKKyAgICAgIGk4ICs9IDM7CisgICAgfSBlbHNlIGlmICgodXRmOF9kYXRhW2k4XSAmIDB4RTApID09IDBYQzApIHsKKyAgICAgIHVjczJfZGF0YVtpMl0gPSAodWludDE2X3QpKCgodWludDE2X3QpdXRmOF9kYXRhW2k4XSA8PCA2KSAmIDB4MDdDMCkgfAorICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkoKHVpbnQxNl90KXV0ZjhfZGF0YVtpOCArIDFdICYgMHgwMDNGKTsKKyAgICAgIGk4ICs9IDI7CisgICAgfSBlbHNlIGlmICghKHV0ZjhfZGF0YVtpOF0gPj4gNykpIHsKKyAgICAgIHVjczJfZGF0YVtpMl0gPSAodWludDE2X3QpKCh1aW50MTZfdCl1dGY4X2RhdGFbaThdICYgMHgwMEZGKTsKKyAgICAgIGk4Kys7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGludmFsaWQgdXRmLTgKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaTIrKzsKKyAgfSB3aGlsZSAoaTggPCB1dGY4X251bV9ieXRlcyk7CisKKyAgaWYgKG91dF91Y3MyX2RhdGFfbnVtX2J5dGVzICE9IE5VTEwpIHsKKyAgICAqb3V0X3VjczJfZGF0YV9udW1fYnl0ZXMgPSBpMiAqIDI7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9hdmIvZXhhbXBsZXMvdWVmaS91ZWZpX2F2Yl91dGlsLmggYi9hdmIvZXhhbXBsZXMvdWVmaS91ZWZpX2F2Yl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3MDU1NwotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9leGFtcGxlcy91ZWZpL3VlZmlfYXZiX3V0aWwuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisvLyBOT1RFOiBTZWUgYXZiX3N5c2RlcHMuaAorCisjaWZuZGVmIFVFRklfQVZCX1VUSUxfSF8KKyNkZWZpbmUgVUVGSV9BVkJfVVRJTF9IXworCisjaW5jbHVkZSA8bGliYXZiL2xpYmF2Yi5oPgorCisvKiBDb252ZXJ0cyBVVEYtOCB0byBVQ1MtMi4gUmV0dXJucyB8ZmFsc2V8IGlmIGludmFsaWQgVVRGLTggb3IgaWYgYQorICogcnVuZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgVUNTLTIuCisgKi8KK2Jvb2wgdWVmaV9hdmJfdXRmOF90b191Y3MyKGNvbnN0IHVpbnQ4X3QqIHV0ZjhfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1dGY4X251bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiB1Y3MyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdWNzMl9kYXRhX2NhcGFjaXR5X251bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogb3V0X3VjczJfZGF0YV9udW1fYnl0ZXMpOworCisjZW5kaWYgLyogVUVGSV9BVkJfVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXZiL2xpYmF2Yi9hdmJfY2hhaW5fcGFydGl0aW9uX2Rlc2NyaXB0b3IuYyBiL2F2Yi9saWJhdmIvYXZiX2NoYWluX3BhcnRpdGlvbl9kZXNjcmlwdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxNDIzMgotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX2NoYWluX3BhcnRpdGlvbl9kZXNjcmlwdG9yLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImF2Yl9jaGFpbl9wYXJ0aXRpb25fZGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImF2Yl91dGlsLmgiCisKK2Jvb2wgYXZiX2NoYWluX3BhcnRpdGlvbl9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgKKyAgICBjb25zdCBBdmJDaGFpblBhcnRpdGlvbkRlc2NyaXB0b3IqIHNyYywgQXZiQ2hhaW5QYXJ0aXRpb25EZXNjcmlwdG9yKiBkZXN0KSB7CisgIHVpbnQ2NF90IGV4cGVjdGVkX3NpemU7CisKKyAgYXZiX21lbWNweShkZXN0LCBzcmMsIHNpemVvZihBdmJDaGFpblBhcnRpdGlvbkRlc2NyaXB0b3IpKTsKKworICBpZiAoIWF2Yl9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgoY29uc3QgQXZiRGVzY3JpcHRvciopc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXZiRGVzY3JpcHRvciopZGVzdCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChkZXN0LT5wYXJlbnRfZGVzY3JpcHRvci50YWcgIT0gQVZCX0RFU0NSSVBUT1JfVEFHX0NIQUlOX1BBUlRJVElPTikgeworICAgIGF2Yl9lcnJvcigiSW52YWxpZCB0YWcgZm9yIGNoYWluIHBhcnRpdGlvbiBkZXNjcmlwdG9yLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+cm9sbGJhY2tfaW5kZXhfbG9jYXRpb24gPSBhdmJfYmUzMnRvaChkZXN0LT5yb2xsYmFja19pbmRleF9sb2NhdGlvbik7CisgIGRlc3QtPnBhcnRpdGlvbl9uYW1lX2xlbiA9IGF2Yl9iZTMydG9oKGRlc3QtPnBhcnRpdGlvbl9uYW1lX2xlbik7CisgIGRlc3QtPnB1YmxpY19rZXlfbGVuID0gYXZiX2JlMzJ0b2goZGVzdC0+cHVibGljX2tleV9sZW4pOworCisgIGlmIChkZXN0LT5yb2xsYmFja19pbmRleF9sb2NhdGlvbiA8IDEpIHsKKyAgICBhdmJfZXJyb3IoIkludmFsaWQgcm9sbGJhY2sgaW5kZXggbG9jYXRpb24gdmFsdWUuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKiBDaGVjayB0aGF0IHBhcnRpdGlvbl9uYW1lIGFuZCBwdWJsaWNfa2V5IGFyZSBmdWxseSBjb250YWluZWQuICovCisgIGV4cGVjdGVkX3NpemUgPSBzaXplb2YoQXZiQ2hhaW5QYXJ0aXRpb25EZXNjcmlwdG9yKSAtIHNpemVvZihBdmJEZXNjcmlwdG9yKTsKKyAgaWYgKCFhdmJfc2FmZV9hZGRfdG8oJmV4cGVjdGVkX3NpemUsIGRlc3QtPnBhcnRpdGlvbl9uYW1lX2xlbikgfHwKKyAgICAgICFhdmJfc2FmZV9hZGRfdG8oJmV4cGVjdGVkX3NpemUsIGRlc3QtPnB1YmxpY19rZXlfbGVuKSkgeworICAgIGF2Yl9lcnJvcigiT3ZlcmZsb3cgd2hpbGUgYWRkaW5nIHVwIHNpemVzLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChleHBlY3RlZF9zaXplID4gZGVzdC0+cGFyZW50X2Rlc2NyaXB0b3IubnVtX2J5dGVzX2ZvbGxvd2luZykgeworICAgIGF2Yl9lcnJvcigiRGVzY3JpcHRvciBwYXlsb2FkIHNpemUgb3ZlcmZsb3cuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9hdmIvbGliYXZiL2F2Yl9jaGFpbl9wYXJ0aXRpb25fZGVzY3JpcHRvci5oIGIvYXZiL2xpYmF2Yi9hdmJfY2hhaW5fcGFydGl0aW9uX2Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmM5MjUwCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yi9hdmJfY2hhaW5fcGFydGl0aW9uX2Rlc2NyaXB0b3IuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoQVZCX0lOU0lERV9MSUJBVkJfSCkgJiYgIWRlZmluZWQoQVZCX0NPTVBJTEFUSU9OKQorI2Vycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSwgaW5jbHVkZSBsaWJhdmIuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIEFWQl9DSEFJTl9QQVJUSVRJT05fREVTQ1JJUFRPUl9IXworI2RlZmluZSBBVkJfQ0hBSU5fUEFSVElUSU9OX0RFU0NSSVBUT1JfSF8KKworI2luY2x1ZGUgImF2Yl9kZXNjcmlwdG9yLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQSBkZXNjcmlwdG9yIGNvbnRhaW5pbmcgYSBwb2ludGVyIHRvIHNpZ25lZCBpbnRlZ3JpdHkgZGF0YSBzdG9yZWQKKyAqIG9uIGFub3RoZXIgcGFydGl0aW9uLiBUaGUgZGVzY3JpcHRvciBjb250YWlucyB0aGUgcGFydGl0aW9uIG5hbWUgaW4KKyAqIHF1ZXN0aW9uICh3aXRob3V0IHRoZSBBL0Igc3VmZml4KSwgdGhlIHB1YmxpYyBrZXkgdXNlZCB0byBzaWduIHRoZQorICogaW50ZWdyaXR5IGRhdGEsIGFuZCByb2xsYmFjayBpbmRleCBsb2NhdGlvbiB0byB1c2UgZm9yIHJvbGxiYWNrCisgKiBwcm90ZWN0aW9uLgorICoKKyAqIEZvbGxvd2luZyB0aGlzIHN0cnVjdCBhcmUgfHBhcnRpdGlvbl9uYW1lX2xlbnwgYnl0ZXMgb2YgdGhlCisgKiBwYXJ0aXRpb24gbmFtZSAoVVRGLTggZW5jb2RlZCkgYW5kIHxwdWJsaWNfa2V5X2xlbnwgYnl0ZXMgb2YgdGhlCisgKiBwdWJsaWMga2V5LgorICoKKyAqIFRoZSB8cmVzZXJ2ZWR8IGZpZWxkIGlzIGZvciBmdXR1cmUgZXhwYW5zaW9uIGFuZCBtdXN0IGJlIHNldCB0byBOVUwKKyAqIGJ5dGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBBdmJDaGFpblBhcnRpdGlvbkRlc2NyaXB0b3IgeworICBBdmJEZXNjcmlwdG9yIHBhcmVudF9kZXNjcmlwdG9yOworICB1aW50MzJfdCByb2xsYmFja19pbmRleF9sb2NhdGlvbjsKKyAgdWludDMyX3QgcGFydGl0aW9uX25hbWVfbGVuOworICB1aW50MzJfdCBwdWJsaWNfa2V5X2xlbjsKKyAgdWludDhfdCByZXNlcnZlZFs2NF07Cit9IEFWQl9BVFRSX1BBQ0tFRCBBdmJDaGFpblBhcnRpdGlvbkRlc2NyaXB0b3I7CisKKy8qIENvcGllcyB8c3JjfCB0byB8ZGVzdHwgYW5kIHZhbGlkYXRlcywgYnl0ZS1zd2FwcGluZyBmaWVsZHMgaW4gdGhlCisgKiBwcm9jZXNzIGlmIG5lZWRlZC4gUmV0dXJucyB0cnVlIGlmIHZhbGlkLCBmYWxzZSBpZiBpbnZhbGlkLgorICoKKyAqIERhdGEgZm9sbG93aW5nIHRoZSBzdHJ1Y3QgaXMgbm90IHZhbGlkYXRlZCBub3IgY29waWVkLgorICovCitib29sIGF2Yl9jaGFpbl9wYXJ0aXRpb25fZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoCisgICAgY29uc3QgQXZiQ2hhaW5QYXJ0aXRpb25EZXNjcmlwdG9yKiBzcmMsCisgICAgQXZiQ2hhaW5QYXJ0aXRpb25EZXNjcmlwdG9yKiBkZXN0KSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBVkJfQ0hBSU5fUEFSVElUSU9OX0RFU0NSSVBUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX2NyYzMyLmMgYi9hdmIvbGliYXZiL2F2Yl9jcmMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYmVkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiL2F2Yl9jcmMzMi5jCkBAIC0wLDAgKzEsMTEzIEBACisvKi0KKyAqICBDT1BZUklHSFQgKEMpIDE5ODYgR2FyeSBTLiBCcm93bi4gIFlvdSBtYXkgdXNlIHRoaXMgcHJvZ3JhbSwgb3IKKyAqICBjb2RlIG9yIHRhYmxlcyBleHRyYWN0ZWQgZnJvbSBpdCwgYXMgZGVzaXJlZCB3aXRob3V0IHJlc3RyaWN0aW9uLgorICovCisKKy8qCisgKiAgRmlyc3QsIHRoZSBwb2x5bm9taWFsIGl0c2VsZiBhbmQgaXRzIHRhYmxlIG9mIGZlZWRiYWNrIHRlcm1zLiAgVGhlCisgKiAgcG9seW5vbWlhbCBpcworICogIFheMzIrWF4yNitYXjIzK1heMjIrWF4xNitYXjEyK1heMTErWF4xMCtYXjgrWF43K1heNStYXjQrWF4yK1heMStYXjAKKyAqCisgKiAgTm90ZSB0aGF0IHdlIHRha2UgaXQgImJhY2t3YXJkcyIgYW5kIHB1dCB0aGUgaGlnaGVzdC1vcmRlciB0ZXJtIGluCisgKiAgdGhlIGxvd2VzdC1vcmRlciBiaXQuICBUaGUgWF4zMiB0ZXJtIGlzICJpbXBsaWVkIjsgdGhlIExTQiBpcyB0aGUKKyAqICBYXjMxIHRlcm0sIGV0Yy4gIFRoZSBYXjAgdGVybSAodXN1YWxseSBzaG93biBhcyAiKzEiKSByZXN1bHRzIGluCisgKiAgdGhlIE1TQiBiZWluZyAxCisgKgorICogIE5vdGUgdGhhdCB0aGUgdXN1YWwgaGFyZHdhcmUgc2hpZnQgcmVnaXN0ZXIgaW1wbGVtZW50YXRpb24sIHdoaWNoCisgKiAgaXMgd2hhdCB3ZSdyZSB1c2luZyAod2UncmUgbWVyZWx5IG9wdGltaXppbmcgaXQgYnkgZG9pbmcgZWlnaHQtYml0CisgKiAgY2h1bmtzIGF0IGEgdGltZSkgc2hpZnRzIGJpdHMgaW50byB0aGUgbG93ZXN0LW9yZGVyIHRlcm0uICBJbiBvdXIKKyAqICBpbXBsZW1lbnRhdGlvbiwgdGhhdCBtZWFucyBzaGlmdGluZyB0b3dhcmRzIHRoZSByaWdodC4gIFdoeSBkbyB3ZQorICogIGRvIGl0IHRoaXMgd2F5PyAgQmVjYXVzZSB0aGUgY2FsY3VsYXRlZCBDUkMgbXVzdCBiZSB0cmFuc21pdHRlZCBpbgorICogIG9yZGVyIGZyb20gaGlnaGVzdC1vcmRlciB0ZXJtIHRvIGxvd2VzdC1vcmRlciB0ZXJtLiAgVUFSVHMgdHJhbnNtaXQKKyAqICBjaGFyYWN0ZXJzIGluIG9yZGVyIGZyb20gTFNCIHRvIE1TQi4gIEJ5IHN0b3JpbmcgdGhlIENSQyB0aGlzIHdheQorICogIHdlIGhhbmQgaXQgdG8gdGhlIFVBUlQgaW4gdGhlIG9yZGVyIGxvdy1ieXRlIHRvIGhpZ2gtYnl0ZTsgdGhlIFVBUlQKKyAqICBzZW5kcyBlYWNoIGxvdy1iaXQgdG8gaGlnaHQtYml0OyBhbmQgdGhlIHJlc3VsdCBpcyB0cmFuc21pc3Npb24gYml0CisgKiAgYnkgYml0IGZyb20gaGlnaGVzdC0gdG8gbG93ZXN0LW9yZGVyIHRlcm0gd2l0aG91dCByZXF1aXJpbmcgYW55IGJpdAorICogIHNodWZmbGluZyBvbiBvdXIgcGFydC4gIFJlY2VwdGlvbiB3b3JrcyBzaW1pbGFybHkKKyAqCisgKiAgVGhlIGZlZWRiYWNrIHRlcm1zIHRhYmxlIGNvbnNpc3RzIG9mIDI1NiwgMzItYml0IGVudHJpZXMuICBOb3RlcworICoKKyAqICAgICAgVGhlIHRhYmxlIGNhbiBiZSBnZW5lcmF0ZWQgYXQgcnVudGltZSBpZiBkZXNpcmVkOyBjb2RlIHRvIGRvIHNvCisgKiAgICAgIGlzIHNob3duIGxhdGVyLiAgSXQgbWlnaHQgbm90IGJlIG9idmlvdXMsIGJ1dCB0aGUgZmVlZGJhY2sKKyAqICAgICAgdGVybXMgc2ltcGx5IHJlcHJlc2VudCB0aGUgcmVzdWx0cyBvZiBlaWdodCBzaGlmdC94b3Igb3BlcmEKKyAqICAgICAgdGlvbnMgZm9yIGFsbCBjb21iaW5hdGlvbnMgb2YgZGF0YSBhbmQgQ1JDIHJlZ2lzdGVyIHZhbHVlcworICoKKyAqICAgICAgVGhlIHZhbHVlcyBtdXN0IGJlIHJpZ2h0LXNoaWZ0ZWQgYnkgZWlnaHQgYml0cyBieSB0aGUgInVwZGNyYworICogICAgICBsb2dpYzsgdGhlIHNoaWZ0IG11c3QgYmUgdW5zaWduZWQgKGJyaW5nIGluIHplcm9lcykuICBPbiBzb21lCisgKiAgICAgIGhhcmR3YXJlIHlvdSBjb3VsZCBwcm9iYWJseSBvcHRpbWl6ZSB0aGUgc2hpZnQgaW4gYXNzZW1ibGVyIGJ5CisgKiAgICAgIHVzaW5nIGJ5dGUtc3dhcCBpbnN0cnVjdGlvbnMKKyAqICAgICAgcG9seW5vbWlhbCAkZWRiODgzMjAKKyAqCisgKgorICogQ1JDMzIgY29kZSBkZXJpdmVkIGZyb20gd29yayBieSBHYXJ5IFMuIEJyb3duLgorICovCisKKyNpbmNsdWRlICJhdmJfc3lzZGVwcy5oIgorCisvKiBDb2RlIHRha2VuIGZyb20gRnJlZUJTRCA4ICovCisKK3N0YXRpYyB1aW50MzJfdCBjcmMzMl90YWJbXSA9IHsKKyAgICAweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLCAweDA3NmRjNDE5LCAweDcwNmFmNDhmLAorICAgIDB4ZTk2M2E1MzUsIDB4OWU2NDk1YTMsIDB4MGVkYjg4MzIsIDB4NzlkY2I4YTQsIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsCisgICAgMHgwOWI2NGMyYiwgMHg3ZWIxN2NiZCwgMHhlN2I4MmQwNywgMHg5MGJmMWQ5MSwgMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwKKyAgICAweGYzYjk3MTQ4LCAweDg0YmU0MWRlLCAweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAorICAgIDB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsIDB4MTQwMTVjNGYsIDB4NjMwNjZjZDksCisgICAgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwgMHgzYjZlMjBjOCwgMHg0YzY5MTA1ZSwgMHhkNTYwNDFlNCwgMHhhMjY3NzE3MiwKKyAgICAweDNjMDNlNGQxLCAweDRiMDRkNDQ3LCAweGQyMGQ4NWZkLCAweGE1MGFiNTZiLCAweDM1YjVhOGZhLCAweDQyYjI5ODZjLAorICAgIDB4ZGJiYmM5ZDYsIDB4YWNiY2Y5NDAsIDB4MzJkODZjZTMsIDB4NDVkZjVjNzUsIDB4ZGNkNjBkY2YsIDB4YWJkMTNkNTksCisgICAgMHgyNmQ5MzBhYywgMHg1MWRlMDAzYSwgMHhjOGQ3NTE4MCwgMHhiZmQwNjExNiwgMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywKKyAgICAweGNmYmE5NTk5LCAweGI4YmRhNTBmLCAweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAorICAgIDB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsIDB4NzZkYzQxOTAsIDB4MDFkYjcxMDYsCisgICAgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwgMHg3MWIxODU4OSwgMHgwNmI2YjUxZiwgMHg5ZmJmZTRhNSwgMHhlOGI4ZDQzMywKKyAgICAweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlLCAweGUxMGU5ODE4LCAweDdmNmEwZGJiLCAweDA4NmQzZDJkLAorICAgIDB4OTE2NDZjOTcsIDB4ZTY2MzVjMDEsIDB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsCisgICAgMHg2YzA2OTVlZCwgMHgxYjAxYTU3YiwgMHg4MjA4ZjRjMSwgMHhmNTBmYzQ1NywgMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwKKyAgICAweDhiYmViOGVhLCAweGZjYjk4ODdjLCAweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAorICAgIDB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsIDB4NGFkZmE1NDEsIDB4M2RkODk1ZDcsCisgICAgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwgMHg0MzY5ZTk2YSwgMHgzNDZlZDlmYywgMHhhZDY3ODg0NiwgMHhkYTYwYjhkMCwKKyAgICAweDQ0MDQyZDczLCAweDMzMDMxZGU1LCAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LCAweDUwMDU3MTNjLCAweDI3MDI0MWFhLAorICAgIDB4YmUwYjEwMTAsIDB4YzkwYzIwODYsIDB4NTc2OGI1MjUsIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYsCisgICAgMHg1ZWRlZjkwZSwgMHgyOWQ5Yzk5OCwgMHhiMGQwOTgyMiwgMHhjN2Q3YThiNCwgMHg1OWIzM2QxNywgMHgyZWI0MGQ4MSwKKyAgICAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLCAweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAorICAgIDB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsIDB4ZTM2MzBiMTIsIDB4OTQ2NDNiODQsCisgICAgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwgMHhlNDBlY2YwYiwgMHg5MzA5ZmY5ZCwgMHgwYTAwYWUyNywgMHg3ZDA3OWViMSwKKyAgICAweGYwMGY5MzQ0LCAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLCAweGY3NjI1NzVkLCAweDgwNjU2N2NiLAorICAgIDB4MTk2YzM2NzEsIDB4NmU2YjA2ZTcsIDB4ZmVkNDFiNzYsIDB4ODlkMzJiZTAsIDB4MTBkYTdhNWEsIDB4NjdkZDRhY2MsCisgICAgMHhmOWI5ZGY2ZiwgMHg4ZWJlZWZmOSwgMHgxN2I3YmU0MywgMHg2MGIwOGVkNSwgMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwKKyAgICAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLCAweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAorICAgIDB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsIDB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsCisgICAgMHgzMTZlOGVlZiwgMHg0NjY5YmU3OSwgMHhjYjYxYjM4YywgMHhiYzY2ODMxYSwgMHgyNTZmZDJhMCwgMHg1MjY4ZTIzNiwKKyAgICAweGNjMGM3Nzk1LCAweGJiMGI0NzAzLCAweDIyMDIxNmI5LCAweDU1MDUyNjJmLCAweGM1YmEzYmJlLCAweGIyYmQwYjI4LAorICAgIDB4MmJiNDVhOTIsIDB4NWNiMzZhMDQsIDB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEsIDB4MmNkOTllOGIsIDB4NWJkZWFlMWQsCisgICAgMHg5YjY0YzJiMCwgMHhlYzYzZjIyNiwgMHg3NTZhYTM5YywgMHgwMjZkOTMwYSwgMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwKKyAgICAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLCAweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAorICAgIDB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsIDB4ODZkM2QyZDQsIDB4ZjFkNGUyNDIsCisgICAgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwgMHg4MWJlMTZjZCwgMHhmNmI5MjY1YiwgMHg2ZmIwNzdlMSwgMHgxOGI3NDc3NywKKyAgICAweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLCAweDhmNjU5ZWZmLCAweGY4NjJhZTY5LAorICAgIDB4NjE2YmZmZDMsIDB4MTY2Y2NmNDUsIDB4YTAwYWUyNzgsIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsCisgICAgMHhhNzY3MjY2MSwgMHhkMDYwMTZmNywgMHg0OTY5NDc0ZCwgMHgzZTZlNzdkYiwgMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywKKyAgICAweDQwZGYwYjY2LCAweDM3ZDgzYmYwLCAweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAorICAgIDB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsIDB4YmFkMDM2MDUsIDB4Y2RkNzA2OTMsCisgICAgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwgMHhiMzY2N2EyZSwgMHhjNDYxNGFiOCwgMHg1ZDY4MWIwMiwgMHgyYTZmMmI5NCwKKyAgICAweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiLCAweDJkMDJlZjhkfTsKKworLyoKKyAqIEEgZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHRoZSBDUkMtMzIgYmFzZWQgb24gdGhlIHRhYmxlIGFib3ZlIGlzCisgKiBnaXZlbiBiZWxvdyBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy4gQW4gZXF1aXZhbGVudCBpbXBsZW1lbnRhdGlvbgorICogb2YgdGhpcyBmdW5jdGlvbiB0aGF0J3MgYWN0dWFsbHkgdXNlZCBpbiB0aGUga2VybmVsIGNhbiBiZSBmb3VuZAorICogaW4gc3lzL2xpYmtlcm4uaCwgd2hlcmUgaXQgY2FuIGJlIGlubGluZWQuCisgKi8KKworc3RhdGljIHVpbnQzMl90IGNyYzMyKHVpbnQzMl90IGNyY19pbiwgY29uc3QgdWludDhfdCogYnVmLCBpbnQgc2l6ZSkgeworICBjb25zdCB1aW50OF90KiBwID0gYnVmOworICB1aW50MzJfdCBjcmM7CisKKyAgY3JjID0gY3JjX2luIF4gfjBVOworICB3aGlsZSAoc2l6ZS0tKQorICAgIGNyYyA9IGNyYzMyX3RhYlsoY3JjIF4gKnArKykgJiAweEZGXSBeIChjcmMgPj4gOCk7CisgIHJldHVybiBjcmMgXiB+MFU7Cit9CisKK3VpbnQzMl90IGF2Yl9jcmMzMihjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBzaXplKSB7CisgIHJldHVybiBjcmMzMigwLCBidWYsIHNpemUpOworfQpkaWZmIC0tZ2l0IGEvYXZiL2xpYmF2Yi9hdmJfY3J5cHRvLmMgYi9hdmIvbGliYXZiL2F2Yl9jcnlwdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDI4NDQzCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yi9hdmJfY3J5cHRvLmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJhdmJfY3J5cHRvLmgiCisjaW5jbHVkZSAiYXZiX3JzYS5oIgorI2luY2x1ZGUgImF2Yl9zaGEuaCIKKyNpbmNsdWRlICJhdmJfdXRpbC5oIgorCisvKiBOT1RFOiBUaGUgUEtDMS12MS41IHBhZGRpbmcgaXMgYSBibG9iIG9mIGJpbmFyeSBERVIgb2YgQVNOLjEgYW5kIGlzCisgKiBvYnRhaW5lZCBmcm9tIHNlY3Rpb24gNS4yLjIgb2YgUkZDIDQ4ODAuCisgKi8KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QKKyAgICBwYWRkaW5nX1JTQTIwNDhfU0hBMjU2W0FWQl9SU0EyMDQ4X05VTV9CWVRFUyAtIEFWQl9TSEEyNTZfRElHRVNUX1NJWkVdID0geworICAgICAgICAweDAwLCAweDAxLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweDAwLCAweDMwLCAweDMxLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLCAweDg2LCAweDQ4LCAweDAxLCAweDY1LAorICAgICAgICAweDAzLCAweDA0LCAweDAyLCAweDAxLCAweDA1LCAweDAwLCAweDA0LCAweDIwfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QKKyAgICBwYWRkaW5nX1JTQTQwOTZfU0hBMjU2W0FWQl9SU0E0MDk2X05VTV9CWVRFUyAtIEFWQl9TSEEyNTZfRElHRVNUX1NJWkVdID0geworICAgICAgICAweDAwLCAweDAxLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDMwLCAweDMxLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLAorICAgICAgICAweDg2LCAweDQ4LCAweDAxLCAweDY1LCAweDAzLCAweDA0LCAweDAyLCAweDAxLCAweDA1LCAweDAwLCAweDA0LCAweDIwfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QKKyAgICBwYWRkaW5nX1JTQTgxOTJfU0hBMjU2W0FWQl9SU0E4MTkyX05VTV9CWVRFUyAtIEFWQl9TSEEyNTZfRElHRVNUX1NJWkVdID0geworICAgICAgICAweDAwLCAweDAxLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweDAwLCAweDMwLCAweDMxLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLCAweDg2LCAweDQ4LCAweDAxLCAweDY1LAorICAgICAgICAweDAzLCAweDA0LCAweDAyLCAweDAxLCAweDA1LCAweDAwLCAweDA0LCAweDIwfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QKKyAgICBwYWRkaW5nX1JTQTIwNDhfU0hBNTEyW0FWQl9SU0EyMDQ4X05VTV9CWVRFUyAtIEFWQl9TSEE1MTJfRElHRVNUX1NJWkVdID0geworICAgICAgICAweDAwLCAweDAxLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDMwLCAweDUxLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLAorICAgICAgICAweDg2LCAweDQ4LCAweDAxLCAweDY1LCAweDAzLCAweDA0LCAweDAyLCAweDAzLCAweDA1LCAweDAwLCAweDA0LCAweDQwfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QKKyAgICBwYWRkaW5nX1JTQTQwOTZfU0hBNTEyW0FWQl9SU0E0MDk2X05VTV9CWVRFUyAtIEFWQl9TSEE1MTJfRElHRVNUX1NJWkVdID0geworICAgICAgICAweDAwLCAweDAxLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDMwLCAweDUxLCAweDMwLAorICAgICAgICAweDBkLCAweDA2LCAweDA5LCAweDYwLCAweDg2LCAweDQ4LCAweDAxLCAweDY1LCAweDAzLCAweDA0LCAweDAyLCAweDAzLAorICAgICAgICAweDA1LCAweDAwLCAweDA0LCAweDQwfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QKKyAgICBwYWRkaW5nX1JTQTgxOTJfU0hBNTEyW0FWQl9SU0E4MTkyX05VTV9CWVRFUyAtIEFWQl9TSEE1MTJfRElHRVNUX1NJWkVdID0geworICAgICAgICAweDAwLCAweDAxLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDMwLCAweDUxLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLAorICAgICAgICAweDg2LCAweDQ4LCAweDAxLCAweDY1LCAweDAzLCAweDA0LCAweDAyLCAweDAzLCAweDA1LCAweDAwLCAweDA0LCAweDQwfTsKKworc3RhdGljIEF2YkFsZ29yaXRobURhdGEgYWxnb3JpdGhtX2RhdGFbX0FWQl9BTEdPUklUSE1fTlVNX1RZUEVTXSA9IHsKKyAgICAvKiBBVkJfQUxHT1JJVEhNX1RZUEVfTk9ORSAqLworICAgIHsucGFkZGluZyA9IE5VTEwsIC5wYWRkaW5nX2xlbiA9IDAsIC5oYXNoX2xlbiA9IDB9LAorICAgIC8qIEFWQl9BTEdPUklUSE1fVFlQRV9TSEEyNTZfUlNBMjA0OCAqLworICAgIHsucGFkZGluZyA9IHBhZGRpbmdfUlNBMjA0OF9TSEEyNTYsCisgICAgIC5wYWRkaW5nX2xlbiA9IHNpemVvZihwYWRkaW5nX1JTQTIwNDhfU0hBMjU2KSwKKyAgICAgLmhhc2hfbGVuID0gQVZCX1NIQTI1Nl9ESUdFU1RfU0laRX0sCisgICAgLyogQVZCX0FMR09SSVRITV9UWVBFX1NIQTI1Nl9SU0E0MDk2ICovCisgICAgey5wYWRkaW5nID0gcGFkZGluZ19SU0E0MDk2X1NIQTI1NiwKKyAgICAgLnBhZGRpbmdfbGVuID0gc2l6ZW9mKHBhZGRpbmdfUlNBNDA5Nl9TSEEyNTYpLAorICAgICAuaGFzaF9sZW4gPSBBVkJfU0hBMjU2X0RJR0VTVF9TSVpFfSwKKyAgICAvKiBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBMjU2X1JTQTgxOTIgKi8KKyAgICB7LnBhZGRpbmcgPSBwYWRkaW5nX1JTQTgxOTJfU0hBMjU2LAorICAgICAucGFkZGluZ19sZW4gPSBzaXplb2YocGFkZGluZ19SU0E4MTkyX1NIQTI1NiksCisgICAgIC5oYXNoX2xlbiA9IEFWQl9TSEEyNTZfRElHRVNUX1NJWkV9LAorICAgIC8qIEFWQl9BTEdPUklUSE1fVFlQRV9TSEE1MTJfUlNBMjA0OCAqLworICAgIHsucGFkZGluZyA9IHBhZGRpbmdfUlNBMjA0OF9TSEE1MTIsCisgICAgIC5wYWRkaW5nX2xlbiA9IHNpemVvZihwYWRkaW5nX1JTQTIwNDhfU0hBNTEyKSwKKyAgICAgLmhhc2hfbGVuID0gQVZCX1NIQTUxMl9ESUdFU1RfU0laRX0sCisgICAgLyogQVZCX0FMR09SSVRITV9UWVBFX1NIQTUxMl9SU0E0MDk2ICovCisgICAgey5wYWRkaW5nID0gcGFkZGluZ19SU0E0MDk2X1NIQTUxMiwKKyAgICAgLnBhZGRpbmdfbGVuID0gc2l6ZW9mKHBhZGRpbmdfUlNBNDA5Nl9TSEE1MTIpLAorICAgICAuaGFzaF9sZW4gPSBBVkJfU0hBNTEyX0RJR0VTVF9TSVpFfSwKKyAgICAvKiBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBNTEyX1JTQTgxOTIgKi8KKyAgICB7LnBhZGRpbmcgPSBwYWRkaW5nX1JTQTgxOTJfU0hBNTEyLAorICAgICAucGFkZGluZ19sZW4gPSBzaXplb2YocGFkZGluZ19SU0E4MTkyX1NIQTUxMiksCisgICAgIC5oYXNoX2xlbiA9IEFWQl9TSEE1MTJfRElHRVNUX1NJWkV9LAorfTsKKworY29uc3QgQXZiQWxnb3JpdGhtRGF0YSogYXZiX2dldF9hbGdvcml0aG1fZGF0YShBdmJBbGdvcml0aG1UeXBlIGFsZ29yaXRobSkgeworICBpZiAoYWxnb3JpdGhtID49IEFWQl9BTEdPUklUSE1fVFlQRV9OT05FICYmCisgICAgICBhbGdvcml0aG0gPCBfQVZCX0FMR09SSVRITV9OVU1fVFlQRVMpIHsKKyAgICByZXR1cm4gJmFsZ29yaXRobV9kYXRhW2FsZ29yaXRobV07CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgYXZiX3JzYV9wdWJsaWNfa2V5X2hlYWRlcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoCisgICAgY29uc3QgQXZiUlNBUHVibGljS2V5SGVhZGVyKiBzcmMsIEF2YlJTQVB1YmxpY0tleUhlYWRlciogZGVzdCkgeworICBhdmJfbWVtY3B5KGRlc3QsIHNyYywgc2l6ZW9mKEF2YlJTQVB1YmxpY0tleUhlYWRlcikpOworCisgIGRlc3QtPmtleV9udW1fYml0cyA9IGF2Yl9iZTMydG9oKGRlc3QtPmtleV9udW1fYml0cyk7CisgIGRlc3QtPm4waW52ID0gYXZiX2JlMzJ0b2goZGVzdC0+bjBpbnYpOworCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYXZiL2xpYmF2Yi9hdmJfY3J5cHRvLmggYi9hdmIvbGliYXZiL2F2Yl9jcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZThkN2UyCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yi9hdmJfY3J5cHRvLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZChBVkJfSU5TSURFX0xJQkFWQl9IKSAmJiAhZGVmaW5lZChBVkJfQ09NUElMQVRJT04pCisjZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LCBpbmNsdWRlIGxpYmF2Yi5oIGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgQVZCX0NSWVBUT19IXworI2RlZmluZSBBVkJfQ1JZUFRPX0hfCisKKyNpbmNsdWRlICJhdmJfc3lzZGVwcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFNpemUgb2YgYSBSU0EtMjA0OCBzaWduYXR1cmUuICovCisjZGVmaW5lIEFWQl9SU0EyMDQ4X05VTV9CWVRFUyAyNTYKKworLyogU2l6ZSBvZiBhIFJTQS00MDk2IHNpZ25hdHVyZS4gKi8KKyNkZWZpbmUgQVZCX1JTQTQwOTZfTlVNX0JZVEVTIDUxMgorCisvKiBTaXplIG9mIGEgUlNBLTgxOTIgc2lnbmF0dXJlLiAqLworI2RlZmluZSBBVkJfUlNBODE5Ml9OVU1fQllURVMgMTAyNAorCisvKiBTaXplIGluIGJ5dGVzIG9mIGEgU0hBLTI1NiBkaWdlc3QuICovCisjZGVmaW5lIEFWQl9TSEEyNTZfRElHRVNUX1NJWkUgMzIKKworLyogU2l6ZSBpbiBieXRlcyBvZiBhIFNIQS01MTIgZGlnZXN0LiAqLworI2RlZmluZSBBVkJfU0hBNTEyX0RJR0VTVF9TSVpFIDY0CisKKy8qIEFsZ29yaXRobXMgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgdmJtZXRhIGltYWdlIGZvcgorICogdmVyaWZpY2F0aW9uLiBBbiBhbGdvcml0aG0gY29uc2lzdHMgb2YgYSBoYXNoIHR5cGUgYW5kIGEgc2lnbmF0dXJlCisgKiB0eXBlLgorICoKKyAqIFRoZSBkYXRhIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBoYXNoIGlzIHRoZSB0aHJlZSBibG9ja3MgbWVudGlvbmVkCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgfEF2YlZCTWV0YUltYWdlSGVhZGVyfCBleGNlcHQgZm9yIHRoZSBkYXRhCisgKiBpbiB0aGUgIkF1dGhlbnRpY2F0aW9uIGRhdGEiIGJsb2NrLgorICoKKyAqIEZvciBzaWduYXR1cmVzIHdpdGggUlNBIGtleXMsIFBLQ1MgdjEuNSBwYWRkaW5nIGlzIHVzZWQuIFRoZSBwdWJsaWMKKyAqIGtleSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgYXV4aWxpYXJ5IGRhdGEgYmxvY2ssIHNlZQorICogfEF2YlJTQVB1YmxpY0tleUhlYWRlcnwgZm9yIHRoZSBzZXJpYWxpemF0aW9uIGZvcm1hdC4KKyAqCisgKiBFYWNoIGFsZ29yaXRobSB0eXBlIGlzIGRlc2NyaWJlZCBiZWxvdzoKKyAqCisgKiBBVkJfQUxHT1JJVEhNX1RZUEVfTk9ORTogVGhlcmUgaXMgbm8gaGFzaCwgbm8gc2lnbmF0dXJlIG9mIHRoZQorICogZGF0YSwgYW5kIG5vIHB1YmxpYyBrZXkuIFRoZSBkYXRhIGNhbm5vdCBiZSB2ZXJpZmllZC4gVGhlIGZpZWxkcworICogfGhhc2hfc2l6ZXwsIHxzaWduYXR1cmVfc2l6ZXwsIGFuZCB8cHVibGljX2tleV9zaXplfCBtdXN0IGJlIHplcm8uCisgKgorICogQVZCX0FMR09SSVRITV9UWVBFX1NIQTI1Nl9SU0EyMDQ4OiBUaGUgaGFzaCBmdW5jdGlvbiB1c2VkIGlzCisgKiBTSEEtMjU2LCByZXN1bHRpbmcgaW4gMzIgYnl0ZXMgb2YgaGFzaCBkaWdlc3QgZGF0YS4gVGhpcyBoYXNoIGlzCisgKiBzaWduZWQgd2l0aCBhIDIwNDgtYml0IFJTQSBrZXkuIFRoZSBmaWVsZCB8aGFzaF9zaXplfCBtdXN0IGJlIDMyLAorICogfHNpZ25hdHVyZV9zaXplfCBtdXN0IGJlIDI1NiwgYW5kIHRoZSBwdWJsaWMga2V5IGRhdGEgbXVzdCBoYXZlCisgKiB8a2V5X251bV9iaXRzfCBzZXQgdG8gMjA0OC4KKyAqCisgKiBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBMjU2X1JTQTQwOTY6IExpa2UgYWJvdmUsIGJ1dCBvbmx5IHdpdGgKKyAqIGEgNDA5Ni1iaXQgUlNBIGtleSBhbmQgfHNpZ25hdHVyZV9zaXplfCBzZXQgdG8gNTEyLgorICoKKyAqIEFWQl9BTEdPUklUSE1fVFlQRV9TSEEyNTZfUlNBODE5MjogTGlrZSBhYm92ZSwgYnV0IG9ubHkgd2l0aAorICogYSA4MTkyLWJpdCBSU0Ega2V5IGFuZCB8c2lnbmF0dXJlX3NpemV8IHNldCB0byAxMDI0LgorICoKKyAqIEFWQl9BTEdPUklUSE1fVFlQRV9TSEE1MTJfUlNBMjA0ODogVGhlIGhhc2ggZnVuY3Rpb24gdXNlZCBpcworICogU0hBLTUxMiwgcmVzdWx0aW5nIGluIDY0IGJ5dGVzIG9mIGhhc2ggZGlnZXN0IGRhdGEuIFRoaXMgaGFzaCBpcworICogc2lnbmVkIHdpdGggYSAyMDQ4LWJpdCBSU0Ega2V5LiBUaGUgZmllbGQgfGhhc2hfc2l6ZXwgbXVzdCBiZSA2NCwKKyAqIHxzaWduYXR1cmVfc2l6ZXwgbXVzdCBiZSAyNTYsIGFuZCB0aGUgcHVibGljIGtleSBkYXRhIG11c3QgaGF2ZQorICogfGtleV9udW1fYml0c3wgc2V0IHRvIDIwNDguCisgKgorICogQVZCX0FMR09SSVRITV9UWVBFX1NIQTUxMl9SU0E0MDk2OiBMaWtlIGFib3ZlLCBidXQgb25seSB3aXRoCisgKiBhIDQwOTYtYml0IFJTQSBrZXkgYW5kIHxzaWduYXR1cmVfc2l6ZXwgc2V0IHRvIDUxMi4KKyAqCisgKiBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBNTEyX1JTQTgxOTI6IExpa2UgYWJvdmUsIGJ1dCBvbmx5IHdpdGgKKyAqIGEgODE5Mi1iaXQgUlNBIGtleSBhbmQgfHNpZ25hdHVyZV9zaXplfCBzZXQgdG8gMTAyNC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgQVZCX0FMR09SSVRITV9UWVBFX05PTkUsCisgIEFWQl9BTEdPUklUSE1fVFlQRV9TSEEyNTZfUlNBMjA0OCwKKyAgQVZCX0FMR09SSVRITV9UWVBFX1NIQTI1Nl9SU0E0MDk2LAorICBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBMjU2X1JTQTgxOTIsCisgIEFWQl9BTEdPUklUSE1fVFlQRV9TSEE1MTJfUlNBMjA0OCwKKyAgQVZCX0FMR09SSVRITV9UWVBFX1NIQTUxMl9SU0E0MDk2LAorICBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBNTEyX1JTQTgxOTIsCisgIF9BVkJfQUxHT1JJVEhNX05VTV9UWVBFUworfSBBdmJBbGdvcml0aG1UeXBlOworCisvKiBIb2xkcyBhbGdvcml0aG0tc3BlY2lmaWMgZGF0YS4gVGhlIHxwYWRkaW5nfCBpcyBuZWVkZWQgYnkgYXZiX3JzYV92ZXJpZnkuICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IHVpbnQ4X3QqIHBhZGRpbmc7CisgIHNpemVfdCBwYWRkaW5nX2xlbjsKKyAgc2l6ZV90IGhhc2hfbGVuOworfSBBdmJBbGdvcml0aG1EYXRhOworCisvKiBQcm92aWRlcyBhbGdvcml0aG0tc3BlY2lmaWMgZGF0YSBmb3IgYSBnaXZlbiB8YWxnb3JpdGhtfC4gUmV0dXJucyBOVUxMIGlmCisgKiB8YWxnb3JpdGhtfCBpcyBpbnZhbGlkLgorICovCitjb25zdCBBdmJBbGdvcml0aG1EYXRhKiBhdmJfZ2V0X2FsZ29yaXRobV9kYXRhKEF2YkFsZ29yaXRobVR5cGUgYWxnb3JpdGhtKQorICAgIEFWQl9BVFRSX1dBUk5fVU5VU0VEX1JFU1VMVDsKKworLyogVGhlIGhlYWRlciBmb3IgYSBzZXJpYWxpemVkIFJTQSBwdWJsaWMga2V5LgorICoKKyAqIFRoZSBzaXplIG9mIHRoZSBrZXkgaXMgZ2l2ZW4gYnkgfGtleV9udW1fYml0c3wsIGZvciBleGFtcGxlIDIwNDgKKyAqIGZvciBhIFJTQS0yMDQ4IGtleS4gQnkgZGVmaW5pdGlvbiwgYSBSU0EgcHVibGljIGtleSBpcyB0aGUgcGFpciAobiwKKyAqIGUpIHdoZXJlIHxufCBpcyB0aGUgbW9kdWx1cyAod2hpY2ggY2FuIGJlIHJlcHJlc2VudGVkIGluCisgKiB8a2V5X251bV9iaXRzfCBiaXRzKSBhbmQgfGV8IGlzIHRoZSBwdWJsaWMgZXhwb25lbnQuIFRoZSBleHBvbmVudAorICogaXMgbm90IHN0b3JlZCBzaW5jZSBpdCdzIGFzc3VtZWQgdG8gYWx3YXlzIGJlIDY1NTM3LgorICoKKyAqIFRvIG9wdGltaXplIHZlcmlmaWNhdGlvbiwgdGhlIGtleSBibG9jayBpbmNsdWRlcyB0d28gcHJlY29tcHV0ZWQKKyAqIHZhbHVlcywgfG4waW52fCAoZml0cyBpbiAzMiBiaXRzKSBhbmQgfHJyfCBhbmQgY2FuIGFsd2F5cyBiZQorICogcmVwcmVzZW50ZWQgaW4gfGtleV9udW1fYml0c3wuCisKKyAqIFRoZSB2YWx1ZSB8bjBpbnZ8IGlzIHRoZSB2YWx1ZSAtMS9uWzBdIChtb2QgMl4zMikuIFRoZSB2YWx1ZSB8cnJ8CisgKiBpcyAoMl5rZXlfbnVtX2JpdHMpXjIgKG1vZCBuKS4KKyAqCisgKiBGb2xsb3dpbmcgdGhpcyBoZWFkZXIgaXMgfGtleV9udW1fYml0c3wgYml0cyBvZiB8bnwsIHRoZW4KKyAqIHxrZXlfbnVtX2JpdHN8IGJpdHMgb2YgfHJyfC4gQm90aCB2YWx1ZXMgYXJlIHN0b3JlZCB3aXRoIG1vc3QKKyAqIHNpZ25pZmljYW50IGJpdCBmaXJzdC4gRWFjaCBzZXJpYWxpemVkIG51bWJlciB0YWtlcyB1cAorICogfGtleV9udW1fYml0c3wvOCBieXRlcy4KKyAqCisgKiBBbGwgZmllbGRzIGluIHRoaXMgc3RydWN0IGFyZSBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyIHdoZW4KKyAqIHNlcmlhbGl6ZWQuICBUbyBnZW5lcmF0ZSBhIGNvcHkgd2l0aCBmaWVsZHMgc3dhcHBlZCB0byBuYXRpdmUgYnl0ZQorICogb3JkZXIsIHVzZSB0aGUgZnVuY3Rpb24gYXZiX3JzYV9wdWJsaWNfa2V5X2hlYWRlcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoKS4KKyAqCisgKiBUaGUgYXZiX3JzYV92ZXJpZnkoKSBmdW5jdGlvbiBleHBlY3RzIGEga2V5IGluIHRoaXMgc2VyaWFsaXplZAorICogZm9ybWF0LgorICoKKyAqIFRoZSAnYXZidG9vbCBleHRyYWN0X3B1YmxpY19rZXknIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYQorICogc2VyaWFsaXplZCBSU0EgcHVibGljIGtleS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQXZiUlNBUHVibGljS2V5SGVhZGVyIHsKKyAgdWludDMyX3Qga2V5X251bV9iaXRzOworICB1aW50MzJfdCBuMGludjsKK30gQVZCX0FUVFJfUEFDS0VEIEF2YlJTQVB1YmxpY0tleUhlYWRlcjsKKworLyogQ29waWVzIHxzcmN8IHRvIHxkZXN0fCBhbmQgdmFsaWRhdGVzLCBieXRlLXN3YXBwaW5nIGZpZWxkcyBpbiB0aGUKKyAqIHByb2Nlc3MgaWYgbmVlZGVkLiBSZXR1cm5zIHRydWUgaWYgdmFsaWQsIGZhbHNlIGlmIGludmFsaWQuCisgKi8KK2Jvb2wgYXZiX3JzYV9wdWJsaWNfa2V5X2hlYWRlcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoCisgICAgY29uc3QgQXZiUlNBUHVibGljS2V5SGVhZGVyKiBzcmMsCisgICAgQXZiUlNBUHVibGljS2V5SGVhZGVyKiBkZXN0KSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBVkJfQ1JZUFRPX0hfICovCmRpZmYgLS1naXQgYS9hdmIvbGliYXZiL2F2Yl9kZXNjcmlwdG9yLmMgYi9hdmIvbGliYXZiL2F2Yl9kZXNjcmlwdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4ZTkyNQotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX2Rlc2NyaXB0b3IuYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImF2Yl9kZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiYXZiX3V0aWwuaCIKKyNpbmNsdWRlICJhdmJfdmJtZXRhX2ltYWdlLmgiCisKK2Jvb2wgYXZiX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKGNvbnN0IEF2YkRlc2NyaXB0b3IqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2YkRlc2NyaXB0b3IqIGRlc3QpIHsKKyAgZGVzdC0+dGFnID0gYXZiX2JlNjR0b2goc3JjLT50YWcpOworICBkZXN0LT5udW1fYnl0ZXNfZm9sbG93aW5nID0gYXZiX2JlNjR0b2goc3JjLT5udW1fYnl0ZXNfZm9sbG93aW5nKTsKKworICBpZiAoKGRlc3QtPm51bV9ieXRlc19mb2xsb3dpbmcgJiAweDA3KSAhPSAwKSB7CisgICAgYXZiX2Vycm9yKCJEZXNjcmlwdG9yIHNpemUgaXMgbm90IGRpdmlzaWJsZSBieSA4LlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIGF2Yl9kZXNjcmlwdG9yX2ZvcmVhY2goY29uc3QgdWludDhfdCogaW1hZ2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW1hZ2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmJEZXNjcmlwdG9yRm9yZWFjaEZ1bmMgZm9yZWFjaF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSkgeworICBjb25zdCBBdmJWQk1ldGFJbWFnZUhlYWRlciogaGVhZGVyID0gTlVMTDsKKyAgYm9vbCByZXQgPSBmYWxzZTsKKyAgY29uc3QgdWludDhfdCogaW1hZ2VfZW5kOworICBjb25zdCB1aW50OF90KiBkZXNjX3N0YXJ0OworICBjb25zdCB1aW50OF90KiBkZXNjX2VuZDsKKyAgY29uc3QgdWludDhfdCogcDsKKworICBpZiAoaW1hZ2VfZGF0YSA9PSBOVUxMKSB7CisgICAgYXZiX2Vycm9yKCJpbWFnZV9kYXRhIGlzIE5VTExcbi4iKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGlmIChmb3JlYWNoX2Z1bmMgPT0gTlVMTCkgeworICAgIGF2Yl9lcnJvcigiZm9yZWFjaF9mdW5jIGlzIE5VTExcbi4iKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGlmIChpbWFnZV9zaXplIDwgc2l6ZW9mKEF2YlZCTWV0YUltYWdlSGVhZGVyKSkgeworICAgIGF2Yl9lcnJvcigiTGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiBoZWFkZXIuXG4iKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIEVuc3VyZSBtYWdpYyBpcyBjb3JyZWN0LiAqLworICBpZiAoYXZiX21lbWNtcChpbWFnZV9kYXRhLCBBVkJfTUFHSUMsIEFWQl9NQUdJQ19MRU4pICE9IDApIHsKKyAgICBhdmJfZXJyb3IoIk1hZ2ljIGlzIGluY29ycmVjdC5cbiIpOworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogQ2FyZWZ1bCwgbm90IGJ5dGVzd2FwcGVkIC0gYWxzbyBlbnN1cmUgaXQncyBhbGlnbmVkIHByb3Blcmx5LiAqLworICBhdmJfYXNzZXJ0X2FsaWduZWQoaW1hZ2VfZGF0YSk7CisgIGhlYWRlciA9IChjb25zdCBBdmJWQk1ldGFJbWFnZUhlYWRlciopaW1hZ2VfZGF0YTsKKyAgaW1hZ2VfZW5kID0gaW1hZ2VfZGF0YSArIGltYWdlX3NpemU7CisKKyAgZGVzY19zdGFydCA9IGltYWdlX2RhdGEgKyBzaXplb2YoQXZiVkJNZXRhSW1hZ2VIZWFkZXIpICsKKyAgICAgICAgICAgICAgIGF2Yl9iZTY0dG9oKGhlYWRlci0+YXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplKSArCisgICAgICAgICAgICAgICBhdmJfYmU2NHRvaChoZWFkZXItPmRlc2NyaXB0b3JzX29mZnNldCk7CisKKyAgZGVzY19lbmQgPSBkZXNjX3N0YXJ0ICsgYXZiX2JlNjR0b2goaGVhZGVyLT5kZXNjcmlwdG9yc19zaXplKTsKKworICBpZiAoZGVzY19zdGFydCA8IGltYWdlX2RhdGEgfHwgZGVzY19zdGFydCA+IGltYWdlX2VuZCB8fAorICAgICAgZGVzY19lbmQgPCBpbWFnZV9kYXRhIHx8IGRlc2NfZW5kID4gaW1hZ2VfZW5kIHx8IGRlc2NfZW5kIDwgZGVzY19zdGFydCkgeworICAgIGF2Yl9lcnJvcigiRGVzY3JpcHRvcnMgbm90IGluc2lkZSBwYXNzZWQtaW4gZGF0YS5cbiIpOworICAgIGdvdG8gb3V0OworICB9CisKKyAgZm9yIChwID0gZGVzY19zdGFydDsgcCA8IGRlc2NfZW5kOykgeworICAgIGNvbnN0IEF2YkRlc2NyaXB0b3IqIGRoID0gKGNvbnN0IEF2YkRlc2NyaXB0b3IqKXA7CisgICAgYXZiX2Fzc2VydF9hbGlnbmVkKGRoKTsKKyAgICB1aW50NjRfdCBuYl9mb2xsb3dpbmcgPSBhdmJfYmU2NHRvaChkaC0+bnVtX2J5dGVzX2ZvbGxvd2luZyk7CisgICAgdWludDY0X3QgbmJfdG90YWwgPSBzaXplb2YoQXZiRGVzY3JpcHRvcikgKyBuYl9mb2xsb3dpbmc7CisKKyAgICBpZiAoKG5iX3RvdGFsICYgNykgIT0gMCkgeworICAgICAgYXZiX2Vycm9yKCJJbnZhbGlkIGRlc2NyaXB0b3IgbGVuZ3RoLlxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAobmJfdG90YWwgKyBwIDwgZGVzY19zdGFydCB8fCBuYl90b3RhbCArIHAgPiBkZXNjX2VuZCkgeworICAgICAgYXZiX2Vycm9yKCJJbnZhbGlkIGRhdGEgaW4gZGVzY3JpcHRvcnMgYXJyYXkuXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChmb3JlYWNoX2Z1bmMoZGgsIHVzZXJfZGF0YSkgPT0gMCkgeworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgcCArPSBuYl90b3RhbDsKKyAgfQorCisgIHJldCA9IHRydWU7CisKK291dDoKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJvb2wgY291bnRfZGVzY3JpcHRvcnMoY29uc3QgQXZiRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSkgeworICBzaXplX3QqIG51bV9kZXNjcmlwdG9ycyA9IHVzZXJfZGF0YTsKKyAgKm51bV9kZXNjcmlwdG9ycyArPSAxOworICByZXR1cm4gdHJ1ZTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzaXplX3QgZGVzY3JpcHRvcl9udW1iZXI7CisgIGNvbnN0IEF2YkRlc2NyaXB0b3IqKiBkZXNjcmlwdG9yczsKK30gU2V0RGVzY3JpcHRvckRhdGE7CisKK3N0YXRpYyBib29sIHNldF9kZXNjcmlwdG9ycyhjb25zdCBBdmJEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCB2b2lkKiB1c2VyX2RhdGEpIHsKKyAgU2V0RGVzY3JpcHRvckRhdGEqIGRhdGEgPSB1c2VyX2RhdGE7CisgIGRhdGEtPmRlc2NyaXB0b3JzW2RhdGEtPmRlc2NyaXB0b3JfbnVtYmVyKytdID0gZGVzY3JpcHRvcjsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEF2YkRlc2NyaXB0b3IqKiBhdmJfZGVzY3JpcHRvcl9nZXRfYWxsKGNvbnN0IHVpbnQ4X3QqIGltYWdlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW1hZ2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogb3V0X251bV9kZXNjcmlwdG9ycykgeworICBzaXplX3QgbnVtX2Rlc2NyaXB0b3JzID0gMDsKKyAgU2V0RGVzY3JpcHRvckRhdGEgZGF0YTsKKworICBhdmJfZGVzY3JpcHRvcl9mb3JlYWNoKAorICAgICAgaW1hZ2VfZGF0YSwgaW1hZ2Vfc2l6ZSwgY291bnRfZGVzY3JpcHRvcnMsICZudW1fZGVzY3JpcHRvcnMpOworCisgIGRhdGEuZGVzY3JpcHRvcl9udW1iZXIgPSAwOworICBkYXRhLmRlc2NyaXB0b3JzID0KKyAgICAgIGF2Yl9jYWxsb2Moc2l6ZW9mKGNvbnN0IEF2YkRlc2NyaXB0b3IqKSAqIChudW1fZGVzY3JpcHRvcnMgKyAxKSk7CisgIGlmIChkYXRhLmRlc2NyaXB0b3JzID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBhdmJfZGVzY3JpcHRvcl9mb3JlYWNoKGltYWdlX2RhdGEsIGltYWdlX3NpemUsIHNldF9kZXNjcmlwdG9ycywgJmRhdGEpOworICBhdmJfYXNzZXJ0KGRhdGEuZGVzY3JpcHRvcl9udW1iZXIgPT0gbnVtX2Rlc2NyaXB0b3JzKTsKKworICBpZiAob3V0X251bV9kZXNjcmlwdG9ycyAhPSBOVUxMKSB7CisgICAgKm91dF9udW1fZGVzY3JpcHRvcnMgPSBudW1fZGVzY3JpcHRvcnM7CisgIH0KKworICByZXR1cm4gZGF0YS5kZXNjcmlwdG9yczsKK30KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX2Rlc2NyaXB0b3IuaCBiL2F2Yi9saWJhdmIvYXZiX2Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDBmMGM2Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yi9hdmJfZGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoQVZCX0lOU0lERV9MSUJBVkJfSCkgJiYgIWRlZmluZWQoQVZCX0NPTVBJTEFUSU9OKQorI2Vycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSwgaW5jbHVkZSBsaWJhdmIuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIEFWQl9ERVNDUklQVE9SX0hfCisjZGVmaW5lIEFWQl9ERVNDUklQVE9SX0hfCisKKyNpbmNsdWRlICJhdmJfc3lzZGVwcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFdlbGwta25vd24gZGVzY3JpcHRvciB0YWdzLgorICoKKyAqIEFWQl9ERVNDUklQVE9SX1RBR19QUk9QRVJUWTogc2VlIHxBdmJQcm9wZXJ0eURlc2NyaXB0b3J8IHN0cnVjdC4KKyAqIEFWQl9ERVNDUklQVE9SX1RBR19IQVNIVFJFRTogc2VlIHxBdmJIYXNodHJlZURlc2NyaXB0b3J8IHN0cnVjdC4KKyAqIEFWQl9ERVNDUklQVE9SX1RBR19IQVNIOiBzZWUgfEF2Ykhhc2hEZXNjcmlwdG9yfCBzdHJ1Y3QuCisgKiBBVkJfREVTQ1JJUFRPUl9UQUdfS0VSTkVMX0NNRExJTkU6IHNlZSB8QXZiS2VybmVsQ21kbGluZURlc2NyaXB0b3J8IHN0cnVjdC4KKyAqIEFWQl9ERVNDUklQVE9SX1RBR19DSEFJTl9QQVJUSVRJT046IHNlZSB8QXZiQ2hhaW5QYXJ0aXRpb25EZXNjcmlwdG9yfCBzdHJ1Y3QuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEFWQl9ERVNDUklQVE9SX1RBR19QUk9QRVJUWSwKKyAgQVZCX0RFU0NSSVBUT1JfVEFHX0hBU0hUUkVFLAorICBBVkJfREVTQ1JJUFRPUl9UQUdfSEFTSCwKKyAgQVZCX0RFU0NSSVBUT1JfVEFHX0tFUk5FTF9DTURMSU5FLAorICBBVkJfREVTQ1JJUFRPUl9UQUdfQ0hBSU5fUEFSVElUSU9OLAorfSBBdmJEZXNjcmlwdG9yVGFnOworCisvKiBUaGUgaGVhZGVyIGZvciBhIHNlcmlhbGl6ZWQgZGVzY3JpcHRvci4KKyAqCisgKiBBIGRlc2NyaXB0b3IgYWx3YXlzIGhhdmUgdHdvIGZpZWxkcywgYSB8dGFnfCAoZGVub3RpbmcgaXRzIHR5cGUsCisgKiBzZWUgdGhlIHxBdmJEZXNjcmlwdG9yVGFnfCBlbnVtZXJhdGlvbikgYW5kIHRoZSBzaXplIG9mIHRoZSBieXRlcworICogZm9sbG93aW5nLCB8bnVtX2J5dGVzX2ZvbGxvd2luZ3wuCisgKgorICogRm9yIHBhZGRpbmcsIHxudW1fYnl0ZXNfZm9sbG93aW5nfCBpcyBhbHdheXMgYSBtdWx0aXBsZSBvZiA4LgorICovCit0eXBlZGVmIHN0cnVjdCBBdmJEZXNjcmlwdG9yIHsKKyAgdWludDY0X3QgdGFnOworICB1aW50NjRfdCBudW1fYnl0ZXNfZm9sbG93aW5nOworfSBBVkJfQVRUUl9QQUNLRUQgQXZiRGVzY3JpcHRvcjsKKworLyogQ29waWVzIHxzcmN8IHRvIHxkZXN0fCBhbmQgdmFsaWRhdGVzLCBieXRlLXN3YXBwaW5nIGZpZWxkcyBpbiB0aGUKKyAqIHByb2Nlc3MgaWYgbmVlZGVkLiBSZXR1cm5zIHRydWUgaWYgdmFsaWQsIGZhbHNlIGlmIGludmFsaWQuCisgKgorICogRGF0YSBmb2xsb3dpbmcgdGhlIHN0cnVjdCBpcyBub3QgdmFsaWRhdGVkIG5vciBjb3BpZWQuCisgKi8KK2Jvb2wgYXZiX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKAorICAgIGNvbnN0IEF2YkRlc2NyaXB0b3IqIHNyYywgQXZiRGVzY3JpcHRvciogZGVzdCkgQVZCX0FUVFJfV0FSTl9VTlVTRURfUkVTVUxUOworCisvKiBTaWduYXR1cmUgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgaW4gYXZiX2Rlc2NyaXB0b3JfZm9yZWFjaCgpLgorICogVGhlIHBhc3NlZCBpbiBkZXNjcmlwdG9yIGlzIGdpdmVuIGJ5IHxkZXNjcmlwdG9yfCBhbmQgdGhlCisgKiB8dXNlcl9kYXRhfCBwYXNzZWQgdG8gYXZiX2Rlc2NyaXB0b3JfZm9yZWFjaCgpIGZ1bmN0aW9uIGlzIGluCisgKiB8dXNlcl9kYXRhfC4gUmV0dXJuIHRydWUgdG8gY29udGludWUgaXRlcmF0aW5nLCBmYWxzZSB0byBzdG9wCisgKiBpdGVyYXRpbmcuCisgKgorICogTm90ZSB0aGF0IHxkZXNjcmlwdG9yfCBwb2ludHMgaW50byB0aGUgaW1hZ2UgcGFzc2VkIHRvCisgKiBhdmJfZGVzY3JpcHRvcl9mb3JlYWNoKCkgLSBhbGwgZmllbGRzIG5lZWQgdG8gYmUgYnl0ZXN3YXBwZWQhCisgKi8KK3R5cGVkZWYgYm9vbCBBdmJEZXNjcmlwdG9yRm9yZWFjaEZ1bmMoY29uc3QgQXZiRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcl9kYXRhKTsKKworLyogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGFsbCBkZXNjcmlwdG9ycyBpbiBhbiB2Ym1ldGEKKyAqIGltYWdlLgorICoKKyAqIFRoZSBmdW5jdGlvbiBnaXZlbiBieSB8Zm9yZWFjaF9mdW5jfCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaAorICogZGVzY3JpcHRvci4gVGhlIGdpdmVuIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdHJ1ZSB0byBjb250aW51ZQorICogaXRlcmF0aW5nLCBmYWxzZSB0byBzdG9wLgorICoKKyAqIFRoZSB8dXNlcl9kYXRhfCBwYXJhbWV0ZXIgd2lsbCBiZSBwYXNzZWQgdG8gfGZvcmVhY2hfZnVuY3wuCisgKgorICogUmV0dXJucyBmYWxzZSBpZiB0aGUgaXRlcmF0aW9uIHdhcyBzaG9ydC1jaXJjdWl0ZWQsIHRoYXQgaXMgaWYKKyAqIGFuIGludm9jYXRpb24gb2YgfGZvcmVhY2hfZnVuY3wgcmV0dXJuZWQgZmFsc2UuCisgKgorICogQmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24sIHlvdSBNVVNUIHZlcmlmeSB8aW1hZ2VfZGF0YXwgd2l0aAorICogYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoKSBhbmQgcmVqZWN0IGl0IHVubGVzcyBpdCdzIHNpZ25lZCBieSBhIGtub3duCisgKiBnb29kIHB1YmxpYyBrZXkuIEFkZGl0aW9uYWxseSwgfGltYWdlX2RhdGF8IG11c3QgYmUgd29yZC1hbGlnbmVkLgorICovCitib29sIGF2Yl9kZXNjcmlwdG9yX2ZvcmVhY2goY29uc3QgdWludDhfdCogaW1hZ2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW1hZ2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmJEZXNjcmlwdG9yRm9yZWFjaEZ1bmMgZm9yZWFjaF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSk7CisKKy8qIEdldHMgYWxsIGRlc2NyaXB0b3JzIGluIGEgdmJtZXRhIGltYWdlLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBOVUxMLXBvaW50ZXIgdGVybWluYXRlZCBhcnJheSBvZgorICogQXZiRGVzY3JpcHRvciBwb2ludGVycy4gRnJlZSB3aXRoIGF2Yl9mcmVlKCkgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aAorICogaXQuIElmIHxvdXRfbnVtX2Rlc2NyaXB0b3JzfCBpcyBub24tTlVMTCwgdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycworICogd2lsbCBiZSByZXR1cm5lZCB0aGVyZS4KKyAqCisgKiBOb3RlIHRoYXQgZWFjaCBBdmJEZXNjcmlwdG9yIHBvaW50ZXIgaW4gdGhlIGFycmF5IHBvaW50cyBpbnRvCisgKiB8aW1hZ2VfZGF0YXwgLSBhbGwgZmllbGRzIG5lZWQgdG8gYmUgYnl0ZXN3YXBwZWQhCisgKgorICogQmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24sIHlvdSBNVVNUIHZlcmlmeSB8aW1hZ2VfZGF0YXwgd2l0aAorICogYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoKSBhbmQgcmVqZWN0IGl0IHVubGVzcyBpdCdzIHNpZ25lZCBieSBhIGtub3duCisgKiBnb29kIHB1YmxpYyBrZXkuIEFkZGl0aW9uYWxseSwgfGltYWdlX2RhdGF8IG11c3QgYmUgd29yZC1hbGlnbmVkLgorICovCitjb25zdCBBdmJEZXNjcmlwdG9yKiogYXZiX2Rlc2NyaXB0b3JfZ2V0X2FsbChjb25zdCB1aW50OF90KiBpbWFnZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGltYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIG91dF9udW1fZGVzY3JpcHRvcnMpCisgICAgQVZCX0FUVFJfV0FSTl9VTlVTRURfUkVTVUxUOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQVZCX0RFU0NSSVBUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX2Zvb3Rlci5jIGIvYXZiL2xpYmF2Yi9hdmJfZm9vdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2ZWQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX2Zvb3Rlci5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJhdmJfZm9vdGVyLmgiCisjaW5jbHVkZSAiYXZiX3V0aWwuaCIKKworYm9vbCBhdmJfZm9vdGVyX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcChjb25zdCBBdmJGb290ZXIqIHNyYywgQXZiRm9vdGVyKiBkZXN0KSB7CisgIGF2Yl9tZW1jcHkoZGVzdCwgc3JjLCBzaXplb2YoQXZiRm9vdGVyKSk7CisKKyAgZGVzdC0+dmVyc2lvbl9tYWpvciA9IGF2Yl9iZTMydG9oKGRlc3QtPnZlcnNpb25fbWFqb3IpOworICBkZXN0LT52ZXJzaW9uX21pbm9yID0gYXZiX2JlMzJ0b2goZGVzdC0+dmVyc2lvbl9taW5vcik7CisKKyAgZGVzdC0+b3JpZ2luYWxfaW1hZ2Vfc2l6ZSA9IGF2Yl9iZTY0dG9oKGRlc3QtPm9yaWdpbmFsX2ltYWdlX3NpemUpOworICBkZXN0LT52Ym1ldGFfb2Zmc2V0ID0gYXZiX2JlNjR0b2goZGVzdC0+dmJtZXRhX29mZnNldCk7CisgIGRlc3QtPnZibWV0YV9zaXplID0gYXZiX2JlNjR0b2goZGVzdC0+dmJtZXRhX3NpemUpOworCisgIC8qIENoZWNrIHRoYXQgbWFnaWMgaXMgY29ycmVjdC4gKi8KKyAgaWYgKGF2Yl9zYWZlX21lbWNtcChkZXN0LT5tYWdpYywgQVZCX0ZPT1RFUl9NQUdJQywgQVZCX0ZPT1RFUl9NQUdJQ19MRU4pICE9CisgICAgICAwKSB7CisgICAgYXZiX2Vycm9yKCJGb290ZXIgbWFnaWMgaXMgaW5jb3JyZWN0LlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyogRW5zdXJlIHdlIGRvbid0IGF0dGVtcHQgdG8gYWNjZXNzIGFueSBmaWVsZHMgaWYgdGhlIGZvb3RlciBtYWpvcgorICAgKiB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAqLworICBpZiAoZGVzdC0+dmVyc2lvbl9tYWpvciA+IEFWQl9GT09URVJfTUFKT1JfVkVSU0lPTikgeworICAgIGF2Yl9lcnJvcigiTm8gc3VwcG9ydCBmb3IgZm9vdGVyIHZlcnNpb24uXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX2Zvb3Rlci5oIGIvYXZiL2xpYmF2Yi9hdmJfZm9vdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwN2M3NQotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX2Zvb3Rlci5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZChBVkJfSU5TSURFX0xJQkFWQl9IKSAmJiAhZGVmaW5lZChBVkJfQ09NUElMQVRJT04pCisjZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LCBpbmNsdWRlIGxpYmF2Yi5oIGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgQVZCX0ZPT1RFUl9IXworI2RlZmluZSBBVkJfRk9PVEVSX0hfCisKKyNpbmNsdWRlICJhdmJfc3lzZGVwcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIE1hZ2ljIGZvciB0aGUgZm9vdGVyLiAqLworI2RlZmluZSBBVkJfRk9PVEVSX01BR0lDICJBVkJmIgorI2RlZmluZSBBVkJfRk9PVEVSX01BR0lDX0xFTiA0CisKKy8qIFNpemUgb2YgdGhlIGZvb3Rlci4gKi8KKyNkZWZpbmUgQVZCX0ZPT1RFUl9TSVpFIDY0CisKKy8qIFRoZSBjdXJyZW50IE1BSk9SIGFuZCBNSU5PUiB2ZXJzaW9ucyB1c2VkIC0ga2VlcCBpbiBzeW5jIHdpdGggYXZidG9vbC4gKi8KKyNkZWZpbmUgQVZCX0ZPT1RFUl9NQUpPUl9WRVJTSU9OIDEKKyNkZWZpbmUgQVZCX0ZPT1RFUl9NSU5PUl9WRVJTSU9OIDAKKworLyogVGhlIHN0cnVjdCB1c2VkIGFzIGEgZm9vdGVyIHVzZWQgb24gcGFydGl0aW9ucywgdXNlZCB0byBmaW5kIHRoZQorICogQXZiVkJNZXRhSW1hZ2VIZWFkZXIgc3RydWN0LiBUaGlzIHN0cnVjdCBpcyBhbHdheXMgc3RvcmVkIGF0IHRoZQorICogZW5kIG9mIGEgcGFydGl0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBBdmJGb290ZXIgeworICAvKiAgIDA6IEZvdXIgYnl0ZXMgZXF1YWwgdG8gIkFWQmYiIChBVkJfRk9PVEVSX01BR0lDKS4gKi8KKyAgdWludDhfdCBtYWdpY1tBVkJfRk9PVEVSX01BR0lDX0xFTl07CisgIC8qICAgNDogVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGZvb3RlciBzdHJ1Y3QuICovCisgIHVpbnQzMl90IHZlcnNpb25fbWFqb3I7CisgIC8qICAgODogVGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIGZvb3RlciBzdHJ1Y3QuICovCisgIHVpbnQzMl90IHZlcnNpb25fbWlub3I7CisKKyAgLyogIDEyOiBUaGUgb3JpZ2luYWwgc2l6ZSBvZiB0aGUgaW1hZ2Ugb24gdGhlIHBhcnRpdGlvbi4gKi8KKyAgdWludDY0X3Qgb3JpZ2luYWxfaW1hZ2Vfc2l6ZTsKKworICAvKiAgMjA6IFRoZSBvZmZzZXQgb2YgdGhlIHxBdmJWQk1ldGFJbWFnZUhlYWRlcnwgc3RydWN0LiAqLworICB1aW50NjRfdCB2Ym1ldGFfb2Zmc2V0OworCisgIC8qICAyODogVGhlIHNpemUgb2YgdGhlIHZibWV0YSBibG9jayAoaGVhZGVyICsgYXV0aCArIGF1eCBibG9ja3MpLiAqLworICB1aW50NjRfdCB2Ym1ldGFfc2l6ZTsKKworICAvKiAgMzY6IFBhZGRpbmcgdG8gZW5zdXJlIHN0cnVjdCBpcyBzaXplIEFWQl9GT09URVJfU0laRSBieXRlcy4gVGhpcworICAgKiBtdXN0IGJlIHNldCB0byB6ZXJvZXMuCisgICAqLworICB1aW50OF90IHJlc2VydmVkWzI4XTsKK30gQVZCX0FUVFJfUEFDS0VEIEF2YkZvb3RlcjsKKworLyogQ29waWVzIHxzcmN8IHRvIHxkZXN0fCBhbmQgdmFsaWRhdGVzLCBieXRlLXN3YXBwaW5nIGZpZWxkcyBpbiB0aGUKKyAqIHByb2Nlc3MgaWYgbmVlZGVkLiBSZXR1cm5zIHRydWUgaWYgdmFsaWQsIGZhbHNlIGlmIGludmFsaWQuCisgKi8KK2Jvb2wgYXZiX2Zvb3Rlcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoY29uc3QgQXZiRm9vdGVyKiBzcmMsIEF2YkZvb3RlciogZGVzdCkKKyAgICBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBVkJfRk9PVEVSX0hfICovCmRpZmYgLS1naXQgYS9hdmIvbGliYXZiL2F2Yl9oYXNoX2Rlc2NyaXB0b3IuYyBiL2F2Yi9saWJhdmIvYXZiX2hhc2hfZGVzY3JpcHRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDI3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiL2F2Yl9oYXNoX2Rlc2NyaXB0b3IuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiYXZiX2hhc2hfZGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImF2Yl91dGlsLmgiCisKK2Jvb2wgYXZiX2hhc2hfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoY29uc3QgQXZiSGFzaERlc2NyaXB0b3IqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZiSGFzaERlc2NyaXB0b3IqIGRlc3QpIHsKKyAgdWludDY0X3QgZXhwZWN0ZWRfc2l6ZTsKKworICBhdmJfbWVtY3B5KGRlc3QsIHNyYywgc2l6ZW9mKEF2Ykhhc2hEZXNjcmlwdG9yKSk7CisKKyAgaWYgKCFhdmJfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoKGNvbnN0IEF2YkRlc2NyaXB0b3IqKXNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF2YkRlc2NyaXB0b3IqKWRlc3QpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoZGVzdC0+cGFyZW50X2Rlc2NyaXB0b3IudGFnICE9IEFWQl9ERVNDUklQVE9SX1RBR19IQVNIKSB7CisgICAgYXZiX2Vycm9yKCJJbnZhbGlkIHRhZyBmb3IgaGFzaCBkZXNjcmlwdG9yLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+aW1hZ2Vfc2l6ZSA9IGF2Yl9iZTY0dG9oKGRlc3QtPmltYWdlX3NpemUpOworICBkZXN0LT5wYXJ0aXRpb25fbmFtZV9sZW4gPSBhdmJfYmUzMnRvaChkZXN0LT5wYXJ0aXRpb25fbmFtZV9sZW4pOworICBkZXN0LT5zYWx0X2xlbiA9IGF2Yl9iZTMydG9oKGRlc3QtPnNhbHRfbGVuKTsKKyAgZGVzdC0+ZGlnZXN0X2xlbiA9IGF2Yl9iZTMydG9oKGRlc3QtPmRpZ2VzdF9sZW4pOworCisgIC8qIENoZWNrIHRoYXQgcGFydGl0aW9uX25hbWUsIHNhbHQsIGFuZCBkaWdlc3QgYXJlIGZ1bGx5IGNvbnRhaW5lZC4gKi8KKyAgZXhwZWN0ZWRfc2l6ZSA9IHNpemVvZihBdmJIYXNoRGVzY3JpcHRvcikgLSBzaXplb2YoQXZiRGVzY3JpcHRvcik7CisgIGlmICghYXZiX3NhZmVfYWRkX3RvKCZleHBlY3RlZF9zaXplLCBkZXN0LT5wYXJ0aXRpb25fbmFtZV9sZW4pIHx8CisgICAgICAhYXZiX3NhZmVfYWRkX3RvKCZleHBlY3RlZF9zaXplLCBkZXN0LT5zYWx0X2xlbikgfHwKKyAgICAgICFhdmJfc2FmZV9hZGRfdG8oJmV4cGVjdGVkX3NpemUsIGRlc3QtPmRpZ2VzdF9sZW4pKSB7CisgICAgYXZiX2Vycm9yKCJPdmVyZmxvdyB3aGlsZSBhZGRpbmcgdXAgc2l6ZXMuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGV4cGVjdGVkX3NpemUgPiBkZXN0LT5wYXJlbnRfZGVzY3JpcHRvci5udW1fYnl0ZXNfZm9sbG93aW5nKSB7CisgICAgYXZiX2Vycm9yKCJEZXNjcmlwdG9yIHBheWxvYWQgc2l6ZSBvdmVyZmxvdy5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX2hhc2hfZGVzY3JpcHRvci5oIGIvYXZiL2xpYmF2Yi9hdmJfaGFzaF9kZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2ODExOAotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX2hhc2hfZGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZChBVkJfSU5TSURFX0xJQkFWQl9IKSAmJiAhZGVmaW5lZChBVkJfQ09NUElMQVRJT04pCisjZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LCBpbmNsdWRlIGxpYmF2Yi5oIGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgQVZCX0hBU0hfREVTQ1JJUFRPUl9IXworI2RlZmluZSBBVkJfSEFTSF9ERVNDUklQVE9SX0hfCisKKyNpbmNsdWRlICJhdmJfZGVzY3JpcHRvci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEEgZGVzY3JpcHRvciBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGhhc2ggZm9yIGFuIGltYWdlLgorICoKKyAqIFRoaXMgZGVzY3JpcHRvciBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgYm9vdCBwYXJ0aXRpb25zIHRvIHZlcmlmeSB0aGUKKyAqIGVudGlyZSBrZXJuZWwraW5pdHJhbWZzIGltYWdlIGJlZm9yZSBleGVjdXRpbmcgaXQuCisgKgorICogRm9sbG93aW5nIHRoaXMgc3RydWN0IGFyZSB8cGFydGl0aW9uX25hbWVfbGVufCBieXRlcyBvZiB0aGUKKyAqIHBhcnRpdGlvbiBuYW1lIChVVEYtOCBlbmNvZGVkKSwgfHNhbHRfbGVufCBieXRlcyBvZiBzYWx0LCBhbmQgdGhlbgorICogfGRpZ2VzdF9sZW58IGJ5dGVzIG9mIHRoZSBkaWdlc3QuCisgKgorICogVGhlIHxyZXNlcnZlZHwgZmllbGQgaXMgZm9yIGZ1dHVyZSBleHBhbnNpb24gYW5kIG11c3QgYmUgc2V0IHRvIE5VTAorICogYnl0ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IEF2Ykhhc2hEZXNjcmlwdG9yIHsKKyAgQXZiRGVzY3JpcHRvciBwYXJlbnRfZGVzY3JpcHRvcjsKKyAgdWludDY0X3QgaW1hZ2Vfc2l6ZTsKKyAgdWludDhfdCBoYXNoX2FsZ29yaXRobVszMl07CisgIHVpbnQzMl90IHBhcnRpdGlvbl9uYW1lX2xlbjsKKyAgdWludDMyX3Qgc2FsdF9sZW47CisgIHVpbnQzMl90IGRpZ2VzdF9sZW47CisgIHVpbnQ4X3QgcmVzZXJ2ZWRbNjRdOworfSBBVkJfQVRUUl9QQUNLRUQgQXZiSGFzaERlc2NyaXB0b3I7CisKKy8qIENvcGllcyB8c3JjfCB0byB8ZGVzdHwgYW5kIHZhbGlkYXRlcywgYnl0ZS1zd2FwcGluZyBmaWVsZHMgaW4gdGhlCisgKiBwcm9jZXNzIGlmIG5lZWRlZC4gUmV0dXJucyB0cnVlIGlmIHZhbGlkLCBmYWxzZSBpZiBpbnZhbGlkLgorICoKKyAqIERhdGEgZm9sbG93aW5nIHRoZSBzdHJ1Y3QgaXMgbm90IHZhbGlkYXRlZCBub3IgY29waWVkLgorICovCitib29sIGF2Yl9oYXNoX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKGNvbnN0IEF2Ykhhc2hEZXNjcmlwdG9yKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2Ykhhc2hEZXNjcmlwdG9yKiBkZXN0KQorICAgIEFWQl9BVFRSX1dBUk5fVU5VU0VEX1JFU1VMVDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFWQl9IQVNIX0RFU0NSSVBUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX2hhc2h0cmVlX2Rlc2NyaXB0b3IuYyBiL2F2Yi9saWJhdmIvYXZiX2hhc2h0cmVlX2Rlc2NyaXB0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTYxZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yi9hdmJfaGFzaHRyZWVfZGVzY3JpcHRvci5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJhdmJfaGFzaHRyZWVfZGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImF2Yl91dGlsLmgiCisKK2Jvb2wgYXZiX2hhc2h0cmVlX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKAorICAgIGNvbnN0IEF2Ykhhc2h0cmVlRGVzY3JpcHRvciogc3JjLCBBdmJIYXNodHJlZURlc2NyaXB0b3IqIGRlc3QpIHsKKyAgdWludDY0X3QgZXhwZWN0ZWRfc2l6ZTsKKworICBhdmJfbWVtY3B5KGRlc3QsIHNyYywgc2l6ZW9mKEF2Ykhhc2h0cmVlRGVzY3JpcHRvcikpOworCisgIGlmICghYXZiX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKChjb25zdCBBdmJEZXNjcmlwdG9yKilzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdmJEZXNjcmlwdG9yKilkZXN0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGRlc3QtPnBhcmVudF9kZXNjcmlwdG9yLnRhZyAhPSBBVkJfREVTQ1JJUFRPUl9UQUdfSEFTSFRSRUUpIHsKKyAgICBhdmJfZXJyb3IoIkludmFsaWQgdGFnIGZvciBoYXNodHJlZSBkZXNjcmlwdG9yLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+ZG1fdmVyaXR5X3ZlcnNpb24gPSBhdmJfYmUzMnRvaChkZXN0LT5kbV92ZXJpdHlfdmVyc2lvbik7CisgIGRlc3QtPmltYWdlX3NpemUgPSBhdmJfYmU2NHRvaChkZXN0LT5pbWFnZV9zaXplKTsKKyAgZGVzdC0+dHJlZV9vZmZzZXQgPSBhdmJfYmU2NHRvaChkZXN0LT50cmVlX29mZnNldCk7CisgIGRlc3QtPnRyZWVfc2l6ZSA9IGF2Yl9iZTY0dG9oKGRlc3QtPnRyZWVfc2l6ZSk7CisgIGRlc3QtPmRhdGFfYmxvY2tfc2l6ZSA9IGF2Yl9iZTMydG9oKGRlc3QtPmRhdGFfYmxvY2tfc2l6ZSk7CisgIGRlc3QtPmhhc2hfYmxvY2tfc2l6ZSA9IGF2Yl9iZTMydG9oKGRlc3QtPmhhc2hfYmxvY2tfc2l6ZSk7CisgIGRlc3QtPmZlY19udW1fcm9vdHMgPSBhdmJfYmUzMnRvaChkZXN0LT5mZWNfbnVtX3Jvb3RzKTsKKyAgZGVzdC0+ZmVjX29mZnNldCA9IGF2Yl9iZTY0dG9oKGRlc3QtPmZlY19vZmZzZXQpOworICBkZXN0LT5mZWNfc2l6ZSA9IGF2Yl9iZTY0dG9oKGRlc3QtPmZlY19zaXplKTsKKyAgZGVzdC0+cGFydGl0aW9uX25hbWVfbGVuID0gYXZiX2JlMzJ0b2goZGVzdC0+cGFydGl0aW9uX25hbWVfbGVuKTsKKyAgZGVzdC0+c2FsdF9sZW4gPSBhdmJfYmUzMnRvaChkZXN0LT5zYWx0X2xlbik7CisgIGRlc3QtPnJvb3RfZGlnZXN0X2xlbiA9IGF2Yl9iZTMydG9oKGRlc3QtPnJvb3RfZGlnZXN0X2xlbik7CisKKyAgLyogQ2hlY2sgdGhhdCBwYXJ0aXRpb25fbmFtZSwgc2FsdCwgYW5kIHJvb3RfZGlnZXN0IGFyZSBmdWxseSBjb250YWluZWQuICovCisgIGV4cGVjdGVkX3NpemUgPSBzaXplb2YoQXZiSGFzaHRyZWVEZXNjcmlwdG9yKSAtIHNpemVvZihBdmJEZXNjcmlwdG9yKTsKKyAgaWYgKCFhdmJfc2FmZV9hZGRfdG8oJmV4cGVjdGVkX3NpemUsIGRlc3QtPnBhcnRpdGlvbl9uYW1lX2xlbikgfHwKKyAgICAgICFhdmJfc2FmZV9hZGRfdG8oJmV4cGVjdGVkX3NpemUsIGRlc3QtPnNhbHRfbGVuKSB8fAorICAgICAgIWF2Yl9zYWZlX2FkZF90bygmZXhwZWN0ZWRfc2l6ZSwgZGVzdC0+cm9vdF9kaWdlc3RfbGVuKSkgeworICAgIGF2Yl9lcnJvcigiT3ZlcmZsb3cgd2hpbGUgYWRkaW5nIHVwIHNpemVzLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChleHBlY3RlZF9zaXplID4gZGVzdC0+cGFyZW50X2Rlc2NyaXB0b3IubnVtX2J5dGVzX2ZvbGxvd2luZykgeworICAgIGF2Yl9lcnJvcigiRGVzY3JpcHRvciBwYXlsb2FkIHNpemUgb3ZlcmZsb3cuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9hdmIvbGliYXZiL2F2Yl9oYXNodHJlZV9kZXNjcmlwdG9yLmggYi9hdmIvbGliYXZiL2F2Yl9oYXNodHJlZV9kZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhYWZiZgotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX2hhc2h0cmVlX2Rlc2NyaXB0b3IuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoQVZCX0lOU0lERV9MSUJBVkJfSCkgJiYgIWRlZmluZWQoQVZCX0NPTVBJTEFUSU9OKQorI2Vycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSwgaW5jbHVkZSBsaWJhdmIuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIEFWQl9IQVNIVFJFRV9ERVNDUklQVE9SX0hfCisjZGVmaW5lIEFWQl9IQVNIVFJFRV9ERVNDUklQVE9SX0hfCisKKyNpbmNsdWRlICJhdmJfZGVzY3JpcHRvci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEEgZGVzY3JpcHRvciBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgZG0tdmVyaXR5IGhhc2h0cmVlLgorICoKKyAqIEhhc2gtdHJlZXMgYXJlIHVzZWQgdG8gdmVyaWZ5IGxhcmdlIHBhcnRpdGlvbnMgdHlwaWNhbGx5IGNvbnRhaW5pbmcKKyAqIGZpbGUgc3lzdGVtcy4gU2VlCisgKiBodHRwczovL2dpdGxhYi5jb20vY3J5cHRzZXR1cC9jcnlwdHNldHVwL3dpa2lzL0RNVmVyaXR5IGZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBhYm91dCBkbS12ZXJpdHkuCisgKgorICogRm9sbG93aW5nIHRoaXMgc3RydWN0IGFyZSB8cGFydGl0aW9uX25hbWVfbGVufCBieXRlcyBvZiB0aGUKKyAqIHBhcnRpdGlvbiBuYW1lIChVVEYtOCBlbmNvZGVkKSwgfHNhbHRfbGVufCBieXRlcyBvZiBzYWx0LCBhbmQgdGhlbgorICogfHJvb3RfZGlnZXN0X2xlbnwgYnl0ZXMgb2YgdGhlIHJvb3QgZGlnZXN0LgorICoKKyAqIFRoZSB8cmVzZXJ2ZWR8IGZpZWxkIGlzIGZvciBmdXR1cmUgZXhwYW5zaW9uIGFuZCBtdXN0IGJlIHNldCB0byBOVUwKKyAqIGJ5dGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBBdmJIYXNodHJlZURlc2NyaXB0b3IgeworICBBdmJEZXNjcmlwdG9yIHBhcmVudF9kZXNjcmlwdG9yOworICB1aW50MzJfdCBkbV92ZXJpdHlfdmVyc2lvbjsKKyAgdWludDY0X3QgaW1hZ2Vfc2l6ZTsKKyAgdWludDY0X3QgdHJlZV9vZmZzZXQ7CisgIHVpbnQ2NF90IHRyZWVfc2l6ZTsKKyAgdWludDMyX3QgZGF0YV9ibG9ja19zaXplOworICB1aW50MzJfdCBoYXNoX2Jsb2NrX3NpemU7CisgIHVpbnQzMl90IGZlY19udW1fcm9vdHM7CisgIHVpbnQ2NF90IGZlY19vZmZzZXQ7CisgIHVpbnQ2NF90IGZlY19zaXplOworICB1aW50OF90IGhhc2hfYWxnb3JpdGhtWzMyXTsKKyAgdWludDMyX3QgcGFydGl0aW9uX25hbWVfbGVuOworICB1aW50MzJfdCBzYWx0X2xlbjsKKyAgdWludDMyX3Qgcm9vdF9kaWdlc3RfbGVuOworICB1aW50OF90IHJlc2VydmVkWzY0XTsKK30gQVZCX0FUVFJfUEFDS0VEIEF2Ykhhc2h0cmVlRGVzY3JpcHRvcjsKKworLyogQ29waWVzIHxzcmN8IHRvIHxkZXN0fCBhbmQgdmFsaWRhdGVzLCBieXRlLXN3YXBwaW5nIGZpZWxkcyBpbiB0aGUKKyAqIHByb2Nlc3MgaWYgbmVlZGVkLiBSZXR1cm5zIHRydWUgaWYgdmFsaWQsIGZhbHNlIGlmIGludmFsaWQuCisgKgorICogRGF0YSBmb2xsb3dpbmcgdGhlIHN0cnVjdCBpcyBub3QgdmFsaWRhdGVkIG5vciBjb3BpZWQuCisgKi8KK2Jvb2wgYXZiX2hhc2h0cmVlX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKAorICAgIGNvbnN0IEF2Ykhhc2h0cmVlRGVzY3JpcHRvciogc3JjLAorICAgIEF2Ykhhc2h0cmVlRGVzY3JpcHRvciogZGVzdCkgQVZCX0FUVFJfV0FSTl9VTlVTRURfUkVTVUxUOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQVZCX0hBU0hUUkVFX0RFU0NSSVBUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX2tlcm5lbF9jbWRsaW5lX2Rlc2NyaXB0b3IuYyBiL2F2Yi9saWJhdmIvYXZiX2tlcm5lbF9jbWRsaW5lX2Rlc2NyaXB0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzUyMWYyCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yi9hdmJfa2VybmVsX2NtZGxpbmVfZGVzY3JpcHRvci5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJhdmJfa2VybmVsX2NtZGxpbmVfZGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImF2Yl91dGlsLmgiCisKK2Jvb2wgYXZiX2tlcm5lbF9jbWRsaW5lX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKAorICAgIGNvbnN0IEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yKiBzcmMsIEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yKiBkZXN0KSB7CisgIHVpbnQ2NF90IGV4cGVjdGVkX3NpemU7CisKKyAgYXZiX21lbWNweShkZXN0LCBzcmMsIHNpemVvZihBdmJLZXJuZWxDbWRsaW5lRGVzY3JpcHRvcikpOworCisgIGlmICghYXZiX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKChjb25zdCBBdmJEZXNjcmlwdG9yKilzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdmJEZXNjcmlwdG9yKilkZXN0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGRlc3QtPnBhcmVudF9kZXNjcmlwdG9yLnRhZyAhPSBBVkJfREVTQ1JJUFRPUl9UQUdfS0VSTkVMX0NNRExJTkUpIHsKKyAgICBhdmJfZXJyb3IoIkludmFsaWQgdGFnIGZvciBrZXJuZWwgY21kbGluZSBkZXNjcmlwdG9yLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+ZmxhZ3MgPSBhdmJfYmUzMnRvaChkZXN0LT5mbGFncyk7CisgIGRlc3QtPmtlcm5lbF9jbWRsaW5lX2xlbmd0aCA9IGF2Yl9iZTMydG9oKGRlc3QtPmtlcm5lbF9jbWRsaW5lX2xlbmd0aCk7CisKKyAgLyogQ2hlY2sgdGhhdCBrZXJuZWxfY21kbGluZSBpcyBmdWxseSBjb250YWluZWQuICovCisgIGV4cGVjdGVkX3NpemUgPSBzaXplb2YoQXZiS2VybmVsQ21kbGluZURlc2NyaXB0b3IpIC0gc2l6ZW9mKEF2YkRlc2NyaXB0b3IpOworICBpZiAoIWF2Yl9zYWZlX2FkZF90bygmZXhwZWN0ZWRfc2l6ZSwgZGVzdC0+a2VybmVsX2NtZGxpbmVfbGVuZ3RoKSkgeworICAgIGF2Yl9lcnJvcigiT3ZlcmZsb3cgd2hpbGUgYWRkaW5nIHVwIHNpemVzLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChleHBlY3RlZF9zaXplID4gZGVzdC0+cGFyZW50X2Rlc2NyaXB0b3IubnVtX2J5dGVzX2ZvbGxvd2luZykgeworICAgIGF2Yl9lcnJvcigiRGVzY3JpcHRvciBwYXlsb2FkIHNpemUgb3ZlcmZsb3cuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX2tlcm5lbF9jbWRsaW5lX2Rlc2NyaXB0b3IuaCBiL2F2Yi9saWJhdmIvYXZiX2tlcm5lbF9jbWRsaW5lX2Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTA4YjNiCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yi9hdmJfa2VybmVsX2NtZGxpbmVfZGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZChBVkJfSU5TSURFX0xJQkFWQl9IKSAmJiAhZGVmaW5lZChBVkJfQ09NUElMQVRJT04pCisjZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LCBpbmNsdWRlIGxpYmF2Yi5oIGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgQVZCX0tFUk5FTF9DTURMSU5FX0RFU0NSSVBUT1JfSF8KKyNkZWZpbmUgQVZCX0tFUk5FTF9DTURMSU5FX0RFU0NSSVBUT1JfSF8KKworI2luY2x1ZGUgImF2Yl9kZXNjcmlwdG9yLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRmxhZ3MgZm9yIGtlcm5lbCBjb21tYW5kLWxpbmUgZGVzY3JpcHRvcnMuCisgKgorICogQVZCX0tFUk5FTF9DTURMSU5FX0ZMQUdTX1VTRV9PTkxZX0lGX0hBU0hUUkVFX05PVF9ESVNBQkxFRDogVGhlCisgKiBjbWRsaW5lIHdpbGwgb25seSBiZSBhcHBsaWVkIGlmIGhhc2h0cmVlIHZlcmlmaWNhdGlvbiBpcyBub3QKKyAqIGRpc2FibGVkIChjZi4gQVZCX1ZCTUVUQV9JTUFHRV9GTEFHU19IQVNIVFJFRV9ESVNBQkxFRCkuCisgKgorICogQVZCX0tFUk5FTF9DTURMSU5FX0ZMQUdTX1VTRV9PTkxZX0lGX0hBU0hUUkVFX0RJU0FCTEVEOiBUaGUgY21kbGluZQorICogd2lsbCBvbmx5IGJlIGFwcGxpZWQgaWYgaGFzaHRyZWUgdmVyaWZpY2F0aW9uIGlzIGRpc2FibGVkCisgKiAoY2YuIEFWQl9WQk1FVEFfSU1BR0VfRkxBR1NfSEFTSFRSRUVfRElTQUJMRUQpLgorICovCit0eXBlZGVmIGVudW0geworICBBVkJfS0VSTkVMX0NNRExJTkVfRkxBR1NfVVNFX09OTFlfSUZfSEFTSFRSRUVfTk9UX0RJU0FCTEVEID0gKDEgPDwgMCksCisgIEFWQl9LRVJORUxfQ01ETElORV9GTEFHU19VU0VfT05MWV9JRl9IQVNIVFJFRV9ESVNBQkxFRCA9ICgxIDw8IDEpCit9IEF2Yktlcm5lbENtZGxpbmVGbGFnczsKKworLyogQSBkZXNjcmlwdG9yIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGtlcm5lbAorICogY29tbWFuZC1saW5lLgorICoKKyAqIFRoZSB8ZmxhZ3N8IGZpZWxkIGNvbnRhaW5zIGZsYWdzIGZyb20gdGhlIEF2Yktlcm5lbENtZGxpbmVGbGFncworICogZW51bWVyYXRpb24uCisgKgorICogRm9sbG93aW5nIHRoaXMgc3RydWN0IGFyZSB8a2VybmVsX2NtZGxpbmVfbGVufCBieXRlcyB3aXRoIHRoZQorICoga2VybmVsIGNvbW1hbmQtbGluZSAoVVRGLTggZW5jb2RlZCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yIHsKKyAgQXZiRGVzY3JpcHRvciBwYXJlbnRfZGVzY3JpcHRvcjsKKyAgdWludDMyX3QgZmxhZ3M7CisgIHVpbnQzMl90IGtlcm5lbF9jbWRsaW5lX2xlbmd0aDsKK30gQVZCX0FUVFJfUEFDS0VEIEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yOworCisvKiBDb3BpZXMgfHNyY3wgdG8gfGRlc3R8IGFuZCB2YWxpZGF0ZXMsIGJ5dGUtc3dhcHBpbmcgZmllbGRzIGluIHRoZQorICogcHJvY2VzcyBpZiBuZWVkZWQuIFJldHVybnMgdHJ1ZSBpZiB2YWxpZCwgZmFsc2UgaWYgaW52YWxpZC4KKyAqCisgKiBEYXRhIGZvbGxvd2luZyB0aGUgc3RydWN0IGlzIG5vdCB2YWxpZGF0ZWQgbm9yIGNvcGllZC4KKyAqLworYm9vbCBhdmJfa2VybmVsX2NtZGxpbmVfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoCisgICAgY29uc3QgQXZiS2VybmVsQ21kbGluZURlc2NyaXB0b3IqIHNyYywKKyAgICBBdmJLZXJuZWxDbWRsaW5lRGVzY3JpcHRvciogZGVzdCkgQVZCX0FUVFJfV0FSTl9VTlVTRURfUkVTVUxUOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQVZCX0tFUk5FTF9DTURMSU5FX0RFU0NSSVBUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX29wcy5oIGIvYXZiL2xpYmF2Yi9hdmJfb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4YzY2YwotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX29wcy5oCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoQVZCX0lOU0lERV9MSUJBVkJfSCkgJiYgIWRlZmluZWQoQVZCX0NPTVBJTEFUSU9OKQorI2Vycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSwgaW5jbHVkZSBsaWJhdmIuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIEFWQl9PUFNfSF8KKyNkZWZpbmUgQVZCX09QU19IXworCisjaW5jbHVkZSAiYXZiX3N5c2RlcHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBSZXR1cm4gY29kZXMgdXNlZCBmb3IgSS9PIG9wZXJhdGlvbnMuCisgKgorICogQVZCX0lPX1JFU1VMVF9PSyBpcyByZXR1cm5lZCBpZiB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiB3YXMKKyAqIHN1Y2Nlc3NmdWwuCisgKgorICogQVZCX0lPX1JFU1VMVF9FUlJPUl9JTyBpcyByZXR1cm5lZCBpZiB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSAoZGlzaworICogb3Igb3RoZXIgc3Vic3lzdGVtKSBlbmNvdW50ZXJlZCBhbiBJL08gZXJyb3IuCisgKgorICogQVZCX0lPX1JFU1VMVF9FUlJPUl9PT00gaXMgcmV0dXJuZWQgaWYgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeS4KKyAqCisgKiBBVkJfSU9fUkVTVUxUX0VSUk9SX05PX1NVQ0hfUEFSVElUSU9OIGlzIHJldHVybmVkIGlmIHRoZSByZXF1ZXN0ZWQKKyAqIHBhcnRpdGlvbiBkb2VzIG5vdCBleGlzdC4KKyAqCisgKiBBVkJfSU9fUkVTVUxUX0VSUk9SX1JBTkdFX09VVFNJREVfUEFSVElUSU9OIGlzIHJldHVybmVkIGlmIHRoZQorICogcmFuZ2Ugb2YgYnl0ZXMgcmVxdWVzdGVkIHRvIGJlIHJlYWQgb3Igd3JpdHRlbiBpcyBvdXRzaWRlIHRoZSByYW5nZQorICogb2YgdGhlIHBhcnRpdGlvbi4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgQVZCX0lPX1JFU1VMVF9PSywKKyAgQVZCX0lPX1JFU1VMVF9FUlJPUl9PT00sCisgIEFWQl9JT19SRVNVTFRfRVJST1JfSU8sCisgIEFWQl9JT19SRVNVTFRfRVJST1JfTk9fU1VDSF9QQVJUSVRJT04sCisgIEFWQl9JT19SRVNVTFRfRVJST1JfUkFOR0VfT1VUU0lERV9QQVJUSVRJT04KK30gQXZiSU9SZXN1bHQ7CisKK3N0cnVjdCBBdmJPcHM7Cit0eXBlZGVmIHN0cnVjdCBBdmJPcHMgQXZiT3BzOworCisvKiBGb3J3YXJkLWRlY2xhcmF0aW9uIG9mIG9wZXJhdGlvbnMgaW4gbGliYXZiX2FiLiAqLworc3RydWN0IEF2YkFCT3BzOworCisvKiBGb3J3YXJkLWRlY2xhcmF0aW9uIG9mIG9wZXJhdGlvbnMgaW4gbGliYXZiX2F0eC4gKi8KK3N0cnVjdCBBdmJBdHhPcHM7CisKKy8qIEhpZ2gtbGV2ZWwgb3BlcmF0aW9ucy9mdW5jdGlvbnMvbWV0aG9kcyB0aGF0IGFyZSBwbGF0Zm9ybQorICogZGVwZW5kZW50LgorICovCitzdHJ1Y3QgQXZiT3BzIHsKKyAgLyogVGhpcyBwb2ludGVyIGNhbiBiZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi9ib290bG9hZGVyIHVzaW5nCisgICAqIGxpYmF2YiBhbmQgaXMgdHlwaWNhbGx5IHVzZWQgaW4gZWFjaCBvcGVyYXRpb24gdG8gZ2V0IGEgcG9pbnRlcgorICAgKiB0byBwbGF0Zm9ybS1zcGVjaWZpYyByZXNvdXJjZXMuIEl0IGNhbm5vdCBiZSB1c2VkIGJ5IGxpYnJhcmllcy4KKyAgICovCisgIHZvaWQqIHVzZXJfZGF0YTsKKworICAvKiBJZiBsaWJhdmJfYWIgaXMgdXNlZCwgdGhpcyBzaG91bGQgcG9pbnQgdG8gdGhlCisgICAqIEF2YkFCT3BzLiBPdGhlcndpc2UgaXQgbXVzdCBiZSBzZXQgdG8gTlVMTC4KKyAgICovCisgIHN0cnVjdCBBdmJBQk9wcyogYWJfb3BzOworCisgIC8qIElmIGxpYmF2Yl9hdHggaXMgdXNlZCwgdGhpcyBzaG91bGQgcG9pbnQgdG8gdGhlCisgICAqIEF2YkF0eE9wcy4gT3RoZXJ3aXNlIGl0IG11c3QgYmUgc2V0IHRvIE5VTEwuCisgICAqLworICBzdHJ1Y3QgQXZiQXR4T3BzKiBhdHhfb3BzOworCisgIC8qIFJlYWRzIHxudW1fYnl0ZXN8IGZyb20gb2Zmc2V0IHxvZmZzZXR8IGZyb20gcGFydGl0aW9uIHdpdGggbmFtZQorICAgKiB8cGFydGl0aW9ufCAoTlVMLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5nKS4gSWYgfG9mZnNldHwgaXMKKyAgICogbmVnYXRpdmUsIGl0cyBhYnNvbHV0ZSB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIG51bWJlcgorICAgKiBvZiBieXRlcyBmcm9tIHRoZSBlbmQgb2YgdGhlIHBhcnRpdGlvbi4KKyAgICoKKyAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIEFWQl9JT19SRVNVTFRfRVJST1JfTk9fU1VDSF9QQVJUSVRJT04gaWYKKyAgICogdGhlcmUgaXMgbm8gcGFydGl0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUsCisgICAqIEFWQl9JT19SRVNVTFRfRVJST1JfUkFOR0VfT1VUU0lERV9QQVJUSVRJT04gaWYgdGhlIHJlcXVlc3RlZAorICAgKiB8b2Zmc2V0fCBpcyBvdXRzaWRlIHRoZSBwYXJ0aXRpb24sIGFuZCBBVkJfSU9fUkVTVUxUX0VSUk9SX0lPIGlmCisgICAqIHRoZXJlIHdhcyBhbiBJL08gZXJyb3IgZnJvbSB0aGUgdW5kZXJseWluZyBJL08gc3Vic3lzdGVtLiAgSWYgdGhlCisgICAqIG9wZXJhdGlvbiBzdWNjZWVkcyBhcyByZXF1ZXN0ZWQgQVZCX0lPX1JFU1VMVF9PSyBpcyByZXR1cm5lZCBhbmQKKyAgICogdGhlIGRhdGEgaXMgYXZhaWxhYmxlIGluIHxidWZmZXJ8LgorICAgKgorICAgKiBUaGUgb25seSB0aW1lIHBhcnRpYWwgSS9PIG1heSBvY2N1ciBpcyBpZiByZWFkaW5nIGJleW9uZCB0aGUgZW5kCisgICAqIG9mIHRoZSBwYXJ0aXRpb24uIEluIHRoaXMgY2FzZSB0aGUgdmFsdWUgcmV0dXJuZWQgaW4KKyAgICogfG91dF9udW1fcmVhZHwgbWF5IGJlIHNtYWxsZXIgdGhhbiB8bnVtX2J5dGVzfC4KKyAgICovCisgIEF2YklPUmVzdWx0ICgqcmVhZF9mcm9tX3BhcnRpdGlvbikoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogb3V0X251bV9yZWFkKTsKKworICAvKiBXcml0ZXMgfG51bV9ieXRlc3wgZnJvbSB8YmZmZXJ8IGF0IG9mZnNldCB8b2Zmc2V0fCB0byBwYXJ0aXRpb24KKyAgICogd2l0aCBuYW1lIHxwYXJ0aXRpb258IChOVUwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmcpLiBJZiB8b2Zmc2V0fAorICAgKiBpcyBuZWdhdGl2ZSwgaXRzIGFic29sdXRlIHZhbHVlIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyB0aGUKKyAgICogbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiB0aGUgcGFydGl0aW9uLgorICAgKgorICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgQVZCX0lPX1JFU1VMVF9FUlJPUl9OT19TVUNIX1BBUlRJVElPTiBpZgorICAgKiB0aGVyZSBpcyBubyBwYXJ0aXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSwKKyAgICogQVZCX0lPX1JFU1VMVF9FUlJPUl9SQU5HRV9PVVRTSURFX1BBUlRJVElPTiBpZiB0aGUgcmVxdWVzdGVkCisgICAqIGJ5dGVyYW5nZSBnb2VzIG91dHNpZGUgdGhlIHBhcnRpdGlvbiwgYW5kIEFWQl9JT19SRVNVTFRfRVJST1JfSU8KKyAgICogaWYgdGhlcmUgd2FzIGFuIEkvTyBlcnJvciBmcm9tIHRoZSB1bmRlcmx5aW5nIEkvTyBzdWJzeXN0ZW0uICBJZgorICAgKiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGFzIHJlcXVlc3RlZCBBVkJfSU9fUkVTVUxUX09LIGlzCisgICAqIHJldHVybmVkLgorICAgKgorICAgKiBUaGlzIGZ1bmN0aW9uIG5ldmVyIGRvZXMgYW55IHBhcnRpYWwgSS9PLCBpdCBlaXRoZXIgdHJhbnNmZXJzIGFsbAorICAgKiBvZiB0aGUgcmVxdWVzdGVkIGJ5dGVzIG9yIHJldHVybnMgYW4gZXJyb3IuCisgICAqLworICBBdmJJT1Jlc3VsdCAoKndyaXRlX3RvX3BhcnRpdGlvbikoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWZmZXIpOworCisgIC8qIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcHVibGljIGtleSB1c2VkIHRvIHNpZ24gdGhlICd2Ym1ldGEnCisgICAqIHBhcnRpdGlvbiBpcyB0cnVzdGVkLiBCb290IGxvYWRlcnMgdHlwaWNhbGx5IGNvbXBhcmUgdGhpcyB3aXRoCisgICAqIGVtYmVkZGVkIGtleSBtYXRlcmlhbCBnZW5lcmF0ZWQgd2l0aCAnYXZidG9vbAorICAgKiBleHRyYWN0X3B1YmxpY19rZXknLgorICAgKgorICAgKiBUaGUgcHVibGljIGtleSBpcyBpbiB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSB8cHVibGljX2tleV9kYXRhfAorICAgKiBhbmQgaXMgb2YgfHB1YmxpY19rZXlfbGVuZ3RofCBieXRlcy4KKyAgICoKKyAgICogSWYgdGhlcmUgaXMgbm8gcHVibGljIGtleSBtZXRhZGF0YSAoc2V0IHdpdGggdGhlIGF2YnRvb2wgb3B0aW9uCisgICAqIC0tcHVibGljX2tleV9tZXRhZGF0YSkgdGhlbiB8cHVibGljX2tleV9tZXRhZGF0YXwgd2lsbCBiZSBzZXQgdG8KKyAgICogTlVMTC4gT3RoZXJ3aXNlIHRoaXMgZmllbGQgcG9pbnRzIHRvIHRoZSBkYXRhIHdoaWNoIGlzCisgICAqIHxwdWJsaWNfa2V5X21ldGFkYXRhX2xlbmd0aHwgYnl0ZXMgbG9uZy4KKyAgICoKKyAgICogSWYgQVZCX0lPX1JFU1VMVF9PSyBpcyByZXR1cm5lZCB0aGVuIHxvdXRfaXNfdHJ1c3RlZHwgaXMgc2V0IC0KKyAgICogdHJ1ZSBpZiB0cnVzdGVkIG9yIGZhbHNlIGlmIHVudHJ1c3RlZC4KKyAgICovCisgIEF2YklPUmVzdWx0ICgqdmFsaWRhdGVfdmJtZXRhX3B1YmxpY19rZXkpKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwdWJsaWNfa2V5X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwdWJsaWNfa2V5X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcHVibGljX2tleV9tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHB1YmxpY19rZXlfbWV0YWRhdGFfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBvdXRfaXNfdHJ1c3RlZCk7CisKKyAgLyogR2V0cyB0aGUgcm9sbGJhY2sgaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gZ2l2ZW4gYnkKKyAgICogfHJvbGxiYWNrX2luZGV4X2xvY2F0aW9ufC4gVGhlIHZhbHVlIGlzIHJldHVybmVkIGluCisgICAqIHxvdXRfcm9sbGJhY2tfaW5kZXh8LiBSZXR1cm5zIEFWQl9JT19SRVNVTFRfT0sgaWYgdGhlIHJvbGxiYWNrCisgICAqIGluZGV4IHdhcyByZXRyaWV2ZWQsIG90aGVyd2lzZSBhbiBlcnJvciBjb2RlLgorICAgKgorICAgKiBBIGRldmljZSBtYXkgaGF2ZSBhIGxpbWl0ZWQgYW1vdW50IG9mIHJvbGxiYWNrIGluZGV4IGxvY2F0aW9ucyAoc2F5LAorICAgKiBvbmUgb3IgZm91cikgc28gbWF5IGVycm9yIG91dCBpZiB8cm9sbGJhY2tfaW5kZXhfbG9jYXRpb258IGV4Y2VlZHMKKyAgICogdGhpcyBudW1iZXIuCisgICAqLworICBBdmJJT1Jlc3VsdCAoKnJlYWRfcm9sbGJhY2tfaW5kZXgpKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByb2xsYmFja19pbmRleF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogb3V0X3JvbGxiYWNrX2luZGV4KTsKKworICAvKiBTZXRzIHRoZSByb2xsYmFjayBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBnaXZlbiBieQorICAgKiB8cm9sbGJhY2tfaW5kZXhfbG9jYXRpb258IHRvIHxyb2xsYmFja19pbmRleHwuIFJldHVybnMKKyAgICogQVZCX0lPX1JFU1VMVF9PSyBpZiB0aGUgcm9sbGJhY2sgaW5kZXggd2FzIHNldCwgb3RoZXJ3aXNlIGFuCisgICAqIGVycm9yIGNvZGUuCisgICAqCisgICAqIEEgZGV2aWNlIG1heSBoYXZlIGEgbGltaXRlZCBhbW91bnQgb2Ygcm9sbGJhY2sgaW5kZXggbG9jYXRpb25zIChzYXksCisgICAqIG9uZSBvciBmb3VyKSBzbyBtYXkgZXJyb3Igb3V0IGlmIHxyb2xsYmFja19pbmRleF9sb2NhdGlvbnwgZXhjZWVkcworICAgKiB0aGlzIG51bWJlci4KKyAgICovCisgIEF2YklPUmVzdWx0ICgqd3JpdGVfcm9sbGJhY2tfaW5kZXgpKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHJvbGxiYWNrX2luZGV4KTsKKworICAvKiBHZXRzIHdoZXRoZXIgdGhlIGRldmljZSBpcyB1bmxvY2tlZC4gVGhlIHZhbHVlIGlzIHJldHVybmVkIGluCisgICAqIHxvdXRfaXNfdW5sb2NrZWR8ICh0cnVlIGlmIHVubG9ja2VkLCBmYWxzZSBvdGhlcndpc2UpLiBSZXR1cm5zCisgICAqIEFWQl9JT19SRVNVTFRfT0sgaWYgdGhlIHN0YXRlIHdhcyByZXRyaWV2ZWQsIG90aGVyd2lzZSBhbiBlcnJvcgorICAgKiBjb2RlLgorICAgKi8KKyAgQXZiSU9SZXN1bHQgKCpyZWFkX2lzX2RldmljZV91bmxvY2tlZCkoQXZiT3BzKiBvcHMsIGJvb2wqIG91dF9pc191bmxvY2tlZCk7CisKKyAgLyogR2V0cyB0aGUgdW5pcXVlIHBhcnRpdGlvbiBHVUlEIGZvciBhIHBhcnRpdGlvbiB3aXRoIG5hbWUgaW4KKyAgICogfHBhcnRpdGlvbnwgKE5VTC10ZXJtaW5hdGVkIFVURi04IHN0cmluZykuIFRoZSBHVUlEIGlzIGNvcGllZCBhcworICAgKiBhIHN0cmluZyBpbnRvIHxndWlkX2J1Znwgb2Ygc2l6ZSB8Z3VpZF9idWZfc2l6ZXwgYW5kIHdpbGwgYmUgTlVMCisgICAqIHRlcm1pbmF0ZWQuIFRoZSBzdHJpbmcgbXVzdCBiZSBsb3dlci1jYXNlIGFuZCBwcm9wZXJseQorICAgKiBoeXBoZW5hdGVkLiBGb3IgZXhhbXBsZToKKyAgICoKKyAgICogIDUyN2MxYzZkLTYzNjEtNDU5My04ODQyLTNjNzhmY2QzOTIxOQorICAgKgorICAgKiBSZXR1cm5zIEFWQl9JT19SRVNVTFRfT0sgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUuCisgICAqLworICBBdmJJT1Jlc3VsdCAoKmdldF91bmlxdWVfZ3VpZF9mb3JfcGFydGl0aW9uKShBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBndWlkX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGd1aWRfYnVmX3NpemUpOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFWQl9PUFNfSF8gKi8KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX3Byb3BlcnR5X2Rlc2NyaXB0b3IuYyBiL2F2Yi9saWJhdmIvYXZiX3Byb3BlcnR5X2Rlc2NyaXB0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWJhMmMwCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yi9hdmJfcHJvcGVydHlfZGVzY3JpcHRvci5jCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiYXZiX3Byb3BlcnR5X2Rlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJhdmJfdXRpbC5oIgorCitib29sIGF2Yl9wcm9wZXJ0eV9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgKKyAgICBjb25zdCBBdmJQcm9wZXJ0eURlc2NyaXB0b3IqIHNyYywgQXZiUHJvcGVydHlEZXNjcmlwdG9yKiBkZXN0KSB7CisgIHVpbnQ2NF90IGV4cGVjdGVkX3NpemU7CisKKyAgYXZiX21lbWNweShkZXN0LCBzcmMsIHNpemVvZihBdmJQcm9wZXJ0eURlc2NyaXB0b3IpKTsKKworICBpZiAoIWF2Yl9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgoY29uc3QgQXZiRGVzY3JpcHRvciopc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXZiRGVzY3JpcHRvciopZGVzdCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChkZXN0LT5wYXJlbnRfZGVzY3JpcHRvci50YWcgIT0gQVZCX0RFU0NSSVBUT1JfVEFHX1BST1BFUlRZKSB7CisgICAgYXZiX2Vycm9yKCJJbnZhbGlkIHRhZyBmb3IgcHJvcGVydHkgZGVzY3JpcHRvci5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmtleV9udW1fYnl0ZXMgPSBhdmJfYmU2NHRvaChkZXN0LT5rZXlfbnVtX2J5dGVzKTsKKyAgZGVzdC0+dmFsdWVfbnVtX2J5dGVzID0gYXZiX2JlNjR0b2goZGVzdC0+dmFsdWVfbnVtX2J5dGVzKTsKKworICAvKiBDaGVjayB0aGF0IGtleSBhbmQgdmFsdWUgYXJlIGZ1bGx5IGNvbnRhaW5lZC4gKi8KKyAgZXhwZWN0ZWRfc2l6ZSA9IHNpemVvZihBdmJQcm9wZXJ0eURlc2NyaXB0b3IpIC0gc2l6ZW9mKEF2YkRlc2NyaXB0b3IpICsgMjsKKyAgaWYgKCFhdmJfc2FmZV9hZGRfdG8oJmV4cGVjdGVkX3NpemUsIGRlc3QtPmtleV9udW1fYnl0ZXMpIHx8CisgICAgICAhYXZiX3NhZmVfYWRkX3RvKCZleHBlY3RlZF9zaXplLCBkZXN0LT52YWx1ZV9udW1fYnl0ZXMpKSB7CisgICAgYXZiX2Vycm9yKCJPdmVyZmxvdyB3aGlsZSBhZGRpbmcgdXAgc2l6ZXMuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGV4cGVjdGVkX3NpemUgPiBkZXN0LT5wYXJlbnRfZGVzY3JpcHRvci5udW1fYnl0ZXNfZm9sbG93aW5nKSB7CisgICAgYXZiX2Vycm9yKCJEZXNjcmlwdG9yIHBheWxvYWQgc2l6ZSBvdmVyZmxvdy5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIqIGtleTsKKyAgc2l6ZV90IGtleV9zaXplOworICBjb25zdCBjaGFyKiByZXRfdmFsdWU7CisgIHNpemVfdCByZXRfdmFsdWVfc2l6ZTsKK30gUHJvcGVydHlJdGVyYXRvckRhdGE7CisKK3N0YXRpYyBib29sIHByb3BlcnR5X2xvb2t1cF9kZXNjX2ZvcmVhY2goY29uc3QgQXZiRGVzY3JpcHRvciogaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpIHsKKyAgUHJvcGVydHlJdGVyYXRvckRhdGEqIGRhdGEgPSAoUHJvcGVydHlJdGVyYXRvckRhdGEqKXVzZXJfZGF0YTsKKyAgQXZiUHJvcGVydHlEZXNjcmlwdG9yIHByb3BfZGVzYzsKKyAgY29uc3QgdWludDhfdCogcDsKKyAgYm9vbCByZXQgPSB0cnVlOworCisgIGlmIChoZWFkZXItPnRhZyAhPSBBVkJfREVTQ1JJUFRPUl9UQUdfUFJPUEVSVFkpIHsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGlmICghYXZiX3Byb3BlcnR5X2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKAorICAgICAgICAgIChjb25zdCBBdmJQcm9wZXJ0eURlc2NyaXB0b3IqKWhlYWRlciwgJnByb3BfZGVzYykpIHsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIHAgPSAoY29uc3QgdWludDhfdCopaGVhZGVyOworICBpZiAocFtzaXplb2YoQXZiUHJvcGVydHlEZXNjcmlwdG9yKSArIHByb3BfZGVzYy5rZXlfbnVtX2J5dGVzXSAhPSAwKSB7CisgICAgYXZiX2Vycm9yKCJObyB0ZXJtaW5hdGluZyBOVUwgYnl0ZSBpbiBrZXkuXG4iKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGlmIChkYXRhLT5rZXlfc2l6ZSA9PSBwcm9wX2Rlc2Mua2V5X251bV9ieXRlcykgeworICAgIGlmIChhdmJfbWVtY21wKHAgKyBzaXplb2YoQXZiUHJvcGVydHlEZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgICAgICBkYXRhLT5rZXksCisgICAgICAgICAgICAgICAgICAgZGF0YS0+a2V5X3NpemUpID09IDApIHsKKyAgICAgIGRhdGEtPnJldF92YWx1ZSA9IChjb25zdCBjaGFyKikocCArIHNpemVvZihBdmJQcm9wZXJ0eURlc2NyaXB0b3IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcF9kZXNjLmtleV9udW1fYnl0ZXMgKyAxKTsKKyAgICAgIGRhdGEtPnJldF92YWx1ZV9zaXplID0gcHJvcF9kZXNjLnZhbHVlX251bV9ieXRlczsKKyAgICAgIC8qIFN0b3AgaXRlcmF0aW5nLiAqLworICAgICAgcmV0ID0gZmFsc2U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIH0KKworb3V0OgorICByZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyKiBhdmJfcHJvcGVydHlfbG9va3VwKGNvbnN0IHVpbnQ4X3QqIGltYWdlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbWFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBvdXRfdmFsdWVfc2l6ZSkgeworICBQcm9wZXJ0eUl0ZXJhdG9yRGF0YSBkYXRhOworCisgIGlmIChrZXlfc2l6ZSA9PSAwKSB7CisgICAga2V5X3NpemUgPSBhdmJfc3RybGVuKGtleSk7CisgIH0KKworICBkYXRhLmtleSA9IGtleTsKKyAgZGF0YS5rZXlfc2l6ZSA9IGtleV9zaXplOworCisgIGlmIChhdmJfZGVzY3JpcHRvcl9mb3JlYWNoKAorICAgICAgICAgIGltYWdlX2RhdGEsIGltYWdlX3NpemUsIHByb3BlcnR5X2xvb2t1cF9kZXNjX2ZvcmVhY2gsICZkYXRhKSA9PSAwKSB7CisgICAgaWYgKG91dF92YWx1ZV9zaXplICE9IE5VTEwpIHsKKyAgICAgICpvdXRfdmFsdWVfc2l6ZSA9IGRhdGEucmV0X3ZhbHVlX3NpemU7CisgICAgfQorICAgIHJldHVybiBkYXRhLnJldF92YWx1ZTsKKyAgfQorCisgIGlmIChvdXRfdmFsdWVfc2l6ZSAhPSBOVUxMKSB7CisgICAgKm91dF92YWx1ZV9zaXplID0gMDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworYm9vbCBhdmJfcHJvcGVydHlfbG9va3VwX3VpbnQ2NChjb25zdCB1aW50OF90KiBpbWFnZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW1hZ2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qga2V5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBvdXRfdmFsdWUpIHsKKyAgY29uc3QgY2hhciogdmFsdWU7CisgIGJvb2wgcmV0ID0gZmFsc2U7CisgIHVpbnQ2NF90IHBhcnNlZF92YWw7CisgIGludCBiYXNlOworICBpbnQgbjsKKworICB2YWx1ZSA9IGF2Yl9wcm9wZXJ0eV9sb29rdXAoaW1hZ2VfZGF0YSwgaW1hZ2Vfc2l6ZSwga2V5LCBrZXlfc2l6ZSwgTlVMTCk7CisgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgZ290byBvdXQ7CisgIH0KKworICBiYXNlID0gMTA7CisgIGlmIChhdmJfbWVtY21wKHZhbHVlLCAiMHgiLCAyKSA9PSAwKSB7CisgICAgYmFzZSA9IDE2OworICAgIHZhbHVlICs9IDI7CisgIH0KKworICBwYXJzZWRfdmFsID0gMDsKKyAgZm9yIChuID0gMDsgdmFsdWVbbl0gIT0gJ1wwJzsgbisrKSB7CisgICAgaW50IGMgPSB2YWx1ZVtuXTsKKyAgICBpbnQgZGlnaXQ7CisKKyAgICBwYXJzZWRfdmFsICo9IGJhc2U7CisKKyAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgIGRpZ2l0ID0gYyAtICcwJzsKKyAgICB9IGVsc2UgaWYgKGJhc2UgPT0gMTYgJiYgYyA+PSAnYScgJiYgYyA8PSAnZicpIHsKKyAgICAgIGRpZ2l0ID0gYyAtICdhJyArIDEwOworICAgIH0gZWxzZSBpZiAoYmFzZSA9PSAxNiAmJiBjID49ICdBJyAmJiBjIDw9ICdGJykgeworICAgICAgZGlnaXQgPSBjIC0gJ0EnICsgMTA7CisgICAgfSBlbHNlIHsKKyAgICAgIGF2Yl9lcnJvcigiSW52YWxpZCBkaWdpdC5cbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgcGFyc2VkX3ZhbCArPSBkaWdpdDsKKyAgfQorCisgIHJldCA9IHRydWU7CisgIGlmIChvdXRfdmFsdWUgIT0gTlVMTCkgeworICAgICpvdXRfdmFsdWUgPSBwYXJzZWRfdmFsOworICB9CisKK291dDoKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX3Byb3BlcnR5X2Rlc2NyaXB0b3IuaCBiL2F2Yi9saWJhdmIvYXZiX3Byb3BlcnR5X2Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmZlZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yi9hdmJfcHJvcGVydHlfZGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoQVZCX0lOU0lERV9MSUJBVkJfSCkgJiYgIWRlZmluZWQoQVZCX0NPTVBJTEFUSU9OKQorI2Vycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSwgaW5jbHVkZSBsaWJhdmIuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIEFWQl9QUk9QRVJUWV9ERVNDUklQVE9SX0hfCisjZGVmaW5lIEFWQl9QUk9QRVJUWV9ERVNDUklQVE9SX0hfCisKKyNpbmNsdWRlICJhdmJfZGVzY3JpcHRvci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEEgZGVzY3JpcHRvciBmb3IgcHJvcGVydGllcyAoZnJlZS1mb3JtIGtleS92YWx1ZSBwYWlycykuCisgKgorICogRm9sbG93aW5nIHRoaXMgc3RydWN0IGFyZSB8a2V5X251bV9ieXRlc3wgYnl0ZXMgb2Yga2V5IGRhdGEsCisgKiBmb2xsb3dlZCBieSBhIE5VTCBieXRlLCB0aGVuIHx2YWx1ZV9udW1fYnl0ZXN8IGJ5dGVzIG9mIHZhbHVlIGRhdGEsCisgKiBmb2xsb3dlZCBieSBhIE5VTCBieXRlIGFuZCB0aGVuIGVub3VnaCBwYWRkaW5nIHRvIG1ha2UgdGhlIGNvbWJpbmVkCisgKiBzaXplIGEgbXVsdGlwbGUgb2YgOC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQXZiUHJvcGVydHlEZXNjcmlwdG9yIHsKKyAgQXZiRGVzY3JpcHRvciBwYXJlbnRfZGVzY3JpcHRvcjsKKyAgdWludDY0X3Qga2V5X251bV9ieXRlczsKKyAgdWludDY0X3QgdmFsdWVfbnVtX2J5dGVzOworfSBBVkJfQVRUUl9QQUNLRUQgQXZiUHJvcGVydHlEZXNjcmlwdG9yOworCisvKiBDb3BpZXMgfHNyY3wgdG8gfGRlc3R8IGFuZCB2YWxpZGF0ZXMsIGJ5dGUtc3dhcHBpbmcgZmllbGRzIGluIHRoZQorICogcHJvY2VzcyBpZiBuZWVkZWQuIFJldHVybnMgdHJ1ZSBpZiB2YWxpZCwgZmFsc2UgaWYgaW52YWxpZC4KKyAqCisgKiBEYXRhIGZvbGxvd2luZyB0aGUgc3RydWN0IGlzIG5vdCB2YWxpZGF0ZWQgbm9yIGNvcGllZC4KKyAqLworYm9vbCBhdmJfcHJvcGVydHlfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoCisgICAgY29uc3QgQXZiUHJvcGVydHlEZXNjcmlwdG9yKiBzcmMsCisgICAgQXZiUHJvcGVydHlEZXNjcmlwdG9yKiBkZXN0KSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKy8qIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBsb29raW5nIHVwIHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSB3aXRoCisgKiBuYW1lIHxrZXl8IGluIGEgdmJtZXRhIGltYWdlLiBJZiB8a2V5X3NpemV8IGlzIDAsIHxrZXl8IG11c3QgYmUKKyAqIE5VTC10ZXJtaW5hdGVkLgorICoKKyAqIFRoZSB8aW1hZ2VfZGF0YXwgcGFyYW1ldGVyIG11c3QgYmUgYSBwb2ludGVyIHRvIGEgdmJtZXRhIGltYWdlIG9mCisgKiBzaXplIHxpbWFnZV9zaXplfC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBpbnNpZGUgdGhlIHBhc3NlZC1pbgorICogaW1hZ2Ugb3IgTlVMTCBpZiBub3QgZm91bmQuIE5vdGUgdGhhdCB0aGUgdmFsdWUgaXMgYWx3YXlzCisgKiBndWFyYW50ZWVkIHRvIGJlIGZvbGxvd2VkIGJ5IGEgTlVMIGJ5dGUuCisgKgorICogSWYgdGhlIHZhbHVlIHdhcyBmb3VuZCBhbmQgfG91dF92YWx1ZV9zaXplfCBpcyBub3QgTlVMTCwgdGhlIHNpemUKKyAqIG9mIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB0aGVyZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIE8obikgaW4gbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHNvIGlmIHlvdSBuZWVkIHRvCisgKiBsb29rIHVwIGEgbG90IG9mIHZhbHVlcywgeW91IG1heSB3YW50IHRvIGJ1aWxkIGEgbW9yZSBlZmZpY2llbnQKKyAqIGxvb2t1cC10YWJsZSBieSBtYW51YWxseSB3YWxraW5nIGFsbCBkZXNjcmlwdG9ycyB1c2luZworICogYXZiX2Rlc2NyaXB0b3JfZm9yZWFjaCgpLgorICoKKyAqIEJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uLCB5b3UgTVVTVCB2ZXJpZnkgfGltYWdlX2RhdGF8IHdpdGgKKyAqIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KCkgYW5kIHJlamVjdCBpdCB1bmxlc3MgaXQncyBzaWduZWQgYnkgYQorICoga25vd24gZ29vZCBwdWJsaWMga2V5LgorICovCitjb25zdCBjaGFyKiBhdmJfcHJvcGVydHlfbG9va3VwKGNvbnN0IHVpbnQ4X3QqIGltYWdlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbWFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBvdXRfdmFsdWVfc2l6ZSkKKyAgICBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKy8qIExpa2UgYXZiX3Byb3BlcnR5X2xvb2t1cCgpIGJ1dCBwYXJzZXMgdGhlIGludGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIHZhbHVlIGFzIGFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLiBCb3RoIGRlY2ltYWwgYW5kIGhleGFkZWNpbWFsCisgKiByZXByZXNlbnRhdGlvbnMgKGUuZy4gIjB4MmEiKSBhcmUgc3VwcG9ydGVkLiBSZXR1cm5zIGZhbHNlIG9uCisgKiBmYWlsdXJlIGFuZCB0cnVlIG9uIHN1Y2Nlc3MuIE9uIHN1Y2Nlc3MsIHRoZSBwYXJzZWQgdmFsdWUgaXMKKyAqIHJldHVybmVkIGluIHxvdXRfdmFsdWV8LgorICovCitib29sIGF2Yl9wcm9wZXJ0eV9sb29rdXBfdWludDY0KGNvbnN0IHVpbnQ4X3QqIGltYWdlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbWFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIG91dF92YWx1ZSkKKyAgICBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBVkJfUFJPUEVSVFlfREVTQ1JJUFRPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvYXZiL2xpYmF2Yi9hdmJfcnNhLmMgYi9hdmIvbGliYXZiL2F2Yl9yc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2VjYzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yi9hdmJfcnNhLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKy8qIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gT1MgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisgKi8KKworLyogSW1wbGVtZW50YXRpb24gb2YgUlNBIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gd2hpY2ggdXNlcyBhIHByZS1wcm9jZXNzZWQKKyAqIGtleSBmb3IgY29tcHV0YXRpb24uIFRoZSBjb2RlIGV4dGVuZHMgbGlibWluY3J5cHQgUlNBIHZlcmlmaWNhdGlvbiBjb2RlIHRvCisgKiBzdXBwb3J0IG11bHRpcGxlIFJTQSBrZXkgbGVuZ3RocyBhbmQgaGFzaCBkaWdlc3QgYWxnb3JpdGhtcy4KKyAqLworCisjaW5jbHVkZSAiYXZiX3JzYS5oIgorI2luY2x1ZGUgImF2Yl9zaGEuaCIKKyNpbmNsdWRlICJhdmJfdXRpbC5oIgorI2luY2x1ZGUgImF2Yl92Ym1ldGFfaW1hZ2UuaCIKKwordHlwZWRlZiBzdHJ1Y3QgS2V5IHsKKyAgdW5zaWduZWQgaW50IGxlbjsgLyogTGVuZ3RoIG9mIG5bXSBpbiBudW1iZXIgb2YgdWludDMyX3QgKi8KKyAgdWludDMyX3QgbjBpbnY7ICAgLyogLTEgLyBuWzBdIG1vZCAyXjMyICovCisgIHVpbnQzMl90KiBuOyAgICAgIC8qIG1vZHVsdXMgYXMgYXJyYXkgKGhvc3QtYnl0ZSBvcmRlcikgKi8KKyAgdWludDMyX3QqIHJyOyAgICAgLyogUl4yIGFzIGFycmF5IChob3N0LWJ5dGUgb3JkZXIpICovCit9IEtleTsKKworS2V5KiBwYXJzZV9rZXlfZGF0YShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CisgIEF2YlJTQVB1YmxpY0tleUhlYWRlciBoOworICBLZXkqIGtleSA9IE5VTEw7CisgIHNpemVfdCBleHBlY3RlZF9sZW5ndGg7CisgIHVuc2lnbmVkIGludCBpOworICBjb25zdCB1aW50OF90KiBuOworICBjb25zdCB1aW50OF90KiBycjsKKworICBpZiAoIWF2Yl9yc2FfcHVibGljX2tleV9oZWFkZXJfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKAorICAgICAgICAgIChjb25zdCBBdmJSU0FQdWJsaWNLZXlIZWFkZXIqKWRhdGEsICZoKSkgeworICAgIGF2Yl9lcnJvcigiSW52YWxpZCBrZXkuXG4iKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICBpZiAoIShoLmtleV9udW1fYml0cyA9PSAyMDQ4IHx8IGgua2V5X251bV9iaXRzID09IDQwOTYgfHwKKyAgICAgICAgaC5rZXlfbnVtX2JpdHMgPT0gODE5MikpIHsKKyAgICBhdmJfZXJyb3IoIlVuZXhwZWN0ZWQga2V5IGxlbmd0aC5cbiIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIGV4cGVjdGVkX2xlbmd0aCA9IHNpemVvZihBdmJSU0FQdWJsaWNLZXlIZWFkZXIpICsgMiAqIGgua2V5X251bV9iaXRzIC8gODsKKyAgaWYgKGxlbmd0aCAhPSBleHBlY3RlZF9sZW5ndGgpIHsKKyAgICBhdmJfZXJyb3IoIktleSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBsZW5ndGguXG4iKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICBuID0gZGF0YSArIHNpemVvZihBdmJSU0FQdWJsaWNLZXlIZWFkZXIpOworICByciA9IGRhdGEgKyBzaXplb2YoQXZiUlNBUHVibGljS2V5SGVhZGVyKSArIGgua2V5X251bV9iaXRzIC8gODsKKworICAvKiBTdG9yZSBuIGFuZCByciBmb2xsb3dpbmcgdGhlIGtleSBoZWFkZXIgc28gd2Ugb25seSBoYXZlIHRvIGRvIG9uZQorICAgKiBhbGxvY2F0aW9uLgorICAgKi8KKyAga2V5ID0gKEtleSopKGF2Yl9tYWxsb2Moc2l6ZW9mKEtleSkgKyAyICogaC5rZXlfbnVtX2JpdHMgLyA4KSk7CisgIGlmIChrZXkgPT0gTlVMTCkgeworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIGtleS0+bGVuID0gaC5rZXlfbnVtX2JpdHMgLyAzMjsKKyAga2V5LT5uMGludiA9IGgubjBpbnY7CisgIGtleS0+biA9ICh1aW50MzJfdCopKGtleSArIDEpOyAvKiBTa2lwIGFoZWFkIHNpemVvZihLZXkpIGJ5dGVzLiAqLworICBrZXktPnJyID0ga2V5LT5uICsga2V5LT5sZW47CisKKyAgLyogQ3J5cHRvLWNvZGUgYmVsb3cgKG1vZHBvd0Y0KCkgYW5kIGZyaWVuZHMpIGV4cGVjdHMgdGhlIGtleSBpbgorICAgKiBsaXR0bGUtZW5kaWFuIGZvcm1hdCAocmF0aGVyIHRoYW4gdGhlIGZvcm1hdCB3ZSdyZSBzdG9yaW5nIHRoZQorICAgKiBrZXkgaW4pLCBzbyBjb252ZXJ0IGl0LgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGtleS0+bGVuOyBpKyspIHsKKyAgICBrZXktPm5baV0gPSBhdmJfYmUzMnRvaCgoKHVpbnQzMl90KiluKVtrZXktPmxlbiAtIGkgLSAxXSk7CisgICAga2V5LT5ycltpXSA9IGF2Yl9iZTMydG9oKCgodWludDMyX3QqKXJyKVtrZXktPmxlbiAtIGkgLSAxXSk7CisgIH0KKyAgcmV0dXJuIGtleTsKKworZmFpbDoKKyAgaWYgKGtleSAhPSBOVUxMKSB7CisgICAgYXZiX2ZyZWUoa2V5KTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBmcmVlX3BhcnNlZF9rZXkoS2V5KiBrZXkpIHsKKyAgYXZiX2ZyZWUoa2V5KTsKK30KKworLyogYVtdIC09IG1vZCAqLworc3RhdGljIHZvaWQgc3ViTShjb25zdCBLZXkqIGtleSwgdWludDMyX3QqIGEpIHsKKyAgaW50NjRfdCBBID0gMDsKKyAgdWludDMyX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IGtleS0+bGVuOyArK2kpIHsKKyAgICBBICs9ICh1aW50NjRfdClhW2ldIC0ga2V5LT5uW2ldOworICAgIGFbaV0gPSAodWludDMyX3QpQTsKKyAgICBBID4+PSAzMjsKKyAgfQorfQorCisvKiByZXR1cm4gYVtdID49IG1vZCAqLworc3RhdGljIGludCBnZU0oY29uc3QgS2V5KiBrZXksIHVpbnQzMl90KiBhKSB7CisgIHVpbnQzMl90IGk7CisgIGZvciAoaSA9IGtleS0+bGVuOyBpOykgeworICAgIC0taTsKKyAgICBpZiAoYVtpXSA8IGtleS0+bltpXSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChhW2ldID4ga2V5LT5uW2ldKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7IC8qIGVxdWFsICovCit9CisKKy8qIG1vbnRnb21lcnkgY1tdICs9IGEgKiBiW10gLyBSICUgbW9kICovCitzdGF0aWMgdm9pZCBtb250TXVsQWRkKGNvbnN0IEtleSoga2V5LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGIpIHsKKyAgdWludDY0X3QgQSA9ICh1aW50NjRfdClhICogYlswXSArIGNbMF07CisgIHVpbnQzMl90IGQwID0gKHVpbnQzMl90KUEgKiBrZXktPm4waW52OworICB1aW50NjRfdCBCID0gKHVpbnQ2NF90KWQwICoga2V5LT5uWzBdICsgKHVpbnQzMl90KUE7CisgIHVpbnQzMl90IGk7CisKKyAgZm9yIChpID0gMTsgaSA8IGtleS0+bGVuOyArK2kpIHsKKyAgICBBID0gKEEgPj4gMzIpICsgKHVpbnQ2NF90KWEgKiBiW2ldICsgY1tpXTsKKyAgICBCID0gKEIgPj4gMzIpICsgKHVpbnQ2NF90KWQwICoga2V5LT5uW2ldICsgKHVpbnQzMl90KUE7CisgICAgY1tpIC0gMV0gPSAodWludDMyX3QpQjsKKyAgfQorCisgIEEgPSAoQSA+PiAzMikgKyAoQiA+PiAzMik7CisKKyAgY1tpIC0gMV0gPSAodWludDMyX3QpQTsKKworICBpZiAoQSA+PiAzMikgeworICAgIHN1Yk0oa2V5LCBjKTsKKyAgfQorfQorCisvKiBtb250Z29tZXJ5IGNbXSA9IGFbXSAqIGJbXSAvIFIgJSBtb2QgKi8KK3N0YXRpYyB2b2lkIG1vbnRNdWwoY29uc3QgS2V5KiBrZXksIHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSwgdWludDMyX3QqIGIpIHsKKyAgdWludDMyX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IGtleS0+bGVuOyArK2kpIHsKKyAgICBjW2ldID0gMDsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwga2V5LT5sZW47ICsraSkgeworICAgIG1vbnRNdWxBZGQoa2V5LCBjLCBhW2ldLCBiKTsKKyAgfQorfQorCisvKiBJbi1wbGFjZSBwdWJsaWMgZXhwb25lbnRpYXRpb24uICg2NTUzN30KKyAqIElucHV0IGFuZCBvdXRwdXQgYmlnLWVuZGlhbiBieXRlIGFycmF5IGluIGlub3V0LgorICovCitzdGF0aWMgdm9pZCBtb2Rwb3dGNChjb25zdCBLZXkqIGtleSwgdWludDhfdCogaW5vdXQpIHsKKyAgdWludDMyX3QqIGEgPSAodWludDMyX3QqKWF2Yl9tYWxsb2Moa2V5LT5sZW4gKiBzaXplb2YodWludDMyX3QpKTsKKyAgdWludDMyX3QqIGFSID0gKHVpbnQzMl90KilhdmJfbWFsbG9jKGtleS0+bGVuICogc2l6ZW9mKHVpbnQzMl90KSk7CisgIHVpbnQzMl90KiBhYVIgPSAodWludDMyX3QqKWF2Yl9tYWxsb2Moa2V5LT5sZW4gKiBzaXplb2YodWludDMyX3QpKTsKKyAgaWYgKGEgPT0gTlVMTCB8fCBhUiA9PSBOVUxMIHx8IGFhUiA9PSBOVUxMKSB7CisgICAgZ290byBvdXQ7CisgIH0KKworICB1aW50MzJfdCogYWFhID0gYWFSOyAvKiBSZS11c2UgbG9jYXRpb24uICovCisgIGludCBpOworCisgIC8qIENvbnZlcnQgZnJvbSBiaWcgZW5kaWFuIGJ5dGUgYXJyYXkgdG8gbGl0dGxlIGVuZGlhbiB3b3JkIGFycmF5LiAqLworICBmb3IgKGkgPSAwOyBpIDwgKGludClrZXktPmxlbjsgKytpKSB7CisgICAgdWludDMyX3QgdG1wID0gKGlub3V0Wygoa2V5LT5sZW4gLSAxIC0gaSkgKiA0KSArIDBdIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICAgKGlub3V0Wygoa2V5LT5sZW4gLSAxIC0gaSkgKiA0KSArIDFdIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgKGlub3V0Wygoa2V5LT5sZW4gLSAxIC0gaSkgKiA0KSArIDJdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAoaW5vdXRbKChrZXktPmxlbiAtIDEgLSBpKSAqIDQpICsgM10gPDwgMCk7CisgICAgYVtpXSA9IHRtcDsKKyAgfQorCisgIG1vbnRNdWwoa2V5LCBhUiwgYSwga2V5LT5ycik7IC8qIGFSID0gYSAqIFJSIC8gUiBtb2QgTSAgICovCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAyKSB7CisgICAgbW9udE11bChrZXksIGFhUiwgYVIsIGFSKTsgIC8qIGFhUiA9IGFSICogYVIgLyBSIG1vZCBNICovCisgICAgbW9udE11bChrZXksIGFSLCBhYVIsIGFhUik7IC8qIGFSID0gYWFSICogYWFSIC8gUiBtb2QgTSAqLworICB9CisgIG1vbnRNdWwoa2V5LCBhYWEsIGFSLCBhKTsgLyogYWFhID0gYVIgKiBhIC8gUiBtb2QgTSAqLworCisgIC8qIE1ha2Ugc3VyZSBhYWEgPCBtb2Q7IGFhYSBpcyBhdCBtb3N0IDF4IG1vZCB0b28gbGFyZ2UuICovCisgIGlmIChnZU0oa2V5LCBhYWEpKSB7CisgICAgc3ViTShrZXksIGFhYSk7CisgIH0KKworICAvKiBDb252ZXJ0IHRvIGJpZ2VuZGlhbiBieXRlIGFycmF5ICovCisgIGZvciAoaSA9IChpbnQpa2V5LT5sZW4gLSAxOyBpID49IDA7IC0taSkgeworICAgIHVpbnQzMl90IHRtcCA9IGFhYVtpXTsKKyAgICAqaW5vdXQrKyA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICppbm91dCsrID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgKmlub3V0KysgPSAodWludDhfdCkodG1wID4+IDgpOworICAgICppbm91dCsrID0gKHVpbnQ4X3QpKHRtcCA+PiAwKTsKKyAgfQorCitvdXQ6CisgIGlmIChhICE9IE5VTEwpIHsKKyAgICBhdmJfZnJlZShhKTsKKyAgfQorICBpZiAoYVIgIT0gTlVMTCkgeworICAgIGF2Yl9mcmVlKGFSKTsKKyAgfQorICBpZiAoYWFSICE9IE5VTEwpIHsKKyAgICBhdmJfZnJlZShhYVIpOworICB9Cit9CisKKy8qIFZlcmlmeSBhIFJTQSBQS0NTMS41IHNpZ25hdHVyZSBhZ2FpbnN0IGFuIGV4cGVjdGVkIGhhc2guCisgKiBSZXR1cm5zIGZhbHNlIG9uIGZhaWx1cmUsIHRydWUgb24gc3VjY2Vzcy4KKyAqLworYm9vbCBhdmJfcnNhX3ZlcmlmeShjb25zdCB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzaWcsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaWdfbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBoYXNoLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgaGFzaF9udW1fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYWRkaW5nX251bV9ieXRlcykgeworICB1aW50OF90KiBidWYgPSBOVUxMOworICBLZXkqIHBhcnNlZF9rZXkgPSBOVUxMOworICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworICBpZiAoa2V5ID09IE5VTEwgfHwgc2lnID09IE5VTEwgfHwgaGFzaCA9PSBOVUxMIHx8IHBhZGRpbmcgPT0gTlVMTCkgeworICAgIGF2Yl9lcnJvcigiSW52YWxpZCBpbnB1dC5cbiIpOworICAgIGdvdG8gb3V0OworICB9CisKKyAgcGFyc2VkX2tleSA9IHBhcnNlX2tleV9kYXRhKGtleSwga2V5X251bV9ieXRlcyk7CisgIGlmIChwYXJzZWRfa2V5ID09IE5VTEwpIHsKKyAgICBhdmJfZXJyb3IoIkVycm9yIHBhcnNpbmcga2V5LlxuIik7CisgICAgZ290byBvdXQ7CisgIH0KKworICBpZiAoc2lnX251bV9ieXRlcyAhPSAocGFyc2VkX2tleS0+bGVuICogc2l6ZW9mKHVpbnQzMl90KSkpIHsKKyAgICBhdmJfZXJyb3IoIlNpZ25hdHVyZSBsZW5ndGggZG9lcyBub3QgbWF0Y2gga2V5IGxlbmd0aC5cbiIpOworICAgIGdvdG8gb3V0OworICB9CisKKyAgaWYgKHBhZGRpbmdfbnVtX2J5dGVzICE9IHNpZ19udW1fYnl0ZXMgLSBoYXNoX251bV9ieXRlcykgeworICAgIGF2Yl9lcnJvcigiUGFkZGluZyBsZW5ndGggZG9lcyBub3QgbWF0Y2ggaGFzaCBhbmQgc2lnbmF0dXJlIGxlbmd0aHMuXG4iKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGJ1ZiA9ICh1aW50OF90KilhdmJfbWFsbG9jKHNpZ19udW1fYnl0ZXMpOworICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICBhdmJfZXJyb3IoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5LlxuIik7CisgICAgZ290byBvdXQ7CisgIH0KKyAgYXZiX21lbWNweShidWYsIHNpZywgc2lnX251bV9ieXRlcyk7CisKKyAgbW9kcG93RjQocGFyc2VkX2tleSwgYnVmKTsKKworICAvKiBDaGVjayBwYWRkaW5nIGJ5dGVzLgorICAgKgorICAgKiBFdmVuIHRob3VnaCB0aGVyZSBhcmUgcHJvYmFibHkgbm8gdGltaW5nIGlzc3VlcyBoZXJlLCB3ZSB1c2UKKyAgICogYXZiX3NhZmVfbWVtY21wKCkganVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLgorICAgKi8KKyAgaWYgKGF2Yl9zYWZlX21lbWNtcChidWYsIHBhZGRpbmcsIHBhZGRpbmdfbnVtX2J5dGVzKSkgeworICAgIGF2Yl9lcnJvcigiUGFkZGluZyBjaGVjayBmYWlsZWQuXG4iKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIENoZWNrIGhhc2guICovCisgIGlmIChhdmJfc2FmZV9tZW1jbXAoYnVmICsgcGFkZGluZ19udW1fYnl0ZXMsIGhhc2gsIGhhc2hfbnVtX2J5dGVzKSkgeworICAgIGF2Yl9lcnJvcigiSGFzaCBjaGVjayBmYWlsZWQuXG4iKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIHN1Y2Nlc3MgPSB0cnVlOworCitvdXQ6CisgIGlmIChwYXJzZWRfa2V5ICE9IE5VTEwpIHsKKyAgICBmcmVlX3BhcnNlZF9rZXkocGFyc2VkX2tleSk7CisgIH0KKyAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgYXZiX2ZyZWUoYnVmKTsKKyAgfQorICByZXR1cm4gc3VjY2VzczsKK30KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX3JzYS5oIGIvYXZiL2xpYmF2Yi9hdmJfcnNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkY2Y0NwotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX3JzYS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKy8qIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gT1MgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisgKi8KKworI2lmZGVmIEFWQl9JTlNJREVfTElCQVZCX0gKKyNlcnJvciAiWW91IGNhbid0IGluY2x1ZGUgYXZiX3JzYS5oIGluIHRoZSBwdWJsaWMgaGVhZGVyIGxpYmF2Yi5oLiIKKyNlbmRpZgorCisjaWZuZGVmIEFWQl9DT01QSUxBVElPTgorI2Vycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSwgaXQgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGludGVybmFsIGF2YiBjb2RlLiIKKyNlbmRpZgorCisjaWZuZGVmIEFWQl9SU0FfSF8KKyNkZWZpbmUgQVZCX1JTQV9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJhdmJfY3J5cHRvLmgiCisjaW5jbHVkZSAiYXZiX3N5c2RlcHMuaCIKKworLyogVXNpbmcgdGhlIGtleSBnaXZlbiBieSB8a2V5fCwgdmVyaWZ5IGEgUlNBIHNpZ25hdHVyZSB8c2lnfCBvZgorICogbGVuZ3RoIHxzaWdfbnVtX2J5dGVzfCBhZ2FpbnN0IGFuIGV4cGVjdGVkIHxoYXNofCBvZiBsZW5ndGgKKyAqIHxoYXNoX251bV9ieXRlc3wuIFRoZSBwYWRkaW5nIHRvIGV4cGVjdCBtdXN0IGJlIHBhc3NlZCBpbiB1c2luZworICogfHBhZGRpbmd8IG9mIGxlbmd0aCB8cGFkZGluZ19udW1fYnl0ZXN8LgorICoKKyAqIFRoZSBkYXRhIGluIHxrZXl8IG11c3QgbWF0Y2ggdGhlIGZvcm1hdCBkZWZpbmVkIGluCisgKiB8QXZiUlNBUHVibGljS2V5SGVhZGVyfCwgaW5jbHVkaW5nIHRoZSB0d28gbGFyZ2UgbnVtYmVycworICogZm9sbG93aW5nLiBUaGUgfGtleV9udW1fYnl0ZXN8IG11c3QgYmUgdGhlIHNpemUgb2YgdGhlIGVudGlyZQorICogc2VyaWFsaXplZCBrZXkuCisgKgorICogUmV0dXJucyBmYWxzZSBpZiB2ZXJpZmljYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlLgorICovCitib29sIGF2Yl9yc2FfdmVyaWZ5KGNvbnN0IHVpbnQ4X3QqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGtleV9udW1fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNpZywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpZ19udW1fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGhhc2gsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBoYXNoX251bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBhZGRpbmdfbnVtX2J5dGVzKSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBVkJfUlNBX0hfICovCmRpZmYgLS1naXQgYS9hdmIvbGliYXZiL2F2Yl9zaGEuaCBiL2F2Yi9saWJhdmIvYXZiX3NoYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YTZhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiL2F2Yl9zaGEuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgQVZCX0lOU0lERV9MSUJBVkJfSAorI2Vycm9yICJZb3UgY2FuJ3QgaW5jbHVkZSBhdmJfc2hhLmggaW4gdGhlIHB1YmxpYyBoZWFkZXIgbGliYXZiLmguIgorI2VuZGlmCisKKyNpZm5kZWYgQVZCX0NPTVBJTEFUSU9OCisjZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlLCBpdCBtYXkgb25seSBiZSB1c2VkIGZyb20gaW50ZXJuYWwgYXZiIGNvZGUuIgorI2VuZGlmCisKKyNpZm5kZWYgQVZCX1NIQV9IXworI2RlZmluZSBBVkJfU0hBX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgImF2Yl9jcnlwdG8uaCIKKyNpbmNsdWRlICJhdmJfc3lzZGVwcy5oIgorCisvKiBCbG9jayBzaXplIGluIGJ5dGVzIG9mIGEgU0hBLTI1NiBkaWdlc3QuICovCisjZGVmaW5lIEFWQl9TSEEyNTZfQkxPQ0tfU0laRSA2NAorCisKKy8qIEJsb2NrIHNpemUgaW4gYnl0ZXMgb2YgYSBTSEEtNTEyIGRpZ2VzdC4gKi8KKyNkZWZpbmUgQVZCX1NIQTUxMl9CTE9DS19TSVpFIDEyOAorCisvKiBEYXRhIHN0cnVjdHVyZSB1c2VkIGZvciBTSEEtMjU2LiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBoWzhdOworICB1aW50MzJfdCB0b3RfbGVuOworICB1aW50MzJfdCBsZW47CisgIHVpbnQ4X3QgYmxvY2tbMiAqIEFWQl9TSEEyNTZfQkxPQ0tfU0laRV07CisgIHVpbnQ4X3QgYnVmW0FWQl9TSEEyNTZfRElHRVNUX1NJWkVdOyAvKiBVc2VkIGZvciBzdG9yaW5nIHRoZSBmaW5hbCBkaWdlc3QuICovCit9IEF2YlNIQTI1NkN0eDsKKworLyogRGF0YSBzdHJ1Y3R1cmUgdXNlZCBmb3IgU0hBLTUxMi4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDY0X3QgaFs4XTsKKyAgdWludDMyX3QgdG90X2xlbjsKKyAgdWludDMyX3QgbGVuOworICB1aW50OF90IGJsb2NrWzIgKiBBVkJfU0hBNTEyX0JMT0NLX1NJWkVdOworICB1aW50OF90IGJ1ZltBVkJfU0hBNTEyX0RJR0VTVF9TSVpFXTsgLyogVXNlZCBmb3Igc3RvcmluZyB0aGUgZmluYWwgZGlnZXN0LiAqLworfSBBdmJTSEE1MTJDdHg7CisKKy8qIEluaXRpYWxpemVzIHRoZSBTSEEtMjU2IGNvbnRleHQuICovCit2b2lkIGF2Yl9zaGEyNTZfaW5pdChBdmJTSEEyNTZDdHgqIGN0eCk7CisKKy8qIFVwZGF0ZXMgdGhlIFNIQS0yNTYgY29udGV4dCB3aXRoIHxsZW58IGJ5dGVzIGZyb20gfGRhdGF8LiAqLwordm9pZCBhdmJfc2hhMjU2X3VwZGF0ZShBdmJTSEEyNTZDdHgqIGN0eCwgY29uc3QgdWludDhfdCogZGF0YSwgdWludDMyX3QgbGVuKTsKKworLyogUmV0dXJucyB0aGUgU0hBLTI1NiBkaWdlc3QuICovCit1aW50OF90KiBhdmJfc2hhMjU2X2ZpbmFsKEF2YlNIQTI1NkN0eCogY3R4KSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKy8qIEluaXRpYWxpemVzIHRoZSBTSEEtNTEyIGNvbnRleHQuICovCit2b2lkIGF2Yl9zaGE1MTJfaW5pdChBdmJTSEE1MTJDdHgqIGN0eCk7CisKKy8qIFVwZGF0ZXMgdGhlIFNIQS01MTIgY29udGV4dCB3aXRoIHxsZW58IGJ5dGVzIGZyb20gfGRhdGF8LiAqLwordm9pZCBhdmJfc2hhNTEyX3VwZGF0ZShBdmJTSEE1MTJDdHgqIGN0eCwgY29uc3QgdWludDhfdCogZGF0YSwgdWludDMyX3QgbGVuKTsKKworLyogUmV0dXJucyB0aGUgU0hBLTUxMiBkaWdlc3QuICovCit1aW50OF90KiBhdmJfc2hhNTEyX2ZpbmFsKEF2YlNIQTUxMkN0eCogY3R4KSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBVkJfU0hBX0hfICovCmRpZmYgLS1naXQgYS9hdmIvbGliYXZiL2F2Yl9zaGEyNTYuYyBiL2F2Yi9saWJhdmIvYXZiX3NoYTI1Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDE0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiL2F2Yl9zaGEyNTYuYwpAQCAtMCwwICsxLDM5MCBAQAorLyogU0hBLTI1NiBhbmQgU0hBLTUxMiBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBjb2RlIGJ5IE9saXZlciBHYXkKKyAqIDxvbGl2aWVyLmdheUBhMy5lcGZsLmNoPiB1bmRlciBhIEJTRC1zdHlsZSBsaWNlbnNlLiBTZWUgYmVsb3cuCisgKi8KKworLyoKKyAqIEZJUFMgMTgwLTIgU0hBLTIyNC8yNTYvMzg0LzUxMiBpbXBsZW1lbnRhdGlvbgorICogTGFzdCB1cGRhdGU6IDAyLzAyLzIwMDcKKyAqIElzc3VlIGRhdGU6ICAwNC8zMC8yMDA1CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA3IE9saXZpZXIgR2F5IDxvbGl2aWVyLmdheUBhMy5lcGZsLmNoPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImF2Yl9zaGEuaCIKKworI2RlZmluZSBTSEZSKHgsIG4pICh4ID4+IG4pCisjZGVmaW5lIFJPVFIoeCwgbikgKCh4ID4+IG4pIHwgKHggPDwgKChzaXplb2YoeCkgPDwgMykgLSBuKSkpCisjZGVmaW5lIFJPVEwoeCwgbikgKCh4IDw8IG4pIHwgKHggPj4gKChzaXplb2YoeCkgPDwgMykgLSBuKSkpCisjZGVmaW5lIENIKHgsIHksIHopICgoeCAmIHkpIF4gKH54ICYgeikpCisjZGVmaW5lIE1BSih4LCB5LCB6KSAoKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopKQorCisjZGVmaW5lIFNIQTI1Nl9GMSh4KSAoUk9UUih4LCAyKSBeIFJPVFIoeCwgMTMpIF4gUk9UUih4LCAyMikpCisjZGVmaW5lIFNIQTI1Nl9GMih4KSAoUk9UUih4LCA2KSBeIFJPVFIoeCwgMTEpIF4gUk9UUih4LCAyNSkpCisjZGVmaW5lIFNIQTI1Nl9GMyh4KSAoUk9UUih4LCA3KSBeIFJPVFIoeCwgMTgpIF4gU0hGUih4LCAzKSkKKyNkZWZpbmUgU0hBMjU2X0Y0KHgpIChST1RSKHgsIDE3KSBeIFJPVFIoeCwgMTkpIF4gU0hGUih4LCAxMCkpCisKKyNkZWZpbmUgVU5QQUNLMzIoeCwgc3RyKSAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKigoc3RyKSArIDMpID0gKHVpbnQ4X3QpKCh4KSk7ICAgICAgIFwKKyAgICAqKChzdHIpICsgMikgPSAodWludDhfdCkoKHgpID4+IDgpOyAgXAorICAgICooKHN0cikgKyAxKSA9ICh1aW50OF90KSgoeCkgPj4gMTYpOyBcCisgICAgKigoc3RyKSArIDApID0gKHVpbnQ4X3QpKCh4KSA+PiAyNCk7IFwKKyAgfQorCisjZGVmaW5lIFBBQ0szMihzdHIsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICooeCkgPSAoKHVpbnQzMl90KSAqICgoc3RyKSArIDMpKSB8ICgodWludDMyX3QpICogKChzdHIpICsgMikgPDwgOCkgfCBcCisgICAgICAgICAgICgodWludDMyX3QpICogKChzdHIpICsgMSkgPDwgMTYpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKCh1aW50MzJfdCkgKiAoKHN0cikgKyAwKSA8PCAyNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8qIE1hY3JvcyB1c2VkIGZvciBsb29wcyB1bnJvbGxpbmcgKi8KKworI2RlZmluZSBTSEEyNTZfU0NSKGkpIFwKKyAgeyB3W2ldID0gU0hBMjU2X0Y0KHdbaSAtIDJdKSArIHdbaSAtIDddICsgU0hBMjU2X0YzKHdbaSAtIDE1XSkgKyB3W2kgLSAxNl07IH0KKworI2RlZmluZSBTSEEyNTZfRVhQKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdDEgPSB3dltoXSArIFNIQTI1Nl9GMih3dltlXSkgKyBDSCh3dltlXSwgd3ZbZl0sIHd2W2ddKSArIHNoYTI1Nl9rW2pdICsgXAorICAgICAgICAgd1tqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0MiA9IFNIQTI1Nl9GMSh3dlthXSkgKyBNQUood3ZbYV0sIHd2W2JdLCB3dltjXSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd3ZbZF0gKz0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHd2W2hdID0gdDEgKyB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitzdGF0aWMgY29uc3QgdWludDMyX3Qgc2hhMjU2X2gwWzhdID0gezB4NmEwOWU2NjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YmI2N2FlODUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2M2ZWYzNzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTU0ZmY1M2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTEwZTUyN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OWIwNTY4OGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWY4M2Q5YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWJlMGNkMTl9OworCitzdGF0aWMgY29uc3QgdWludDMyX3Qgc2hhMjU2X2tbNjRdID0geworICAgIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsCisgICAgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSwgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywKKyAgICAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LCAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LAorICAgIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsCisgICAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNywgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywKKyAgICAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LCAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLAorICAgIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsCisgICAgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCwKKyAgICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LCAweDM5MWMwY2IzLCAweDRlZDhhYTRhLAorICAgIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsCisgICAgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMn07CisKKy8qIFNIQS0yNTYgaW1wbGVtZW50YXRpb24gKi8KK3ZvaWQgYXZiX3NoYTI1Nl9pbml0KEF2YlNIQTI1NkN0eCogY3R4KSB7CisjaWZuZGVmIFVOUk9MTF9MT09QUworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgIGN0eC0+aFtpXSA9IHNoYTI1Nl9oMFtpXTsKKyAgfQorI2Vsc2UKKyAgY3R4LT5oWzBdID0gc2hhMjU2X2gwWzBdOworICBjdHgtPmhbMV0gPSBzaGEyNTZfaDBbMV07CisgIGN0eC0+aFsyXSA9IHNoYTI1Nl9oMFsyXTsKKyAgY3R4LT5oWzNdID0gc2hhMjU2X2gwWzNdOworICBjdHgtPmhbNF0gPSBzaGEyNTZfaDBbNF07CisgIGN0eC0+aFs1XSA9IHNoYTI1Nl9oMFs1XTsKKyAgY3R4LT5oWzZdID0gc2hhMjU2X2gwWzZdOworICBjdHgtPmhbN10gPSBzaGEyNTZfaDBbN107CisjZW5kaWYgLyogIVVOUk9MTF9MT09QUyAqLworCisgIGN0eC0+bGVuID0gMDsKKyAgY3R4LT50b3RfbGVuID0gMDsKK30KKworc3RhdGljIHZvaWQgU0hBMjU2X3RyYW5zZm9ybShBdmJTSEEyNTZDdHgqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJsb2NrX25iKSB7CisgIHVpbnQzMl90IHdbNjRdOworICB1aW50MzJfdCB3dls4XTsKKyAgdWludDMyX3QgdDEsIHQyOworICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzdWJfYmxvY2s7CisgIGludCBpOworCisjaWZuZGVmIFVOUk9MTF9MT09QUworICBpbnQgajsKKyNlbmRpZgorCisgIGZvciAoaSA9IDA7IGkgPCAoaW50KWJsb2NrX25iOyBpKyspIHsKKyAgICBzdWJfYmxvY2sgPSBtZXNzYWdlICsgKGkgPDwgNik7CisKKyNpZm5kZWYgVU5ST0xMX0xPT1BTCisgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKyAgICAgIFBBQ0szMigmc3ViX2Jsb2NrW2ogPDwgMl0sICZ3W2pdKTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAxNjsgaiA8IDY0OyBqKyspIHsKKyAgICAgIFNIQTI1Nl9TQ1Ioaik7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgd3Zbal0gPSBjdHgtPmhbal07CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKKyAgICAgIHQxID0gd3ZbN10gKyBTSEEyNTZfRjIod3ZbNF0pICsgQ0god3ZbNF0sIHd2WzVdLCB3dls2XSkgKyBzaGEyNTZfa1tqXSArCisgICAgICAgICAgIHdbal07CisgICAgICB0MiA9IFNIQTI1Nl9GMSh3dlswXSkgKyBNQUood3ZbMF0sIHd2WzFdLCB3dlsyXSk7CisgICAgICB3dls3XSA9IHd2WzZdOworICAgICAgd3ZbNl0gPSB3dls1XTsKKyAgICAgIHd2WzVdID0gd3ZbNF07CisgICAgICB3dls0XSA9IHd2WzNdICsgdDE7CisgICAgICB3dlszXSA9IHd2WzJdOworICAgICAgd3ZbMl0gPSB3dlsxXTsKKyAgICAgIHd2WzFdID0gd3ZbMF07CisgICAgICB3dlswXSA9IHQxICsgdDI7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgY3R4LT5oW2pdICs9IHd2W2pdOworICAgIH0KKyNlbHNlCisgICAgUEFDSzMyKCZzdWJfYmxvY2tbMF0sICZ3WzBdKTsKKyAgICBQQUNLMzIoJnN1Yl9ibG9ja1s0XSwgJndbMV0pOworICAgIFBBQ0szMigmc3ViX2Jsb2NrWzhdLCAmd1syXSk7CisgICAgUEFDSzMyKCZzdWJfYmxvY2tbMTJdLCAmd1szXSk7CisgICAgUEFDSzMyKCZzdWJfYmxvY2tbMTZdLCAmd1s0XSk7CisgICAgUEFDSzMyKCZzdWJfYmxvY2tbMjBdLCAmd1s1XSk7CisgICAgUEFDSzMyKCZzdWJfYmxvY2tbMjRdLCAmd1s2XSk7CisgICAgUEFDSzMyKCZzdWJfYmxvY2tbMjhdLCAmd1s3XSk7CisgICAgUEFDSzMyKCZzdWJfYmxvY2tbMzJdLCAmd1s4XSk7CisgICAgUEFDSzMyKCZzdWJfYmxvY2tbMzZdLCAmd1s5XSk7CisgICAgUEFDSzMyKCZzdWJfYmxvY2tbNDBdLCAmd1sxMF0pOworICAgIFBBQ0szMigmc3ViX2Jsb2NrWzQ0XSwgJndbMTFdKTsKKyAgICBQQUNLMzIoJnN1Yl9ibG9ja1s0OF0sICZ3WzEyXSk7CisgICAgUEFDSzMyKCZzdWJfYmxvY2tbNTJdLCAmd1sxM10pOworICAgIFBBQ0szMigmc3ViX2Jsb2NrWzU2XSwgJndbMTRdKTsKKyAgICBQQUNLMzIoJnN1Yl9ibG9ja1s2MF0sICZ3WzE1XSk7CisKKyAgICBTSEEyNTZfU0NSKDE2KTsKKyAgICBTSEEyNTZfU0NSKDE3KTsKKyAgICBTSEEyNTZfU0NSKDE4KTsKKyAgICBTSEEyNTZfU0NSKDE5KTsKKyAgICBTSEEyNTZfU0NSKDIwKTsKKyAgICBTSEEyNTZfU0NSKDIxKTsKKyAgICBTSEEyNTZfU0NSKDIyKTsKKyAgICBTSEEyNTZfU0NSKDIzKTsKKyAgICBTSEEyNTZfU0NSKDI0KTsKKyAgICBTSEEyNTZfU0NSKDI1KTsKKyAgICBTSEEyNTZfU0NSKDI2KTsKKyAgICBTSEEyNTZfU0NSKDI3KTsKKyAgICBTSEEyNTZfU0NSKDI4KTsKKyAgICBTSEEyNTZfU0NSKDI5KTsKKyAgICBTSEEyNTZfU0NSKDMwKTsKKyAgICBTSEEyNTZfU0NSKDMxKTsKKyAgICBTSEEyNTZfU0NSKDMyKTsKKyAgICBTSEEyNTZfU0NSKDMzKTsKKyAgICBTSEEyNTZfU0NSKDM0KTsKKyAgICBTSEEyNTZfU0NSKDM1KTsKKyAgICBTSEEyNTZfU0NSKDM2KTsKKyAgICBTSEEyNTZfU0NSKDM3KTsKKyAgICBTSEEyNTZfU0NSKDM4KTsKKyAgICBTSEEyNTZfU0NSKDM5KTsKKyAgICBTSEEyNTZfU0NSKDQwKTsKKyAgICBTSEEyNTZfU0NSKDQxKTsKKyAgICBTSEEyNTZfU0NSKDQyKTsKKyAgICBTSEEyNTZfU0NSKDQzKTsKKyAgICBTSEEyNTZfU0NSKDQ0KTsKKyAgICBTSEEyNTZfU0NSKDQ1KTsKKyAgICBTSEEyNTZfU0NSKDQ2KTsKKyAgICBTSEEyNTZfU0NSKDQ3KTsKKyAgICBTSEEyNTZfU0NSKDQ4KTsKKyAgICBTSEEyNTZfU0NSKDQ5KTsKKyAgICBTSEEyNTZfU0NSKDUwKTsKKyAgICBTSEEyNTZfU0NSKDUxKTsKKyAgICBTSEEyNTZfU0NSKDUyKTsKKyAgICBTSEEyNTZfU0NSKDUzKTsKKyAgICBTSEEyNTZfU0NSKDU0KTsKKyAgICBTSEEyNTZfU0NSKDU1KTsKKyAgICBTSEEyNTZfU0NSKDU2KTsKKyAgICBTSEEyNTZfU0NSKDU3KTsKKyAgICBTSEEyNTZfU0NSKDU4KTsKKyAgICBTSEEyNTZfU0NSKDU5KTsKKyAgICBTSEEyNTZfU0NSKDYwKTsKKyAgICBTSEEyNTZfU0NSKDYxKTsKKyAgICBTSEEyNTZfU0NSKDYyKTsKKyAgICBTSEEyNTZfU0NSKDYzKTsKKworICAgIHd2WzBdID0gY3R4LT5oWzBdOworICAgIHd2WzFdID0gY3R4LT5oWzFdOworICAgIHd2WzJdID0gY3R4LT5oWzJdOworICAgIHd2WzNdID0gY3R4LT5oWzNdOworICAgIHd2WzRdID0gY3R4LT5oWzRdOworICAgIHd2WzVdID0gY3R4LT5oWzVdOworICAgIHd2WzZdID0gY3R4LT5oWzZdOworICAgIHd2WzddID0gY3R4LT5oWzddOworCisgICAgU0hBMjU2X0VYUCgwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCAwKTsKKyAgICBTSEEyNTZfRVhQKDcsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDEpOworICAgIFNIQTI1Nl9FWFAoNiwgNywgMCwgMSwgMiwgMywgNCwgNSwgMik7CisgICAgU0hBMjU2X0VYUCg1LCA2LCA3LCAwLCAxLCAyLCAzLCA0LCAzKTsKKyAgICBTSEEyNTZfRVhQKDQsIDUsIDYsIDcsIDAsIDEsIDIsIDMsIDQpOworICAgIFNIQTI1Nl9FWFAoMywgNCwgNSwgNiwgNywgMCwgMSwgMiwgNSk7CisgICAgU0hBMjU2X0VYUCgyLCAzLCA0LCA1LCA2LCA3LCAwLCAxLCA2KTsKKyAgICBTSEEyNTZfRVhQKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDAsIDcpOworICAgIFNIQTI1Nl9FWFAoMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCk7CisgICAgU0hBMjU2X0VYUCg3LCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA5KTsKKyAgICBTSEEyNTZfRVhQKDYsIDcsIDAsIDEsIDIsIDMsIDQsIDUsIDEwKTsKKyAgICBTSEEyNTZfRVhQKDUsIDYsIDcsIDAsIDEsIDIsIDMsIDQsIDExKTsKKyAgICBTSEEyNTZfRVhQKDQsIDUsIDYsIDcsIDAsIDEsIDIsIDMsIDEyKTsKKyAgICBTSEEyNTZfRVhQKDMsIDQsIDUsIDYsIDcsIDAsIDEsIDIsIDEzKTsKKyAgICBTSEEyNTZfRVhQKDIsIDMsIDQsIDUsIDYsIDcsIDAsIDEsIDE0KTsKKyAgICBTSEEyNTZfRVhQKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDAsIDE1KTsKKyAgICBTSEEyNTZfRVhQKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDE2KTsKKyAgICBTSEEyNTZfRVhQKDcsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDE3KTsKKyAgICBTSEEyNTZfRVhQKDYsIDcsIDAsIDEsIDIsIDMsIDQsIDUsIDE4KTsKKyAgICBTSEEyNTZfRVhQKDUsIDYsIDcsIDAsIDEsIDIsIDMsIDQsIDE5KTsKKyAgICBTSEEyNTZfRVhQKDQsIDUsIDYsIDcsIDAsIDEsIDIsIDMsIDIwKTsKKyAgICBTSEEyNTZfRVhQKDMsIDQsIDUsIDYsIDcsIDAsIDEsIDIsIDIxKTsKKyAgICBTSEEyNTZfRVhQKDIsIDMsIDQsIDUsIDYsIDcsIDAsIDEsIDIyKTsKKyAgICBTSEEyNTZfRVhQKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDAsIDIzKTsKKyAgICBTSEEyNTZfRVhQKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDI0KTsKKyAgICBTSEEyNTZfRVhQKDcsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDI1KTsKKyAgICBTSEEyNTZfRVhQKDYsIDcsIDAsIDEsIDIsIDMsIDQsIDUsIDI2KTsKKyAgICBTSEEyNTZfRVhQKDUsIDYsIDcsIDAsIDEsIDIsIDMsIDQsIDI3KTsKKyAgICBTSEEyNTZfRVhQKDQsIDUsIDYsIDcsIDAsIDEsIDIsIDMsIDI4KTsKKyAgICBTSEEyNTZfRVhQKDMsIDQsIDUsIDYsIDcsIDAsIDEsIDIsIDI5KTsKKyAgICBTSEEyNTZfRVhQKDIsIDMsIDQsIDUsIDYsIDcsIDAsIDEsIDMwKTsKKyAgICBTSEEyNTZfRVhQKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDAsIDMxKTsKKyAgICBTSEEyNTZfRVhQKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDMyKTsKKyAgICBTSEEyNTZfRVhQKDcsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDMzKTsKKyAgICBTSEEyNTZfRVhQKDYsIDcsIDAsIDEsIDIsIDMsIDQsIDUsIDM0KTsKKyAgICBTSEEyNTZfRVhQKDUsIDYsIDcsIDAsIDEsIDIsIDMsIDQsIDM1KTsKKyAgICBTSEEyNTZfRVhQKDQsIDUsIDYsIDcsIDAsIDEsIDIsIDMsIDM2KTsKKyAgICBTSEEyNTZfRVhQKDMsIDQsIDUsIDYsIDcsIDAsIDEsIDIsIDM3KTsKKyAgICBTSEEyNTZfRVhQKDIsIDMsIDQsIDUsIDYsIDcsIDAsIDEsIDM4KTsKKyAgICBTSEEyNTZfRVhQKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDAsIDM5KTsKKyAgICBTSEEyNTZfRVhQKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDQwKTsKKyAgICBTSEEyNTZfRVhQKDcsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDQxKTsKKyAgICBTSEEyNTZfRVhQKDYsIDcsIDAsIDEsIDIsIDMsIDQsIDUsIDQyKTsKKyAgICBTSEEyNTZfRVhQKDUsIDYsIDcsIDAsIDEsIDIsIDMsIDQsIDQzKTsKKyAgICBTSEEyNTZfRVhQKDQsIDUsIDYsIDcsIDAsIDEsIDIsIDMsIDQ0KTsKKyAgICBTSEEyNTZfRVhQKDMsIDQsIDUsIDYsIDcsIDAsIDEsIDIsIDQ1KTsKKyAgICBTSEEyNTZfRVhQKDIsIDMsIDQsIDUsIDYsIDcsIDAsIDEsIDQ2KTsKKyAgICBTSEEyNTZfRVhQKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDAsIDQ3KTsKKyAgICBTSEEyNTZfRVhQKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDQ4KTsKKyAgICBTSEEyNTZfRVhQKDcsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDQ5KTsKKyAgICBTSEEyNTZfRVhQKDYsIDcsIDAsIDEsIDIsIDMsIDQsIDUsIDUwKTsKKyAgICBTSEEyNTZfRVhQKDUsIDYsIDcsIDAsIDEsIDIsIDMsIDQsIDUxKTsKKyAgICBTSEEyNTZfRVhQKDQsIDUsIDYsIDcsIDAsIDEsIDIsIDMsIDUyKTsKKyAgICBTSEEyNTZfRVhQKDMsIDQsIDUsIDYsIDcsIDAsIDEsIDIsIDUzKTsKKyAgICBTSEEyNTZfRVhQKDIsIDMsIDQsIDUsIDYsIDcsIDAsIDEsIDU0KTsKKyAgICBTSEEyNTZfRVhQKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDAsIDU1KTsKKyAgICBTSEEyNTZfRVhQKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDU2KTsKKyAgICBTSEEyNTZfRVhQKDcsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDU3KTsKKyAgICBTSEEyNTZfRVhQKDYsIDcsIDAsIDEsIDIsIDMsIDQsIDUsIDU4KTsKKyAgICBTSEEyNTZfRVhQKDUsIDYsIDcsIDAsIDEsIDIsIDMsIDQsIDU5KTsKKyAgICBTSEEyNTZfRVhQKDQsIDUsIDYsIDcsIDAsIDEsIDIsIDMsIDYwKTsKKyAgICBTSEEyNTZfRVhQKDMsIDQsIDUsIDYsIDcsIDAsIDEsIDIsIDYxKTsKKyAgICBTSEEyNTZfRVhQKDIsIDMsIDQsIDUsIDYsIDcsIDAsIDEsIDYyKTsKKyAgICBTSEEyNTZfRVhQKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDAsIDYzKTsKKworICAgIGN0eC0+aFswXSArPSB3dlswXTsKKyAgICBjdHgtPmhbMV0gKz0gd3ZbMV07CisgICAgY3R4LT5oWzJdICs9IHd2WzJdOworICAgIGN0eC0+aFszXSArPSB3dlszXTsKKyAgICBjdHgtPmhbNF0gKz0gd3ZbNF07CisgICAgY3R4LT5oWzVdICs9IHd2WzVdOworICAgIGN0eC0+aFs2XSArPSB3dls2XTsKKyAgICBjdHgtPmhbN10gKz0gd3ZbN107CisjZW5kaWYgLyogIVVOUk9MTF9MT09QUyAqLworICB9Cit9CisKK3ZvaWQgYXZiX3NoYTI1Nl91cGRhdGUoQXZiU0hBMjU2Q3R4KiBjdHgsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHVpbnQzMl90IGxlbikgeworICB1bnNpZ25lZCBpbnQgYmxvY2tfbmI7CisgIHVuc2lnbmVkIGludCBuZXdfbGVuLCByZW1fbGVuLCB0bXBfbGVuOworICBjb25zdCB1aW50OF90KiBzaGlmdGVkX2RhdGE7CisKKyAgdG1wX2xlbiA9IEFWQl9TSEEyNTZfQkxPQ0tfU0laRSAtIGN0eC0+bGVuOworICByZW1fbGVuID0gbGVuIDwgdG1wX2xlbiA/IGxlbiA6IHRtcF9sZW47CisKKyAgYXZiX21lbWNweSgmY3R4LT5ibG9ja1tjdHgtPmxlbl0sIGRhdGEsIHJlbV9sZW4pOworCisgIGlmIChjdHgtPmxlbiArIGxlbiA8IEFWQl9TSEEyNTZfQkxPQ0tfU0laRSkgeworICAgIGN0eC0+bGVuICs9IGxlbjsKKyAgICByZXR1cm47CisgIH0KKworICBuZXdfbGVuID0gbGVuIC0gcmVtX2xlbjsKKyAgYmxvY2tfbmIgPSBuZXdfbGVuIC8gQVZCX1NIQTI1Nl9CTE9DS19TSVpFOworCisgIHNoaWZ0ZWRfZGF0YSA9IGRhdGEgKyByZW1fbGVuOworCisgIFNIQTI1Nl90cmFuc2Zvcm0oY3R4LCBjdHgtPmJsb2NrLCAxKTsKKyAgU0hBMjU2X3RyYW5zZm9ybShjdHgsIHNoaWZ0ZWRfZGF0YSwgYmxvY2tfbmIpOworCisgIHJlbV9sZW4gPSBuZXdfbGVuICUgQVZCX1NIQTI1Nl9CTE9DS19TSVpFOworCisgIGF2Yl9tZW1jcHkoY3R4LT5ibG9jaywgJnNoaWZ0ZWRfZGF0YVtibG9ja19uYiA8PCA2XSwgcmVtX2xlbik7CisKKyAgY3R4LT5sZW4gPSByZW1fbGVuOworICBjdHgtPnRvdF9sZW4gKz0gKGJsb2NrX25iICsgMSkgPDwgNjsKK30KKwordWludDhfdCogYXZiX3NoYTI1Nl9maW5hbChBdmJTSEEyNTZDdHgqIGN0eCkgeworICB1bnNpZ25lZCBpbnQgYmxvY2tfbmI7CisgIHVuc2lnbmVkIGludCBwbV9sZW47CisgIHVuc2lnbmVkIGludCBsZW5fYjsKKyNpZm5kZWYgVU5ST0xMX0xPT1BTCisgIGludCBpOworI2VuZGlmCisKKyAgYmxvY2tfbmIgPQorICAgICAgKDEgKyAoKEFWQl9TSEEyNTZfQkxPQ0tfU0laRSAtIDkpIDwgKGN0eC0+bGVuICUgQVZCX1NIQTI1Nl9CTE9DS19TSVpFKSkpOworCisgIGxlbl9iID0gKGN0eC0+dG90X2xlbiArIGN0eC0+bGVuKSA8PCAzOworICBwbV9sZW4gPSBibG9ja19uYiA8PCA2OworCisgIGF2Yl9tZW1zZXQoY3R4LT5ibG9jayArIGN0eC0+bGVuLCAwLCBwbV9sZW4gLSBjdHgtPmxlbik7CisgIGN0eC0+YmxvY2tbY3R4LT5sZW5dID0gMHg4MDsKKyAgVU5QQUNLMzIobGVuX2IsIGN0eC0+YmxvY2sgKyBwbV9sZW4gLSA0KTsKKworICBTSEEyNTZfdHJhbnNmb3JtKGN0eCwgY3R4LT5ibG9jaywgYmxvY2tfbmIpOworCisjaWZuZGVmIFVOUk9MTF9MT09QUworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgVU5QQUNLMzIoY3R4LT5oW2ldLCAmY3R4LT5idWZbaSA8PCAyXSk7CisgIH0KKyNlbHNlCisgIFVOUEFDSzMyKGN0eC0+aFswXSwgJmN0eC0+YnVmWzBdKTsKKyAgVU5QQUNLMzIoY3R4LT5oWzFdLCAmY3R4LT5idWZbNF0pOworICBVTlBBQ0szMihjdHgtPmhbMl0sICZjdHgtPmJ1Zls4XSk7CisgIFVOUEFDSzMyKGN0eC0+aFszXSwgJmN0eC0+YnVmWzEyXSk7CisgIFVOUEFDSzMyKGN0eC0+aFs0XSwgJmN0eC0+YnVmWzE2XSk7CisgIFVOUEFDSzMyKGN0eC0+aFs1XSwgJmN0eC0+YnVmWzIwXSk7CisgIFVOUEFDSzMyKGN0eC0+aFs2XSwgJmN0eC0+YnVmWzI0XSk7CisgIFVOUEFDSzMyKGN0eC0+aFs3XSwgJmN0eC0+YnVmWzI4XSk7CisjZW5kaWYgLyogIVVOUk9MTF9MT09QUyAqLworCisgIHJldHVybiBjdHgtPmJ1ZjsKK30KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX3NoYTUxMi5jIGIvYXZiL2xpYmF2Yi9hdmJfc2hhNTEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmNjMxOQotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX3NoYTUxMi5jCkBAIC0wLDAgKzEsMzg4IEBACisvKiBTSEEtMjU2IGFuZCBTSEEtNTEyIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGNvZGUgYnkgT2xpdmVyIEdheQorICogPG9saXZpZXIuZ2F5QGEzLmVwZmwuY2g+IHVuZGVyIGEgQlNELXN0eWxlIGxpY2Vuc2UuIFNlZSBiZWxvdy4KKyAqLworCisvKgorICogRklQUyAxODAtMiBTSEEtMjI0LzI1Ni8zODQvNTEyIGltcGxlbWVudGF0aW9uCisgKiBMYXN0IHVwZGF0ZTogMDIvMDIvMjAwNworICogSXNzdWUgZGF0ZTogIDA0LzMwLzIwMDUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcgT2xpdmllciBHYXkgPG9saXZpZXIuZ2F5QGEzLmVwZmwuY2g+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiYXZiX3NoYS5oIgorCisjZGVmaW5lIFNIRlIoeCwgbikgKHggPj4gbikKKyNkZWZpbmUgUk9UUih4LCBuKSAoKHggPj4gbikgfCAoeCA8PCAoKHNpemVvZih4KSA8PCAzKSAtIG4pKSkKKyNkZWZpbmUgUk9UTCh4LCBuKSAoKHggPDwgbikgfCAoeCA+PiAoKHNpemVvZih4KSA8PCAzKSAtIG4pKSkKKyNkZWZpbmUgQ0goeCwgeSwgeikgKCh4ICYgeSkgXiAofnggJiB6KSkKKyNkZWZpbmUgTUFKKHgsIHksIHopICgoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeikpCisKKyNkZWZpbmUgU0hBNTEyX0YxKHgpIChST1RSKHgsIDI4KSBeIFJPVFIoeCwgMzQpIF4gUk9UUih4LCAzOSkpCisjZGVmaW5lIFNIQTUxMl9GMih4KSAoUk9UUih4LCAxNCkgXiBST1RSKHgsIDE4KSBeIFJPVFIoeCwgNDEpKQorI2RlZmluZSBTSEE1MTJfRjMoeCkgKFJPVFIoeCwgMSkgXiBST1RSKHgsIDgpIF4gU0hGUih4LCA3KSkKKyNkZWZpbmUgU0hBNTEyX0Y0KHgpIChST1RSKHgsIDE5KSBeIFJPVFIoeCwgNjEpIF4gU0hGUih4LCA2KSkKKworI2RlZmluZSBVTlBBQ0szMih4LCBzdHIpICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKChzdHIpICsgMykgPSAodWludDhfdCkoKHgpKTsgICAgICAgXAorICAgICooKHN0cikgKyAyKSA9ICh1aW50OF90KSgoeCkgPj4gOCk7ICBcCisgICAgKigoc3RyKSArIDEpID0gKHVpbnQ4X3QpKCh4KSA+PiAxNik7IFwKKyAgICAqKChzdHIpICsgMCkgPSAodWludDhfdCkoKHgpID4+IDI0KTsgXAorICB9CisKKyNkZWZpbmUgVU5QQUNLNjQoeCwgc3RyKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICooKHN0cikgKyA3KSA9ICh1aW50OF90KXg7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKChzdHIpICsgNikgPSAodWludDhfdCkoKHVpbnQ2NF90KXggPj4gOCk7ICBcCisgICAgKigoc3RyKSArIDUpID0gKHVpbnQ4X3QpKCh1aW50NjRfdCl4ID4+IDE2KTsgXAorICAgICooKHN0cikgKyA0KSA9ICh1aW50OF90KSgodWludDY0X3QpeCA+PiAyNCk7IFwKKyAgICAqKChzdHIpICsgMykgPSAodWludDhfdCkoKHVpbnQ2NF90KXggPj4gMzIpOyBcCisgICAgKigoc3RyKSArIDIpID0gKHVpbnQ4X3QpKCh1aW50NjRfdCl4ID4+IDQwKTsgXAorICAgICooKHN0cikgKyAxKSA9ICh1aW50OF90KSgodWludDY0X3QpeCA+PiA0OCk7IFwKKyAgICAqKChzdHIpICsgMCkgPSAodWludDhfdCkoKHVpbnQ2NF90KXggPj4gNTYpOyBcCisgIH0KKworI2RlZmluZSBQQUNLNjQoc3RyLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICooeCkgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKHVpbnQ2NF90KSAqICgoc3RyKSArIDcpKSB8ICgodWludDY0X3QpICogKChzdHIpICsgNikgPDwgOCkgfCAgICAgICAgXAorICAgICAgICAoKHVpbnQ2NF90KSAqICgoc3RyKSArIDUpIDw8IDE2KSB8ICgodWludDY0X3QpICogKChzdHIpICsgNCkgPDwgMjQpIHwgXAorICAgICAgICAoKHVpbnQ2NF90KSAqICgoc3RyKSArIDMpIDw8IDMyKSB8ICgodWludDY0X3QpICogKChzdHIpICsgMikgPDwgNDApIHwgXAorICAgICAgICAoKHVpbnQ2NF90KSAqICgoc3RyKSArIDEpIDw8IDQ4KSB8ICgodWludDY0X3QpICogKChzdHIpICsgMCkgPDwgNTYpOyAgXAorICB9CisKKy8qIE1hY3JvcyB1c2VkIGZvciBsb29wcyB1bnJvbGxpbmcgKi8KKworI2RlZmluZSBTSEE1MTJfU0NSKGkpIFwKKyAgeyB3W2ldID0gU0hBNTEyX0Y0KHdbaSAtIDJdKSArIHdbaSAtIDddICsgU0hBNTEyX0YzKHdbaSAtIDE1XSkgKyB3W2kgLSAxNl07IH0KKworI2RlZmluZSBTSEE1MTJfRVhQKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdDEgPSB3dltoXSArIFNIQTUxMl9GMih3dltlXSkgKyBDSCh3dltlXSwgd3ZbZl0sIHd2W2ddKSArIHNoYTUxMl9rW2pdICsgXAorICAgICAgICAgd1tqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0MiA9IFNIQTUxMl9GMSh3dlthXSkgKyBNQUood3ZbYV0sIHd2W2JdLCB3dltjXSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd3ZbZF0gKz0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHd2W2hdID0gdDEgKyB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitzdGF0aWMgY29uc3QgdWludDY0X3Qgc2hhNTEyX2gwWzhdID0gezB4NmEwOWU2NjdmM2JjYzkwOFVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiYjY3YWU4NTg0Y2FhNzNiVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNjNmVmMzcyZmU5NGY4MmJVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTU0ZmY1M2E1ZjFkMzZmMVVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MTBlNTI3ZmFkZTY4MmQxVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDliMDU2ODhjMmIzZTZjMWZVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWY4M2Q5YWJmYjQxYmQ2YlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1YmUwY2QxOTEzN2UyMTc5VUxMfTsKKworc3RhdGljIGNvbnN0IHVpbnQ2NF90IHNoYTUxMl9rWzgwXSA9IHsKKyAgICAweDQyOGEyZjk4ZDcyOGFlMjJVTEwsIDB4NzEzNzQ0OTEyM2VmNjVjZFVMTCwgMHhiNWMwZmJjZmVjNGQzYjJmVUxMLAorICAgIDB4ZTliNWRiYTU4MTg5ZGJiY1VMTCwgMHgzOTU2YzI1YmYzNDhiNTM4VUxMLCAweDU5ZjExMWYxYjYwNWQwMTlVTEwsCisgICAgMHg5MjNmODJhNGFmMTk0ZjliVUxMLCAweGFiMWM1ZWQ1ZGE2ZDgxMThVTEwsIDB4ZDgwN2FhOThhMzAzMDI0MlVMTCwKKyAgICAweDEyODM1YjAxNDU3MDZmYmVVTEwsIDB4MjQzMTg1YmU0ZWU0YjI4Y1VMTCwgMHg1NTBjN2RjM2Q1ZmZiNGUyVUxMLAorICAgIDB4NzJiZTVkNzRmMjdiODk2ZlVMTCwgMHg4MGRlYjFmZTNiMTY5NmIxVUxMLCAweDliZGMwNmE3MjVjNzEyMzVVTEwsCisgICAgMHhjMTliZjE3NGNmNjkyNjk0VUxMLCAweGU0OWI2OWMxOWVmMTRhZDJVTEwsIDB4ZWZiZTQ3ODYzODRmMjVlM1VMTCwKKyAgICAweDBmYzE5ZGM2OGI4Y2Q1YjVVTEwsIDB4MjQwY2ExY2M3N2FjOWM2NVVMTCwgMHgyZGU5MmM2ZjU5MmIwMjc1VUxMLAorICAgIDB4NGE3NDg0YWE2ZWE2ZTQ4M1VMTCwgMHg1Y2IwYTlkY2JkNDFmYmQ0VUxMLCAweDc2Zjk4OGRhODMxMTUzYjVVTEwsCisgICAgMHg5ODNlNTE1MmVlNjZkZmFiVUxMLCAweGE4MzFjNjZkMmRiNDMyMTBVTEwsIDB4YjAwMzI3Yzg5OGZiMjEzZlVMTCwKKyAgICAweGJmNTk3ZmM3YmVlZjBlZTRVTEwsIDB4YzZlMDBiZjMzZGE4OGZjMlVMTCwgMHhkNWE3OTE0NzkzMGFhNzI1VUxMLAorICAgIDB4MDZjYTYzNTFlMDAzODI2ZlVMTCwgMHgxNDI5Mjk2NzBhMGU2ZTcwVUxMLCAweDI3YjcwYTg1NDZkMjJmZmNVTEwsCisgICAgMHgyZTFiMjEzODVjMjZjOTI2VUxMLCAweDRkMmM2ZGZjNWFjNDJhZWRVTEwsIDB4NTMzODBkMTM5ZDk1YjNkZlVMTCwKKyAgICAweDY1MGE3MzU0OGJhZjYzZGVVTEwsIDB4NzY2YTBhYmIzYzc3YjJhOFVMTCwgMHg4MWMyYzkyZTQ3ZWRhZWU2VUxMLAorICAgIDB4OTI3MjJjODUxNDgyMzUzYlVMTCwgMHhhMmJmZThhMTRjZjEwMzY0VUxMLCAweGE4MWE2NjRiYmM0MjMwMDFVTEwsCisgICAgMHhjMjRiOGI3MGQwZjg5NzkxVUxMLCAweGM3NmM1MWEzMDY1NGJlMzBVTEwsIDB4ZDE5MmU4MTlkNmVmNTIxOFVMTCwKKyAgICAweGQ2OTkwNjI0NTU2NWE5MTBVTEwsIDB4ZjQwZTM1ODU1NzcxMjAyYVVMTCwgMHgxMDZhYTA3MDMyYmJkMWI4VUxMLAorICAgIDB4MTlhNGMxMTZiOGQyZDBjOFVMTCwgMHgxZTM3NmMwODUxNDFhYjUzVUxMLCAweDI3NDg3NzRjZGY4ZWViOTlVTEwsCisgICAgMHgzNGIwYmNiNWUxOWI0OGE4VUxMLCAweDM5MWMwY2IzYzVjOTVhNjNVTEwsIDB4NGVkOGFhNGFlMzQxOGFjYlVMTCwKKyAgICAweDViOWNjYTRmNzc2M2UzNzNVTEwsIDB4NjgyZTZmZjNkNmIyYjhhM1VMTCwgMHg3NDhmODJlZTVkZWZiMmZjVUxMLAorICAgIDB4NzhhNTYzNmY0MzE3MmY2MFVMTCwgMHg4NGM4NzgxNGExZjBhYjcyVUxMLCAweDhjYzcwMjA4MWE2NDM5ZWNVTEwsCisgICAgMHg5MGJlZmZmYTIzNjMxZTI4VUxMLCAweGE0NTA2Y2ViZGU4MmJkZTlVTEwsIDB4YmVmOWEzZjdiMmM2NzkxNVVMTCwKKyAgICAweGM2NzE3OGYyZTM3MjUzMmJVTEwsIDB4Y2EyNzNlY2VlYTI2NjE5Y1VMTCwgMHhkMTg2YjhjNzIxYzBjMjA3VUxMLAorICAgIDB4ZWFkYTdkZDZjZGUwZWIxZVVMTCwgMHhmNTdkNGY3ZmVlNmVkMTc4VUxMLCAweDA2ZjA2N2FhNzIxNzZmYmFVTEwsCisgICAgMHgwYTYzN2RjNWEyYzg5OGE2VUxMLCAweDExM2Y5ODA0YmVmOTBkYWVVTEwsIDB4MWI3MTBiMzUxMzFjNDcxYlVMTCwKKyAgICAweDI4ZGI3N2Y1MjMwNDdkODRVTEwsIDB4MzJjYWFiN2I0MGM3MjQ5M1VMTCwgMHgzYzllYmUwYTE1YzliZWJjVUxMLAorICAgIDB4NDMxZDY3YzQ5YzEwMGQ0Y1VMTCwgMHg0Y2M1ZDRiZWNiM2U0MmI2VUxMLCAweDU5N2YyOTljZmM2NTdlMmFVTEwsCisgICAgMHg1ZmNiNmZhYjNhZDZmYWVjVUxMLCAweDZjNDQxOThjNGE0NzU4MTdVTEx9OworCisvKiBTSEEtNTEyIGltcGxlbWVudGF0aW9uICovCisKK3ZvaWQgYXZiX3NoYTUxMl9pbml0KEF2YlNIQTUxMkN0eCogY3R4KSB7CisjaWZkZWYgVU5ST0xMX0xPT1BTX1NIQTUxMgorICBjdHgtPmhbMF0gPSBzaGE1MTJfaDBbMF07CisgIGN0eC0+aFsxXSA9IHNoYTUxMl9oMFsxXTsKKyAgY3R4LT5oWzJdID0gc2hhNTEyX2gwWzJdOworICBjdHgtPmhbM10gPSBzaGE1MTJfaDBbM107CisgIGN0eC0+aFs0XSA9IHNoYTUxMl9oMFs0XTsKKyAgY3R4LT5oWzVdID0gc2hhNTEyX2gwWzVdOworICBjdHgtPmhbNl0gPSBzaGE1MTJfaDBbNl07CisgIGN0eC0+aFs3XSA9IHNoYTUxMl9oMFs3XTsKKyNlbHNlCisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgY3R4LT5oW2ldID0gc2hhNTEyX2gwW2ldOworI2VuZGlmIC8qIFVOUk9MTF9MT09QU19TSEE1MTIgKi8KKworICBjdHgtPmxlbiA9IDA7CisgIGN0eC0+dG90X2xlbiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIFNIQTUxMl90cmFuc2Zvcm0oQXZiU0hBNTEyQ3R4KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBibG9ja19uYikgeworICB1aW50NjRfdCB3WzgwXTsKKyAgdWludDY0X3Qgd3ZbOF07CisgIHVpbnQ2NF90IHQxLCB0MjsKKyAgY29uc3QgdWludDhfdCogc3ViX2Jsb2NrOworICBpbnQgaSwgajsKKworICBmb3IgKGkgPSAwOyBpIDwgKGludClibG9ja19uYjsgaSsrKSB7CisgICAgc3ViX2Jsb2NrID0gbWVzc2FnZSArIChpIDw8IDcpOworCisjaWZkZWYgVU5ST0xMX0xPT1BTX1NIQTUxMgorICAgIFBBQ0s2NCgmc3ViX2Jsb2NrWzBdLCAmd1swXSk7CisgICAgUEFDSzY0KCZzdWJfYmxvY2tbOF0sICZ3WzFdKTsKKyAgICBQQUNLNjQoJnN1Yl9ibG9ja1sxNl0sICZ3WzJdKTsKKyAgICBQQUNLNjQoJnN1Yl9ibG9ja1syNF0sICZ3WzNdKTsKKyAgICBQQUNLNjQoJnN1Yl9ibG9ja1szMl0sICZ3WzRdKTsKKyAgICBQQUNLNjQoJnN1Yl9ibG9ja1s0MF0sICZ3WzVdKTsKKyAgICBQQUNLNjQoJnN1Yl9ibG9ja1s0OF0sICZ3WzZdKTsKKyAgICBQQUNLNjQoJnN1Yl9ibG9ja1s1Nl0sICZ3WzddKTsKKyAgICBQQUNLNjQoJnN1Yl9ibG9ja1s2NF0sICZ3WzhdKTsKKyAgICBQQUNLNjQoJnN1Yl9ibG9ja1s3Ml0sICZ3WzldKTsKKyAgICBQQUNLNjQoJnN1Yl9ibG9ja1s4MF0sICZ3WzEwXSk7CisgICAgUEFDSzY0KCZzdWJfYmxvY2tbODhdLCAmd1sxMV0pOworICAgIFBBQ0s2NCgmc3ViX2Jsb2NrWzk2XSwgJndbMTJdKTsKKyAgICBQQUNLNjQoJnN1Yl9ibG9ja1sxMDRdLCAmd1sxM10pOworICAgIFBBQ0s2NCgmc3ViX2Jsb2NrWzExMl0sICZ3WzE0XSk7CisgICAgUEFDSzY0KCZzdWJfYmxvY2tbMTIwXSwgJndbMTVdKTsKKworICAgIFNIQTUxMl9TQ1IoMTYpOworICAgIFNIQTUxMl9TQ1IoMTcpOworICAgIFNIQTUxMl9TQ1IoMTgpOworICAgIFNIQTUxMl9TQ1IoMTkpOworICAgIFNIQTUxMl9TQ1IoMjApOworICAgIFNIQTUxMl9TQ1IoMjEpOworICAgIFNIQTUxMl9TQ1IoMjIpOworICAgIFNIQTUxMl9TQ1IoMjMpOworICAgIFNIQTUxMl9TQ1IoMjQpOworICAgIFNIQTUxMl9TQ1IoMjUpOworICAgIFNIQTUxMl9TQ1IoMjYpOworICAgIFNIQTUxMl9TQ1IoMjcpOworICAgIFNIQTUxMl9TQ1IoMjgpOworICAgIFNIQTUxMl9TQ1IoMjkpOworICAgIFNIQTUxMl9TQ1IoMzApOworICAgIFNIQTUxMl9TQ1IoMzEpOworICAgIFNIQTUxMl9TQ1IoMzIpOworICAgIFNIQTUxMl9TQ1IoMzMpOworICAgIFNIQTUxMl9TQ1IoMzQpOworICAgIFNIQTUxMl9TQ1IoMzUpOworICAgIFNIQTUxMl9TQ1IoMzYpOworICAgIFNIQTUxMl9TQ1IoMzcpOworICAgIFNIQTUxMl9TQ1IoMzgpOworICAgIFNIQTUxMl9TQ1IoMzkpOworICAgIFNIQTUxMl9TQ1IoNDApOworICAgIFNIQTUxMl9TQ1IoNDEpOworICAgIFNIQTUxMl9TQ1IoNDIpOworICAgIFNIQTUxMl9TQ1IoNDMpOworICAgIFNIQTUxMl9TQ1IoNDQpOworICAgIFNIQTUxMl9TQ1IoNDUpOworICAgIFNIQTUxMl9TQ1IoNDYpOworICAgIFNIQTUxMl9TQ1IoNDcpOworICAgIFNIQTUxMl9TQ1IoNDgpOworICAgIFNIQTUxMl9TQ1IoNDkpOworICAgIFNIQTUxMl9TQ1IoNTApOworICAgIFNIQTUxMl9TQ1IoNTEpOworICAgIFNIQTUxMl9TQ1IoNTIpOworICAgIFNIQTUxMl9TQ1IoNTMpOworICAgIFNIQTUxMl9TQ1IoNTQpOworICAgIFNIQTUxMl9TQ1IoNTUpOworICAgIFNIQTUxMl9TQ1IoNTYpOworICAgIFNIQTUxMl9TQ1IoNTcpOworICAgIFNIQTUxMl9TQ1IoNTgpOworICAgIFNIQTUxMl9TQ1IoNTkpOworICAgIFNIQTUxMl9TQ1IoNjApOworICAgIFNIQTUxMl9TQ1IoNjEpOworICAgIFNIQTUxMl9TQ1IoNjIpOworICAgIFNIQTUxMl9TQ1IoNjMpOworICAgIFNIQTUxMl9TQ1IoNjQpOworICAgIFNIQTUxMl9TQ1IoNjUpOworICAgIFNIQTUxMl9TQ1IoNjYpOworICAgIFNIQTUxMl9TQ1IoNjcpOworICAgIFNIQTUxMl9TQ1IoNjgpOworICAgIFNIQTUxMl9TQ1IoNjkpOworICAgIFNIQTUxMl9TQ1IoNzApOworICAgIFNIQTUxMl9TQ1IoNzEpOworICAgIFNIQTUxMl9TQ1IoNzIpOworICAgIFNIQTUxMl9TQ1IoNzMpOworICAgIFNIQTUxMl9TQ1IoNzQpOworICAgIFNIQTUxMl9TQ1IoNzUpOworICAgIFNIQTUxMl9TQ1IoNzYpOworICAgIFNIQTUxMl9TQ1IoNzcpOworICAgIFNIQTUxMl9TQ1IoNzgpOworICAgIFNIQTUxMl9TQ1IoNzkpOworCisgICAgd3ZbMF0gPSBjdHgtPmhbMF07CisgICAgd3ZbMV0gPSBjdHgtPmhbMV07CisgICAgd3ZbMl0gPSBjdHgtPmhbMl07CisgICAgd3ZbM10gPSBjdHgtPmhbM107CisgICAgd3ZbNF0gPSBjdHgtPmhbNF07CisgICAgd3ZbNV0gPSBjdHgtPmhbNV07CisgICAgd3ZbNl0gPSBjdHgtPmhbNl07CisgICAgd3ZbN10gPSBjdHgtPmhbN107CisKKyAgICBqID0gMDsKKworICAgIGRvIHsKKyAgICAgIFNIQTUxMl9FWFAoMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgaik7CisgICAgICBqKys7CisgICAgICBTSEE1MTJfRVhQKDcsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIGopOworICAgICAgaisrOworICAgICAgU0hBNTEyX0VYUCg2LCA3LCAwLCAxLCAyLCAzLCA0LCA1LCBqKTsKKyAgICAgIGorKzsKKyAgICAgIFNIQTUxMl9FWFAoNSwgNiwgNywgMCwgMSwgMiwgMywgNCwgaik7CisgICAgICBqKys7CisgICAgICBTSEE1MTJfRVhQKDQsIDUsIDYsIDcsIDAsIDEsIDIsIDMsIGopOworICAgICAgaisrOworICAgICAgU0hBNTEyX0VYUCgzLCA0LCA1LCA2LCA3LCAwLCAxLCAyLCBqKTsKKyAgICAgIGorKzsKKyAgICAgIFNIQTUxMl9FWFAoMiwgMywgNCwgNSwgNiwgNywgMCwgMSwgaik7CisgICAgICBqKys7CisgICAgICBTSEE1MTJfRVhQKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDAsIGopOworICAgICAgaisrOworICAgIH0gd2hpbGUgKGogPCA4MCk7CisKKyAgICBjdHgtPmhbMF0gKz0gd3ZbMF07CisgICAgY3R4LT5oWzFdICs9IHd2WzFdOworICAgIGN0eC0+aFsyXSArPSB3dlsyXTsKKyAgICBjdHgtPmhbM10gKz0gd3ZbM107CisgICAgY3R4LT5oWzRdICs9IHd2WzRdOworICAgIGN0eC0+aFs1XSArPSB3dls1XTsKKyAgICBjdHgtPmhbNl0gKz0gd3ZbNl07CisgICAgY3R4LT5oWzddICs9IHd2WzddOworI2Vsc2UKKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworICAgICAgUEFDSzY0KCZzdWJfYmxvY2tbaiA8PCAzXSwgJndbal0pOworICAgIH0KKworICAgIGZvciAoaiA9IDE2OyBqIDwgODA7IGorKykgeworICAgICAgU0hBNTEyX1NDUihqKTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICB3dltqXSA9IGN0eC0+aFtqXTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgODA7IGorKykgeworICAgICAgdDEgPSB3dls3XSArIFNIQTUxMl9GMih3dls0XSkgKyBDSCh3dls0XSwgd3ZbNV0sIHd2WzZdKSArIHNoYTUxMl9rW2pdICsKKyAgICAgICAgICAgd1tqXTsKKyAgICAgIHQyID0gU0hBNTEyX0YxKHd2WzBdKSArIE1BSih3dlswXSwgd3ZbMV0sIHd2WzJdKTsKKyAgICAgIHd2WzddID0gd3ZbNl07CisgICAgICB3dls2XSA9IHd2WzVdOworICAgICAgd3ZbNV0gPSB3dls0XTsKKyAgICAgIHd2WzRdID0gd3ZbM10gKyB0MTsKKyAgICAgIHd2WzNdID0gd3ZbMl07CisgICAgICB3dlsyXSA9IHd2WzFdOworICAgICAgd3ZbMV0gPSB3dlswXTsKKyAgICAgIHd2WzBdID0gdDEgKyB0MjsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgY3R4LT5oW2pdICs9IHd2W2pdOworI2VuZGlmIC8qIFVOUk9MTF9MT09QU19TSEE1MTIgKi8KKyAgfQorfQorCit2b2lkIGF2Yl9zaGE1MTJfdXBkYXRlKEF2YlNIQTUxMkN0eCogY3R4LCBjb25zdCB1aW50OF90KiBkYXRhLCB1aW50MzJfdCBsZW4pIHsKKyAgdW5zaWduZWQgaW50IGJsb2NrX25iOworICB1bnNpZ25lZCBpbnQgbmV3X2xlbiwgcmVtX2xlbiwgdG1wX2xlbjsKKyAgY29uc3QgdWludDhfdCogc2hpZnRlZF9kYXRhOworCisgIHRtcF9sZW4gPSBBVkJfU0hBNTEyX0JMT0NLX1NJWkUgLSBjdHgtPmxlbjsKKyAgcmVtX2xlbiA9IGxlbiA8IHRtcF9sZW4gPyBsZW4gOiB0bXBfbGVuOworCisgIGF2Yl9tZW1jcHkoJmN0eC0+YmxvY2tbY3R4LT5sZW5dLCBkYXRhLCByZW1fbGVuKTsKKworICBpZiAoY3R4LT5sZW4gKyBsZW4gPCBBVkJfU0hBNTEyX0JMT0NLX1NJWkUpIHsKKyAgICBjdHgtPmxlbiArPSBsZW47CisgICAgcmV0dXJuOworICB9CisKKyAgbmV3X2xlbiA9IGxlbiAtIHJlbV9sZW47CisgIGJsb2NrX25iID0gbmV3X2xlbiAvIEFWQl9TSEE1MTJfQkxPQ0tfU0laRTsKKworICBzaGlmdGVkX2RhdGEgPSBkYXRhICsgcmVtX2xlbjsKKworICBTSEE1MTJfdHJhbnNmb3JtKGN0eCwgY3R4LT5ibG9jaywgMSk7CisgIFNIQTUxMl90cmFuc2Zvcm0oY3R4LCBzaGlmdGVkX2RhdGEsIGJsb2NrX25iKTsKKworICByZW1fbGVuID0gbmV3X2xlbiAlIEFWQl9TSEE1MTJfQkxPQ0tfU0laRTsKKworICBhdmJfbWVtY3B5KGN0eC0+YmxvY2ssICZzaGlmdGVkX2RhdGFbYmxvY2tfbmIgPDwgN10sIHJlbV9sZW4pOworCisgIGN0eC0+bGVuID0gcmVtX2xlbjsKKyAgY3R4LT50b3RfbGVuICs9IChibG9ja19uYiArIDEpIDw8IDc7Cit9CisKK3VpbnQ4X3QqIGF2Yl9zaGE1MTJfZmluYWwoQXZiU0hBNTEyQ3R4KiBjdHgpIHsKKyAgdW5zaWduZWQgaW50IGJsb2NrX25iOworICB1bnNpZ25lZCBpbnQgcG1fbGVuOworICB1bnNpZ25lZCBpbnQgbGVuX2I7CisKKyNpZm5kZWYgVU5ST0xMX0xPT1BTX1NIQTUxMgorICBpbnQgaTsKKyNlbmRpZgorCisgIGJsb2NrX25iID0KKyAgICAgIDEgKyAoKEFWQl9TSEE1MTJfQkxPQ0tfU0laRSAtIDE3KSA8IChjdHgtPmxlbiAlIEFWQl9TSEE1MTJfQkxPQ0tfU0laRSkpOworCisgIGxlbl9iID0gKGN0eC0+dG90X2xlbiArIGN0eC0+bGVuKSA8PCAzOworICBwbV9sZW4gPSBibG9ja19uYiA8PCA3OworCisgIGF2Yl9tZW1zZXQoY3R4LT5ibG9jayArIGN0eC0+bGVuLCAwLCBwbV9sZW4gLSBjdHgtPmxlbik7CisgIGN0eC0+YmxvY2tbY3R4LT5sZW5dID0gMHg4MDsKKyAgVU5QQUNLMzIobGVuX2IsIGN0eC0+YmxvY2sgKyBwbV9sZW4gLSA0KTsKKworICBTSEE1MTJfdHJhbnNmb3JtKGN0eCwgY3R4LT5ibG9jaywgYmxvY2tfbmIpOworCisjaWZkZWYgVU5ST0xMX0xPT1BTX1NIQTUxMgorICBVTlBBQ0s2NChjdHgtPmhbMF0sICZjdHgtPmJ1ZlswXSk7CisgIFVOUEFDSzY0KGN0eC0+aFsxXSwgJmN0eC0+YnVmWzhdKTsKKyAgVU5QQUNLNjQoY3R4LT5oWzJdLCAmY3R4LT5idWZbMTZdKTsKKyAgVU5QQUNLNjQoY3R4LT5oWzNdLCAmY3R4LT5idWZbMjRdKTsKKyAgVU5QQUNLNjQoY3R4LT5oWzRdLCAmY3R4LT5idWZbMzJdKTsKKyAgVU5QQUNLNjQoY3R4LT5oWzVdLCAmY3R4LT5idWZbNDBdKTsKKyAgVU5QQUNLNjQoY3R4LT5oWzZdLCAmY3R4LT5idWZbNDhdKTsKKyAgVU5QQUNLNjQoY3R4LT5oWzddLCAmY3R4LT5idWZbNTZdKTsKKyNlbHNlCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgVU5QQUNLNjQoY3R4LT5oW2ldLCAmY3R4LT5idWZbaSA8PCAzXSk7CisjZW5kaWYgLyogVU5ST0xMX0xPT1BTX1NIQTUxMiAqLworCisgIHJldHVybiBjdHgtPmJ1ZjsKK30KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX3Nsb3RfdmVyaWZ5LmMgYi9hdmIvbGliYXZiL2F2Yl9zbG90X3ZlcmlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmQ4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiL2F2Yl9zbG90X3ZlcmlmeS5jCkBAIC0wLDAgKzEsMTA5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImF2Yl9zbG90X3ZlcmlmeS5oIgorI2luY2x1ZGUgImF2Yl9jaGFpbl9wYXJ0aXRpb25fZGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImF2Yl9mb290ZXIuaCIKKyNpbmNsdWRlICJhdmJfaGFzaF9kZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiYXZiX2tlcm5lbF9jbWRsaW5lX2Rlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJhdmJfc2hhLmgiCisjaW5jbHVkZSAiYXZiX3V0aWwuaCIKKyNpbmNsdWRlICJhdmJfdmJtZXRhX2ltYWdlLmgiCisKKy8qIE1heGltdW0gYWxsb3cgbGVuZ3RoIChpbiBieXRlcykgb2YgYSBwYXJ0aXRpb24gbmFtZSwgaW5jbHVkaW5nCisgKiBhYl9zdWZmaXguCisgKi8KKyNkZWZpbmUgUEFSVF9OQU1FX01BWF9TSVpFIDMyCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHBhcnRpdGlvbnMgdGhhdCBjYW4gYmUgbG9hZGVkIHdpdGggYXZiX3Nsb3RfdmVyaWZ5KCkuICovCisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfTE9BREVEX1BBUlRJVElPTlMgMzIKKworLyogTWF4aW11bSBudW1iZXIgb2YgdmJtZXRhIGltYWdlcyB0aGF0IGNhbiBiZSBsb2FkZWQgd2l0aCBhdmJfc2xvdF92ZXJpZnkoKS4gKi8KKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9WQk1FVEFfSU1BR0VTIDMyCisKKy8qIE1heGltdW0gc2l6ZSBvZiBhIHZibWV0YSBpbWFnZSAtIDY0IEtpQi4gKi8KKyNkZWZpbmUgVkJNRVRBX01BWF9TSVpFICg2NCAqIDEwMjQpCisKKy8qIEhlbHBlciBmdW5jdGlvbiB0byBzZWUgaWYgd2Ugc2hvdWxkIGNvbnRpbnVlIHdpdGggdmVyaWZpY2F0aW9uIGluCisgKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3I9dHJ1ZSBtb2RlIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLiBTZWUgdGhlCisgKiBjb21tZW50cyBmb3IgdGhlIGF2Yl9zbG90X3ZlcmlmeSgpIGZ1bmN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgcmVzdWx0X3Nob3VsZF9jb250aW51ZShBdmJTbG90VmVyaWZ5UmVzdWx0IHJlc3VsdCkgeworICBzd2l0Y2ggKHJlc3VsdCkgeworICAgIGNhc2UgQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9PT006CisgICAgY2FzZSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lPOgorICAgIGNhc2UgQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9JTlZBTElEX01FVEFEQVRBOgorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY2FzZSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LOgorICAgIGNhc2UgQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9WRVJJRklDQVRJT046CisgICAgY2FzZSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1JPTExCQUNLX0lOREVYOgorICAgIGNhc2UgQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9QVUJMSUNfS0VZX1JFSkVDVEVEOgorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBBdmJTbG90VmVyaWZ5UmVzdWx0IGxvYWRfYW5kX3ZlcmlmeV9oYXNoX3BhcnRpdGlvbigKKyAgICBBdmJPcHMqIG9wcywKKyAgICBjb25zdCBjaGFyKiBjb25zdCogcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgY29uc3QgY2hhciogYWJfc3VmZml4LAorICAgIGJvb2wgYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yLAorICAgIGNvbnN0IEF2YkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgQXZiU2xvdFZlcmlmeURhdGEqIHNsb3RfZGF0YSkgeworICBBdmJIYXNoRGVzY3JpcHRvciBoYXNoX2Rlc2M7CisgIGNvbnN0IHVpbnQ4X3QqIGRlc2NfcGFydGl0aW9uX25hbWUgPSBOVUxMOworICBjb25zdCB1aW50OF90KiBkZXNjX3NhbHQ7CisgIGNvbnN0IHVpbnQ4X3QqIGRlc2NfZGlnZXN0OworICBjaGFyIHBhcnRfbmFtZVtQQVJUX05BTUVfTUFYX1NJWkVdOworICBBdmJTbG90VmVyaWZ5UmVzdWx0IHJldDsKKyAgQXZiSU9SZXN1bHQgaW9fcmV0OworICB1aW50OF90KiBpbWFnZV9idWYgPSBOVUxMOworICBzaXplX3QgcGFydF9udW1fcmVhZDsKKyAgdWludDhfdCogZGlnZXN0OworICBzaXplX3QgZGlnZXN0X2xlbjsKKyAgY29uc3QgY2hhciogZm91bmQ7CisKKyAgaWYgKCFhdmJfaGFzaF9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgKKyAgICAgICAgICAoY29uc3QgQXZiSGFzaERlc2NyaXB0b3IqKWRlc2NyaXB0b3IsICZoYXNoX2Rlc2MpKSB7CisgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9JTlZBTElEX01FVEFEQVRBOworICAgIGdvdG8gb3V0OworICB9CisKKyAgZGVzY19wYXJ0aXRpb25fbmFtZSA9CisgICAgICAoKGNvbnN0IHVpbnQ4X3QqKWRlc2NyaXB0b3IpICsgc2l6ZW9mKEF2Ykhhc2hEZXNjcmlwdG9yKTsKKyAgZGVzY19zYWx0ID0gZGVzY19wYXJ0aXRpb25fbmFtZSArIGhhc2hfZGVzYy5wYXJ0aXRpb25fbmFtZV9sZW47CisgIGRlc2NfZGlnZXN0ID0gZGVzY19zYWx0ICsgaGFzaF9kZXNjLnNhbHRfbGVuOworCisgIGlmICghYXZiX3ZhbGlkYXRlX3V0ZjgoZGVzY19wYXJ0aXRpb25fbmFtZSwgaGFzaF9kZXNjLnBhcnRpdGlvbl9uYW1lX2xlbikpIHsKKyAgICBhdmJfZXJyb3IoIlBhcnRpdGlvbiBuYW1lIGlzIG5vdCB2YWxpZCBVVEYtOC5cbiIpOworICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfSU5WQUxJRF9NRVRBREFUQTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGlmICghYXZiX3N0cl9jb25jYXQocGFydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBwYXJ0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKWRlc2NfcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgaGFzaF9kZXNjLnBhcnRpdGlvbl9uYW1lX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBhYl9zdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgYXZiX3N0cmxlbihhYl9zdWZmaXgpKSkgeworICAgIGF2Yl9lcnJvcigiUGFydGl0aW9uIG5hbWUgYW5kIHN1ZmZpeCBkb2VzIG5vdCBmaXQuXG4iKTsKKyAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lOVkFMSURfTUVUQURBVEE7CisgICAgZ290byBvdXQ7CisgIH0KKworICBpbWFnZV9idWYgPSBhdmJfbWFsbG9jKGhhc2hfZGVzYy5pbWFnZV9zaXplKTsKKyAgaWYgKGltYWdlX2J1ZiA9PSBOVUxMKSB7CisgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9PT007CisgICAgZ290byBvdXQ7CisgIH0KKworICBpb19yZXQgPSBvcHMtPnJlYWRfZnJvbV9wYXJ0aXRpb24ob3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBvZmZzZXQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Rlc2MuaW1hZ2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0X251bV9yZWFkKTsKKyAgaWYgKGlvX3JldCA9PSBBVkJfSU9fUkVTVUxUX0VSUk9SX09PTSkgeworICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfT09NOworICAgIGdvdG8gb3V0OworICB9IGVsc2UgaWYgKGlvX3JldCAhPSBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgYXZiX2Vycm9ydihwYXJ0X25hbWUsICI6IEVycm9yIGxvYWRpbmcgZGF0YSBmcm9tIHBhcnRpdGlvbi5cbiIsIE5VTEwpOworICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfSU87CisgICAgZ290byBvdXQ7CisgIH0KKyAgaWYgKHBhcnRfbnVtX3JlYWQgIT0gaGFzaF9kZXNjLmltYWdlX3NpemUpIHsKKyAgICBhdmJfZXJyb3J2KHBhcnRfbmFtZSwgIjogUmVhZCBmZXdlciB0aGFuIHJlcXVlc3RlZCBieXRlcy5cbiIsIE5VTEwpOworICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfSU87CisgICAgZ290byBvdXQ7CisgIH0KKworICBpZiAoYXZiX3N0cmNtcCgoY29uc3QgY2hhciopaGFzaF9kZXNjLmhhc2hfYWxnb3JpdGhtLCAic2hhMjU2IikgPT0gMCkgeworICAgIEF2YlNIQTI1NkN0eCBzaGEyNTZfY3R4OworICAgIGF2Yl9zaGEyNTZfaW5pdCgmc2hhMjU2X2N0eCk7CisgICAgYXZiX3NoYTI1Nl91cGRhdGUoJnNoYTI1Nl9jdHgsIGRlc2Nfc2FsdCwgaGFzaF9kZXNjLnNhbHRfbGVuKTsKKyAgICBhdmJfc2hhMjU2X3VwZGF0ZSgmc2hhMjU2X2N0eCwgaW1hZ2VfYnVmLCBoYXNoX2Rlc2MuaW1hZ2Vfc2l6ZSk7CisgICAgZGlnZXN0ID0gYXZiX3NoYTI1Nl9maW5hbCgmc2hhMjU2X2N0eCk7CisgICAgZGlnZXN0X2xlbiA9IEFWQl9TSEEyNTZfRElHRVNUX1NJWkU7CisgIH0gZWxzZSBpZiAoYXZiX3N0cmNtcCgoY29uc3QgY2hhciopaGFzaF9kZXNjLmhhc2hfYWxnb3JpdGhtLCAic2hhNTEyIikgPT0gMCkgeworICAgIEF2YlNIQTUxMkN0eCBzaGE1MTJfY3R4OworICAgIGF2Yl9zaGE1MTJfaW5pdCgmc2hhNTEyX2N0eCk7CisgICAgYXZiX3NoYTUxMl91cGRhdGUoJnNoYTUxMl9jdHgsIGRlc2Nfc2FsdCwgaGFzaF9kZXNjLnNhbHRfbGVuKTsKKyAgICBhdmJfc2hhNTEyX3VwZGF0ZSgmc2hhNTEyX2N0eCwgaW1hZ2VfYnVmLCBoYXNoX2Rlc2MuaW1hZ2Vfc2l6ZSk7CisgICAgZGlnZXN0ID0gYXZiX3NoYTUxMl9maW5hbCgmc2hhNTEyX2N0eCk7CisgICAgZGlnZXN0X2xlbiA9IEFWQl9TSEE1MTJfRElHRVNUX1NJWkU7CisgIH0gZWxzZSB7CisgICAgYXZiX2Vycm9ydihwYXJ0X25hbWUsICI6IFVuc3VwcG9ydGVkIGhhc2ggYWxnb3JpdGhtLlxuIiwgTlVMTCk7CisgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9JTlZBTElEX01FVEFEQVRBOworICAgIGdvdG8gb3V0OworICB9CisKKyAgaWYgKGRpZ2VzdF9sZW4gIT0gaGFzaF9kZXNjLmRpZ2VzdF9sZW4pIHsKKyAgICBhdmJfZXJyb3J2KAorICAgICAgICBwYXJ0X25hbWUsICI6IERpZ2VzdCBpbiBkZXNjcmlwdG9yIG5vdCBvZiBleHBlY3RlZCBzaXplLlxuIiwgTlVMTCk7CisgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9JTlZBTElEX01FVEFEQVRBOworICAgIGdvdG8gb3V0OworICB9CisKKyAgaWYgKGF2Yl9zYWZlX21lbWNtcChkaWdlc3QsIGRlc2NfZGlnZXN0LCBkaWdlc3RfbGVuKSAhPSAwKSB7CisgICAgYXZiX2Vycm9ydihwYXJ0X25hbWUsCisgICAgICAgICAgICAgICAiOiBIYXNoIG9mIGRhdGEgZG9lcyBub3QgbWF0Y2ggZGlnZXN0IGluIGRlc2NyaXB0b3IuXG4iLAorICAgICAgICAgICAgICAgTlVMTCk7CisgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9WRVJJRklDQVRJT047CisgICAgZ290byBvdXQ7CisgIH0KKworICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LOworCitvdXQ6CisKKyAgaWYgKHJldCA9PSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LIHx8IHJlc3VsdF9zaG91bGRfY29udGludWUocmV0KSkgeworICAgIC8qIElmIHRoaXMgaXMgdGhlIHJlcXVlc3RlZCBwYXJ0aXRpb24sIGNvcHkgdG8gc2xvdF9kYXRhLiAqLworICAgIGZvdW5kID0gYXZiX3N0cnZfZmluZF9zdHIocmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopZGVzY19wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfZGVzYy5wYXJ0aXRpb25fbmFtZV9sZW4pOworICAgIGlmIChmb3VuZCAhPSBOVUxMKSB7CisgICAgICBBdmJQYXJ0aXRpb25EYXRhKiBsb2FkZWRfcGFydGl0aW9uOworICAgICAgaWYgKHNsb3RfZGF0YS0+bnVtX2xvYWRlZF9wYXJ0aXRpb25zID09IE1BWF9OVU1CRVJfT0ZfTE9BREVEX1BBUlRJVElPTlMpIHsKKyAgICAgICAgYXZiX2Vycm9ydihwYXJ0X25hbWUsICI6IFRvbyBtYW55IGxvYWRlZCBwYXJ0aXRpb25zLlxuIiwgTlVMTCk7CisgICAgICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfT09NOworICAgICAgICBnb3RvIGZhaWw7CisgICAgICB9CisgICAgICBsb2FkZWRfcGFydGl0aW9uID0KKyAgICAgICAgICAmc2xvdF9kYXRhLT5sb2FkZWRfcGFydGl0aW9uc1tzbG90X2RhdGEtPm51bV9sb2FkZWRfcGFydGl0aW9ucysrXTsKKyAgICAgIGxvYWRlZF9wYXJ0aXRpb24tPnBhcnRpdGlvbl9uYW1lID0gYXZiX3N0cmR1cChmb3VuZCk7CisgICAgICBsb2FkZWRfcGFydGl0aW9uLT5kYXRhX3NpemUgPSBoYXNoX2Rlc2MuaW1hZ2Vfc2l6ZTsKKyAgICAgIGxvYWRlZF9wYXJ0aXRpb24tPmRhdGEgPSBpbWFnZV9idWY7CisgICAgICBpbWFnZV9idWYgPSBOVUxMOworICAgIH0KKyAgfQorCitmYWlsOgorICBpZiAoaW1hZ2VfYnVmICE9IE5VTEwpIHsKKyAgICBhdmJfZnJlZShpbWFnZV9idWYpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBBdmJTbG90VmVyaWZ5UmVzdWx0IGxvYWRfYW5kX3ZlcmlmeV92Ym1ldGEoCisgICAgQXZiT3BzKiBvcHMsCisgICAgY29uc3QgY2hhciogY29uc3QqIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgIGNvbnN0IGNoYXIqIGFiX3N1ZmZpeCwKKyAgICBib29sIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciwKKyAgICBBdmJWQk1ldGFJbWFnZUZsYWdzIHRvcGxldmVsX3ZibWV0YV9mbGFncywKKyAgICBpbnQgcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24sCisgICAgY29uc3QgY2hhciogcGFydGl0aW9uX25hbWUsCisgICAgc2l6ZV90IHBhcnRpdGlvbl9uYW1lX2xlbiwKKyAgICBjb25zdCB1aW50OF90KiBleHBlY3RlZF9wdWJsaWNfa2V5LAorICAgIHNpemVfdCBleHBlY3RlZF9wdWJsaWNfa2V5X2xlbmd0aCwKKyAgICBBdmJTbG90VmVyaWZ5RGF0YSogc2xvdF9kYXRhLAorICAgIEF2YkFsZ29yaXRobVR5cGUqIG91dF9hbGdvcml0aG1fdHlwZSkgeworICBjaGFyIGZ1bGxfcGFydGl0aW9uX25hbWVbUEFSVF9OQU1FX01BWF9TSVpFXTsKKyAgQXZiU2xvdFZlcmlmeVJlc3VsdCByZXQ7CisgIEF2YklPUmVzdWx0IGlvX3JldDsKKyAgc2l6ZV90IHZibWV0YV9vZmZzZXQ7CisgIHNpemVfdCB2Ym1ldGFfc2l6ZTsKKyAgdWludDhfdCogdmJtZXRhX2J1ZiA9IE5VTEw7CisgIHNpemVfdCB2Ym1ldGFfbnVtX3JlYWQ7CisgIEF2YlZCTWV0YVZlcmlmeVJlc3VsdCB2Ym1ldGFfcmV0OworICBjb25zdCB1aW50OF90KiBwa19kYXRhOworICBzaXplX3QgcGtfbGVuOworICBBdmJWQk1ldGFJbWFnZUhlYWRlciB2Ym1ldGFfaGVhZGVyOworICB1aW50NjRfdCBzdG9yZWRfcm9sbGJhY2tfaW5kZXg7CisgIGNvbnN0IEF2YkRlc2NyaXB0b3IqKiBkZXNjcmlwdG9ycyA9IE5VTEw7CisgIHNpemVfdCBudW1fZGVzY3JpcHRvcnM7CisgIHNpemVfdCBuOworICBpbnQgaXNfbWFpbl92Ym1ldGE7CisgIEF2YlZCTWV0YURhdGEqIHZibWV0YV9pbWFnZV9kYXRhID0gTlVMTDsKKworICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LOworCisgIGF2Yl9hc3NlcnQoc2xvdF9kYXRhICE9IE5VTEwpOworCisgIGlzX21haW5fdmJtZXRhID0gKGF2Yl9zdHJjbXAocGFydGl0aW9uX25hbWUsICJ2Ym1ldGEiKSA9PSAwKTsKKworICBpZiAoIWF2Yl92YWxpZGF0ZV91dGY4KChjb25zdCB1aW50OF90KilwYXJ0aXRpb25fbmFtZSwgcGFydGl0aW9uX25hbWVfbGVuKSkgeworICAgIGF2Yl9lcnJvcigiUGFydGl0aW9uIG5hbWUgaXMgbm90IHZhbGlkIFVURi04LlxuIik7CisgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9JTlZBTElEX01FVEFEQVRBOworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogQ29uc3RydWN0IGZ1bGwgcGFydGl0aW9uIG5hbWUuICovCisgIGlmICghYXZiX3N0cl9jb25jYXQoZnVsbF9wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgZnVsbF9wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fbmFtZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgYWJfc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgIGF2Yl9zdHJsZW4oYWJfc3VmZml4KSkpIHsKKyAgICBhdmJfZXJyb3IoIlBhcnRpdGlvbiBuYW1lIGFuZCBzdWZmaXggZG9lcyBub3QgZml0LlxuIik7CisgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9JTlZBTElEX01FVEFEQVRBOworICAgIGdvdG8gb3V0OworICB9CisKKyAgYXZiX2RlYnVndigiTG9hZGluZyB2Ym1ldGEgc3RydWN0IGZyb20gcGFydGl0aW9uICciLAorICAgICAgICAgICAgIGZ1bGxfcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgIicuXG4iLAorICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIElmIHdlJ3JlIGxvYWRpbmcgZnJvbSB0aGUgbWFpbiB2Ym1ldGEgcGFydGl0aW9uLCB0aGUgdmJtZXRhCisgICAqIHN0cnVjdCBpcyBpbiB0aGUgYmVnaW5uaW5nLiBPdGhlcndpc2Ugd2UgaGF2ZSB0byBsb2NhdGUgaXQgdmlhIGEKKyAgICogZm9vdGVyLgorICAgKi8KKyAgaWYgKGlzX21haW5fdmJtZXRhKSB7CisgICAgdmJtZXRhX29mZnNldCA9IDA7CisgICAgdmJtZXRhX3NpemUgPSBWQk1FVEFfTUFYX1NJWkU7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCBmb290ZXJfYnVmW0FWQl9GT09URVJfU0laRV07CisgICAgc2l6ZV90IGZvb3Rlcl9udW1fcmVhZDsKKyAgICBBdmJGb290ZXIgZm9vdGVyOworCisgICAgaW9fcmV0ID0gb3BzLT5yZWFkX2Zyb21fcGFydGl0aW9uKG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUFWQl9GT09URVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCX0ZPT1RFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb290ZXJfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9vdGVyX251bV9yZWFkKTsKKyAgICBpZiAoaW9fcmV0ID09IEFWQl9JT19SRVNVTFRfRVJST1JfT09NKSB7CisgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX09PTTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0gZWxzZSBpZiAoaW9fcmV0ICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICAgIGF2Yl9lcnJvcnYoZnVsbF9wYXJ0aXRpb25fbmFtZSwgIjogRXJyb3IgbG9hZGluZyBmb290ZXIuXG4iLCBOVUxMKTsKKyAgICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfSU87CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgYXZiX2Fzc2VydChmb290ZXJfbnVtX3JlYWQgPT0gQVZCX0ZPT1RFUl9TSVpFKTsKKworICAgIGlmICghYXZiX2Zvb3Rlcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoKGNvbnN0IEF2YkZvb3RlciopZm9vdGVyX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb290ZXIpKSB7CisgICAgICBhdmJfZXJyb3J2KGZ1bGxfcGFydGl0aW9uX25hbWUsICI6IEVycm9yIHZhbGlkYXRpbmcgZm9vdGVyLlxuIiwgTlVMTCk7CisgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lOVkFMSURfTUVUQURBVEE7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKiBCYXNpYyBmb290ZXIgc2FuaXR5IGNoZWNrIHNpbmNlIHRoZSBkYXRhIGlzIHVudHJ1c3RlZC4gKi8KKyAgICBpZiAoZm9vdGVyLnZibWV0YV9zaXplID4gVkJNRVRBX01BWF9TSVpFKSB7CisgICAgICBhdmJfZXJyb3J2KAorICAgICAgICAgIGZ1bGxfcGFydGl0aW9uX25hbWUsICI6IEludmFsaWQgdmJtZXRhIHNpemUgaW4gZm9vdGVyLlxuIiwgTlVMTCk7CisgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lOVkFMSURfTUVUQURBVEE7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICB2Ym1ldGFfb2Zmc2V0ID0gZm9vdGVyLnZibWV0YV9vZmZzZXQ7CisgICAgdmJtZXRhX3NpemUgPSBmb290ZXIudmJtZXRhX3NpemU7CisgIH0KKworICB2Ym1ldGFfYnVmID0gYXZiX21hbGxvYyh2Ym1ldGFfc2l6ZSk7CisgIGlmICh2Ym1ldGFfYnVmID09IE5VTEwpIHsKKyAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX09PTTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGlvX3JldCA9IG9wcy0+cmVhZF9mcm9tX3BhcnRpdGlvbihvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX3BhcnRpdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmJtZXRhX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZibWV0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmJtZXRhX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2Ym1ldGFfbnVtX3JlYWQpOworICBpZiAoaW9fcmV0ID09IEFWQl9JT19SRVNVTFRfRVJST1JfT09NKSB7CisgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9PT007CisgICAgZ290byBvdXQ7CisgIH0gZWxzZSBpZiAoaW9fcmV0ICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICBhdmJfZXJyb3J2KGZ1bGxfcGFydGl0aW9uX25hbWUsICI6IEVycm9yIGxvYWRpbmcgdmJtZXRhIGRhdGEuXG4iLCBOVUxMKTsKKyAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lPOworICAgIGdvdG8gb3V0OworICB9CisgIGF2Yl9hc3NlcnQodmJtZXRhX251bV9yZWFkIDw9IHZibWV0YV9zaXplKTsKKworICAvKiBDaGVjayBpZiB0aGUgaW1hZ2UgaXMgcHJvcGVybHkgc2lnbmVkIGFuZCBnZXQgdGhlIHB1YmxpYyBrZXkgdXNlZAorICAgKiB0byBzaWduIHRoZSBpbWFnZS4KKyAgICovCisgIHZibWV0YV9yZXQgPQorICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkodmJtZXRhX2J1ZiwgdmJtZXRhX251bV9yZWFkLCAmcGtfZGF0YSwgJnBrX2xlbik7CisgIHN3aXRjaCAodmJtZXRhX3JldCkgeworICAgIGNhc2UgQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LOgorICAgICAgYXZiX2Fzc2VydChwa19kYXRhICE9IE5VTEwgJiYgcGtfbGVuID4gMCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LX05PVF9TSUdORUQ6CisgICAgY2FzZSBBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfSEFTSF9NSVNNQVRDSDoKKyAgICBjYXNlIEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9TSUdOQVRVUkVfTUlTTUFUQ0g6CisgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1ZFUklGSUNBVElPTjsKKyAgICAgIGF2Yl9lcnJvcnYoZnVsbF9wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgIjogRXJyb3IgdmVyaWZ5aW5nIHZibWV0YSBpbWFnZTogIiwKKyAgICAgICAgICAgICAgICAgYXZiX3ZibWV0YV92ZXJpZnlfcmVzdWx0X3RvX3N0cmluZyh2Ym1ldGFfcmV0KSwKKyAgICAgICAgICAgICAgICAgIlxuIiwKKyAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBpZiAoIWFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvcikgeworICAgICAgICBnb3RvIG91dDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfSU5WQUxJRF9WQk1FVEFfSEVBREVSOgorICAgICAgLyogTm8gd2F5IHRvIGNvbnRpbnVlIHRoaXMgY2FzZS4gKi8KKyAgICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfSU5WQUxJRF9NRVRBREFUQTsKKyAgICAgIGF2Yl9lcnJvcnYoZnVsbF9wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgIjogRXJyb3IgdmVyaWZ5aW5nIHZibWV0YSBpbWFnZTogaW52YWxpZCB2Ym1ldGEgaGVhZGVyXG4iLAorICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogQnl0ZXN3YXAgdGhlIGhlYWRlci4gKi8KKyAgYXZiX3ZibWV0YV9pbWFnZV9oZWFkZXJfdG9faG9zdF9ieXRlX29yZGVyKChBdmJWQk1ldGFJbWFnZUhlYWRlciopdmJtZXRhX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2Ym1ldGFfaGVhZGVyKTsKKworICAvKiBJZiB3ZSdyZSB0aGUgdG9wbGV2ZWwsIGFzc2lnbiBmbGFncyBzbyB0aGV5J2xsIGJlIHBhc3NlZCBkb3duLiAqLworICBpZiAoaXNfbWFpbl92Ym1ldGEpIHsKKyAgICB0b3BsZXZlbF92Ym1ldGFfZmxhZ3MgPSAoQXZiVkJNZXRhSW1hZ2VGbGFncyl2Ym1ldGFfaGVhZGVyLmZsYWdzOworICB9IGVsc2UgeworICAgIGlmICh2Ym1ldGFfaGVhZGVyLmZsYWdzICE9IDApIHsKKyAgICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfSU5WQUxJRF9NRVRBREFUQTsKKyAgICAgIGF2Yl9lcnJvcnYoZnVsbF9wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgIjogY2hhaW5lZCB2Ym1ldGEgaW1hZ2UgaGFzIG5vbi16ZXJvIGZsYWdzXG4iLAorICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgfQorCisgIC8qIENoZWNrIGlmIGtleSB1c2VkIHRvIG1ha2Ugc2lnbmF0dXJlIG1hdGNoZXMgd2hhdCBpcyBleHBlY3RlZC4gKi8KKyAgaWYgKHBrX2RhdGEgIT0gTlVMTCkgeworICAgIGlmIChleHBlY3RlZF9wdWJsaWNfa2V5ICE9IE5VTEwpIHsKKyAgICAgIGF2Yl9hc3NlcnQoIWlzX21haW5fdmJtZXRhKTsKKyAgICAgIGlmIChleHBlY3RlZF9wdWJsaWNfa2V5X2xlbmd0aCAhPSBwa19sZW4gfHwKKyAgICAgICAgICBhdmJfc2FmZV9tZW1jbXAoZXhwZWN0ZWRfcHVibGljX2tleSwgcGtfZGF0YSwgcGtfbGVuKSAhPSAwKSB7CisgICAgICAgIGF2Yl9lcnJvcnYoZnVsbF9wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAiOiBQdWJsaWMga2V5IHVzZWQgdG8gc2lnbiBkYXRhIGRvZXMgbm90IG1hdGNoIGtleSBpbiBjaGFpbiAiCisgICAgICAgICAgICAgICAgICAgInBhcnRpdGlvbiBkZXNjcmlwdG9yLlxuIiwKKyAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9QVUJMSUNfS0VZX1JFSkVDVEVEOworICAgICAgICBpZiAoIWFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvcikgeworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGJvb2wga2V5X2lzX3RydXN0ZWQgPSBmYWxzZTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHBrX21ldGFkYXRhID0gTlVMTDsKKyAgICAgIHNpemVfdCBwa19tZXRhZGF0YV9sZW4gPSAwOworCisgICAgICBpZiAodmJtZXRhX2hlYWRlci5wdWJsaWNfa2V5X21ldGFkYXRhX3NpemUgPiAwKSB7CisgICAgICAgIHBrX21ldGFkYXRhID0gdmJtZXRhX2J1ZiArIHNpemVvZihBdmJWQk1ldGFJbWFnZUhlYWRlcikgKworICAgICAgICAgICAgICAgICAgICAgIHZibWV0YV9oZWFkZXIuYXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICB2Ym1ldGFfaGVhZGVyLnB1YmxpY19rZXlfbWV0YWRhdGFfb2Zmc2V0OworICAgICAgICBwa19tZXRhZGF0YV9sZW4gPSB2Ym1ldGFfaGVhZGVyLnB1YmxpY19rZXlfbWV0YWRhdGFfc2l6ZTsKKyAgICAgIH0KKworICAgICAgYXZiX2Fzc2VydChpc19tYWluX3ZibWV0YSk7CisgICAgICBpb19yZXQgPSBvcHMtPnZhbGlkYXRlX3ZibWV0YV9wdWJsaWNfa2V5KAorICAgICAgICAgIG9wcywgcGtfZGF0YSwgcGtfbGVuLCBwa19tZXRhZGF0YSwgcGtfbWV0YWRhdGFfbGVuLCAma2V5X2lzX3RydXN0ZWQpOworICAgICAgaWYgKGlvX3JldCA9PSBBVkJfSU9fUkVTVUxUX0VSUk9SX09PTSkgeworICAgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX09PTTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgICB9IGVsc2UgaWYgKGlvX3JldCAhPSBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgICAgIGF2Yl9lcnJvcnYoZnVsbF9wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAiOiBFcnJvciB3aGlsZSBjaGVja2luZyBwdWJsaWMga2V5IHVzZWQgdG8gc2lnbiBkYXRhLlxuIiwKKyAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9JTzsKKyAgICAgICAgZ290byBvdXQ7CisgICAgICB9CisgICAgICBpZiAoIWtleV9pc190cnVzdGVkKSB7CisgICAgICAgIGF2Yl9lcnJvcnYoZnVsbF9wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAiOiBQdWJsaWMga2V5IHVzZWQgdG8gc2lnbiBkYXRhIHJlamVjdGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9QVUJMSUNfS0VZX1JFSkVDVEVEOworICAgICAgICBpZiAoIWFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvcikgeworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgcm9sbGJhY2sgaW5kZXguICovCisgIGlvX3JldCA9IG9wcy0+cmVhZF9yb2xsYmFja19pbmRleCgKKyAgICAgIG9wcywgcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24sICZzdG9yZWRfcm9sbGJhY2tfaW5kZXgpOworICBpZiAoaW9fcmV0ID09IEFWQl9JT19SRVNVTFRfRVJST1JfT09NKSB7CisgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9PT007CisgICAgZ290byBvdXQ7CisgIH0gZWxzZSBpZiAoaW9fcmV0ICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICBhdmJfZXJyb3J2KGZ1bGxfcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAiOiBFcnJvciBnZXR0aW5nIHJvbGxiYWNrIGluZGV4IGZvciBsb2NhdGlvbi5cbiIsCisgICAgICAgICAgICAgICBOVUxMKTsKKyAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lPOworICAgIGdvdG8gb3V0OworICB9CisgIGlmICh2Ym1ldGFfaGVhZGVyLnJvbGxiYWNrX2luZGV4IDwgc3RvcmVkX3JvbGxiYWNrX2luZGV4KSB7CisgICAgYXZiX2Vycm9ydigKKyAgICAgICAgZnVsbF9wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgIjogSW1hZ2Ugcm9sbGJhY2sgaW5kZXggaXMgbGVzcyB0aGFuIHRoZSBzdG9yZWQgcm9sbGJhY2sgaW5kZXguXG4iLAorICAgICAgICBOVUxMKTsKKyAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1JPTExCQUNLX0lOREVYOworICAgIGlmICghYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yKSB7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIH0KKworICAvKiBDb3B5IHZibWV0YSB0byB2Ym1ldGFfaW1hZ2VzIGJlZm9yZSByZWN1cnNpbmcuICovCisgIGlmIChpc19tYWluX3ZibWV0YSkgeworICAgIGF2Yl9hc3NlcnQoc2xvdF9kYXRhLT5udW1fdmJtZXRhX2ltYWdlcyA9PSAwKTsKKyAgfSBlbHNlIHsKKyAgICBhdmJfYXNzZXJ0KHNsb3RfZGF0YS0+bnVtX3ZibWV0YV9pbWFnZXMgPiAwKTsKKyAgfQorICBpZiAoc2xvdF9kYXRhLT5udW1fdmJtZXRhX2ltYWdlcyA9PSBNQVhfTlVNQkVSX09GX1ZCTUVUQV9JTUFHRVMpIHsKKyAgICBhdmJfZXJyb3J2KGZ1bGxfcGFydGl0aW9uX25hbWUsICI6IFRvbyBtYW55IHZibWV0YSBpbWFnZXMuXG4iLCBOVUxMKTsKKyAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX09PTTsKKyAgICBnb3RvIG91dDsKKyAgfQorICB2Ym1ldGFfaW1hZ2VfZGF0YSA9ICZzbG90X2RhdGEtPnZibWV0YV9pbWFnZXNbc2xvdF9kYXRhLT5udW1fdmJtZXRhX2ltYWdlcysrXTsKKyAgdmJtZXRhX2ltYWdlX2RhdGEtPnBhcnRpdGlvbl9uYW1lID0gYXZiX3N0cmR1cChwYXJ0aXRpb25fbmFtZSk7CisgIHZibWV0YV9pbWFnZV9kYXRhLT52Ym1ldGFfZGF0YSA9IHZibWV0YV9idWY7CisgIC8qIE5vdGUgdGhhdCB8dmJtZXRhX2J1ZnwgaXMgYWN0dWFsbHkgfHZibWV0YV9udW1fcmVhZHwgYnl0ZXMgbG9uZworICAgKiBhbmQgdGhpcyBpbmNsdWRlcyBkYXRhIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW1hZ2UuIFBhc3MgdGhlCisgICAqIGFjdHVhbCBzaXplIG9mIHRoZSB2Ym1ldGEgaW1hZ2UuIEFsc28sIG5vIG5lZWQgdG8gdXNlCisgICAqIGF2Yl9zYWZlX2FkZCgpIHNpbmNlIHRoZSBoZWFkZXIgaGFzIGFscmVhZHkgYmVlbiB2ZXJpZmllZC4KKyAgICovCisgIHZibWV0YV9pbWFnZV9kYXRhLT52Ym1ldGFfc2l6ZSA9CisgICAgICBzaXplb2YoQXZiVkJNZXRhSW1hZ2VIZWFkZXIpICsKKyAgICAgIHZibWV0YV9oZWFkZXIuYXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplICsKKyAgICAgIHZibWV0YV9oZWFkZXIuYXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZTsKKyAgdmJtZXRhX2ltYWdlX2RhdGEtPnZlcmlmeV9yZXN1bHQgPSB2Ym1ldGFfcmV0OworCisgIC8qIE5vdyBnbyB0aHJvdWdoIGFsbCBkZXNjcmlwdG9ycyBhbmQgdGFrZSB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uOgorICAgKgorICAgKiAtIGhhc2ggZGVzY3JpcHRvcjogTG9hZCBkYXRhIGZyb20gcGFydGl0aW9uLCBjYWxjdWxhdGUgaGFzaCwgYW5kCisgICAqICAgY2hlY2tzIHRoYXQgaXQgbWF0Y2hlcyB3aGF0J3MgaW4gdGhlIGhhc2ggZGVzY3JpcHRvci4KKyAgICoKKyAgICogLSBoYXNodHJlZSBkZXNjcmlwdG9yOiBEbyBub3RoaW5nIHNpbmNlIHZlcmlmaWNhdGlvbiBoYXBwZW5zCisgICAqICAgb24tdGhlLWZseSBmcm9tIHdpdGhpbiB0aGUgT1MuCisgICAqCisgICAqIC0gY2hhaW5lZCBwYXJ0aXRpb24gZGVzY3JpcHRvcjogTG9hZCB0aGUgZm9vdGVyLCBsb2FkIHRoZSB2Ym1ldGEKKyAgICogICBpbWFnZSwgdmVyaWZ5IHZibWV0YSBpbWFnZSAoaW5jbHVkZXMgcm9sbGJhY2sgY2hlY2tzLCBoYXNoCisgICAqICAgY2hlY2tzLCBiYWlsIG9uIGNoYWluZWQgcGFydGl0aW9ucykuCisgICAqLworICBkZXNjcmlwdG9ycyA9CisgICAgICBhdmJfZGVzY3JpcHRvcl9nZXRfYWxsKHZibWV0YV9idWYsIHZibWV0YV9udW1fcmVhZCwgJm51bV9kZXNjcmlwdG9ycyk7CisgIGZvciAobiA9IDA7IG4gPCBudW1fZGVzY3JpcHRvcnM7IG4rKykgeworICAgIEF2YkRlc2NyaXB0b3IgZGVzYzsKKworICAgIGlmICghYXZiX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKGRlc2NyaXB0b3JzW25dLCAmZGVzYykpIHsKKyAgICAgIGF2Yl9lcnJvcnYoZnVsbF9wYXJ0aXRpb25fbmFtZSwgIjogRGVzY3JpcHRvciBpcyBpbnZhbGlkLlxuIiwgTlVMTCk7CisgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lOVkFMSURfTUVUQURBVEE7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGRlc2MudGFnKSB7CisgICAgICBjYXNlIEFWQl9ERVNDUklQVE9SX1RBR19IQVNIOiB7CisgICAgICAgIEF2YlNsb3RWZXJpZnlSZXN1bHQgc3ViX3JldDsKKyAgICAgICAgc3ViX3JldCA9IGxvYWRfYW5kX3ZlcmlmeV9oYXNoX3BhcnRpdGlvbihvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJfc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yc1tuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90X2RhdGEpOworICAgICAgICBpZiAoc3ViX3JldCAhPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LKSB7CisgICAgICAgICAgcmV0ID0gc3ViX3JldDsKKyAgICAgICAgICBpZiAoIWFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciB8fCAhcmVzdWx0X3Nob3VsZF9jb250aW51ZShyZXQpKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisKKyAgICAgIGNhc2UgQVZCX0RFU0NSSVBUT1JfVEFHX0NIQUlOX1BBUlRJVElPTjogeworICAgICAgICBBdmJTbG90VmVyaWZ5UmVzdWx0IHN1Yl9yZXQ7CisgICAgICAgIEF2YkNoYWluUGFydGl0aW9uRGVzY3JpcHRvciBjaGFpbl9kZXNjOworICAgICAgICBjb25zdCB1aW50OF90KiBjaGFpbl9wYXJ0aXRpb25fbmFtZTsKKyAgICAgICAgY29uc3QgdWludDhfdCogY2hhaW5fcHVibGljX2tleTsKKworICAgICAgICAvKiBPbmx5IGFsbG93IENIQUlOX1BBUlRJVElPTiBkZXNjcmlwdG9ycyBpbiB0aGUgbWFpbiB2Ym1ldGEgaW1hZ2UuICovCisgICAgICAgIGlmICghaXNfbWFpbl92Ym1ldGEpIHsKKyAgICAgICAgICBhdmJfZXJyb3J2KGZ1bGxfcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAiOiBFbmNvdW50ZXJlZCBjaGFpbiBkZXNjcmlwdG9yIG5vdCBpbiBtYWluIGltYWdlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfSU5WQUxJRF9NRVRBREFUQTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYXZiX2NoYWluX3BhcnRpdGlvbl9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgKKyAgICAgICAgICAgICAgICAoQXZiQ2hhaW5QYXJ0aXRpb25EZXNjcmlwdG9yKilkZXNjcmlwdG9yc1tuXSwgJmNoYWluX2Rlc2MpKSB7CisgICAgICAgICAgYXZiX2Vycm9ydihmdWxsX3BhcnRpdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIjogQ2hhaW4gcGFydGl0aW9uIGRlc2NyaXB0b3IgaXMgaW52YWxpZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lOVkFMSURfTUVUQURBVEE7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgICBjaGFpbl9wYXJ0aXRpb25fbmFtZSA9ICgoY29uc3QgdWludDhfdCopZGVzY3JpcHRvcnNbbl0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQXZiQ2hhaW5QYXJ0aXRpb25EZXNjcmlwdG9yKTsKKyAgICAgICAgY2hhaW5fcHVibGljX2tleSA9IGNoYWluX3BhcnRpdGlvbl9uYW1lICsgY2hhaW5fZGVzYy5wYXJ0aXRpb25fbmFtZV9sZW47CisKKyAgICAgICAgc3ViX3JldCA9IGxvYWRfYW5kX3ZlcmlmeV92Ym1ldGEob3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJfc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcGxldmVsX3ZibWV0YV9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5fZGVzYy5yb2xsYmFja19pbmRleF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKWNoYWluX3BhcnRpdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbl9kZXNjLnBhcnRpdGlvbl9uYW1lX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5fcHVibGljX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5fZGVzYy5wdWJsaWNfa2V5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIG91dF9hbGdvcml0aG1fdHlwZSAqLyk7CisgICAgICAgIGlmIChzdWJfcmV0ICE9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfT0spIHsKKyAgICAgICAgICByZXQgPSBzdWJfcmV0OworICAgICAgICAgIGlmICghcmVzdWx0X3Nob3VsZF9jb250aW51ZShyZXQpKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisKKyAgICAgIGNhc2UgQVZCX0RFU0NSSVBUT1JfVEFHX0tFUk5FTF9DTURMSU5FOiB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtlcm5lbF9jbWRsaW5lOworICAgICAgICBBdmJLZXJuZWxDbWRsaW5lRGVzY3JpcHRvciBrZXJuZWxfY21kbGluZV9kZXNjOworICAgICAgICBib29sIGFwcGx5X2NtZGxpbmU7CisKKyAgICAgICAgaWYgKCFhdmJfa2VybmVsX2NtZGxpbmVfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoCisgICAgICAgICAgICAgICAgKEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yKilkZXNjcmlwdG9yc1tuXSwKKyAgICAgICAgICAgICAgICAma2VybmVsX2NtZGxpbmVfZGVzYykpIHsKKyAgICAgICAgICBhdmJfZXJyb3J2KGZ1bGxfcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAiOiBLZXJuZWwgY21kbGluZSBkZXNjcmlwdG9yIGlzIGludmFsaWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9JTlZBTElEX01FVEFEQVRBOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAga2VybmVsX2NtZGxpbmUgPSAoKGNvbnN0IHVpbnQ4X3QqKWRlc2NyaXB0b3JzW25dKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yKTsKKworICAgICAgICBpZiAoIWF2Yl92YWxpZGF0ZV91dGY4KGtlcm5lbF9jbWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbF9jbWRsaW5lX2Rlc2Mua2VybmVsX2NtZGxpbmVfbGVuZ3RoKSkgeworICAgICAgICAgIGF2Yl9lcnJvcnYoZnVsbF9wYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICI6IEtlcm5lbCBjbWRsaW5lIGlzIG5vdCB2YWxpZCBVVEYtOC5cbiIsCisgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lOVkFMSURfTUVUQURBVEE7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb21wYXJlIHRoZSBmbGFncyBmb3IgdG9wLWxldmVsIFZCTWV0YSBzdHJ1Y3Qgd2l0aCBmbGFncyBpbgorICAgICAgICAgKiB0aGUgY29tbWFuZC1saW5lIGRlc2NyaXB0b3Igc28gY29tbWFuZC1saW5lIHNuaXBwZXRzIG9ubHkKKyAgICAgICAgICogaW50ZW5kZWQgZm9yIGEgY2VydGFpbiBtb2RlIChkbS12ZXJpdHkgZW5hYmxlZC9kaXNhYmxlZCkKKyAgICAgICAgICogYXJlIHNraXBwZWQgaWYgYXBwbGljYWJsZS4KKyAgICAgICAgICovCisgICAgICAgIGFwcGx5X2NtZGxpbmUgPSB0cnVlOworICAgICAgICBpZiAodG9wbGV2ZWxfdmJtZXRhX2ZsYWdzICYgQVZCX1ZCTUVUQV9JTUFHRV9GTEFHU19IQVNIVFJFRV9ESVNBQkxFRCkgeworICAgICAgICAgIGlmIChrZXJuZWxfY21kbGluZV9kZXNjLmZsYWdzICYKKyAgICAgICAgICAgICAgQVZCX0tFUk5FTF9DTURMSU5FX0ZMQUdTX1VTRV9PTkxZX0lGX0hBU0hUUkVFX05PVF9ESVNBQkxFRCkgeworICAgICAgICAgICAgYXBwbHlfY21kbGluZSA9IGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoa2VybmVsX2NtZGxpbmVfZGVzYy5mbGFncyAmCisgICAgICAgICAgICAgIEFWQl9LRVJORUxfQ01ETElORV9GTEFHU19VU0VfT05MWV9JRl9IQVNIVFJFRV9ESVNBQkxFRCkgeworICAgICAgICAgICAgYXBwbHlfY21kbGluZSA9IGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcHBseV9jbWRsaW5lKSB7CisgICAgICAgICAgaWYgKHNsb3RfZGF0YS0+Y21kbGluZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBzbG90X2RhdGEtPmNtZGxpbmUgPQorICAgICAgICAgICAgICAgIGF2Yl9jYWxsb2Moa2VybmVsX2NtZGxpbmVfZGVzYy5rZXJuZWxfY21kbGluZV9sZW5ndGggKyAxKTsKKyAgICAgICAgICAgIGlmIChzbG90X2RhdGEtPmNtZGxpbmUgPT0gTlVMTCkgeworICAgICAgICAgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX09PTTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmJfbWVtY3B5KHNsb3RfZGF0YS0+Y21kbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAga2VybmVsX2NtZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbF9jbWRsaW5lX2Rlc2Mua2VybmVsX2NtZGxpbmVfbGVuZ3RoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogbmV3IGNtZGxpbmUgaXM6IDxleGlzdGluZ19jbWRsaW5lPiArICcgJyArIDxuZXdjbWRsaW5lPiArICdcMCcgKi8KKyAgICAgICAgICAgIHNpemVfdCBvcmlnX3NpemUgPSBhdmJfc3RybGVuKHNsb3RfZGF0YS0+Y21kbGluZSk7CisgICAgICAgICAgICBzaXplX3QgbmV3X3NpemUgPQorICAgICAgICAgICAgICAgIG9yaWdfc2l6ZSArIDEgKyBrZXJuZWxfY21kbGluZV9kZXNjLmtlcm5lbF9jbWRsaW5lX2xlbmd0aCArIDE7CisgICAgICAgICAgICBjaGFyKiBuZXdfY21kbGluZSA9IGF2Yl9jYWxsb2MobmV3X3NpemUpOworICAgICAgICAgICAgaWYgKG5ld19jbWRsaW5lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9PT007CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZiX21lbWNweShuZXdfY21kbGluZSwgc2xvdF9kYXRhLT5jbWRsaW5lLCBvcmlnX3NpemUpOworICAgICAgICAgICAgbmV3X2NtZGxpbmVbb3JpZ19zaXplXSA9ICcgJzsKKyAgICAgICAgICAgIGF2Yl9tZW1jcHkobmV3X2NtZGxpbmUgKyBvcmlnX3NpemUgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWxfY21kbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAga2VybmVsX2NtZGxpbmVfZGVzYy5rZXJuZWxfY21kbGluZV9sZW5ndGgpOworICAgICAgICAgICAgYXZiX2ZyZWUoc2xvdF9kYXRhLT5jbWRsaW5lKTsKKyAgICAgICAgICAgIHNsb3RfZGF0YS0+Y21kbGluZSA9IG5ld19jbWRsaW5lOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKworICAgICAgLyogRXhwbGljaXQgZmFsbC10aHJvdWdoICovCisgICAgICBjYXNlIEFWQl9ERVNDUklQVE9SX1RBR19QUk9QRVJUWToKKyAgICAgIGNhc2UgQVZCX0RFU0NSSVBUT1JfVEFHX0hBU0hUUkVFOgorICAgICAgICAvKiBEbyBub3RoaW5nLiAqLworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAocm9sbGJhY2tfaW5kZXhfbG9jYXRpb24gPj0gQVZCX01BWF9OVU1CRVJfT0ZfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT05TKSB7CisgICAgYXZiX2Vycm9ydigKKyAgICAgICAgZnVsbF9wYXJ0aXRpb25fbmFtZSwgIjogSW52YWxpZCByb2xsYmFja19pbmRleF9sb2NhdGlvbi5cbiIsIE5VTEwpOworICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfSU5WQUxJRF9NRVRBREFUQTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIHNsb3RfZGF0YS0+cm9sbGJhY2tfaW5kZXhlc1tyb2xsYmFja19pbmRleF9sb2NhdGlvbl0gPQorICAgICAgdmJtZXRhX2hlYWRlci5yb2xsYmFja19pbmRleDsKKworICBpZiAob3V0X2FsZ29yaXRobV90eXBlICE9IE5VTEwpIHsKKyAgICAqb3V0X2FsZ29yaXRobV90eXBlID0gKEF2YkFsZ29yaXRobVR5cGUpdmJtZXRhX2hlYWRlci5hbGdvcml0aG1fdHlwZTsKKyAgfQorCitvdXQ6CisgIC8qIElmIHx2Ym1ldGFfaW1hZ2VfZGF0YXwgaXNuJ3QgTlVMTCBpdCBtZWFucyB0aGF0IGl0IGFkb3B0ZWQKKyAgICogfHZibWV0YV9idWZ8IHNvIGluIHRoYXQgY2FzZSBkb24ndCBmcmVlIGl0IGhlcmUuCisgICAqLworICBpZiAodmJtZXRhX2ltYWdlX2RhdGEgPT0gTlVMTCkgeworICAgIGlmICh2Ym1ldGFfYnVmICE9IE5VTEwpIHsKKyAgICAgIGF2Yl9mcmVlKHZibWV0YV9idWYpOworICAgIH0KKyAgfQorICBpZiAoZGVzY3JpcHRvcnMgIT0gTlVMTCkgeworICAgIGF2Yl9mcmVlKGRlc2NyaXB0b3JzKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIE5VTV9HVUlEUyAzCisKKy8qIFN1YnN0aXR1dGVzIGFsbCB2YXJpYWJsZXMgKGUuZy4gJChBTkRST0lEX1NZU1RFTV9QQVJUVVVJRCkpIHdpdGgKKyAqIHZhbHVlcy4gUmV0dXJucyBOVUxMIG9uIE9PTSwgb3RoZXJ3aXNlIHRoZSBjbWRsaW5lIHdpdGggdmFsdWVzCisgKiByZXBsYWNlZC4KKyAqLworc3RhdGljIGNoYXIqIHN1Yl9jbWRsaW5lKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNtZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWJfc3VmZml4KSB7CisgIGNvbnN0IGNoYXIqIHBhcnRfbmFtZV9zdHJbTlVNX0dVSURTXSA9IHsic3lzdGVtIiwgImJvb3QiLCAidmJtZXRhIn07CisgIGNvbnN0IGNoYXIqIHJlcGxhY2Vfc3RyW05VTV9HVUlEU10gPSB7IiQoQU5EUk9JRF9TWVNURU1fUEFSVFVVSUQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJChBTkRST0lEX0JPT1RfUEFSVFVVSUQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJChBTkRST0lEX1ZCTUVUQV9QQVJUVVVJRCkifTsKKyAgY2hhciogcmV0ID0gTlVMTDsKKyAgQXZiSU9SZXN1bHQgaW9fcmV0OworCisgIC8qIFJlcGxhY2UgdW5pcXVlIHBhcnRpdGlvbiBHVUlEcyAqLworICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IE5VTV9HVUlEUzsgbisrKSB7CisgICAgY2hhciBwYXJ0X25hbWVbUEFSVF9OQU1FX01BWF9TSVpFXTsKKyAgICBjaGFyIGd1aWRfYnVmWzM3XTsKKyAgICBjaGFyKiBuZXdfcmV0OworCisgICAgaWYgKCFhdmJfc3RyX2NvbmNhdChwYXJ0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgcGFydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFydF9uYW1lX3N0cltuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Yl9zdHJsZW4ocGFydF9uYW1lX3N0cltuXSksCisgICAgICAgICAgICAgICAgICAgICAgICBhYl9zdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICBhdmJfc3RybGVuKGFiX3N1ZmZpeCkpKSB7CisgICAgICBhdmJfZXJyb3IoIlBhcnRpdGlvbiBuYW1lIGFuZCBzdWZmaXggZG9lcyBub3QgZml0LlxuIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaW9fcmV0ID0gb3BzLT5nZXRfdW5pcXVlX2d1aWRfZm9yX3BhcnRpdGlvbigKKyAgICAgICAgb3BzLCBwYXJ0X25hbWUsIGd1aWRfYnVmLCBzaXplb2YgZ3VpZF9idWYpOworICAgIGlmIChpb19yZXQgPT0gQVZCX0lPX1JFU1VMVF9FUlJPUl9PT00pIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoaW9fcmV0ICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICAgIGF2Yl9lcnJvcigiRXJyb3IgZ2V0dGluZyB1bmlxdWUgR1VJRCBmb3IgcGFydGl0aW9uLlxuIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgICBuZXdfcmV0ID0gYXZiX3JlcGxhY2UoY21kbGluZSwgcmVwbGFjZV9zdHJbbl0sIGd1aWRfYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgbmV3X3JldCA9IGF2Yl9yZXBsYWNlKHJldCwgcmVwbGFjZV9zdHJbbl0sIGd1aWRfYnVmKTsKKyAgICB9CisgICAgaWYgKG5ld19yZXQgPT0gTlVMTCkgeworICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICByZXQgPSBuZXdfcmV0OworICB9CisKKyAgcmV0dXJuIHJldDsKKworZmFpbDoKKyAgaWYgKHJldCAhPSBOVUxMKSB7CisgICAgYXZiX2ZyZWUocmV0KTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBjbWRsaW5lX2FwcGVuZF9vcHRpb24oQXZiU2xvdFZlcmlmeURhdGEqIHNsb3RfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNpemVfdCBvZmZzZXQsIGtleV9sZW4sIHZhbHVlX2xlbjsKKyAgY2hhciogbmV3X2NtZGxpbmU7CisKKyAga2V5X2xlbiA9IGF2Yl9zdHJsZW4oa2V5KTsKKyAgdmFsdWVfbGVuID0gYXZiX3N0cmxlbih2YWx1ZSk7CisKKyAgb2Zmc2V0ID0gMDsKKyAgaWYgKHNsb3RfZGF0YS0+Y21kbGluZSAhPSBOVUxMKSB7CisgICAgb2Zmc2V0ID0gYXZiX3N0cmxlbihzbG90X2RhdGEtPmNtZGxpbmUpOworICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICBvZmZzZXQgKz0gMTsKKyAgICB9CisgIH0KKworICBuZXdfY21kbGluZSA9IGF2Yl9jYWxsb2Mob2Zmc2V0ICsga2V5X2xlbiArIHZhbHVlX2xlbiArIDIpOworICBpZiAobmV3X2NtZGxpbmUgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgYXZiX21lbWNweShuZXdfY21kbGluZSwgc2xvdF9kYXRhLT5jbWRsaW5lLCBvZmZzZXQgLSAxKTsKKyAgICBuZXdfY21kbGluZVtvZmZzZXQgLSAxXSA9ICcgJzsKKyAgfQorICBhdmJfbWVtY3B5KG5ld19jbWRsaW5lICsgb2Zmc2V0LCBrZXksIGtleV9sZW4pOworICBuZXdfY21kbGluZVtvZmZzZXQgKyBrZXlfbGVuXSA9ICc9JzsKKyAgYXZiX21lbWNweShuZXdfY21kbGluZSArIG9mZnNldCArIGtleV9sZW4gKyAxLCB2YWx1ZSwgdmFsdWVfbGVuKTsKKyAgaWYgKHNsb3RfZGF0YS0+Y21kbGluZSAhPSBOVUxMKSB7CisgICAgYXZiX2ZyZWUoc2xvdF9kYXRhLT5jbWRsaW5lKTsKKyAgfQorICBzbG90X2RhdGEtPmNtZGxpbmUgPSBuZXdfY21kbGluZTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjbWRsaW5lX2FwcGVuZF91aW50NjRfYmFzZTEwKEF2YlNsb3RWZXJpZnlEYXRhKiBzbG90X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlKSB7CisgIGNvbnN0IGludCBNQVhfRElHSVRTID0gMzI7CisgIGNoYXIgcmV2X2RpZ2l0c1tNQVhfRElHSVRTXTsKKyAgY2hhciBkaWdpdHNbTUFYX0RJR0lUU107CisgIHNpemVfdCBuLCBudW1fZGlnaXRzOworCisgIGZvciAobnVtX2RpZ2l0cyA9IDA7IG51bV9kaWdpdHMgPCBNQVhfRElHSVRTIC0gMTspIHsKKyAgICByZXZfZGlnaXRzW251bV9kaWdpdHMrK10gPSAodmFsdWUgJSAxMCkgKyAnMCc7CisgICAgdmFsdWUgLz0gMTA7CisgICAgaWYgKHZhbHVlID09IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGZvciAobiA9IDA7IG4gPCBudW1fZGlnaXRzOyBuKyspIHsKKyAgICBkaWdpdHNbbl0gPSByZXZfZGlnaXRzW251bV9kaWdpdHMgLSAxIC0gbl07CisgIH0KKyAgZGlnaXRzW25dID0gJ1wwJzsKKworICByZXR1cm4gY21kbGluZV9hcHBlbmRfb3B0aW9uKHNsb3RfZGF0YSwga2V5LCBkaWdpdHMpOworfQorCitzdGF0aWMgaW50IGNtZGxpbmVfYXBwZW5kX2hleChBdmJTbG90VmVyaWZ5RGF0YSogc2xvdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX2xlbikgeworICBjaGFyIGhleF9kaWdpdHNbMTddID0gIjAxMjM0NTY3ODlhYmNkZWYiOworICBjaGFyKiBoZXhfZGF0YTsKKyAgaW50IHJldDsKKyAgc2l6ZV90IG47CisKKyAgaGV4X2RhdGEgPSBhdmJfbWFsbG9jKGRhdGFfbGVuICogMiArIDEpOworICBpZiAoaGV4X2RhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgZm9yIChuID0gMDsgbiA8IGRhdGFfbGVuOyBuKyspIHsKKyAgICBoZXhfZGF0YVtuICogMl0gPSBoZXhfZGlnaXRzW2RhdGFbbl0gPj4gNF07CisgICAgaGV4X2RhdGFbbiAqIDIgKyAxXSA9IGhleF9kaWdpdHNbZGF0YVtuXSAmIDB4MGZdOworICB9CisgIGhleF9kYXRhW24gKiAyXSA9ICdcMCc7CisKKyAgcmV0ID0gY21kbGluZV9hcHBlbmRfb3B0aW9uKHNsb3RfZGF0YSwga2V5LCBoZXhfZGF0YSk7CisgIGF2Yl9mcmVlKGhleF9kYXRhKTsKKyAgcmV0dXJuIHJldDsKK30KKworQXZiU2xvdFZlcmlmeVJlc3VsdCBhdmJfc2xvdF92ZXJpZnkoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhYl9zdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2YlNsb3RWZXJpZnlEYXRhKiogb3V0X2RhdGEpIHsKKyAgQXZiU2xvdFZlcmlmeVJlc3VsdCByZXQ7CisgIEF2YlNsb3RWZXJpZnlEYXRhKiBzbG90X2RhdGEgPSBOVUxMOworICBBdmJBbGdvcml0aG1UeXBlIGFsZ29yaXRobV90eXBlID0gQVZCX0FMR09SSVRITV9UWVBFX05PTkU7CisgIEF2YklPUmVzdWx0IGlvX3JldDsKKworICBpZiAob3V0X2RhdGEgIT0gTlVMTCkgeworICAgICpvdXRfZGF0YSA9IE5VTEw7CisgIH0KKworICBzbG90X2RhdGEgPSBhdmJfY2FsbG9jKHNpemVvZihBdmJTbG90VmVyaWZ5RGF0YSkpOworICBpZiAoc2xvdF9kYXRhID09IE5VTEwpIHsKKyAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX09PTTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKyAgc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzID0KKyAgICAgIGF2Yl9jYWxsb2Moc2l6ZW9mKEF2YlZCTWV0YURhdGEpICogTUFYX05VTUJFUl9PRl9WQk1FVEFfSU1BR0VTKTsKKyAgaWYgKHNsb3RfZGF0YS0+dmJtZXRhX2ltYWdlcyA9PSBOVUxMKSB7CisgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9PT007CisgICAgZ290byBmYWlsOworICB9CisgIHNsb3RfZGF0YS0+bG9hZGVkX3BhcnRpdGlvbnMgPQorICAgICAgYXZiX2NhbGxvYyhzaXplb2YoQXZiUGFydGl0aW9uRGF0YSkgKiBNQVhfTlVNQkVSX09GX0xPQURFRF9QQVJUSVRJT05TKTsKKyAgaWYgKHNsb3RfZGF0YS0+bG9hZGVkX3BhcnRpdGlvbnMgPT0gTlVMTCkgeworICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfT09NOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIHJldCA9IGxvYWRfYW5kX3ZlcmlmeV92Ym1ldGEob3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiX3N1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogdG9wbGV2ZWxfdmJtZXRhX2ZsYWdzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiByb2xsYmFja19pbmRleF9sb2NhdGlvbiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmJtZXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmJfc3RybGVuKCJ2Ym1ldGEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGV4cGVjdGVkX3B1YmxpY19rZXkgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBleHBlY3RlZF9wdWJsaWNfa2V5X2xlbmd0aCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsZ29yaXRobV90eXBlKTsKKyAgaWYgKCFhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgJiYgcmV0ICE9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfT0spIHsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICAvKiBJZiB0aGluZ3MgY2hlY2sgb3V0LCBtYW5nbGUgdGhlIGtlcm5lbCBjb21tYW5kLWxpbmUgYXMgbmVlZGVkLiAqLworICBpZiAocmVzdWx0X3Nob3VsZF9jb250aW51ZShyZXQpKSB7CisgICAgLyogRmlsbCBpbiB8YWJfc3VmZml4fCBmaWVsZC4gKi8KKyAgICBzbG90X2RhdGEtPmFiX3N1ZmZpeCA9IGF2Yl9zdHJkdXAoYWJfc3VmZml4KTsKKyAgICBpZiAoc2xvdF9kYXRhLT5hYl9zdWZmaXggPT0gTlVMTCkgeworICAgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9PT007CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogQWRkIGFuZHJvaWRib290LnZibWV0YS5kZXZpY2Ugb3B0aW9uLiAqLworICAgIGlmICghY21kbGluZV9hcHBlbmRfb3B0aW9uKHNsb3RfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmRldmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBUlRVVUlEPSQoQU5EUk9JRF9WQk1FVEFfUEFSVFVVSUQpIikpIHsKKyAgICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfT09NOworICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIFN1YnN0aXR1dGUgJChBTkRST0lEX1NZU1RFTV9QQVJUVVVJRCkgYW5kIGZyaWVuZHMuICovCisgICAgaWYgKHNsb3RfZGF0YS0+Y21kbGluZSAhPSBOVUxMKSB7CisgICAgICBjaGFyKiBuZXdfY21kbGluZSA9IHN1Yl9jbWRsaW5lKG9wcywgc2xvdF9kYXRhLT5jbWRsaW5lLCBhYl9zdWZmaXgpOworICAgICAgaWYgKG5ld19jbWRsaW5lID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9PT007CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIH0KKyAgICAgIGF2Yl9mcmVlKHNsb3RfZGF0YS0+Y21kbGluZSk7CisgICAgICBzbG90X2RhdGEtPmNtZGxpbmUgPSBuZXdfY21kbGluZTsKKyAgICB9CisKKyAgICAvKiBBZGQgYW5kcm9pZGJvb3Quc2xvdF9zdWZmaXgsIGlmIGFwcGxpY2FibGUuICovCisgICAgaWYgKGF2Yl9zdHJsZW4oYWJfc3VmZml4KSA+IDApIHsKKyAgICAgIGlmICghY21kbGluZV9hcHBlbmRfb3B0aW9uKAorICAgICAgICAgICAgICBzbG90X2RhdGEsICJhbmRyb2lkYm9vdC5zbG90X3N1ZmZpeCIsIGFiX3N1ZmZpeCkpIHsKKyAgICAgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9PT007CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZXQgYW5kcm9pZGJvb3QuYXZiLmRldmljZV9zdGF0ZSB0byAibG9ja2VkIiBvciAidW5sb2NrZWQiLiAqLworICAgIGJvb2wgaXNfZGV2aWNlX3VubG9ja2VkOworICAgIGlvX3JldCA9IG9wcy0+cmVhZF9pc19kZXZpY2VfdW5sb2NrZWQob3BzLCAmaXNfZGV2aWNlX3VubG9ja2VkKTsKKyAgICBpZiAoaW9fcmV0ID09IEFWQl9JT19SRVNVTFRfRVJST1JfT09NKSB7CisgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX09PTTsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9IGVsc2UgaWYgKGlvX3JldCAhPSBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgICBhdmJfZXJyb3IoIkVycm9yIGdldHRpbmcgZGV2aWNlIHN0YXRlLlxuIik7CisgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lPOworICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoIWNtZGxpbmVfYXBwZW5kX29wdGlvbihzbG90X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWRib290LnZibWV0YS5kZXZpY2Vfc3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2RldmljZV91bmxvY2tlZCA/ICJ1bmxvY2tlZCIgOiAibG9ja2VkIikpIHsKKyAgICAgIHJldCA9IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfT09NOworICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIFNldCBhbmRyb2lkYm9vdC52Ym1ldGEue2hhc2hfYWxnLCBzaXplLCBkaWdlc3R9IC0gdXNlIHNhbWUgaGFzaAorICAgICAqIGZ1bmN0aW9uIGFzIGlzIHVzZWQgdG8gc2lnbiB2Ym1ldGEuCisgICAgICovCisgICAgc3dpdGNoIChhbGdvcml0aG1fdHlwZSkgeworICAgICAgLyogRXhwbGljaXQgZmFsbHRocm91Z2guICovCisgICAgICBjYXNlIEFWQl9BTEdPUklUSE1fVFlQRV9OT05FOgorICAgICAgY2FzZSBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBMjU2X1JTQTIwNDg6CisgICAgICBjYXNlIEFWQl9BTEdPUklUSE1fVFlQRV9TSEEyNTZfUlNBNDA5NjoKKyAgICAgIGNhc2UgQVZCX0FMR09SSVRITV9UWVBFX1NIQTI1Nl9SU0E4MTkyOiB7CisgICAgICAgIEF2YlNIQTI1NkN0eCBjdHg7CisgICAgICAgIHNpemVfdCBuLCB0b3RhbF9zaXplID0gMDsKKyAgICAgICAgYXZiX3NoYTI1Nl9pbml0KCZjdHgpOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgc2xvdF9kYXRhLT5udW1fdmJtZXRhX2ltYWdlczsgbisrKSB7CisgICAgICAgICAgYXZiX3NoYTI1Nl91cGRhdGUoJmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90X2RhdGEtPnZibWV0YV9pbWFnZXNbbl0udmJtZXRhX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzW25dLnZibWV0YV9zaXplKTsKKyAgICAgICAgICB0b3RhbF9zaXplICs9IHNsb3RfZGF0YS0+dmJtZXRhX2ltYWdlc1tuXS52Ym1ldGFfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNtZGxpbmVfYXBwZW5kX29wdGlvbigKKyAgICAgICAgICAgICAgICBzbG90X2RhdGEsICJhbmRyb2lkYm9vdC52Ym1ldGEuaGFzaF9hbGciLCAic2hhMjU2IikgfHwKKyAgICAgICAgICAgICFjbWRsaW5lX2FwcGVuZF91aW50NjRfYmFzZTEwKAorICAgICAgICAgICAgICAgIHNsb3RfZGF0YSwgImFuZHJvaWRib290LnZibWV0YS5zaXplIiwgdG90YWxfc2l6ZSkgfHwKKyAgICAgICAgICAgICFjbWRsaW5lX2FwcGVuZF9oZXgoc2xvdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmRpZ2VzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Yl9zaGEyNTZfZmluYWwoJmN0eCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQl9TSEEyNTZfRElHRVNUX1NJWkUpKSB7CisgICAgICAgICAgcmV0ID0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9PT007CisgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgLyogRXhwbGljaXQgZmFsbHRocm91Z2guICovCisgICAgICBjYXNlIEFWQl9BTEdPUklUSE1fVFlQRV9TSEE1MTJfUlNBMjA0ODoKKyAgICAgIGNhc2UgQVZCX0FMR09SSVRITV9UWVBFX1NIQTUxMl9SU0E0MDk2OgorICAgICAgY2FzZSBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBNTEyX1JTQTgxOTI6IHsKKyAgICAgICAgQXZiU0hBNTEyQ3R4IGN0eDsKKyAgICAgICAgc2l6ZV90IG4sIHRvdGFsX3NpemUgPSAwOworICAgICAgICBhdmJfc2hhNTEyX2luaXQoJmN0eCk7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBzbG90X2RhdGEtPm51bV92Ym1ldGFfaW1hZ2VzOyBuKyspIHsKKyAgICAgICAgICBhdmJfc2hhNTEyX3VwZGF0ZSgmY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RfZGF0YS0+dmJtZXRhX2ltYWdlc1tuXS52Ym1ldGFfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90X2RhdGEtPnZibWV0YV9pbWFnZXNbbl0udmJtZXRhX3NpemUpOworICAgICAgICAgIHRvdGFsX3NpemUgKz0gc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzW25dLnZibWV0YV9zaXplOworICAgICAgICB9CisgICAgICAgIGlmICghY21kbGluZV9hcHBlbmRfb3B0aW9uKAorICAgICAgICAgICAgICAgIHNsb3RfZGF0YSwgImFuZHJvaWRib290LnZibWV0YS5oYXNoX2FsZyIsICJzaGE1MTIiKSB8fAorICAgICAgICAgICAgIWNtZGxpbmVfYXBwZW5kX3VpbnQ2NF9iYXNlMTAoCisgICAgICAgICAgICAgICAgc2xvdF9kYXRhLCAiYW5kcm9pZGJvb3QudmJtZXRhLnNpemUiLCB0b3RhbF9zaXplKSB8fAorICAgICAgICAgICAgIWNtZGxpbmVfYXBwZW5kX2hleChzbG90X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuZGlnZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZiX3NoYTUxMl9maW5hbCgmY3R4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCX1NIQTUxMl9ESUdFU1RfU0laRSkpIHsKKyAgICAgICAgICByZXQgPSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX09PTTsKKyAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIF9BVkJfQUxHT1JJVEhNX05VTV9UWVBFUzoKKyAgICAgICAgYXZiX2Fzc2VydF9ub3RfcmVhY2hlZCgpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAob3V0X2RhdGEgIT0gTlVMTCkgeworICAgICAgKm91dF9kYXRhID0gc2xvdF9kYXRhOworICAgIH0gZWxzZSB7CisgICAgICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKHNsb3RfZGF0YSk7CisgICAgfQorICB9CisKKyAgaWYgKCFhbGxvd192ZXJpZmljYXRpb25fZXJyb3IpIHsKKyAgICBhdmJfYXNzZXJ0KHJldCA9PSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LKTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK2ZhaWw6CisgIGlmIChzbG90X2RhdGEgIT0gTlVMTCkgeworICAgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoc2xvdF9kYXRhKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCit2b2lkIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoQXZiU2xvdFZlcmlmeURhdGEqIGRhdGEpIHsKKyAgaWYgKGRhdGEtPmFiX3N1ZmZpeCAhPSBOVUxMKSB7CisgICAgYXZiX2ZyZWUoZGF0YS0+YWJfc3VmZml4KTsKKyAgfQorICBpZiAoZGF0YS0+Y21kbGluZSAhPSBOVUxMKSB7CisgICAgYXZiX2ZyZWUoZGF0YS0+Y21kbGluZSk7CisgIH0KKyAgaWYgKGRhdGEtPnZibWV0YV9pbWFnZXMgIT0gTlVMTCkgeworICAgIHNpemVfdCBuOworICAgIGZvciAobiA9IDA7IG4gPCBkYXRhLT5udW1fdmJtZXRhX2ltYWdlczsgbisrKSB7CisgICAgICBBdmJWQk1ldGFEYXRhKiB2Ym1ldGFfaW1hZ2UgPSAmZGF0YS0+dmJtZXRhX2ltYWdlc1tuXTsKKyAgICAgIGlmICh2Ym1ldGFfaW1hZ2UtPnBhcnRpdGlvbl9uYW1lICE9IE5VTEwpIHsKKyAgICAgICAgYXZiX2ZyZWUodmJtZXRhX2ltYWdlLT5wYXJ0aXRpb25fbmFtZSk7CisgICAgICB9CisgICAgICBpZiAodmJtZXRhX2ltYWdlLT52Ym1ldGFfZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIGF2Yl9mcmVlKHZibWV0YV9pbWFnZS0+dmJtZXRhX2RhdGEpOworICAgICAgfQorICAgIH0KKyAgICBhdmJfZnJlZShkYXRhLT52Ym1ldGFfaW1hZ2VzKTsKKyAgfQorICBpZiAoZGF0YS0+bG9hZGVkX3BhcnRpdGlvbnMgIT0gTlVMTCkgeworICAgIHNpemVfdCBuOworICAgIGZvciAobiA9IDA7IG4gPCBkYXRhLT5udW1fbG9hZGVkX3BhcnRpdGlvbnM7IG4rKykgeworICAgICAgQXZiUGFydGl0aW9uRGF0YSogbG9hZGVkX3BhcnRpdGlvbiA9ICZkYXRhLT5sb2FkZWRfcGFydGl0aW9uc1tuXTsKKyAgICAgIGlmIChsb2FkZWRfcGFydGl0aW9uLT5wYXJ0aXRpb25fbmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGF2Yl9mcmVlKGxvYWRlZF9wYXJ0aXRpb24tPnBhcnRpdGlvbl9uYW1lKTsKKyAgICAgIH0KKyAgICAgIGlmIChsb2FkZWRfcGFydGl0aW9uLT5kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgYXZiX2ZyZWUobG9hZGVkX3BhcnRpdGlvbi0+ZGF0YSk7CisgICAgICB9CisgICAgfQorICAgIGF2Yl9mcmVlKGRhdGEtPmxvYWRlZF9wYXJ0aXRpb25zKTsKKyAgfQorICBhdmJfZnJlZShkYXRhKTsKK30KKworY29uc3QgY2hhciogYXZiX3Nsb3RfdmVyaWZ5X3Jlc3VsdF90b19zdHJpbmcoQXZiU2xvdFZlcmlmeVJlc3VsdCByZXN1bHQpIHsKKyAgY29uc3QgY2hhciogcmV0ID0gTlVMTDsKKworICBzd2l0Y2ggKHJlc3VsdCkgeworICAgIGNhc2UgQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9PSzoKKyAgICAgIHJldCA9ICJPSyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfT09NOgorICAgICAgcmV0ID0gIkVSUk9SX09PTSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfSU86CisgICAgICByZXQgPSAiRVJST1JfSU8iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1ZFUklGSUNBVElPTjoKKyAgICAgIHJldCA9ICJFUlJPUl9WRVJJRklDQVRJT04iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1JPTExCQUNLX0lOREVYOgorICAgICAgcmV0ID0gIkVSUk9SX1JPTExCQUNLX0lOREVYIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9QVUJMSUNfS0VZX1JFSkVDVEVEOgorICAgICAgcmV0ID0gIkVSUk9SX1BVQkxJQ19LRVlfUkVKRUNURUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lOVkFMSURfTUVUQURBVEE6CisgICAgICByZXQgPSAiRVJST1JfSU5WQUxJRF9NRVRBREFUQSI7CisgICAgICBicmVhazsKKyAgICAgIC8qIERvIG5vdCBhZGQgYSAnZGVmYXVsdDonIGNhc2UgaGVyZSBiZWNhdXNlIG9mIC1Xc3dpdGNoLiAqLworICB9CisKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgYXZiX2Vycm9yKCJVbmtub3duIEF2YlNsb3RWZXJpZnlSZXN1bHQgdmFsdWUuXG4iKTsKKyAgICByZXQgPSAiKHVua25vd24pIjsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hdmIvbGliYXZiL2F2Yl9zbG90X3ZlcmlmeS5oIGIvYXZiL2xpYmF2Yi9hdmJfc2xvdF92ZXJpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2MxMmJhCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yi9hdmJfc2xvdF92ZXJpZnkuaApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKEFWQl9JTlNJREVfTElCQVZCX0gpICYmICFkZWZpbmVkKEFWQl9DT01QSUxBVElPTikKKyNlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHksIGluY2x1ZGUgbGliYXZiLmggaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBBVkJfU0xPVF9WRVJJRllfSF8KKyNkZWZpbmUgQVZCX1NMT1RfVkVSSUZZX0hfCisKKyNpbmNsdWRlICJhdmJfb3BzLmgiCisjaW5jbHVkZSAiYXZiX3ZibWV0YV9pbWFnZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFJldHVybiBjb2RlcyB1c2VkIGluIGF2Yl9zbG90X3ZlcmlmeSgpLCBzZWUgdGhhdCBmdW5jdGlvbiBmb3IKKyAqIGRvY3VtZW50YXRpb24gZm9yIGVhY2ggZmllbGQuCisgKgorICogVXNlIGF2Yl9zbG90X3ZlcmlmeV9yZXN1bHRfdG9fc3RyaW5nKCkgdG8gZ2V0IGEgdGV4dHVhbAorICogcmVwcmVzZW50YXRpb24gdXNhYmxlIGZvciBlcnJvci9kZWJ1ZyBvdXRwdXQuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfT0ssCisgIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfT09NLAorICBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lPLAorICBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1ZFUklGSUNBVElPTiwKKyAgQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9ST0xMQkFDS19JTkRFWCwKKyAgQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9QVUJMSUNfS0VZX1JFSkVDVEVELAorICBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lOVkFMSURfTUVUQURBVEEKK30gQXZiU2xvdFZlcmlmeVJlc3VsdDsKKworLyogR2V0IGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB8cmVzdWx0fC4gKi8KK2NvbnN0IGNoYXIqIGF2Yl9zbG90X3ZlcmlmeV9yZXN1bHRfdG9fc3RyaW5nKEF2YlNsb3RWZXJpZnlSZXN1bHQgcmVzdWx0KTsKKworLyogTWF4aW11bSBudW1iZXIgb2Ygcm9sbGJhY2sgaW5kZXggbG9jYXRpb25zIHN1cHBvcnRlZC4gKi8KKyNkZWZpbmUgQVZCX01BWF9OVU1CRVJfT0ZfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT05TIDMyCisKKy8qIEF2YlBhcnRpdGlvbkRhdGEgY29udGFpbnMgZGF0YSBsb2FkZWQgZnJvbSBwYXJ0aXRpb25zIHdoZW4gdXNpbmcKKyAqIGF2Yl9zbG90X3ZlcmlmeSgpLiBUaGUgfHBhcnRpdGlvbl9uYW1lfCBmaWVsZCBjb250YWlucyB0aGUgbmFtZSBvZgorICogdGhlIHBhcnRpdGlvbiAod2l0aG91dCBBL0Igc3VmZml4KSwgfGRhdGF8IHBvaW50cyB0byB0aGUgbG9hZGVkCisgKiBkYXRhIHdoaWNoIGlzIHxkYXRhX3NpemV8IGJ5dGVzIGxvbmcuCisgKgorICogTm90ZSB0aGF0IHRoaXMgaXMgc3RyaWN0bHkgbGVzcyB0aGFuIHRoZSBwYXJ0aXRpb24gc2l6ZSAtIGl0J3Mgb25seQorICogdGhlIGltYWdlIHN0b3JlZCB0aGVyZSwgbm90IHRoZSBlbnRpcmUgcGFydGl0aW9uIG5vciBhbnkgb2YgdGhlCisgKiBtZXRhZGF0YS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyKiBwYXJ0aXRpb25fbmFtZTsKKyAgdWludDhfdCogZGF0YTsKKyAgc2l6ZV90IGRhdGFfc2l6ZTsKK30gQXZiUGFydGl0aW9uRGF0YTsKKworLyogQXZiVkJNZXRhRGF0YSBjb250YWlucyBhIHZibWV0YSBzdHJ1Y3QgbG9hZGVkIGZyb20gYSBwYXJ0aXRpb24gd2hlbgorICogdXNpbmcgYXZiX3Nsb3RfdmVyaWZ5KCkuIFRoZSB8cGFydGl0aW9uX25hbWV8IGZpZWxkIGNvbnRhaW5zIHRoZQorICogbmFtZSBvZiB0aGUgcGFydGl0aW9uICh3aXRob3V0IEEvQiBzdWZmaXgpLCB8dmJtZXRhX2RhdGF8IHBvaW50cyB0bworICogdGhlIGxvYWRlZCBkYXRhIHdoaWNoIGlzIHx2Ym1ldGFfc2l6ZXwgYnl0ZXMgbG9uZy4KKyAqCisgKiBUaGUgfHZlcmlmeV9yZXN1bHR8IGZpZWxkIGNvbnRhaW5zIHRoZSByZXN1bHQgb2YKKyAqIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KCkgb24gdGhlIGRhdGEuIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZQorICogQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LIGZvciBhbGwgdmJtZXRhIGltYWdlcyBpZgorICogYXZiX3Nsb3RfdmVyaWZ5KCkgcmV0dXJucyBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LLgorICoKKyAqIFlvdSBjYW4gdXNlIGF2Yl9kZXNjcmlwdG9yX2dldF9hbGwoKSwgYXZiX2Rlc2NyaXB0b3JfZm9yZWFjaCgpLCBhbmQKKyAqIGF2Yl92Ym1ldGFfaW1hZ2VfaGVhZGVyX3RvX2hvc3RfYnl0ZV9vcmRlcigpIHdpdGggdGhpcyBkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIqIHBhcnRpdGlvbl9uYW1lOworICB1aW50OF90KiB2Ym1ldGFfZGF0YTsKKyAgc2l6ZV90IHZibWV0YV9zaXplOworICBBdmJWQk1ldGFWZXJpZnlSZXN1bHQgdmVyaWZ5X3Jlc3VsdDsKK30gQXZiVkJNZXRhRGF0YTsKKworLyogQXZiU2xvdFZlcmlmeURhdGEgY29udGFpbnMgZGF0YSBuZWVkZWQgdG8gYm9vdCBhIHBhcnRpY3VsYXIgc2xvdAorICogYW5kIGlzIHJldHVybmVkIGJ5IGF2Yl9zbG90X3ZlcmlmeSgpIGlmIHBhcnRpdGlvbnMgaW4gYSBzbG90IGFyZQorICogc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkLgorICoKKyAqIEFsbCBkYXRhIHBvaW50ZWQgdG8gYnkgdGhpcyBzdHJ1Y3QgLSBpbmNsdWRpbmcgZGF0YSBpbiBlYWNoIGl0ZW0gaW4KKyAqIHRoZSB8cGFydGl0aW9uc3wgYXJyYXkgLSB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlCisgKiBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKCkgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqIFRoZSB8YWJfc3VmZml4fCBmaWVsZCBpcyB0aGUgY29weSBvZiB0aGUgb2YgfGFiX3N1ZmZpeHwgZmllbGQKKyAqIHBhc3NlZCB0byBhdmJfc2xvdF92ZXJpZnkoKS4gSXQgaXMgdGhlIEEvQiBzdWZmaXggb2YgdGhlIHNsb3QuCisgKgorICogVGhlIFZCTWV0YSBpbWFnZXMgdGhhdCB3ZXJlIGNoZWNrZWQgYXJlIGF2YWlsYWJsZSBpbiB0aGUKKyAqIHx2Ym1ldGFfaW1hZ2VzfCBmaWVsZC4gVGhlIGZpZWxkIHxudW1fdmJtZXRhX2ltYWdlc3wgY29udGFpbnMgdGhlCisgKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBhcnJheS4gVGhlIGZpcnN0IGVsZW1lbnQgLQorICogdmJtZXRhX2ltYWdlc1swXSAtIGlzIGd1YXJhbnRlZWQgdG8gYmUgZnJvbSB0aGUgInZibWV0YSIgcGFydGl0aW9uCisgKiBpbiB0aGUgcmVxdWVzdGVkIHNsb3QuCisgKgorICogVGhlIHBhcnRpdGlvbnMgbG9hZGVkIGFuZCB2ZXJpZmllZCBmcm9tIGZyb20gdGhlIHNsb3QgYXJlCisgKiBhY2Nlc3NpYmxlIGluIHRoZSB8bG9hZGVkX3BhcnRpdGlvbnN8IGFycmF5LiBUaGUgZmllbGQKKyAqIHxudW1fbG9hZGVkX3BhcnRpdGlvbnN8IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcworICogYXJyYXkuIFRoZSBvcmRlciBvZiBwYXJ0aXRpb25zIGluIHRoaXMgYXJyYXkgbWF5IG5vdCBuZWNlc3NhcmlseSBiZQorICogdGhlIHNhbWUgb3JkZXIgYXMgaW4gdGhlIHBhc3NlZC1pbiB8cmVxdWVzdGVkX3BhcnRpdGlvbnN8IGFycmF5LgorICoKKyAqIFJvbGxiYWNrIGluZGV4ZXMgZm9yIHRoZSB2ZXJpZmllZCBzbG90IGFyZSBzdG9yZWQgaW4gdGhlCisgKiB8cm9sbGJhY2tfaW5kZXhlc3wgZmllbGQuIE5vdGUgdGhhdCBhdmJfc2xvdF92ZXJpZnkoKSB3aWxsIE5FVkVSCisgKiBtb2RpZnkgc3RvcmVkX3JvbGxiYWNrX2luZGV4W25dIGxvY2F0aW9ucyBlLmcuIGl0IHdpbGwgbmV2ZXIgdXNlCisgKiB0aGUgd3JpdGVfcm9sbGJhY2tfaW5kZXgoKSBBdmJPcHMgb3BlcmF0aW9uLiBJbnN0ZWFkIGl0IGlzIHRoZSBqb2IKKyAqIG9mIHRoZSBjYWxsZXIgb2YgYXZiX3Nsb3RfdmVyaWZ5KCkgdG8gZG8gdGhpcyBiYXNlZCBvbiBlLmcuIEEvQgorICogcG9saWN5IGFuZCBvdGhlciBmYWN0b3JzLiBTZWUgbGliYXZiX2FiL2F2Yl9hYl9mbG93LmMgZm9yIGFuCisgKiBleGFtcGxlIG9mIGhvdyB0byBkbyB0aGlzLgorICoKKyAqIFRoZSB8Y21kbGluZXwgZmllbGQgaXMgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgaW4gVVRGLTggcmVzdWx0aW5nCisgKiBmcm9tIGNvbmNhdGVuYXRpbmcgYWxsIHxBdmJLZXJuZWxDbWRsaW5lRGVzY3JpcHRvcnwgYW5kIHRoZW4KKyAqIHBlcmZvcm1pbmcgcHJvcGVyIHN1YnN0aXR1dGlvbiBvZiB0aGUgdmFyaWFibGVzCisgKiAkKEFORFJPSURfU1lTVEVNX1BBUlRVVUlEKSwgJChBTkRST0lEX0JPT1RfUEFSVFVVSUQpLCBhbmQKKyAqICQoQU5EUk9JRF9WQk1FVEFfUEFSVFVVSUQpIHVzaW5nIHRoZQorICogZ2V0X3VuaXF1ZV9ndWlkX2Zvcl9wYXJ0aXRpb24oKSBvcGVyYXRpb24gaW4gfEF2Yk9wc3wuCisgKgorICogQWRkaXRpb25hbGx5LCB0aGUgfGNtZGxpbmV8IGZpZWxkIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGtlcm5lbAorICogY29tbWFuZC1saW5lIG9wdGlvbnMgc2V0OgorICoKKyAqICAgYW5kcm9pZGJvb3QudmJtZXRhLmRldmljZV9zdGF0ZTogc2V0IHRvICJsb2NrZWQiIG9yICJ1bmxvY2tlZCIKKyAqICAgZGVwZW5kaW5nIG9uIHRoZSByZXN1bHQgb2YgdGhlIHJlc3VsdCBvZiBBdmJPcHMncworICogICByZWFkX2lzX3VubG9ja2VkKCkgZnVuY3Rpb24uCisgKgorICogICBhbmRyb2lkYm9vdC5zbG90X3N1ZmZpeDogSWYgfGFiX3N1ZmZpeHwgYXMgcGFzc2VkIGludG8KKyAqICAgYXZiX3Nsb3RfdmVyaWZ5KCkgaXMgbm9uLWVtcHR5LCB0aGlzIHZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvIGl0cworICogICB2YWx1ZS4KKyAqCisgKiAgIGFuZHJvaWRib290LnZibWV0YS57aGFzaF9hbGcsIHNpemUsIGRpZ2VzdH06IFdpbGwgYmUgc2V0IHRvCisgKiAgIHRoZSBkaWdlc3Qgb2YgYWxsIGltYWdlcyBpbiB8dmJtZXRhX2ltYWdlc3wuCisgKgorICogICBhbmRyb2lkYm9vdC52Ym1ldGEuZGV2aWNlOiBUaGlzIGlzIHNldCB0byB0aGUgdmFsdWUKKyAqICAgUEFSVFVVSUQ9JChBTkRST0lEX1ZCTUVUQV9QQVJUVVVJRCkgYmVmb3JlIHN1YnN0aXR1dGlvbiBzbyBpdAorICogICB3aWxsIGVuZCB1cCBwb2ludGluZyB0byB0aGUgdmJtZXRhIHBhcnRpdGlvbiBmb3IgdGhlIHZlcmlmaWVkCisgKiAgIHNsb3QuCisgKgorICogVGhpcyBzdHJ1Y3QgbWF5IGdyb3cgaW4gdGhlIGZ1dHVyZSB3aXRob3V0IGl0IGJlaW5nIGNvbnNpZGVyZWQgYW4KKyAqIEFCSSBicmVhay4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyKiBhYl9zdWZmaXg7CisgIEF2YlZCTWV0YURhdGEqIHZibWV0YV9pbWFnZXM7CisgIHNpemVfdCBudW1fdmJtZXRhX2ltYWdlczsKKyAgQXZiUGFydGl0aW9uRGF0YSogbG9hZGVkX3BhcnRpdGlvbnM7CisgIHNpemVfdCBudW1fbG9hZGVkX3BhcnRpdGlvbnM7CisgIGNoYXIqIGNtZGxpbmU7CisgIHVpbnQ2NF90IHJvbGxiYWNrX2luZGV4ZXNbQVZCX01BWF9OVU1CRVJfT0ZfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT05TXTsKK30gQXZiU2xvdFZlcmlmeURhdGE7CisKKy8qIEZyZWVzIGEgfEF2YlNsb3RWZXJpZnlEYXRhfCBpbmNsdWRpbmcgYWxsIGRhdGEgaXQgcG9pbnRzIHRvLiAqLwordm9pZCBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKEF2YlNsb3RWZXJpZnlEYXRhKiBkYXRhKTsKKworLyogUGVyZm9ybXMgYSBmdWxsIHZlcmlmaWNhdGlvbiBvZiB0aGUgc2xvdCBpZGVudGlmaWVkIGJ5IHxhYl9zdWZmaXh8CisgKiBhbmQgbG9hZCB0aGUgY29udGVudHMgb2YgdGhlIHBhcnRpdGlvbnMgd2hvc2UgbmFtZSBpcyBpbiB0aGUKKyAqIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgYXJyYXkgfHJlcXVlc3RlZF9wYXJ0aXRpb25zfCAoZWFjaCBwYXJ0aXRpb24KKyAqIG11c3QgdXNlIGhhc2ggdmVyaWZpY2F0aW9uKS4gSWYgbm90IHVzaW5nIEEvQiwgcGFzcyBhbiBlbXB0eSBzdHJpbmcKKyAqIChlLmcuICIiLCBub3QgTlVMTCkgZm9yIHxhYl9zdWZmaXh8LgorICoKKyAqIFR5cGljYWxseSB0aGUgfHJlcXVlc3RlZF9wYXJ0aXRpb25zfCBhcnJheSBvbmx5IGNvbnRhaW5zIGEgc2luZ2xlCisgKiBpdGVtIGZvciB0aGUgYm9vdCBwYXJ0aXRpb24sICdib290Jy4KKyAqCisgKiBWZXJpZmljYXRpb24gaW5jbHVkZXMgbG9hZGluZyBkYXRhIGZyb20gdGhlICd2Ym1ldGEnLCBhbGwgaGFzaAorICogcGFydGl0aW9ucywgYW5kIHBvc3NpYmx5IG90aGVyIHBhcnRpdGlvbnMgKHdpdGggfGFiX3N1ZmZpeHwKKyAqIGFwcGVuZGVkKSwgaW5zcGVjdGluZyByb2xsYmFjayBpbmRleGVzLCBhbmQgY2hlY2tpbmcgaWYgdGhlIHB1YmxpYworICoga2V5IHVzZWQgdG8gc2lnbiB0aGUgZGF0YSBpcyBhY2NlcHRhYmxlLiBUaGUgZnVuY3Rpb25zIGluIHxvcHN8CisgKiB3aWxsIGJlIHVzZWQgdG8gZG8gdGhpcy4KKyAqCisgKiBJZiB8b3V0X2RhdGF8IGlzIG5vdCBOVUxMLCBpdCB3aWxsIGJlIHNldCB0byBhIG5ld2x5IGFsbG9jYXRlZAorICogfEF2YlNsb3RWZXJpZnlEYXRhfCBzdHJ1Y3QgY29udGFpbmluZyBhbGwgdGhlIGRhdGEgbmVlZGVkIHRvCisgKiBhY3R1YWxseSBib290IHRoZSBzbG90LiBUaGlzIGRhdGEgc3RydWN0dXJlIHNob3VsZCBiZSBmcmVlZCB3aXRoCisgKiBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKCkgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBpdC4gU2VlIGJlbG93CisgKiBmb3Igd2hlbiB0aGlzIGlzIHJldHVybmVkLgorICoKKyAqIElmIHxhbGxvd192ZXJpZmljYXRpb25fZXJyb3J8IGlzIGZhbHNlIHRoaXMgZnVuY3Rpb24gd2lsbCBiYWlsIG91dAorICogYXMgc29vbiBhcyBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBhbmQgfG91dF9kYXRhfCBpcyBzZXQgb25seSBpZgorICogQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9PSyBpcyByZXR1cm5lZC4KKyAqCisgKiBPdGhlcndpc2UgaWYgfGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvcnwgaXMgdHJ1ZSB0aGUgZnVuY3Rpb24gd2lsbAorICogY29udGludWUgdmVyaWZpY2F0aW9uIGVmZm9ydHMgYW5kIHxvdXRfZGF0YXwgaXMgYWxzbyBzZXQgaWYKKyAqIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfUFVCTElDX0tFWV9SRUpFQ1RFRCwKKyAqIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfVkVSSUZJQ0FUSU9OLCBvcgorICogQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9ST0xMQkFDS19JTkRFWCBpcyByZXR1cm5lZC4gSXQgaXMKKyAqIHVuZGVmaW5lZCB3aGljaCBlcnJvciBpcyByZXR1cm5lZCBpZiBtb3JlIHRoYW4gb25lIGRpc3RpbmN0IGVycm9yCisgKiBpcyBlbmNvdW50ZXJlZC4gSXQgaXMgZ3VhcmFudGVlZCB0aGF0IEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfT0sgaXMKKyAqIHJldHVybmVkIGlmLCBhbmQgb25seSBpZiwgdGhlcmUgYXJlIG5vIGVycm9ycy4gVGhpcyBtb2RlIGlzIG5lZWRlZAorICogdG8gYm9vdCB2YWxpZCBidXQgdW52ZXJpZmllZCBzbG90cyB3aGVuIHRoZSBkZXZpY2UgaXMgdW5sb2NrZWQuCisgKgorICogQWxzbyBub3RlIHRoYXQgfG91dF9kYXRhfCBpcyBuZXZlciBzZXQgaWYKKyAqIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfT09NLCBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lPLAorICogb3IgQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9JTlZBTElEX01FVEFEQVRBIGlzIHJldHVybmVkLgorICoKKyAqIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfT0sgaXMgcmV0dXJuZWQgaWYgZXZlcnl0aGluZyBpcyB2ZXJpZmllZAorICogY29ycmVjdGx5IGFuZCBhbGwgcHVibGljIGtleXMgYXJlIGFjY2VwdGVkLgorICoKKyAqIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfUFVCTElDX0tFWV9SRUpFQ1RFRCBpcyByZXR1cm5lZCBpZgorICogZXZlcnl0aGluZyBpcyB2ZXJpZmllZCBjb3JyZWN0bHkgb3V0IGJ1dCBvbmUgb3IgbW9yZSBwdWJsaWMga2V5cworICogYXJlIG5vdCBhY2NlcHRlZC4gVGhpcyBpbmNsdWRlcyB0aGUgY2FzZSB3aGVyZSBpbnRlZ3JpdHkgZGF0YSBpcworICogbm90IHNpZ25lZC4KKyAqCisgKiBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX09PTSBpcyByZXR1cm5lZCBpZiB1bmFibGUgdG8KKyAqIGFsbG9jYXRlIG1lbW9yeS4KKyAqCisgKiBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lPIGlzIHJldHVybmVkIGlmIGFuIEkvTyBlcnJvcgorICogb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGxvYWQgZGF0YSBvciBnZXQgYSByb2xsYmFjayBpbmRleC4KKyAqCisgKiBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1ZFUklGSUNBVElPTiBpcyByZXR1cm5lZCBpZiB0aGUgZGF0YQorICogZGlkIG5vdCB2ZXJpZnksIGUuZy4gdGhlIGRpZ2VzdCBkaWRuJ3QgbWF0Y2ggb3Igc2lnbmF0dXJlIGNoZWNrcworICogZmFpbGVkLgorICoKKyAqIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfUk9MTEJBQ0tfSU5ERVggaXMgcmV0dXJuZWQgaWYgYQorICogcm9sbGJhY2sgaW5kZXggd2FzIGxlc3MgdGhhbiBpdHMgc3RvcmVkIHZhbHVlLgorICoKKyAqIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfSU5WQUxJRF9NRVRBREFUQSBpcyByZXR1cm5lZCBpZiBzb21lCisgKiBvZiB0aGUgbWV0YWRhdGEgaXMgaW52YWxpZCBvciBpbmNvbnNpc3RlbnQuCisgKi8KK0F2YlNsb3RWZXJpZnlSZXN1bHQgYXZiX3Nsb3RfdmVyaWZ5KEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWJfc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmJTbG90VmVyaWZ5RGF0YSoqIG91dF9kYXRhKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFWQl9TTE9UX1ZFUklGWV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXZiL2xpYmF2Yi9hdmJfc3lzZGVwcy5oIGIvYXZiL2xpYmF2Yi9hdmJfc3lzZGVwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYTgzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiL2F2Yl9zeXNkZXBzLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZChBVkJfSU5TSURFX0xJQkFWQl9IKSAmJiAhZGVmaW5lZChBVkJfQ09NUElMQVRJT04pCisjZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LCBpbmNsdWRlIGxpYmF2Yi5oIGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgQVZCX1NZU0RFUFNfSF8KKyNkZWZpbmUgQVZCX1NZU0RFUFNfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBDaGFuZ2UgdGhlc2UgaW5jbHVkZXMgdG8gbWF0Y2ggeW91ciBwbGF0Zm9ybSB0byBicmluZyBpbiB0aGUKKyAqIGVxdWl2YWxlbnQgdHlwZXMgYXZhaWxhYmxlIGluIGEgbm9ybWFsIEMgcnVudGltZS4gQXQgbGVhc3QgdGhpbmdzCisgKiBsaWtlIHVpbnQ4X3QsIHVpbnQ2NF90LCBhbmQgYm9vbCAod2l0aCB8ZmFsc2V8LCB8dHJ1ZXwga2V5d29yZHMpCisgKiBtdXN0IGJlIHByZXNlbnQuCisgKi8KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogSWYgeW91IGRvbid0IGhhdmUgZ2NjIG9yIGNsYW5nLCB0aGVzZSBhdHRyaWJ1dGUgbWFjcm9zIG1heSBuZWVkIHRvCisgKiBiZSBhZGp1c3RlZC4KKyAqLworI2RlZmluZSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQgX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSkKKyNkZWZpbmUgQVZCX0FUVFJfUEFDS0VEIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisjZGVmaW5lIEFWQl9BVFRSX05PX1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisjZGVmaW5lIEFWQl9BVFRSX1NFTlRJTkVMIF9fYXR0cmlidXRlX18oKF9fc2VudGluZWxfXykpCisKKy8qIFNpemUgaW4gYnl0ZXMgdXNlZCBmb3IgYWxpZ25tZW50LiAqLworI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIEFWQl9BTElHTk1FTlRfU0laRSA4CisjZWxzZQorI2RlZmluZSBBVkJfQUxJR05NRU5UX1NJWkUgNAorI2VuZGlmCisKKy8qIENvbXBhcmUgfG58IGJ5dGVzIGluIHxzcmMxfCBhbmQgfHNyYzJ8LgorICoKKyAqIFJldHVybnMgYW4gaW50ZWdlciBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gemVybyBpZiB0aGUKKyAqIGZpcnN0IHxufCBieXRlcyBvZiB8c3JjMXwgaXMgZm91bmQsIHJlc3BlY3RpdmVseSwgdG8gYmUgbGVzcyB0aGFuLAorICogdG8gbWF0Y2gsIG9yIGJlIGdyZWF0ZXIgdGhhbiB0aGUgZmlyc3QgfG58IGJ5dGVzIG9mIHxzcmMyfC4gKi8KK2ludCBhdmJfbWVtY21wKGNvbnN0IHZvaWQqIHNyYzEsCisgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzcmMyLAorICAgICAgICAgICAgICAgc2l6ZV90IG4pIEFWQl9BVFRSX1dBUk5fVU5VU0VEX1JFU1VMVDsKKworLyogQ29tcGFyZSB0d28gc3RyaW5ncy4KKyAqCisgKiBSZXR1cm4gYW4gaW50ZWdlciBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gemVybyBpZiB8czF8CisgKiBpcyBmb3VuZCwgcmVzcGVjdGl2ZWx5LCB0byBiZSBsZXNzIHRoYW4sIHRvIG1hdGNoLCBvciBiZSBncmVhdGVyCisgKiB0aGFuIHxzMnwuCisgKi8KK2ludCBhdmJfc3RyY21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMik7CisKKy8qIENvcHkgfG58IGJ5dGVzIGZyb20gfHNyY3wgdG8gfGRlc3R8LiAqLwordm9pZCogYXZiX21lbWNweSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBuKTsKKworLyogU2V0IHxufCBieXRlcyBzdGFydGluZyBhdCB8c3wgdG8gfGN8LiAgUmV0dXJucyB8ZGVzdHwuICovCit2b2lkKiBhdmJfbWVtc2V0KHZvaWQqIGRlc3QsIGNvbnN0IGludCBjLCBzaXplX3Qgbik7CisKKy8qIFByaW50cyBvdXQgYSBtZXNzYWdlLiBUaGUgc3RyaW5nIHBhc3NlZCBtdXN0IGJlIGEgTlVMLXRlcm1pbmF0ZWQKKyAqIFVURi04IHN0cmluZy4KKyAqLwordm9pZCBhdmJfcHJpbnQoY29uc3QgY2hhciogbWVzc2FnZSk7CisKKy8qIFByaW50cyBvdXQgYSB2ZWN0b3Igb2Ygc3RyaW5ncy4gRWFjaCBhcmd1bWVudCBtdXN0IHBvaW50IHRvIGEKKyAqIE5VTC10ZXJtaW5hdGVkIFVURi04IHN0cmluZyBhbmQgTlVMTCBzaG91bGQgYmUgdGhlIGxhc3QgYXJndW1lbnQuCisgKi8KK3ZvaWQgYXZiX3ByaW50dihjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pIEFWQl9BVFRSX1NFTlRJTkVMOworCisvKiBBYm9ydHMgdGhlIHByb2dyYW0gb3IgcmVib290cyB0aGUgZGV2aWNlLiAqLwordm9pZCBhdmJfYWJvcnQodm9pZCkgQVZCX0FUVFJfTk9fUkVUVVJOOworCisvKiBBbGxvY2F0ZXMgfHNpemV8IGJ5dGVzLiBSZXR1cm5zIE5VTEwgaWYgbm8gbWVtb3J5IGlzIGF2YWlsYWJsZSwKKyAqIG90aGVyd2lzZSBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKgorICogVGhlIG1lbW9yeSBpcyBub3QgaW5pdGlhbGl6ZWQuCisgKgorICogVGhlIHBvaW50ZXIgcmV0dXJuZWQgaXMgZ3VhcmFudGVlZCB0byBiZSB3b3JkLWFsaWduZWQuCisgKgorICogVGhlIG1lbW9yeSBzaG91bGQgYmUgZnJlZWQgd2l0aCBhdmJfZnJlZSgpIHdoZW4geW91IGFyZSBkb25lIHdpdGggaXQuCisgKi8KK3ZvaWQqIGF2Yl9tYWxsb2NfKHNpemVfdCBzaXplKSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKy8qIEZyZWVzIG1lbW9yeSBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIGF2Yl9tYWxsb2MoKS4gKi8KK3ZvaWQgYXZiX2ZyZWUodm9pZCogcHRyKTsKKworLyogUmV0dXJucyB0aGUgbGVuZ2h0IG9mIHxzdHJ8LCBleGNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTC1ieXRlLiAqLworc2l6ZV90IGF2Yl9zdHJsZW4oY29uc3QgY2hhciogc3RyKSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBVkJfU1lTREVQU19IXyAqLwpkaWZmIC0tZ2l0IGEvYXZiL2xpYmF2Yi9hdmJfc3lzZGVwc19wb3NpeC5jIGIvYXZiL2xpYmF2Yi9hdmJfc3lzZGVwc19wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNDBkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiL2F2Yl9zeXNkZXBzX3Bvc2l4LmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhdmJfc3lzZGVwcy5oIgorCitpbnQgYXZiX21lbWNtcChjb25zdCB2b2lkKiBzcmMxLCBjb25zdCB2b2lkKiBzcmMyLCBzaXplX3QgbikgeworICByZXR1cm4gbWVtY21wKHNyYzEsIHNyYzIsIG4pOworfQorCit2b2lkKiBhdmJfbWVtY3B5KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IG4pIHsKKyAgcmV0dXJuIG1lbWNweShkZXN0LCBzcmMsIG4pOworfQorCit2b2lkKiBhdmJfbWVtc2V0KHZvaWQqIGRlc3QsIGNvbnN0IGludCBjLCBzaXplX3QgbikgeworICByZXR1cm4gbWVtc2V0KGRlc3QsIGMsIG4pOworfQorCitpbnQgYXZiX3N0cmNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKKyAgcmV0dXJuIHN0cmNtcChzMSwgczIpOworfQorCitzaXplX3QgYXZiX3N0cmxlbihjb25zdCBjaGFyKiBzdHIpIHsKKyAgcmV0dXJuIHN0cmxlbihzdHIpOworfQorCit2b2lkIGF2Yl9hYm9ydCh2b2lkKSB7CisgIGFib3J0KCk7Cit9CisKK3ZvaWQgYXZiX3ByaW50KGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgZnByaW50ZihzdGRlcnIsICIlcyIsIG1lc3NhZ2UpOworfQorCit2b2lkIGF2Yl9wcmludHYoY29uc3QgY2hhciogbWVzc2FnZSwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIGNvbnN0IGNoYXIqIG07CisKKyAgdmFfc3RhcnQoYXAsIG1lc3NhZ2UpOworICBmb3IgKG0gPSBtZXNzYWdlOyBtICE9IE5VTEw7IG0gPSB2YV9hcmcoYXAsIGNvbnN0IGNoYXIqKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBtKTsKKyAgfQorICB2YV9lbmQoYXApOworfQorCit2b2lkKiBhdmJfbWFsbG9jXyhzaXplX3Qgc2l6ZSkgeworICByZXR1cm4gbWFsbG9jKHNpemUpOworfQorCit2b2lkIGF2Yl9mcmVlKHZvaWQqIHB0cikgeworICBmcmVlKHB0cik7Cit9CmRpZmYgLS1naXQgYS9hdmIvbGliYXZiL2F2Yl91dGlsLmMgYi9hdmIvbGliYXZiL2F2Yl91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1N2I2MgotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX3V0aWwuYwpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImF2Yl91dGlsLmgiCisKK3VpbnQzMl90IGF2Yl9iZTMydG9oKHVpbnQzMl90IGluKSB7CisgIHVpbnQ4X3QqIGQgPSAodWludDhfdCopJmluOworICB1aW50MzJfdCByZXQ7CisgIHJldCA9ICgodWludDMyX3QpZFswXSkgPDwgMjQ7CisgIHJldCB8PSAoKHVpbnQzMl90KWRbMV0pIDw8IDE2OworICByZXQgfD0gKCh1aW50MzJfdClkWzJdKSA8PCA4OworICByZXQgfD0gKCh1aW50MzJfdClkWzNdKTsKKyAgcmV0dXJuIHJldDsKK30KKwordWludDY0X3QgYXZiX2JlNjR0b2godWludDY0X3QgaW4pIHsKKyAgdWludDhfdCogZCA9ICh1aW50OF90KikmaW47CisgIHVpbnQ2NF90IHJldDsKKyAgcmV0ID0gKCh1aW50NjRfdClkWzBdKSA8PCA1NjsKKyAgcmV0IHw9ICgodWludDY0X3QpZFsxXSkgPDwgNDg7CisgIHJldCB8PSAoKHVpbnQ2NF90KWRbMl0pIDw8IDQwOworICByZXQgfD0gKCh1aW50NjRfdClkWzNdKSA8PCAzMjsKKyAgcmV0IHw9ICgodWludDY0X3QpZFs0XSkgPDwgMjQ7CisgIHJldCB8PSAoKHVpbnQ2NF90KWRbNV0pIDw8IDE2OworICByZXQgfD0gKCh1aW50NjRfdClkWzZdKSA8PCA4OworICByZXQgfD0gKCh1aW50NjRfdClkWzddKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogQ29udmVydHMgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBmcm9tIGhvc3QgdG8gYmlnLWVuZGlhbiBieXRlIG9yZGVyLiAqLwordWludDMyX3QgYXZiX2h0b2JlMzIodWludDMyX3QgaW4pIHsKKyAgdW5pb24geworICAgIHVpbnQzMl90IHdvcmQ7CisgICAgdWludDhfdCBieXRlc1s0XTsKKyAgfSByZXQ7CisgIHJldC5ieXRlc1swXSA9IChpbiA+PiAyNCkgJiAweGZmOworICByZXQuYnl0ZXNbMV0gPSAoaW4gPj4gMTYpICYgMHhmZjsKKyAgcmV0LmJ5dGVzWzJdID0gKGluID4+IDgpICYgMHhmZjsKKyAgcmV0LmJ5dGVzWzNdID0gaW4gJiAweGZmOworICByZXR1cm4gcmV0LndvcmQ7Cit9CisKKy8qIENvbnZlcnRzIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgZnJvbSBob3N0IHRvIGJpZy1lbmRpYW4gYnl0ZSBvcmRlci4gKi8KK3VpbnQ2NF90IGF2Yl9odG9iZTY0KHVpbnQ2NF90IGluKSB7CisgIHVuaW9uIHsKKyAgICB1aW50NjRfdCB3b3JkOworICAgIHVpbnQ4X3QgYnl0ZXNbOF07CisgIH0gcmV0OworICByZXQuYnl0ZXNbMF0gPSAoaW4gPj4gNTYpICYgMHhmZjsKKyAgcmV0LmJ5dGVzWzFdID0gKGluID4+IDQ4KSAmIDB4ZmY7CisgIHJldC5ieXRlc1syXSA9IChpbiA+PiA0MCkgJiAweGZmOworICByZXQuYnl0ZXNbM10gPSAoaW4gPj4gMzIpICYgMHhmZjsKKyAgcmV0LmJ5dGVzWzRdID0gKGluID4+IDI0KSAmIDB4ZmY7CisgIHJldC5ieXRlc1s1XSA9IChpbiA+PiAxNikgJiAweGZmOworICByZXQuYnl0ZXNbNl0gPSAoaW4gPj4gOCkgJiAweGZmOworICByZXQuYnl0ZXNbN10gPSBpbiAmIDB4ZmY7CisgIHJldHVybiByZXQud29yZDsKK30KKworaW50IGF2Yl9zYWZlX21lbWNtcChjb25zdCB2b2lkKiBzMSwgY29uc3Qgdm9pZCogczIsIHNpemVfdCBuKSB7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHVzMSA9IHMxOworICBjb25zdCB1bnNpZ25lZCBjaGFyKiB1czIgPSBzMjsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgaWYgKDAgPT0gbikgeworICAgIHJldHVybiAwOworICB9CisKKyAgLyoKKyAgICogQ29kZSBzbmlwcGV0IHdpdGhvdXQgZGF0YS1kZXBlbmRlbnQgYnJhbmNoIGR1ZSB0byBOYXRlIExhd3NvbgorICAgKiAobmF0ZUByb290Lm9yZykgb2YgUm9vdCBMYWJzLgorICAgKi8KKyAgd2hpbGUgKG4tLSkgeworICAgIHJlc3VsdCB8PSAqdXMxKysgXiAqdXMyKys7CisgIH0KKworICByZXR1cm4gcmVzdWx0ICE9IDA7Cit9CisKK2Jvb2wgYXZiX3NhZmVfYWRkX3RvKHVpbnQ2NF90KiB2YWx1ZSwgdWludDY0X3QgdmFsdWVfdG9fYWRkKSB7CisgIHVpbnQ2NF90IG9yaWdpbmFsX3ZhbHVlOworCisgIGF2Yl9hc3NlcnQodmFsdWUgIT0gTlVMTCk7CisKKyAgb3JpZ2luYWxfdmFsdWUgPSAqdmFsdWU7CisKKyAgKnZhbHVlICs9IHZhbHVlX3RvX2FkZDsKKyAgaWYgKCp2YWx1ZSA8IG9yaWdpbmFsX3ZhbHVlKSB7CisgICAgYXZiX2Vycm9yKCJPdmVyZmxvdyB3aGVuIGFkZGluZyB2YWx1ZXMuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBhdmJfc2FmZV9hZGQodWludDY0X3QqIG91dF9yZXN1bHQsIHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpIHsKKyAgdWludDY0X3QgZHVtbXk7CisgIGlmIChvdXRfcmVzdWx0ID09IE5VTEwpIHsKKyAgICBvdXRfcmVzdWx0ID0gJmR1bW15OworICB9CisgICpvdXRfcmVzdWx0ID0gYTsKKyAgcmV0dXJuIGF2Yl9zYWZlX2FkZF90byhvdXRfcmVzdWx0LCBiKTsKK30KKworYm9vbCBhdmJfdmFsaWRhdGVfdXRmOChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbnVtX2J5dGVzKSB7CisgIHNpemVfdCBuOworICB1bnNpZ25lZCBpbnQgbnVtX2NjOworCisgIGZvciAobiA9IDAsIG51bV9jYyA9IDA7IG4gPCBudW1fYnl0ZXM7IG4rKykgeworICAgIHVpbnQ4X3QgYyA9IGRhdGFbbl07CisKKyAgICBpZiAobnVtX2NjID4gMCkgeworICAgICAgaWYgKChjICYgKDB4ODAgfCAweDQwKSkgPT0gMHg4MCkgeworICAgICAgICAvKiAxMHh4IHh4eHggKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIH0KKyAgICAgIG51bV9jYy0tOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgbnVtX2NjID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoKGMgJiAoMHg4MCB8IDB4NDAgfCAweDIwKSkgPT0gKDB4ODAgfCAweDQwKSkgeworICAgICAgICAvKiAxMTB4IHh4eHggKi8KKyAgICAgICAgbnVtX2NjID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoKGMgJiAoMHg4MCB8IDB4NDAgfCAweDIwIHwgMHgxMCkpID09ICgweDgwIHwgMHg0MCB8IDB4MjApKSB7CisgICAgICAgIC8qIDExMTAgeHh4eCAqLworICAgICAgICBudW1fY2MgPSAyOworICAgICAgfSBlbHNlIGlmICgoYyAmICgweDgwIHwgMHg0MCB8IDB4MjAgfCAweDEwIHwgMHgwOCkpID09CisgICAgICAgICAgICAgICAgICgweDgwIHwgMHg0MCB8IDB4MjAgfCAweDEwKSkgeworICAgICAgICAvKiAxMTExIDB4eHggKi8KKyAgICAgICAgbnVtX2NjID0gMzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAobnVtX2NjICE9IDApIHsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKKworZmFpbDoKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGF2Yl9zdHJfY29uY2F0KGNoYXIqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHIxLAorICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RyMV9sZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0cjIsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdHIyX2xlbikgeworICB1aW50NjRfdCBjb21iaW5lZF9sZW47CisKKyAgaWYgKCFhdmJfc2FmZV9hZGQoJmNvbWJpbmVkX2xlbiwgc3RyMV9sZW4sIHN0cjJfbGVuKSkgeworICAgIGF2Yl9lcnJvcigiT3ZlcmZsb3cgd2hlbiBhZGRpbmcgc3RyaW5nIHNpemVzLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGNvbWJpbmVkX2xlbiA+IGJ1Zl9zaXplIC0gMSkgeworICAgIGF2Yl9lcnJvcigiSW5zdWZmaWNpZW50IGJ1ZmZlciBzcGFjZS5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGF2Yl9tZW1jcHkoYnVmLCBzdHIxLCBzdHIxX2xlbik7CisgIGF2Yl9tZW1jcHkoYnVmICsgc3RyMV9sZW4sIHN0cjIsIHN0cjJfbGVuKTsKKyAgYnVmW2NvbWJpbmVkX2xlbl0gPSAnXDAnOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkKiBhdmJfbWFsbG9jKHNpemVfdCBzaXplKSB7CisgIHZvaWQqIHJldCA9IGF2Yl9tYWxsb2NfKHNpemUpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBhdmJfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCit2b2lkKiBhdmJfY2FsbG9jKHNpemVfdCBzaXplKSB7CisgIHZvaWQqIHJldCA9IGF2Yl9tYWxsb2Moc2l6ZSk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgYXZiX21lbXNldChyZXQsICdcMCcsIHNpemUpOworICByZXR1cm4gcmV0OworfQorCitjaGFyKiBhdmJfc3RyZHVwKGNvbnN0IGNoYXIqIHN0cikgeworICBzaXplX3QgbGVuID0gYXZiX3N0cmxlbihzdHIpOworICBjaGFyKiByZXQgPSBhdmJfbWFsbG9jKGxlbiArIDEpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGF2Yl9tZW1jcHkocmV0LCBzdHIsIGxlbik7CisgIHJldFtsZW5dID0gJ1wwJzsKKworICByZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyKiBhdmJfc3Ryc3RyKGNvbnN0IGNoYXIqIGhheXN0YWNrLCBjb25zdCBjaGFyKiBuZWVkbGUpIHsKKyAgc2l6ZV90IG4sIG07CisKKyAgLyogTG9vayB0aHJvdWdoIHxoYXlzdGFja3wgYW5kIGNoZWNrIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKKyAgICogfG5lZWRsZXwgbWF0Y2hlcy4gSWYgc28sIGNoZWNrIHRoZSByZXN0IG9mIHxuZWVkbGV8LgorICAgKi8KKyAgZm9yIChuID0gMDsgaGF5c3RhY2tbbl0gIT0gJ1wwJzsgbisrKSB7CisgICAgaWYgKGhheXN0YWNrW25dICE9IG5lZWRsZVswXSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZm9yIChtID0gMTs7IG0rKykgeworICAgICAgaWYgKG5lZWRsZVttXSA9PSAnXDAnKSB7CisgICAgICAgIHJldHVybiBoYXlzdGFjayArIG47CisgICAgICB9CisKKyAgICAgIGlmIChoYXlzdGFja1tuICsgbV0gIT0gbmVlZGxlW21dKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyKiBhdmJfc3Rydl9maW5kX3N0cihjb25zdCBjaGFyKiBjb25zdCogc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdHJfc2l6ZSkgeworICBzaXplX3QgbjsKKyAgZm9yIChuID0gMDsgc3RyaW5nc1tuXSAhPSBOVUxMOyBuKyspIHsKKyAgICBpZiAoYXZiX3N0cmxlbihzdHJpbmdzW25dKSA9PSBzdHJfc2l6ZSAmJgorICAgICAgICBhdmJfbWVtY21wKHN0cmluZ3Nbbl0sIHN0ciwgc3RyX3NpemUpID09IDApIHsKKyAgICAgIHJldHVybiBzdHJpbmdzW25dOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworY2hhciogYXZiX3JlcGxhY2UoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBzZWFyY2gsIGNvbnN0IGNoYXIqIHJlcGxhY2UpIHsKKyAgY2hhciogcmV0ID0gTlVMTDsKKyAgc2l6ZV90IHJldF9sZW4gPSAwOworICBzaXplX3Qgc2VhcmNoX2xlbiwgcmVwbGFjZV9sZW47CisgIGNvbnN0IGNoYXIqIHN0cl9hZnRlcl9sYXN0X3JlcGxhY2U7CisKKyAgc2VhcmNoX2xlbiA9IGF2Yl9zdHJsZW4oc2VhcmNoKTsKKyAgcmVwbGFjZV9sZW4gPSBhdmJfc3RybGVuKHJlcGxhY2UpOworCisgIHN0cl9hZnRlcl9sYXN0X3JlcGxhY2UgPSBzdHI7CisgIHdoaWxlICgqc3RyICE9ICdcMCcpIHsKKyAgICBjb25zdCBjaGFyKiBzOworICAgIHNpemVfdCBudW1fYmVmb3JlOworICAgIHNpemVfdCBudW1fbmV3OworCisgICAgcyA9IGF2Yl9zdHJzdHIoc3RyLCBzZWFyY2gpOworICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIG51bV9iZWZvcmUgPSBzIC0gc3RyOworCisgICAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgICBudW1fbmV3ID0gbnVtX2JlZm9yZSArIHJlcGxhY2VfbGVuICsgMTsKKyAgICAgIHJldCA9IGF2Yl9tYWxsb2MobnVtX25ldyk7CisgICAgICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgICB9CisgICAgICBhdmJfbWVtY3B5KHJldCwgc3RyLCBudW1fYmVmb3JlKTsKKyAgICAgIGF2Yl9tZW1jcHkocmV0ICsgbnVtX2JlZm9yZSwgcmVwbGFjZSwgcmVwbGFjZV9sZW4pOworICAgICAgcmV0W251bV9uZXcgLSAxXSA9ICdcMCc7CisgICAgICByZXRfbGVuID0gbnVtX25ldyAtIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGNoYXIqIG5ld19zdHI7CisgICAgICBudW1fbmV3ID0gcmV0X2xlbiArIG51bV9iZWZvcmUgKyByZXBsYWNlX2xlbiArIDE7CisgICAgICBuZXdfc3RyID0gYXZiX21hbGxvYyhudW1fbmV3KTsKKyAgICAgIGlmIChyZXQgPT0gTlVMTCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICAgIH0KKyAgICAgIGF2Yl9tZW1jcHkobmV3X3N0ciwgcmV0LCByZXRfbGVuKTsKKyAgICAgIGF2Yl9tZW1jcHkobmV3X3N0ciArIHJldF9sZW4sIHN0ciwgbnVtX2JlZm9yZSk7CisgICAgICBhdmJfbWVtY3B5KG5ld19zdHIgKyByZXRfbGVuICsgbnVtX2JlZm9yZSwgcmVwbGFjZSwgcmVwbGFjZV9sZW4pOworICAgICAgbmV3X3N0cltudW1fbmV3IC0gMV0gPSAnXDAnOworICAgICAgYXZiX2ZyZWUocmV0KTsKKyAgICAgIHJldCA9IG5ld19zdHI7CisgICAgICByZXRfbGVuID0gbnVtX25ldyAtIDE7CisgICAgfQorCisgICAgc3RyID0gcyArIHNlYXJjaF9sZW47CisgICAgc3RyX2FmdGVyX2xhc3RfcmVwbGFjZSA9IHN0cjsKKyAgfQorCisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldCA9IGF2Yl9zdHJkdXAoc3RyX2FmdGVyX2xhc3RfcmVwbGFjZSk7CisgICAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc2l6ZV90IG51bV9yZW1haW5pbmcgPSBhdmJfc3RybGVuKHN0cl9hZnRlcl9sYXN0X3JlcGxhY2UpOworICAgIHNpemVfdCBudW1fbmV3ID0gcmV0X2xlbiArIG51bV9yZW1haW5pbmcgKyAxOworICAgIGNoYXIqIG5ld19zdHIgPSBhdmJfbWFsbG9jKG51bV9uZXcpOworICAgIGlmIChyZXQgPT0gTlVMTCkgeworICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGF2Yl9tZW1jcHkobmV3X3N0ciwgcmV0LCByZXRfbGVuKTsKKyAgICBhdmJfbWVtY3B5KG5ld19zdHIgKyByZXRfbGVuLCBzdHJfYWZ0ZXJfbGFzdF9yZXBsYWNlLCBudW1fcmVtYWluaW5nKTsKKyAgICBuZXdfc3RyW251bV9uZXcgLSAxXSA9ICdcMCc7CisgICAgYXZiX2ZyZWUocmV0KTsKKyAgICByZXQgPSBuZXdfc3RyOworICAgIHJldF9sZW4gPSBudW1fbmV3IC0gMTsKKyAgfQorCitvdXQ6CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hdmIvbGliYXZiL2F2Yl91dGlsLmggYi9hdmIvbGliYXZiL2F2Yl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyODI5YQotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX3V0aWwuaApAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKEFWQl9JTlNJREVfTElCQVZCX0gpICYmICFkZWZpbmVkKEFWQl9DT01QSUxBVElPTikKKyNlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHksIGluY2x1ZGUgbGliYXZiLmggaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBBVkJfVVRJTF9IXworI2RlZmluZSBBVkJfVVRJTF9IXworCisjaW5jbHVkZSAiYXZiX3N5c2RlcHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIEFWQl9TVFJJTkdJRlkoeCkgI3gKKyNkZWZpbmUgQVZCX1RPX1NUUklORyh4KSBBVkJfU1RSSU5HSUZZKHgpCisKKyNpZmRlZiBBVkJfRU5BQkxFX0RFQlVHCisvKiBBYm9ydHMgdGhlIHByb2dyYW0gaWYgfGV4cHJ8IGlzIGZhbHNlLgorICoKKyAqIFRoaXMgaGFzIG5vIGVmZmVjdCB1bmxlc3MgQVZCX0VOQUJMRV9ERUJVRyBpcyBkZWZpbmVkLgorICovCisjZGVmaW5lIGF2Yl9hc3NlcnQoZXhwcikgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoZXhwcikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhdmJfZmF0YWwoImFzc2VydCBmYWlsOiAiICNleHByICJcbiIpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBhdmJfYXNzZXJ0KGV4cHIpCisjZW5kaWYKKworLyogQWJvcnRzIHRoZSBwcm9ncmFtIGlmIHJlYWNoZWQuCisgKgorICogVGhpcyBoYXMgbm8gZWZmZWN0IHVubGVzcyBBVkJfRU5BQkxFX0RFQlVHIGlzIGRlZmluZWQuCisgKi8KKyNpZmRlZiBBVkJfRU5BQkxFX0RFQlVHCisjZGVmaW5lIGF2Yl9hc3NlcnRfbm90X3JlYWNoZWQoKSAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2Yl9mYXRhbCgiYXNzZXJ0X25vdF9yZWFjaGVkKClcbiIpOyBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBhdmJfYXNzZXJ0X25vdF9yZWFjaGVkKCkKKyNlbmRpZgorCisvKiBBYm9ydHMgdGhlIHByb2dyYW0gaWYgfGFkZHJ8IGlzIG5vdCB3b3JkLWFsaWduZWQuCisgKgorICogVGhpcyBoYXMgbm8gZWZmZWN0IHVubGVzcyBBVkJfRU5BQkxFX0RFQlVHIGlzIGRlZmluZWQuCisgKi8KKyNkZWZpbmUgYXZiX2Fzc2VydF9hbGlnbmVkKGFkZHIpIFwKKyAgYXZiX2Fzc2VydCgoKCh1aW50cHRyX3QpYWRkcikgJiAoQVZCX0FMSUdOTUVOVF9TSVpFIC0gMSkpID09IDApCisKKyNpZmRlZiBBVkJfRU5BQkxFX0RFQlVHCisvKiBQcmludCBmdW5jdGlvbnMsIHVzZWQgZm9yIGRpYWdub3N0aWNzLgorICoKKyAqIFRoZXNlIGhhdmUgbm8gZWZmZWN0IHVubGVzcyBBVkJfRU5BQkxFX0RFQlVHIGlzIGRlZmluZWQuCisgKi8KKyNkZWZpbmUgYXZiX2RlYnVnKG1lc3NhZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZiX3ByaW50KF9fRklMRV9fICI6IiBBVkJfVE9fU1RSSU5HKF9fTElORV9fKSAiOiBERUJVRzogIik7IFwKKyAgICBhdmJfcHJpbnQobWVzc2FnZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBhdmJfZGVidWd2KG1lc3NhZ2UsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdmJfcHJpbnQoX19GSUxFX18gIjoiIEFWQl9UT19TVFJJTkcoX19MSU5FX18pICI6IERFQlVHOiAiKTsgXAorICAgIGF2Yl9wcmludHYobWVzc2FnZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBhdmJfZGVidWcobWVzc2FnZSkKKyNkZWZpbmUgYXZiX2RlYnVndihtZXNzYWdlLCAuLi4pCisjZW5kaWYKKworLyogUHJpbnRzIG91dCBhIG1lc3NhZ2UuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaWYgYSBydW50aW1lLWVycm9yCisgKiBvY2N1cnMuCisgKi8KKyNkZWZpbmUgYXZiX2Vycm9yKG1lc3NhZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZiX3ByaW50KF9fRklMRV9fICI6IiBBVkJfVE9fU1RSSU5HKF9fTElORV9fKSAiOiBFUlJPUjogIik7IFwKKyAgICBhdmJfcHJpbnQobWVzc2FnZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBhdmJfZXJyb3J2KG1lc3NhZ2UsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdmJfcHJpbnQoX19GSUxFX18gIjoiIEFWQl9UT19TVFJJTkcoX19MSU5FX18pICI6IEVSUk9SOiAiKTsgXAorICAgIGF2Yl9wcmludHYobWVzc2FnZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qIFByaW50cyBvdXQgYSBtZXNzYWdlIGFuZCBjYWxscyBhdmJfYWJvcnQoKS4KKyAqLworI2RlZmluZSBhdmJfZmF0YWwobWVzc2FnZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdmJfcHJpbnQoX19GSUxFX18gIjoiIEFWQl9UT19TVFJJTkcoX19MSU5FX18pICI6IEZBVEFMOiAiKTsgXAorICAgIGF2Yl9wcmludChtZXNzYWdlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZiX2Fib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYXZiX2ZhdGFsdihtZXNzYWdlLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZiX3ByaW50KF9fRklMRV9fICI6IiBBVkJfVE9fU1RSSU5HKF9fTElORV9fKSAiOiBGQVRBTDogIik7IFwKKyAgICBhdmJfcHJpbnR2KG1lc3NhZ2UsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2Yl9hYm9ydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qIENvbnZlcnRzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgZnJvbSBiaWctZW5kaWFuIHRvIGhvc3QgYnl0ZSBvcmRlci4gKi8KK3VpbnQzMl90IGF2Yl9iZTMydG9oKHVpbnQzMl90IGluKSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKy8qIENvbnZlcnRzIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgZnJvbSBiaWctZW5kaWFuIHRvIGhvc3QgYnl0ZSBvcmRlci4gKi8KK3VpbnQ2NF90IGF2Yl9iZTY0dG9oKHVpbnQ2NF90IGluKSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKy8qIENvbnZlcnRzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgZnJvbSBob3N0IHRvIGJpZy1lbmRpYW4gYnl0ZSBvcmRlci4gKi8KK3VpbnQzMl90IGF2Yl9odG9iZTMyKHVpbnQzMl90IGluKSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKy8qIENvbnZlcnRzIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgZnJvbSBob3N0IHRvIGJpZy1lbmRpYW4gYnl0ZSBvcmRlci4gKi8KK3VpbnQ2NF90IGF2Yl9odG9iZTY0KHVpbnQ2NF90IGluKSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKy8qIENvbXBhcmUgfG58IGJ5dGVzIHN0YXJ0aW5nIGF0IHxzMXwgd2l0aCB8czJ8IGFuZCByZXR1cm4gMCBpZiB0aGV5CisgKiBtYXRjaCwgMSBpZiB0aGV5IGRvbid0LiAgUmV0dXJucyAwIGlmIHxufD09MCwgc2luY2Ugbm8gYnl0ZXMKKyAqIG1pc21hdGNoZWQuCisgKgorICogVGltZSB0YWtlbiB0byBwZXJmb3JtIHRoZSBjb21wYXJpc29uIGlzIG9ubHkgZGVwZW5kZW50IG9uIHxufCBhbmQKKyAqIG5vdCBvbiB0aGUgcmVsYXRpb25zaGlwIG9mIHRoZSBtYXRjaCBiZXR3ZWVuIHxzMXwgYW5kIHxzMnwuCisgKgorICogTm90ZSB0aGF0IHVubGlrZSBhdmJfbWVtY21wKCksIHRoaXMgb25seSBpbmRpY2F0ZXMgaW5lcXVhbGl0eSwgbm90CisgKiB3aGV0aGVyIHxzMXwgaXMgbGVzcyB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB8czJ8LgorICovCitpbnQgYXZiX3NhZmVfbWVtY21wKGNvbnN0IHZvaWQqIHMxLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzMiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG4pIEFWQl9BVFRSX1dBUk5fVU5VU0VEX1JFU1VMVDsKKworLyogQWRkcyB8dmFsdWVfdG9fYWRkfCB0byB8dmFsdWV8IHdpdGggb3ZlcmZsb3cgcHJvdGVjdGlvbi4KKyAqCisgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBhZGRpdGlvbiBvdmVyZmxvd3MsIHRydWUgb3RoZXJ3aXNlLiBJbiBlaXRoZXIKKyAqIGNhc2UsIHx2YWx1ZXwgaXMgYWx3YXlzIG1vZGlmaWVkLgorICovCitib29sIGF2Yl9zYWZlX2FkZF90byh1aW50NjRfdCogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZV90b19hZGQpIEFWQl9BVFRSX1dBUk5fVU5VU0VEX1JFU1VMVDsKKworLyogQWRkcyB8YXwgYW5kIHxifCB3aXRoIG92ZXJmbG93IHByb3RlY3Rpb24sIHJldHVybmluZyB0aGUgdmFsdWUgaW4KKyAqIHxvdXRfcmVzdWx0fC4KKyAqCisgKiBJdCdzIHBlcm1pc3NpYmxlIHRvIHBhc3MgTlVMTCBmb3IgfG91dF9yZXN1bHR8IGlmIHlvdSBqdXN0IHdhbnQgdG8KKyAqIGNoZWNrIHRoYXQgdGhlIGFkZGl0aW9uIHdvdWxkIG5vdCBvdmVyZmxvdy4KKyAqCisgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBhZGRpdGlvbiBvdmVyZmxvd3MsIHRydWUgb3RoZXJ3aXNlLgorICovCitib29sIGF2Yl9zYWZlX2FkZCh1aW50NjRfdCogb3V0X3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGEsCisgICAgICAgICAgICAgICAgICB1aW50NjRfdCBiKSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKy8qIENoZWNrcyBpZiB8bnVtX2J5dGVzfCBkYXRhIGF0IHxkYXRhfCBpcyBhIHZhbGlkIFVURi04CisgKiBzdHJpbmcuIFJldHVybnMgdHJ1ZSBpZiB2YWxpZCBVVEYtOCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIGF2Yl92YWxpZGF0ZV91dGY4KGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fYnl0ZXMpIEFWQl9BVFRSX1dBUk5fVU5VU0VEX1JFU1VMVDsKKworLyogQ29uY2F0ZW5hdGVzIHxzdHIxfCAob2YgfHN0cjFfbGVufCBieXRlcykgYW5kIHxzdHIyfCAob2YgfHN0cjJfbGVufAorICogYnl0ZXMpIGFuZCBwdXRzIHRoZSByZXN1bHQgaW4gfGJ1Znwgd2hpY2ggaG9sZHMgfGJ1Zl9zaXplfAorICogYnl0ZXMuIFRoZSByZXN1bHQgaXMgYWxzbyBndWFyYW50ZWVkIHRvIGJlIE5VTCB0ZXJtaW5hdGVkLiBGYWlsIGlmCisgKiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gaW4gfGJ1ZnwgZm9yIHRoZSByZXN1bHRpbmcgc3RyaW5nIHBsdXMKKyAqIHRlcm1pbmF0aW5nIE5VTCBieXRlLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgYXZiX3N0cl9jb25jYXQoY2hhciogYnVmLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0cjEsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdHIxX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RyMiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN0cjJfbGVuKTsKKworLyogTGlrZSBhdmJfbWFsbG9jXygpIGJ1dCBwcmludHMgYSBlcnJvciB1c2luZyBhdmJfZXJyb3IoKSBpZiBtZW1vcnkKKyAqIGFsbG9jYXRpb24gZmFpbHMuCisgKi8KK3ZvaWQqIGF2Yl9tYWxsb2Moc2l6ZV90IHNpemUpIEFWQl9BVFRSX1dBUk5fVU5VU0VEX1JFU1VMVDsKKworLyogTGlrZSBhdmJfbWFsbG9jKCkgYnV0IHNldHMgdGhlIG1lbW9yeSB3aXRoIHplcm9lcy4gKi8KK3ZvaWQqIGF2Yl9jYWxsb2Moc2l6ZV90IHNpemUpIEFWQl9BVFRSX1dBUk5fVU5VU0VEX1JFU1VMVDsKKworLyogRHVwbGljYXRlcyBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4gUmV0dXJucyBOVUxMIG9uIE9PTS4gKi8KK2NoYXIqIGF2Yl9zdHJkdXAoY29uc3QgY2hhciogc3RyKSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKy8qIEZpbmRzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHxuZWVkbGV8IGluIHRoZSBzdHJpbmcgfGhheXN0YWNrfAorICogd2hlcmUgYm90aCBzdHJpbmdzIGFyZSBOVUwtdGVybWluYXRlZCBzdHJpbmdzLiBUaGUgdGVybWluYXRpbmcgTlVMCisgKiBieXRlcyBhcmUgbm90IGNvbXBhcmVkLgorICoKKyAqIFJldHVybnMgTlVMTCBpZiBub3QgZm91bmQsIG90aGVyd2lzZSBwb2ludHMgaW50byB8aGF5c3RhY2t8IGZvciB0aGUKKyAqIGZpcnN0IG9jY3VycmVuY2Ugb2YgfG5lZWRsZXwuCisgKi8KK2NvbnN0IGNoYXIqIGF2Yl9zdHJzdHIoY29uc3QgY2hhciogaGF5c3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5lZWRsZSkgQVZCX0FUVFJfV0FSTl9VTlVTRURfUkVTVUxUOworCisvKiBGaW5kcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB8c3RyfCBpbiB0aGUgTlVMTC10ZXJtaW5hdGVkIHN0cmluZworICogYXJyYXkgfHN0cmluZ3N8LiBFYWNoIGVsZW1lbnQgaW4gfHN0cmluZ3N8IG11c3QgYmUKKyAqIE5VTC10ZXJtaW5hdGVkLiBUaGUgc3RyaW5nIGdpdmVuIGJ5IHxzdHJ8IG5lZWQgbm90IGJlCisgKiBOVUwtdGVybWluYXRlZCBidXQgaXRzIHNpemUgbXVzdCBiZSBnaXZlbiBpbiB8c3RyX3NpemV8LgorICoKKyAqIFJldHVybnMgTlVMTCBpZiBub3QgZm91bmQsIG90aGVyd2lzZSBwb2ludHMgaW50byB8c3RyaW5nc3wgZm9yIHRoZQorICogZmlyc3Qgb2NjdXJyZW5jZSBvZiB8c3RyfC4KKyAqLworY29uc3QgY2hhciogYXZiX3N0cnZfZmluZF9zdHIoY29uc3QgY2hhciogY29uc3QqIHN0cmluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RyX3NpemUpOworCisvKiBSZXBsYWNlcyBhbGwgb2NjdXJyZW5jZXMgb2YgfHNlYXJjaHwgd2l0aCB8cmVwbGFjZXwgaW4gfHN0cnwuCisgKgorICogUmV0dXJucyBhIG5ld2x5IGFsbG9jYXRlZCBzdHJpbmcgb3IgTlVMTCBpZiBvdXQgb2YgbWVtb3J5LgorICovCitjaGFyKiBhdmJfcmVwbGFjZShjb25zdCBjaGFyKiBzdHIsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZWFyY2gsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZXBsYWNlKSBBVkJfQVRUUl9XQVJOX1VOVVNFRF9SRVNVTFQ7CisKKy8qIENhbGN1bGF0ZXMgdGhlIENSQy0zMiBmb3IgZGF0YSBpbiB8YnVmfCBvZiBzaXplIHxidWZfc2l6ZXwuICovCit1aW50MzJfdCBhdmJfY3JjMzIoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3QgYnVmX3NpemUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQVZCX1VUSUxfSF8gKi8KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvYXZiX3ZibWV0YV9pbWFnZS5jIGIvYXZiL2xpYmF2Yi9hdmJfdmJtZXRhX2ltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiMWVkYQotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmIvYXZiX3ZibWV0YV9pbWFnZS5jCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiYXZiX3ZibWV0YV9pbWFnZS5oIgorI2luY2x1ZGUgImF2Yl9jcnlwdG8uaCIKKyNpbmNsdWRlICJhdmJfcnNhLmgiCisjaW5jbHVkZSAiYXZiX3NoYS5oIgorI2luY2x1ZGUgImF2Yl91dGlsLmgiCisKK0F2YlZCTWV0YVZlcmlmeVJlc3VsdCBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICBjb25zdCB1aW50OF90KiBkYXRhLAorICAgIHNpemVfdCBsZW5ndGgsCisgICAgY29uc3QgdWludDhfdCoqIG91dF9wdWJsaWNfa2V5X2RhdGEsCisgICAgc2l6ZV90KiBvdXRfcHVibGljX2tleV9sZW5ndGgpIHsKKyAgQXZiVkJNZXRhVmVyaWZ5UmVzdWx0IHJldDsKKyAgQXZiVkJNZXRhSW1hZ2VIZWFkZXIgaDsKKyAgdWludDhfdCogY29tcHV0ZWRfaGFzaDsKKyAgY29uc3QgQXZiQWxnb3JpdGhtRGF0YSogYWxnb3JpdGhtOworICBBdmJTSEEyNTZDdHggc2hhMjU2X2N0eDsKKyAgQXZiU0hBNTEyQ3R4IHNoYTUxMl9jdHg7CisgIGNvbnN0IHVpbnQ4X3QqIGhlYWRlcl9ibG9jazsKKyAgY29uc3QgdWludDhfdCogYXV0aGVudGljYXRpb25fYmxvY2s7CisgIGNvbnN0IHVpbnQ4X3QqIGF1eGlsaWFyeV9ibG9jazsKKyAgaW50IHZlcmlmaWNhdGlvbl9yZXN1bHQ7CisKKyAgcmV0ID0gQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX0lOVkFMSURfVkJNRVRBX0hFQURFUjsKKworICBpZiAob3V0X3B1YmxpY19rZXlfZGF0YSAhPSBOVUxMKSB7CisgICAgKm91dF9wdWJsaWNfa2V5X2RhdGEgPSBOVUxMOworICB9CisgIGlmIChvdXRfcHVibGljX2tleV9sZW5ndGggIT0gTlVMTCkgeworICAgICpvdXRfcHVibGljX2tleV9sZW5ndGggPSAwOworICB9CisKKyAgLyogRW5zdXJlIG1hZ2ljIGlzIGNvcnJlY3QuICovCisgIGlmIChhdmJfc2FmZV9tZW1jbXAoZGF0YSwgQVZCX01BR0lDLCBBVkJfTUFHSUNfTEVOKSAhPSAwKSB7CisgICAgYXZiX2Vycm9yKCJNYWdpYyBpcyBpbmNvcnJlY3QuXG4iKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIEJlZm9yZSB3ZSBieXRlc3dhcCwgZW5zdXJlIGxlbmd0aCBpcyBsb25nIGVub3VnaC4gKi8KKyAgaWYgKGxlbmd0aCA8IHNpemVvZihBdmJWQk1ldGFJbWFnZUhlYWRlcikpIHsKKyAgICBhdmJfZXJyb3IoIkxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gaGVhZGVyLlxuIik7CisgICAgZ290byBvdXQ7CisgIH0KKyAgYXZiX3ZibWV0YV9pbWFnZV9oZWFkZXJfdG9faG9zdF9ieXRlX29yZGVyKChjb25zdCBBdmJWQk1ldGFJbWFnZUhlYWRlciopZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoKTsKKworICAvKiBFbnN1cmUgd2UgZG9uJ3QgYXR0ZW1wdCB0byBhY2Nlc3MgYW55IGZpZWxkcyBpZiB0aGUgbWFqb3IgdmVyc2lvbgorICAgKiBpcyBub3Qgc3VwcG9ydGVkLgorICAgKi8KKyAgaWYgKGguaGVhZGVyX3ZlcnNpb25fbWFqb3IgPiBBVkJfTUFKT1JfVkVSU0lPTikgeworICAgIGF2Yl9lcnJvcigiTm8gc3VwcG9ydCBmb3IgZ2l2ZW4gbWFqb3IgdmVyc2lvbi5cbiIpOworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogRW5zdXJlIGlubmVyIGJsb2NrIHNpemVzIGFyZSBtdWx0aXBsZSBvZiA2NC4gKi8KKyAgaWYgKChoLmF1dGhlbnRpY2F0aW9uX2RhdGFfYmxvY2tfc2l6ZSAmIDB4M2YpICE9IDAgfHwKKyAgICAgIChoLmF1eGlsaWFyeV9kYXRhX2Jsb2NrX3NpemUgJiAweDNmKSAhPSAwKSB7CisgICAgYXZiX2Vycm9yKCJCbG9jayBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIDY0LlxuIik7CisgICAgZ290byBvdXQ7CisgIH0KKworICAvKiBFbnN1cmUgYmxvY2sgc2l6ZXMgYWxsIGFkZCB1cCB0byBhdCBtb3N0IHxsZW5ndGh8LiAqLworICB1aW50NjRfdCBibG9ja190b3RhbCA9IHNpemVvZihBdmJWQk1ldGFJbWFnZUhlYWRlcik7CisgIGlmICghYXZiX3NhZmVfYWRkX3RvKCZibG9ja190b3RhbCwgaC5hdXRoZW50aWNhdGlvbl9kYXRhX2Jsb2NrX3NpemUpIHx8CisgICAgICAhYXZiX3NhZmVfYWRkX3RvKCZibG9ja190b3RhbCwgaC5hdXhpbGlhcnlfZGF0YV9ibG9ja19zaXplKSkgeworICAgIGF2Yl9lcnJvcigiT3ZlcmZsb3cgd2hpbGUgY29tcHV0aW5nIHNpemUgb2YgYm9vdCBpbWFnZS5cbiIpOworICAgIGdvdG8gb3V0OworICB9CisgIGlmIChibG9ja190b3RhbCA+IGxlbmd0aCkgeworICAgIGF2Yl9lcnJvcigiQmxvY2sgc2l6ZXMgYWRkIHVwIHRvIG1vcmUgdGhhbiBnaXZlbiBsZW5ndGguXG4iKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIHVpbnRwdHJfdCBkYXRhX3B0ciA9ICh1aW50cHRyX3QpZGF0YTsKKyAgLyogRW5zdXJlIHBhc3NlZCBpbiBtZW1vcnkgZG9lc24ndCB3cmFwLiAqLworICBpZiAoIWF2Yl9zYWZlX2FkZChOVUxMLCAodWludDY0X3QpZGF0YV9wdHIsIGxlbmd0aCkpIHsKKyAgICBhdmJfZXJyb3IoIkJvb3QgaW1hZ2UgbG9jYXRpb24gYW5kIGxlbmd0aCBtaXNtYXRjaC5cbiIpOworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogRW5zdXJlIGhhc2ggYW5kIHNpZ25hdHVyZSBhcmUgZW50aXJlbHkgaW4gdGhlIEF1dGhlbnRpY2F0aW9uIGRhdGEgYmxvY2suICovCisgIHVpbnQ2NF90IGhhc2hfZW5kOworICBpZiAoIWF2Yl9zYWZlX2FkZCgmaGFzaF9lbmQsIGguaGFzaF9vZmZzZXQsIGguaGFzaF9zaXplKSB8fAorICAgICAgaGFzaF9lbmQgPiBoLmF1dGhlbnRpY2F0aW9uX2RhdGFfYmxvY2tfc2l6ZSkgeworICAgIGF2Yl9lcnJvcigiSGFzaCBpcyBub3QgZW50aXJlbHkgaW4gaXRzIGJsb2NrLlxuIik7CisgICAgZ290byBvdXQ7CisgIH0KKyAgdWludDY0X3Qgc2lnbmF0dXJlX2VuZDsKKyAgaWYgKCFhdmJfc2FmZV9hZGQoJnNpZ25hdHVyZV9lbmQsIGguc2lnbmF0dXJlX29mZnNldCwgaC5zaWduYXR1cmVfc2l6ZSkgfHwKKyAgICAgIHNpZ25hdHVyZV9lbmQgPiBoLmF1dGhlbnRpY2F0aW9uX2RhdGFfYmxvY2tfc2l6ZSkgeworICAgIGF2Yl9lcnJvcigiU2lnbmF0dXJlIGlzIG5vdCBlbnRpcmVseSBpbiBpdHMgYmxvY2suXG4iKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIEVuc3VyZSBwdWJsaWMga2V5IGlzIGVudGlyZWx5IGluIHRoZSBBdXhpbGlhcnkgZGF0YSBibG9jay4gKi8KKyAgdWludDY0X3QgcHVia2V5X2VuZDsKKyAgaWYgKCFhdmJfc2FmZV9hZGQoJnB1YmtleV9lbmQsIGgucHVibGljX2tleV9vZmZzZXQsIGgucHVibGljX2tleV9zaXplKSB8fAorICAgICAgcHVia2V5X2VuZCA+IGguYXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZSkgeworICAgIGF2Yl9lcnJvcigiUHVibGljIGtleSBpcyBub3QgZW50aXJlbHkgaW4gaXRzIGJsb2NrLlxuIik7CisgICAgZ290byBvdXQ7CisgIH0KKworICAvKiBFbnN1cmUgcHVibGljIGtleSBtZXRhZGF0YSAoaWYgc2V0KSBpcyBlbnRpcmVseSBpbiB0aGUgQXV4aWxpYXJ5CisgICAqIGRhdGEgYmxvY2suICovCisgIGlmIChoLnB1YmxpY19rZXlfbWV0YWRhdGFfc2l6ZSA+IDApIHsKKyAgICB1aW50NjRfdCBwdWJrZXlfbWRfZW5kOworICAgIGlmICghYXZiX3NhZmVfYWRkKCZwdWJrZXlfbWRfZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGgucHVibGljX2tleV9tZXRhZGF0YV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgaC5wdWJsaWNfa2V5X21ldGFkYXRhX3NpemUpIHx8CisgICAgICAgIHB1YmtleV9tZF9lbmQgPiBoLmF1eGlsaWFyeV9kYXRhX2Jsb2NrX3NpemUpIHsKKyAgICAgIGF2Yl9lcnJvcigiUHVibGljIGtleSBtZXRhZGF0YSBpcyBub3QgZW50aXJlbHkgaW4gaXRzIGJsb2NrLlxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIH0KKworICAvKiBCYWlsIGVhcmx5IGlmIHRoZXJlJ3Mgbm8gaGFzaCBvciBzaWduYXR1cmUuICovCisgIGlmIChoLmFsZ29yaXRobV90eXBlID09IEFWQl9BTEdPUklUSE1fVFlQRV9OT05FKSB7CisgICAgcmV0ID0gQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LX05PVF9TSUdORUQ7CisgICAgZ290byBvdXQ7CisgIH0KKworICAvKiBFbnN1cmUgYWxnb3JpdGhtIGZpZWxkIGlzIHN1cHBvcnRlZC4gKi8KKyAgYWxnb3JpdGhtID0gYXZiX2dldF9hbGdvcml0aG1fZGF0YShoLmFsZ29yaXRobV90eXBlKTsKKyAgaWYgKCFhbGdvcml0aG0pIHsKKyAgICBhdmJfZXJyb3IoIkludmFsaWQgb3IgdW5rbm93biBhbGdvcml0aG0uXG4iKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIEJhaWwgaWYgdGhlIGVtYmVkZGVkIGhhc2ggc2l6ZSBkb2Vzbid0IG1hdGNoIHRoZSBjaG9zZW4gYWxnb3JpdGhtLiAqLworICBpZiAoaC5oYXNoX3NpemUgIT0gYWxnb3JpdGhtLT5oYXNoX2xlbikgeworICAgIGF2Yl9lcnJvcigiRW1iZWRkZWQgaGFzaCBoYXMgd3Jvbmcgc2l6ZS5cbiIpOworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogTm8gb3ZlcmZsb3cgY2hlY2tzIG5lZWRlZCBmcm9tIGhlcmUtb24gYWZ0ZXIgc2luY2UgYWxsIGJsb2NrCisgICAqIHNpemVzIGFuZCBvZmZzZXRzIGhhdmUgYmVlbiB2ZXJpZmllZCBhYm92ZS4KKyAgICovCisKKyAgaGVhZGVyX2Jsb2NrID0gZGF0YTsKKyAgYXV0aGVudGljYXRpb25fYmxvY2sgPSBoZWFkZXJfYmxvY2sgKyBzaXplb2YoQXZiVkJNZXRhSW1hZ2VIZWFkZXIpOworICBhdXhpbGlhcnlfYmxvY2sgPSBhdXRoZW50aWNhdGlvbl9ibG9jayArIGguYXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplOworCisgIHN3aXRjaCAoaC5hbGdvcml0aG1fdHlwZSkgeworICAgIC8qIEV4cGxpY2l0IGZhbGwtdGhyb3VnaDogKi8KKyAgICBjYXNlIEFWQl9BTEdPUklUSE1fVFlQRV9TSEEyNTZfUlNBMjA0ODoKKyAgICBjYXNlIEFWQl9BTEdPUklUSE1fVFlQRV9TSEEyNTZfUlNBNDA5NjoKKyAgICBjYXNlIEFWQl9BTEdPUklUSE1fVFlQRV9TSEEyNTZfUlNBODE5MjoKKyAgICAgIGF2Yl9zaGEyNTZfaW5pdCgmc2hhMjU2X2N0eCk7CisgICAgICBhdmJfc2hhMjU2X3VwZGF0ZSgKKyAgICAgICAgICAmc2hhMjU2X2N0eCwgaGVhZGVyX2Jsb2NrLCBzaXplb2YoQXZiVkJNZXRhSW1hZ2VIZWFkZXIpKTsKKyAgICAgIGF2Yl9zaGEyNTZfdXBkYXRlKAorICAgICAgICAgICZzaGEyNTZfY3R4LCBhdXhpbGlhcnlfYmxvY2ssIGguYXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZSk7CisgICAgICBjb21wdXRlZF9oYXNoID0gYXZiX3NoYTI1Nl9maW5hbCgmc2hhMjU2X2N0eCk7CisgICAgICBicmVhazsKKyAgICAvKiBFeHBsaWNpdCBmYWxsLXRocm91Z2g6ICovCisgICAgY2FzZSBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBNTEyX1JTQTIwNDg6CisgICAgY2FzZSBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBNTEyX1JTQTQwOTY6CisgICAgY2FzZSBBVkJfQUxHT1JJVEhNX1RZUEVfU0hBNTEyX1JTQTgxOTI6CisgICAgICBhdmJfc2hhNTEyX2luaXQoJnNoYTUxMl9jdHgpOworICAgICAgYXZiX3NoYTUxMl91cGRhdGUoCisgICAgICAgICAgJnNoYTUxMl9jdHgsIGhlYWRlcl9ibG9jaywgc2l6ZW9mKEF2YlZCTWV0YUltYWdlSGVhZGVyKSk7CisgICAgICBhdmJfc2hhNTEyX3VwZGF0ZSgKKyAgICAgICAgICAmc2hhNTEyX2N0eCwgYXV4aWxpYXJ5X2Jsb2NrLCBoLmF1eGlsaWFyeV9kYXRhX2Jsb2NrX3NpemUpOworICAgICAgY29tcHV0ZWRfaGFzaCA9IGF2Yl9zaGE1MTJfZmluYWwoJnNoYTUxMl9jdHgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGF2Yl9lcnJvcigiVW5rbm93biBhbGdvcml0aG0uXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICB9CisKKyAgaWYgKGF2Yl9zYWZlX21lbWNtcChhdXRoZW50aWNhdGlvbl9ibG9jayArIGguaGFzaF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICBoLmhhc2hfc2l6ZSkgIT0gMCkgeworICAgIGF2Yl9lcnJvcigiSGFzaCBkb2VzIG5vdCBtYXRjaCFcbiIpOworICAgIHJldCA9IEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9IQVNIX01JU01BVENIOworICAgIGdvdG8gb3V0OworICB9CisKKyAgdmVyaWZpY2F0aW9uX3Jlc3VsdCA9CisgICAgICBhdmJfcnNhX3ZlcmlmeShhdXhpbGlhcnlfYmxvY2sgKyBoLnB1YmxpY19rZXlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgaC5wdWJsaWNfa2V5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9ibG9jayArIGguc2lnbmF0dXJlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIGguc2lnbmF0dXJlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9ibG9jayArIGguaGFzaF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBoLmhhc2hfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobS0+cGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobS0+cGFkZGluZ19sZW4pOworCisgIGlmICh2ZXJpZmljYXRpb25fcmVzdWx0ID09IDApIHsKKyAgICByZXQgPSBBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfU0lHTkFUVVJFX01JU01BVENIOworICAgIGdvdG8gb3V0OworICB9CisKKyAgaWYgKGgucHVibGljX2tleV9zaXplID4gMCkgeworICAgIGlmIChvdXRfcHVibGljX2tleV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICpvdXRfcHVibGljX2tleV9kYXRhID0gYXV4aWxpYXJ5X2Jsb2NrICsgaC5wdWJsaWNfa2V5X29mZnNldDsKKyAgICB9CisgICAgaWYgKG91dF9wdWJsaWNfa2V5X2xlbmd0aCAhPSBOVUxMKSB7CisgICAgICAqb3V0X3B1YmxpY19rZXlfbGVuZ3RoID0gaC5wdWJsaWNfa2V5X3NpemU7CisgICAgfQorICB9CisKKyAgcmV0ID0gQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LOworCitvdXQ6CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXZiX3ZibWV0YV9pbWFnZV9oZWFkZXJfdG9faG9zdF9ieXRlX29yZGVyKGNvbnN0IEF2YlZCTWV0YUltYWdlSGVhZGVyKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmJWQk1ldGFJbWFnZUhlYWRlciogZGVzdCkgeworICBhdmJfbWVtY3B5KGRlc3QsIHNyYywgc2l6ZW9mKEF2YlZCTWV0YUltYWdlSGVhZGVyKSk7CisKKyAgZGVzdC0+aGVhZGVyX3ZlcnNpb25fbWFqb3IgPSBhdmJfYmUzMnRvaChkZXN0LT5oZWFkZXJfdmVyc2lvbl9tYWpvcik7CisgIGRlc3QtPmhlYWRlcl92ZXJzaW9uX21pbm9yID0gYXZiX2JlMzJ0b2goZGVzdC0+aGVhZGVyX3ZlcnNpb25fbWlub3IpOworCisgIGRlc3QtPmF1dGhlbnRpY2F0aW9uX2RhdGFfYmxvY2tfc2l6ZSA9CisgICAgICBhdmJfYmU2NHRvaChkZXN0LT5hdXRoZW50aWNhdGlvbl9kYXRhX2Jsb2NrX3NpemUpOworICBkZXN0LT5hdXhpbGlhcnlfZGF0YV9ibG9ja19zaXplID0KKyAgICAgIGF2Yl9iZTY0dG9oKGRlc3QtPmF1eGlsaWFyeV9kYXRhX2Jsb2NrX3NpemUpOworCisgIGRlc3QtPmFsZ29yaXRobV90eXBlID0gYXZiX2JlMzJ0b2goZGVzdC0+YWxnb3JpdGhtX3R5cGUpOworCisgIGRlc3QtPmhhc2hfb2Zmc2V0ID0gYXZiX2JlNjR0b2goZGVzdC0+aGFzaF9vZmZzZXQpOworICBkZXN0LT5oYXNoX3NpemUgPSBhdmJfYmU2NHRvaChkZXN0LT5oYXNoX3NpemUpOworCisgIGRlc3QtPnNpZ25hdHVyZV9vZmZzZXQgPSBhdmJfYmU2NHRvaChkZXN0LT5zaWduYXR1cmVfb2Zmc2V0KTsKKyAgZGVzdC0+c2lnbmF0dXJlX3NpemUgPSBhdmJfYmU2NHRvaChkZXN0LT5zaWduYXR1cmVfc2l6ZSk7CisKKyAgZGVzdC0+cHVibGljX2tleV9vZmZzZXQgPSBhdmJfYmU2NHRvaChkZXN0LT5wdWJsaWNfa2V5X29mZnNldCk7CisgIGRlc3QtPnB1YmxpY19rZXlfc2l6ZSA9IGF2Yl9iZTY0dG9oKGRlc3QtPnB1YmxpY19rZXlfc2l6ZSk7CisKKyAgZGVzdC0+cHVibGljX2tleV9tZXRhZGF0YV9vZmZzZXQgPQorICAgICAgYXZiX2JlNjR0b2goZGVzdC0+cHVibGljX2tleV9tZXRhZGF0YV9vZmZzZXQpOworICBkZXN0LT5wdWJsaWNfa2V5X21ldGFkYXRhX3NpemUgPSBhdmJfYmU2NHRvaChkZXN0LT5wdWJsaWNfa2V5X21ldGFkYXRhX3NpemUpOworCisgIGRlc3QtPmRlc2NyaXB0b3JzX29mZnNldCA9IGF2Yl9iZTY0dG9oKGRlc3QtPmRlc2NyaXB0b3JzX29mZnNldCk7CisgIGRlc3QtPmRlc2NyaXB0b3JzX3NpemUgPSBhdmJfYmU2NHRvaChkZXN0LT5kZXNjcmlwdG9yc19zaXplKTsKKworICBkZXN0LT5yb2xsYmFja19pbmRleCA9IGF2Yl9iZTY0dG9oKGRlc3QtPnJvbGxiYWNrX2luZGV4KTsKKyAgZGVzdC0+ZmxhZ3MgPSBhdmJfYmUzMnRvaChkZXN0LT5mbGFncyk7Cit9CisKK2NvbnN0IGNoYXIqIGF2Yl92Ym1ldGFfdmVyaWZ5X3Jlc3VsdF90b19zdHJpbmcoQXZiVkJNZXRhVmVyaWZ5UmVzdWx0IHJlc3VsdCkgeworICBjb25zdCBjaGFyKiByZXQgPSBOVUxMOworCisgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgY2FzZSBBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfT0s6CisgICAgICByZXQgPSAiT0siOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfT0tfTk9UX1NJR05FRDoKKyAgICAgIHJldCA9ICJPS19OT1RfU0lHTkVEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX0lOVkFMSURfVkJNRVRBX0hFQURFUjoKKyAgICAgIHJldCA9ICJJTlZBTElEX1ZCTUVUQV9IRUFERVIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfSEFTSF9NSVNNQVRDSDoKKyAgICAgIHJldCA9ICJIQVNIX01JU01BVENIIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX1NJR05BVFVSRV9NSVNNQVRDSDoKKyAgICAgIHJldCA9ICJTSUdOQVRVUkVfTUlTTUFUQ0giOworICAgICAgYnJlYWs7CisgICAgICAvKiBEbyBub3QgYWRkIGEgJ2RlZmF1bHQ6JyBjYXNlIGhlcmUgYmVjYXVzZSBvZiAtV3N3aXRjaC4gKi8KKyAgfQorCisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIGF2Yl9lcnJvcigiVW5rbm93biBBdmJWQk1ldGFWZXJpZnlSZXN1bHQgdmFsdWUuXG4iKTsKKyAgICByZXQgPSAiKHVua25vd24pIjsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hdmIvbGliYXZiL2F2Yl92Ym1ldGFfaW1hZ2UuaCBiL2F2Yi9saWJhdmIvYXZiX3ZibWV0YV9pbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjc3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiL2F2Yl92Ym1ldGFfaW1hZ2UuaApAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKEFWQl9JTlNJREVfTElCQVZCX0gpICYmICFkZWZpbmVkKEFWQl9DT01QSUxBVElPTikKKyNlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHksIGluY2x1ZGUgbGliYXZiLmggaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBBVkJfVkJNRVRBX0lNQUdFX0hfCisjZGVmaW5lIEFWQl9WQk1FVEFfSU1BR0VfSF8KKworI2luY2x1ZGUgImF2Yl9zeXNkZXBzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgImF2Yl9jcnlwdG8uaCIKKyNpbmNsdWRlICJhdmJfZGVzY3JpcHRvci5oIgorCisvKiBTaXplIG9mIHRoZSB2Ym1ldGEgaW1hZ2UgaGVhZGVyLiAqLworI2RlZmluZSBBVkJfVkJNRVRBX0lNQUdFX0hFQURFUl9TSVpFIDI1NgorCisvKiBNYWdpYyBmb3IgdGhlIHZibWV0YSBpbWFnZSBoZWFkZXIuICovCisjZGVmaW5lIEFWQl9NQUdJQyAiQVZCMCIKKyNkZWZpbmUgQVZCX01BR0lDX0xFTiA0CisKKy8qIFRoZSBjdXJyZW50IE1BSk9SIGFuZCBNSU5PUiB2ZXJzaW9ucyB1c2VkIC0ga2VlcCBpbiBzeW5jIHdpdGggYXZidG9vbC4gKi8KKyNkZWZpbmUgQVZCX01BSk9SX1ZFUlNJT04gMQorI2RlZmluZSBBVkJfTUlOT1JfVkVSU0lPTiAwCisKKy8qIEZsYWdzIGZvciB0aGUgdmJtZXRhIGltYWdlLgorICoKKyAqIEFWQl9WQk1FVEFfSU1BR0VfRkxBR1NfSEFTSFRSRUVfRElTQUJMRUQ6IElmIHRoaXMgZmxhZyBpcyBzZXQsCisgKiBoYXNodHJlZSBpbWFnZSB2ZXJpZmljYXRpb24gd2lsbCBiZSBkaXNhYmxlZC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgQVZCX1ZCTUVUQV9JTUFHRV9GTEFHU19IQVNIVFJFRV9ESVNBQkxFRCA9ICgxIDw8IDApCit9IEF2YlZCTWV0YUltYWdlRmxhZ3M7CisKKy8qIEJpbmFyeSBmb3JtYXQgZm9yIGhlYWRlciBvZiB0aGUgdmJtZXRhIGltYWdlLgorICoKKyAqIFRoZSB2Ym1ldGEgaW1hZ2UgY29uc2lzdHMgb2YgdGhyZWUgYmxvY2tzOgorICoKKyAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgfCBIZWFkZXIgZGF0YSAtIGZpeGVkIHNpemUgICAgICAgICAgICAgICAgfAorICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICB8IEF1dGhlbnRpY2F0aW9uIGRhdGEgLSB2YXJpYWJsZSBzaXplICAgICB8CisgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogIHwgQXV4aWxpYXJ5IGRhdGEgLSB2YXJpYWJsZSBzaXplICAgICAgICAgIHwKKyAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogVGhlICJIZWFkZXIgZGF0YSIgYmxvY2sgaXMgZGVzY3JpYmVkIGJ5IHRoaXMgc3RydWN0IGFuZCBpcyBhbHdheXMKKyAqIHxBVkJfVkJNRVRBX0lNQUdFX0hFQURFUl9TSVpFfCBieXRlcyBsb25nLgorICoKKyAqIFRoZSAiQXV0aGVudGljYXRpb24gZGF0YSIgYmxvY2sgaXMgfGF1dGhlbnRpY2F0aW9uX2RhdGFfYmxvY2tfc2l6ZXwKKyAqIGJ5dGVzIGxvbmcgYW5kIGNvbnRhaW5zIHRoZSBoYXNoIGFuZCBzaWduYXR1cmUgdXNlZCB0byBhdXRoZW50aWNhdGUKKyAqIHRoZSB2Ym1ldGEgaW1hZ2UuIFRoZSB0eXBlIG9mIHRoZSBoYXNoIGFuZCBzaWduYXR1cmUgaXMgZGVmaW5lZCBieQorICogdGhlIHxhbGdvcml0aG1fdHlwZXwgZmllbGQuCisgKgorICogVGhlICJBdXhpbGlhcnkgZGF0YSIgaXMgfGF1eGlsaWFyeV9kYXRhX2Jsb2NrX3NpemV8IGJ5dGVzIGxvbmcgYW5kCisgKiBjb250YWlucyB0aGUgYXV4aWxpYXJ5IGRhdGEgaW5jbHVkaW5nIHRoZSBwdWJsaWMga2V5IHVzZWQgdG8gbWFrZQorICogdGhlIHNpZ25hdHVyZSBhbmQgZGVzY3JpcHRvcnMuCisgKgorICogVGhlIHB1YmxpYyBrZXkgaXMgYXQgb2Zmc2V0IHxwdWJsaWNfa2V5X29mZnNldHwgd2l0aCBzaXplCisgKiB8cHVibGljX2tleV9zaXplfCBpbiB0aGlzIGJsb2NrLiBUaGUgc2l6ZSBvZiB0aGUgcHVibGljIGtleSBkYXRhIGlzCisgKiBkZWZpbmVkIGJ5IHRoZSB8YWxnb3JpdGhtX3R5cGV8IGZpZWxkLiBUaGUgZm9ybWF0IG9mIHRoZSBwdWJsaWMga2V5CisgKiBkYXRhIGlzIGRlc2NyaWJlZCBpbiB0aGUgfEF2YlJTQVB1YmxpY0tleUhlYWRlcnwgc3RydWN0LgorICoKKyAqIFRoZSBkZXNjcmlwdG9ycyBzdGFydHMgYXQgfGRlc2NyaXB0b3JzX29mZnNldHwgZnJvbSB0aGUgYmVnaW5uaW5nCisgKiBvZiB0aGUgIkF1eGlsaWFyeSBEYXRhIiBibG9jayBhbmQgdGFrZSB1cCB8ZGVzY3JpcHRvcnNfc2l6ZXwKKyAqIGJ5dGVzLiBFYWNoIGRlc2NyaXB0b3IgaXMgc3RvcmVkIGFzIGEgfEF2YkRlc2NyaXB0b3J8IHdpdGggdGFnIGFuZAorICogbnVtYmVyIG9mIGJ5dGVzIGZvbGxvd2luZy4gVGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBjYW4gYmUKKyAqIGRldGVybWluZWQgYnkgd2Fsa2luZyB0aGlzIGRhdGEgdW50aWwgfGRlc2NyaXB0b3JzX3NpemV8IGlzCisgKiBleGhhdXN0ZWQuCisgKgorICogVGhlIHNpemUgb2YgZWFjaCBvZiB0aGUgIkF1dGhlbnRpY2F0aW9uIGRhdGEiIGFuZCAiQXV4aWxpYXJ5IGRhdGEiCisgKiBibG9ja3MgbXVzdCBiZSBkaXZpc2libGUgYnkgNjQuIFRoaXMgaXMgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQuCisgKgorICogRGVzY3JpcHRvcnMgYXJlIGZyZWUtZm9ybSBibG9ja3Mgc3RvcmVkIGluIGEgcGFydCBvZiB0aGUgdmJtZXRhCisgKiBpbWFnZSBzdWJqZWN0IHRvIHRoZSBzYW1lIGludGVncml0eSBjaGVja3MgYXMgdGhlIHJlc3Qgb2YgdGhlCisgKiBpbWFnZS4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB8QXZiRGVzY3JpcHRvcnwgZm9yIHdlbGwta25vd24KKyAqIGRlc2NyaXB0b3JzLiBTZWUgYXZiX2Rlc2NyaXB0b3JfZm9yZWFjaCgpIGZvciBhIGNvbnZlbmllbmNlCisgKiBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgZGVzY3JpcHRvcnMuCisgKgorICogVGhpcyBzdHJ1Y3QgaXMgdmVyc2lvbmVkLCBzZWUgdGhlIHxoZWFkZXJfdmVyc2lvbl9tYWpvcnwgYW5kCisgKiB8aGVhZGVyX3ZlcnNpb25fbWlub3J8IGZpZWxkcy4gQ29tcGF0aWJpbGl0eSBpcyBndWFyYW50ZWVkIG9ubHkKKyAqIHdpdGhpbiB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uLgorICoKKyAqIEFsbCBmaWVsZHMgYXJlIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgd2hlbiBzZXJpYWxpemVkLiBUbworICogZ2VuZXJhdGUgYSBjb3B5IHdpdGggZmllbGRzIHN3YXBwZWQgdG8gbmF0aXZlIGJ5dGUgb3JkZXIsIHVzZSB0aGUKKyAqIGZ1bmN0aW9uIGF2Yl92Ym1ldGFfaW1hZ2VfaGVhZGVyX3RvX2hvc3RfYnl0ZV9vcmRlcigpLgorICoKKyAqIEJlZm9yZSByZWFkaW5nIGFuZC9vciB1c2luZyBhbnkgb2YgdGhpcyBkYXRhLCB5b3UgTVVTVCB2ZXJpZnkgaXQKKyAqIHVzaW5nIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KCkgYW5kIHJlamVjdCBpdCB1bmxlc3MgaXQncyBzaWduZWQgYnkKKyAqIGEga25vd24gZ29vZCBwdWJsaWMga2V5LgorICovCit0eXBlZGVmIHN0cnVjdCBBdmJWQk1ldGFJbWFnZUhlYWRlciB7CisgIC8qICAgMDogRm91ciBieXRlcyBlcXVhbCB0byAiQVZCMCIgKEFWQl9NQUdJQykuICovCisgIHVpbnQ4X3QgbWFnaWNbQVZCX01BR0lDX0xFTl07CisgIC8qICAgNDogVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIHZibWV0YSBpbWFnZSBoZWFkZXIuICovCisgIHVpbnQzMl90IGhlYWRlcl92ZXJzaW9uX21ham9yOworICAvKiAgIDg6IFRoZSBtaW5vciB2ZXJzaW9uIG9mIHRoZSB2Ym1ldGEgaW1hZ2UgaGVhZGVyLiAqLworICB1aW50MzJfdCBoZWFkZXJfdmVyc2lvbl9taW5vcjsKKworICAvKiAgMTI6IFRoZSBzaXplIG9mIHRoZSBzaWduYXR1cmUgYmxvY2suICovCisgIHVpbnQ2NF90IGF1dGhlbnRpY2F0aW9uX2RhdGFfYmxvY2tfc2l6ZTsKKyAgLyogIDIwOiBUaGUgc2l6ZSBvZiB0aGUgYXV4aWxpYXJ5IGRhdGEgYmxvY2suICovCisgIHVpbnQ2NF90IGF1eGlsaWFyeV9kYXRhX2Jsb2NrX3NpemU7CisKKyAgLyogIDI4OiBUaGUgdmVyaWZpY2F0aW9uIGFsZ29yaXRobSB1c2VkLCBzZWUgfEF2YkFsZ29yaXRobVR5cGV8IGVudW0uICovCisgIHVpbnQzMl90IGFsZ29yaXRobV90eXBlOworCisgIC8qICAzMjogT2Zmc2V0IGludG8gdGhlICJBdXRoZW50aWNhdGlvbiBkYXRhIiBibG9jayBvZiBoYXNoIGRhdGEuICovCisgIHVpbnQ2NF90IGhhc2hfb2Zmc2V0OworICAvKiAgNDA6IExlbmd0aCBvZiB0aGUgaGFzaCBkYXRhLiAqLworICB1aW50NjRfdCBoYXNoX3NpemU7CisKKyAgLyogIDQ4OiBPZmZzZXQgaW50byB0aGUgIkF1dGhlbnRpY2F0aW9uIGRhdGEiIGJsb2NrIG9mIHNpZ25hdHVyZSBkYXRhLiAqLworICB1aW50NjRfdCBzaWduYXR1cmVfb2Zmc2V0OworICAvKiAgNTY6IExlbmd0aCBvZiB0aGUgc2lnbmF0dXJlIGRhdGEuICovCisgIHVpbnQ2NF90IHNpZ25hdHVyZV9zaXplOworCisgIC8qICA2NDogT2Zmc2V0IGludG8gdGhlICJBdXhpbGlhcnkgZGF0YSIgYmxvY2sgb2YgcHVibGljIGtleSBkYXRhLiAqLworICB1aW50NjRfdCBwdWJsaWNfa2V5X29mZnNldDsKKyAgLyogIDcyOiBMZW5ndGggb2YgdGhlIHB1YmxpYyBrZXkgZGF0YS4gKi8KKyAgdWludDY0X3QgcHVibGljX2tleV9zaXplOworCisgIC8qICA4MDogT2Zmc2V0IGludG8gdGhlICJBdXhpbGlhcnkgZGF0YSIgYmxvY2sgb2YgcHVibGljIGtleSBtZXRhZGF0YS4gKi8KKyAgdWludDY0X3QgcHVibGljX2tleV9tZXRhZGF0YV9vZmZzZXQ7CisgIC8qICA4ODogTGVuZ3RoIG9mIHRoZSBwdWJsaWMga2V5IG1ldGFkYXRhLiBNdXN0IGJlIHNldCB0byB6ZXJvIGlmIHRoZXJlCisgICAqICBpcyBubyBwdWJsaWMga2V5IG1ldGFkYXRhLgorICAgKi8KKyAgdWludDY0X3QgcHVibGljX2tleV9tZXRhZGF0YV9zaXplOworCisgIC8qICA5NjogT2Zmc2V0IGludG8gdGhlICJBdXhpbGlhcnkgZGF0YSIgYmxvY2sgb2YgZGVzY3JpcHRvciBkYXRhLiAqLworICB1aW50NjRfdCBkZXNjcmlwdG9yc19vZmZzZXQ7CisgIC8qIDEwNDogTGVuZ3RoIG9mIGRlc2NyaXB0b3IgZGF0YS4gKi8KKyAgdWludDY0X3QgZGVzY3JpcHRvcnNfc2l6ZTsKKworICAvKiAxMTI6IFRoZSByb2xsYmFjayBpbmRleCB3aGljaCBjYW4gYmUgdXNlZCB0byBwcmV2ZW50IHJvbGxiYWNrIHRvCisgICAqICBvbGRlciB2ZXJzaW9ucy4KKyAgICovCisgIHVpbnQ2NF90IHJvbGxiYWNrX2luZGV4OworCisgIC8qIDEyMDogRmxhZ3MgZnJvbSB0aGUgQXZiVkJNZXRhSW1hZ2VGbGFncyBlbnVtZXJhdGlvbi4gVGhpcyBtdXN0IGJlCisgICAqIHNldCB0byB6ZXJvIGlmIHRoZSB2Ym1ldGEgaW1hZ2UgaXMgbm90IGEgdG9wLWxldmVsIGltYWdlLgorICAgKi8KKyAgdWludDMyX3QgZmxhZ3M7CisKKyAgLyogMTI0OiBQYWRkaW5nIHRvIGVuc3VyZSBzdHJ1Y3QgaXMgc2l6ZSBBVkJfVkJNRVRBX0lNQUdFX0hFQURFUl9TSVpFCisgICAqIGJ5dGVzLiBUaGlzIG11c3QgYmUgc2V0IHRvIHplcm9lcy4KKyAgICovCisgIHVpbnQ4X3QgcmVzZXJ2ZWRbMTMyXTsKK30gQVZCX0FUVFJfUEFDS0VEIEF2YlZCTWV0YUltYWdlSGVhZGVyOworCisvKiBDb3BpZXMgfHNyY3wgdG8gfGRlc3R8LCBieXRlLXN3YXBwaW5nIGZpZWxkcyBpbiB0aGUgcHJvY2Vzcy4KKyAqCisgKiBNYWtlIHN1cmUgeW91J3ZlIHZlcmlmaWVkIHxzcmN8IHVzaW5nIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KCkKKyAqIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIGRhdGEgYW5kL29yIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK3ZvaWQgYXZiX3ZibWV0YV9pbWFnZV9oZWFkZXJfdG9faG9zdF9ieXRlX29yZGVyKGNvbnN0IEF2YlZCTWV0YUltYWdlSGVhZGVyKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmJWQk1ldGFJbWFnZUhlYWRlciogZGVzdCk7CisKKy8qIFJldHVybiBjb2RlcyB1c2VkIGluIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KCkuCisgKgorICogQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LIGlzIHJldHVybmVkIGlmIHRoZSB2Ym1ldGEgaW1hZ2UgaGVhZGVyCisgKiBpcyB2YWxpZCwgdGhlIGhhc2ggaXMgY29ycmVjdCBhbmQgdGhlIHNpZ25hdHVyZSBpcyBjb3JyZWN0LiBLZWVwIGluCisgKiBtaW5kIHRoYXQgeW91IHN0aWxsIG5lZWQgdG8gY2hlY2sgdGhhdCB5b3Uga25vdyB0aGUgcHVibGljIGtleSB1c2VkCisgKiB0byBzaWduIHRoZSBpbWFnZSwgc2VlIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KCkgZm9yIGRldGFpbHMuCisgKgorICogQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LX05PVF9TSUdORUQgaXMgcmV0dXJuZWQgaWYgdGhlIHZibWV0YQorICogaW1hZ2UgaGVhZGVyIGlzIHZhbGlkIGJ1dCB0aGVyZSBpcyBubyBzaWduYXR1cmUgb3IgaGFzaC4KKyAqCisgKiBBVkJfVkVSSUZZX0lOVkFMSURfVkJNRVRBX0hFQURFUiBpcyByZXR1cm5lZCBpZiB0aGUgaGVhZGVyIG9mCisgKiB0aGUgdmJtZXRhIGltYWdlIGlzIGludmFsaWQsIGZvciBleGFtcGxlLCBpbnZhbGlkIG1hZ2ljIG9yCisgKiBpbmNvbnNpc3RlbnQgZGF0YS4KKyAqCisgKiBBVkJfVkVSSUZZX0hBU0hfTUlTTUFUQ0ggaXMgcmV0dXJuZWQgaWYgdGhlIGhhc2ggc3RvcmVkIGluIHRoZQorICogIkF1dGhlbnRpY2F0aW9uIGRhdGEiIGJsb2NrIGRvZXMgbm90IG1hdGNoIHRoZSBjYWxjdWxhdGVkIGhhc2guCisgKgorICogQVZCX1ZFUklGWV9TSUdOQVRVUkVfTUlTTUFUQ0ggaXMgcmV0dXJuZWQgaWYgdGhlIHNpZ25hdHVyZSBzdG9yZWQKKyAqIGluIHRoZSAiQXV0aGVudGljYXRpb24gZGF0YSIgYmxvY2sgaXMgaW52YWxpZCBvciBkb2Vzbid0IG1hdGNoIHRoZQorICogcHVibGljIGtleSBzdG9yZWQgaW4gdGhlIHZibWV0YSBpbWFnZS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LLAorICBBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfT0tfTk9UX1NJR05FRCwKKyAgQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX0lOVkFMSURfVkJNRVRBX0hFQURFUiwKKyAgQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX0hBU0hfTUlTTUFUQ0gsCisgIEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9TSUdOQVRVUkVfTUlTTUFUQ0gsCit9IEF2YlZCTWV0YVZlcmlmeVJlc3VsdDsKKworLyogR2V0IGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB8cmVzdWx0fC4gKi8KK2NvbnN0IGNoYXIqIGF2Yl92Ym1ldGFfdmVyaWZ5X3Jlc3VsdF90b19zdHJpbmcoQXZiVkJNZXRhVmVyaWZ5UmVzdWx0IHJlc3VsdCk7CisKKy8qIENoZWNrcyB0aGF0IHZibWV0YSBpbWFnZSBhdCB8ZGF0YXwgb2Ygc2l6ZSB8bGVuZ3RofCBpcyBhIHZhbGlkCisgKiB2Ym1ldGEgaW1hZ2UuIFRoZSBjb21wbGV0ZSBjb250ZW50cyBvZiB0aGUgdmJtZXRhIGltYWdlIG11c3QgYmUKKyAqIHBhc3NlZCBpbi4gSXQncyBmaW5lIGlmIHxsZW5ndGh8IGlzIGJpZ2dlciB0aGFuIHRoZSBhY3R1YWwgaW1hZ2UsCisgKiB0eXBpY2FsbHkgY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIHdpbGwgbG9hZCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mCisgKiB0aGUgJ3ZibWV0YV9hJyBvciAndmJtZXRhX2InIHBhcnRpdGlvbiBhbmQgcGFzcyBpbiBpdHMgbGVuZ3RoIChmb3IKKyAqIGV4YW1wbGUsIDEgTWlCKS4KKyAqCisgKiBTZWUgdGhlIHxBdmJWQk1ldGFJbWFnZUhlYWRlcnwgc3RydWN0IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAqIHRocmVlIGJsb2NrcyAoaGVhZGVyLCBhdXRoZW50aWNhdGlvbiwgYXV4aWxpYXJ5KSB0aGF0IG1ha2UgdXAgYQorICogdmJtZXRhIGltYWdlLgorICoKKyAqIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIHxBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfT0t8IGFuZAorICogfG91dF9wdWJsaWNfa2V5X2RhdGF8IGlzIG5vbi1OVUxMLCBpdCB3aWxsIGJlIHNldCB0byBwb2ludCBpbnNpZGUKKyAqIHxkYXRhfCBmb3Igd2hlcmUgdGhlIHNlcmlhbGl6ZWQgcHVibGljIGtleSBkYXRhIGlzIHN0b3JlZCBhbmQKKyAqIHxvdXRfcHVibGljX2tleV9sZW5ndGh8LCBpZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZgorICogdGhlIHB1YmxpYyBrZXkgZGF0YS4gSWYgdGhlcmUgaXMgbm8gcHVibGljIGtleSBpbiB0aGUgbWV0YWRhdGEgdGhlbgorICogfG91dF9wdWJsaWNfa2V5X2RhdGF8IGlzIHNldCB0byBOVUxMLgorICoKKyAqIFNlZSB0aGUgfEF2YlZCTWV0YVZlcmlmeVJlc3VsdHwgZW51bSBmb3IgcG9zc2libGUgcmV0dXJuIHZhbHVlcy4KKyAqCisgKiBWRVJZIElNUE9SVEFOVDoKKyAqCisgKiAgIDEuIEV2ZW4gaWYgfEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PS3wgaXMgcmV0dXJuZWQsIHlvdSBzdGlsbAorICogICAgICBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHB1YmxpYyBrZXkgZW1iZWRkZWQgaW4gdGhlIGltYWdlCisgKiAgICAgIG1hdGNoZXMgYSBrbm93biBrZXkhIFlvdSBjYW4gdXNlICdhdmJ0b29sIGV4dHJhY3RfcHVibGljX2tleScKKyAqICAgICAgdG8gZXh0cmFjdCB0aGUga2V5IChhdCBidWlsZCB0aW1lLCB0aGVuIHN0b3JlIGl0IGFsb25nIHlvdXIKKyAqICAgICAgY29kZSkgYW5kIGNvbXBhcmUgaXQgdG8gd2hhdCBpcyByZXR1cm5lZCBpbgorICogICAgICB8b3V0X3B1YmxpY19rZXlfZGF0YXwuCisgKgorICogICAyLiBZb3UgbmVlZCB0byBjaGVjayB0aGUgfHJvbGxiYWNrX2luZGV4fCBmaWVsZCBhZ2FpbnN0IGEgc3RvcmVkCisgKiAgICAgIHZhbHVlIGluIE5WUkFNIGFuZCByZWplY3QgdGhlIHZibWV0YSBpbWFnZSBpZiB0aGUgdmFsdWUgaW4KKyAqICAgICAgTlZSQU0gaXMgYmlnZ2VyIHRoYW4gfHJvbGxiYWNrX2luZGV4fC4gWW91IG11c3QgYWxzbyB1cGRhdGUKKyAqICAgICAgdGhlIHZhbHVlIHN0b3JlZCBpbiBOVlJBTSB0byB0aGUgc21hbGxlc3QgdmFsdWUgb2YKKyAqICAgICAgfHJvbGxiYWNrX2luZGV4fCBmaWVsZCBmcm9tIGJvb3QgaW1hZ2VzIGluIGFsbCBib290YWJsZSBhbmQKKyAqICAgICAgYXV0aGVudGljIHNsb3RzIG1hcmtlZCBhcyBHT09ELgorICoKKyAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgZnVuY3Rpb24gdG8gb25seSB2ZXJpZnkgdGhlIHZibWV0YSBkYXRhIC0geW91CisgKiBhcmUgbGlrZWx5IGxvb2tpbmcgZm9yIGF2Yl9zbG90X3ZlcmlmeSgpIGluc3RlYWQgZm9yIHZlcmlmeWluZworICogaW50ZWdyaXR5IGRhdGEgZm9yIGEgd2hvbGUgc2V0IG9mIHBhcnRpdGlvbnMuCisgKi8KK0F2YlZCTWV0YVZlcmlmeVJlc3VsdCBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICBjb25zdCB1aW50OF90KiBkYXRhLAorICAgIHNpemVfdCBsZW5ndGgsCisgICAgY29uc3QgdWludDhfdCoqIG91dF9wdWJsaWNfa2V5X2RhdGEsCisgICAgc2l6ZV90KiBvdXRfcHVibGljX2tleV9sZW5ndGgpIEFWQl9BVFRSX1dBUk5fVU5VU0VEX1JFU1VMVDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFWQl9WQk1FVEFfSU1BR0VfSF8gKi8KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmIvbGliYXZiLmggYi9hdmIvbGliYXZiL2xpYmF2Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDMwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiL2xpYmF2Yi5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgTElCQVZCX0hfCisjZGVmaW5lIExJQkFWQl9IXworCisvKiBUaGUgQVZCX0lOU0lERV9MSUJBVkJfSCBwcmVwcm9jZXNzb3Igc3ltYm9sIGlzIHVzZWQgdG8gZW5mb3JjZQorICogbGlicmFyeSB1c2VycyB0byBpbmNsdWRlIG9ubHkgdGhpcyBmaWxlLiBBbGwgcHVibGljIGludGVyZmFjZXMsIGFuZAorICogb25seSBwdWJsaWMgaW50ZXJmYWNlcywgbXVzdCBiZSBpbmNsdWRlZCBoZXJlLgorICovCisKKyNkZWZpbmUgQVZCX0lOU0lERV9MSUJBVkJfSAorI2luY2x1ZGUgImF2Yl9jaGFpbl9wYXJ0aXRpb25fZGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImF2Yl9jcnlwdG8uaCIKKyNpbmNsdWRlICJhdmJfZGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImF2Yl9mb290ZXIuaCIKKyNpbmNsdWRlICJhdmJfaGFzaF9kZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiYXZiX2hhc2h0cmVlX2Rlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJhdmJfa2VybmVsX2NtZGxpbmVfZGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImF2Yl9vcHMuaCIKKyNpbmNsdWRlICJhdmJfcHJvcGVydHlfZGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImF2Yl9zbG90X3ZlcmlmeS5oIgorI2luY2x1ZGUgImF2Yl9zeXNkZXBzLmgiCisjaW5jbHVkZSAiYXZiX3V0aWwuaCIKKyNpbmNsdWRlICJhdmJfdmJtZXRhX2ltYWdlLmgiCisjdW5kZWYgQVZCX0lOU0lERV9MSUJBVkJfSAorCisjZW5kaWYgLyogTElCQVZCX0hfICovCmRpZmYgLS1naXQgYS9hdmIvbGliYXZiX2FiL2F2Yl9hYl9mbG93LmMgYi9hdmIvbGliYXZiX2FiL2F2Yl9hYl9mbG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2ZTYxNwotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmJfYWIvYXZiX2FiX2Zsb3cuYwpAQCAtMCwwICsxLDUxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImF2Yl9hYl9mbG93LmgiCisKK2Jvb2wgYXZiX2FiX2RhdGFfdmVyaWZ5X2FuZF9ieXRlc3dhcChjb25zdCBBdmJBQkRhdGEqIHNyYywgQXZiQUJEYXRhKiBkZXN0KSB7CisgIC8qIEVuc3VyZSBtYWdpYyBpcyBjb3JyZWN0LiAqLworICBpZiAoYXZiX3NhZmVfbWVtY21wKHNyYy0+bWFnaWMsIEFWQl9BQl9NQUdJQywgQVZCX0FCX01BR0lDX0xFTikgIT0gMCkgeworICAgIGF2Yl9lcnJvcigiTWFnaWMgaXMgaW5jb3JyZWN0LlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYXZiX21lbWNweShkZXN0LCBzcmMsIHNpemVvZihBdmJBQkRhdGEpKTsKKyAgZGVzdC0+Y3JjMzIgPSBhdmJfYmUzMnRvaChkZXN0LT5jcmMzMik7CisKKyAgLyogRW5zdXJlIHdlIGRvbid0IGF0dGVtcHQgdG8gYWNjZXNzIGFueSBmaWVsZHMgaWYgdGhlIG1ham9yIHZlcnNpb24KKyAgICogaXMgbm90IHN1cHBvcnRlZC4KKyAgICovCisgIGlmIChkZXN0LT52ZXJzaW9uX21ham9yID4gQVZCX0FCX01BSk9SX1ZFUlNJT04pIHsKKyAgICBhdmJfZXJyb3IoIk5vIHN1cHBvcnQgZm9yIGdpdmVuIG1ham9yIHZlcnNpb24uXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKiBCYWlsIGlmIENSQzMyIGRvZXNuJ3QgbWF0Y2guICovCisgIGlmIChkZXN0LT5jcmMzMiAhPQorICAgICAgYXZiX2NyYzMyKChjb25zdCB1aW50OF90KilkZXN0LCBzaXplb2YoQXZiQUJEYXRhKSAtIHNpemVvZih1aW50MzJfdCkpKSB7CisgICAgYXZiX2Vycm9yKCJDUkMzMiBkb2VzIG5vdCBtYXRjaC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIGF2Yl9hYl9kYXRhX3VwZGF0ZV9jcmNfYW5kX2J5dGVzd2FwKGNvbnN0IEF2YkFCRGF0YSogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmJBQkRhdGEqIGRlc3QpIHsKKyAgYXZiX21lbWNweShkZXN0LCBzcmMsIHNpemVvZihBdmJBQkRhdGEpKTsKKyAgZGVzdC0+Y3JjMzIgPSBhdmJfaHRvYmUzMigKKyAgICAgIGF2Yl9jcmMzMigoY29uc3QgdWludDhfdCopZGVzdCwgc2l6ZW9mKEF2YkFCRGF0YSkgLSBzaXplb2YodWludDMyX3QpKSk7Cit9CisKK3ZvaWQgYXZiX2FiX2RhdGFfaW5pdChBdmJBQkRhdGEqIGRhdGEpIHsKKyAgYXZiX21lbXNldChkYXRhLCAnXDAnLCBzaXplb2YoQXZiQUJEYXRhKSk7CisgIGF2Yl9tZW1jcHkoZGF0YS0+bWFnaWMsIEFWQl9BQl9NQUdJQywgQVZCX0FCX01BR0lDX0xFTik7CisgIGRhdGEtPnZlcnNpb25fbWFqb3IgPSBBVkJfQUJfTUFKT1JfVkVSU0lPTjsKKyAgZGF0YS0+dmVyc2lvbl9taW5vciA9IEFWQl9BQl9NSU5PUl9WRVJTSU9OOworICBkYXRhLT5zbG90c1swXS5wcmlvcml0eSA9IEFWQl9BQl9NQVhfUFJJT1JJVFk7CisgIGRhdGEtPnNsb3RzWzBdLnRyaWVzX3JlbWFpbmluZyA9IEFWQl9BQl9NQVhfVFJJRVNfUkVNQUlOSU5HOworICBkYXRhLT5zbG90c1swXS5zdWNjZXNzZnVsX2Jvb3QgPSAwOworICBkYXRhLT5zbG90c1sxXS5wcmlvcml0eSA9IEFWQl9BQl9NQVhfUFJJT1JJVFkgLSAxOworICBkYXRhLT5zbG90c1sxXS50cmllc19yZW1haW5pbmcgPSBBVkJfQUJfTUFYX1RSSUVTX1JFTUFJTklORzsKKyAgZGF0YS0+c2xvdHNbMV0uc3VjY2Vzc2Z1bF9ib290ID0gMDsKK30KKworLyogVGhlIEF2YkFCRGF0YSBzdHJ1Y3QgaXMgc3RvcmVkIDIwNDggYnl0ZXMgaW50byB0aGUgJ21pc2MnIHBhcnRpdGlvbgorICogZm9sbG93aW5nIHRoZSAnc3RydWN0IGJvb3Rsb2FkZXJfbWVzc2FnZScgZmllbGQuIFRoZSBzdHJ1Y3QgaXMKKyAqIGNvbXBhdGlibGUgd2l0aCB0aGUgZ3VpZGVsaW5lcyBpbiBib290YWJsZS9yZWNvdmVyeS9ib290bG9hZGVyLmggLQorICogZS5nLiBpdCBpcyBzdG9yZWQgaW4gdGhlIHxzbG90X3N1ZmZpeHwgZmllbGQsIHN0YXJ0cyB3aXRoIGEKKyAqIE5VTC1ieXRlLCBhbmQgaXMgMzIgYnl0ZXMgbG9uZy4KKyAqLworI2RlZmluZSBBQl9NRVRBREFUQV9NSVNDX1BBUlRJVElPTl9PRkZTRVQgMjA0OAorCitBdmJJT1Jlc3VsdCBhdmJfYWJfZGF0YV9yZWFkKEF2YkFCT3BzKiBhYl9vcHMsIEF2YkFCRGF0YSogZGF0YSkgeworICBBdmJPcHMqIG9wcyA9IGFiX29wcy0+b3BzOworICBBdmJBQkRhdGEgc2VyaWFsaXplZDsKKyAgQXZiSU9SZXN1bHQgaW9fcmV0OworICBzaXplX3QgbnVtX2J5dGVzX3JlYWQ7CisKKyAgaW9fcmV0ID0gb3BzLT5yZWFkX2Zyb21fcGFydGl0aW9uKG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCX01FVEFEQVRBX01JU0NfUEFSVElUSU9OX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBdmJBQkRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcmlhbGl6ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtX2J5dGVzX3JlYWQpOworICBpZiAoaW9fcmV0ID09IEFWQl9JT19SRVNVTFRfRVJST1JfT09NKSB7CisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfT09NOworICB9IGVsc2UgaWYgKGlvX3JldCAhPSBBVkJfSU9fUkVTVUxUX09LIHx8CisgICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgIT0gc2l6ZW9mKEF2YkFCRGF0YSkpIHsKKyAgICBhdmJfZXJyb3IoIkVycm9yIHJlYWRpbmcgQS9CIG1ldGFkYXRhLlxuIik7CisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfSU87CisgIH0KKworICBpZiAoIWF2Yl9hYl9kYXRhX3ZlcmlmeV9hbmRfYnl0ZXN3YXAoJnNlcmlhbGl6ZWQsIGRhdGEpKSB7CisgICAgYXZiX2Vycm9yKAorICAgICAgICAiRXJyb3IgdmFsaWRhdGluZyBBL0IgbWV0YWRhdGEgZnJvbSBkaXNrLiAiCisgICAgICAgICJSZXNldHRpbmcgYW5kIHdyaXRpbmcgbmV3IEEvQiBtZXRhZGF0YSB0byBkaXNrLlxuIik7CisgICAgYXZiX2FiX2RhdGFfaW5pdChkYXRhKTsKKyAgICByZXR1cm4gYXZiX2FiX2RhdGFfd3JpdGUoYWJfb3BzLCBkYXRhKTsKKyAgfQorCisgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworfQorCitBdmJJT1Jlc3VsdCBhdmJfYWJfZGF0YV93cml0ZShBdmJBQk9wcyogYWJfb3BzLCBjb25zdCBBdmJBQkRhdGEqIGRhdGEpIHsKKyAgQXZiT3BzKiBvcHMgPSBhYl9vcHMtPm9wczsKKyAgQXZiQUJEYXRhIHNlcmlhbGl6ZWQ7CisgIEF2YklPUmVzdWx0IGlvX3JldDsKKworICBhdmJfYWJfZGF0YV91cGRhdGVfY3JjX2FuZF9ieXRlc3dhcChkYXRhLCAmc2VyaWFsaXplZCk7CisgIGlvX3JldCA9IG9wcy0+d3JpdGVfdG9fcGFydGl0aW9uKG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pc2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQl9NRVRBREFUQV9NSVNDX1BBUlRJVElPTl9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBdmJBQkRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VyaWFsaXplZCk7CisgIGlmIChpb19yZXQgPT0gQVZCX0lPX1JFU1VMVF9FUlJPUl9PT00pIHsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9PT007CisgIH0gZWxzZSBpZiAoaW9fcmV0ICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICBhdmJfZXJyb3IoIkVycm9yIHdyaXRpbmcgQS9CIG1ldGFkYXRhLlxuIik7CisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfSU87CisgIH0KKyAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7Cit9CisKK3N0YXRpYyBib29sIHNsb3RfaXNfYm9vdGFibGUoQXZiQUJTbG90RGF0YSogc2xvdCkgeworICByZXR1cm4gc2xvdC0+cHJpb3JpdHkgPiAwICYmCisgICAgICAgICAoc2xvdC0+c3VjY2Vzc2Z1bF9ib290IHx8IChzbG90LT50cmllc19yZW1haW5pbmcgPiAwKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNsb3Rfc2V0X3VuYm9vdGFibGUoQXZiQUJTbG90RGF0YSogc2xvdCkgeworICBzbG90LT5wcmlvcml0eSA9IDA7CisgIHNsb3QtPnRyaWVzX3JlbWFpbmluZyA9IDA7CisgIHNsb3QtPnN1Y2Nlc3NmdWxfYm9vdCA9IDA7Cit9CisKKy8qIEVuc3VyZSBhbGwgdW5ib290YWJsZSBhbmQvb3IgaWxsZWdhbCBzdGF0ZXMgYXJlIG1hcmtlZCBhcyB0aGUKKyAqIGNhbm9uaWNhbCAndW5ib290YWJsZScgc3RhdGUsIGUuZy4gcHJpb3JpdHk9MCwgdHJpZXNfcmVtYWluaW5nPTAsCisgKiBhbmQgc3VjY2Vzc2Z1bF9ib290PTAuCisgKi8KK3N0YXRpYyB2b2lkIHNsb3Rfbm9ybWFsaXplKEF2YkFCU2xvdERhdGEqIHNsb3QpIHsKKyAgaWYgKHNsb3QtPnByaW9yaXR5ID4gMCkgeworICAgIGlmIChzbG90LT50cmllc19yZW1haW5pbmcgPT0gMCAmJiAhc2xvdC0+c3VjY2Vzc2Z1bF9ib290KSB7CisgICAgICAvKiBXZSd2ZSBleGhhdXN0ZWQgYWxsIHRyaWVzIC0+IHVuYm9vdGFibGUuICovCisgICAgICBzbG90X3NldF91bmJvb3RhYmxlKHNsb3QpOworICAgIH0KKyAgICBpZiAoc2xvdC0+dHJpZXNfcmVtYWluaW5nID4gMCAmJiBzbG90LT5zdWNjZXNzZnVsX2Jvb3QpIHsKKyAgICAgIC8qIElsbGVnYWwgc3RhdGUgLSBhdmJfYWJfbWFya19zbG90X3N1Y2Nlc3NmdWwoKSB3aWxsIGNsZWFyCisgICAgICAgKiB0cmllc19yZW1haW5pbmcgd2hlbiBzZXR0aW5nIHN1Y2Nlc3NmdWxfYm9vdC4KKyAgICAgICAqLworICAgICAgc2xvdF9zZXRfdW5ib290YWJsZShzbG90KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc2xvdF9zZXRfdW5ib290YWJsZShzbG90KTsKKyAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciogc2xvdF9zdWZmaXhlc1syXSA9IHsiX2EiLCAiX2IifTsKKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGxvYWQgbWV0YWRhdGEgLSByZXR1cm5zIEFWQl9JT19SRVNVTFRfT0sgb24KKyAqIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgQXZiSU9SZXN1bHQgbG9hZF9tZXRhZGF0YShBdmJBQk9wcyogYWJfb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZiQUJEYXRhKiBhYl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZiQUJEYXRhKiBhYl9kYXRhX29yaWcpIHsKKyAgQXZiSU9SZXN1bHQgaW9fcmV0OworCisgIGlvX3JldCA9IGFiX29wcy0+cmVhZF9hYl9tZXRhZGF0YShhYl9vcHMsIGFiX2RhdGEpOworICBpZiAoaW9fcmV0ICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICBhdmJfZXJyb3IoIkkvTyBlcnJvciB3aGlsZSBsb2FkaW5nIEEvQiBtZXRhZGF0YS5cbiIpOworICAgIHJldHVybiBpb19yZXQ7CisgIH0KKyAgKmFiX2RhdGFfb3JpZyA9ICphYl9kYXRhOworCisgIC8qIEVuc3VyZSBkYXRhIGlzIG5vcm1hbGl6ZWQsIGUuZy4gaWxsZWdhbCBzdGF0ZXMgd2lsbCBiZSBtYXJrZWQgYXMKKyAgICogdW5ib290YWJsZSBhbmQgYWxsIHVuYm9vdGFibGUgc3RhdGVzIGFyZSByZXByZXNlbnRlZCB3aXRoCisgICAqIChwcmlvcml0eT0wLCB0cmllc19yZW1haW5pbmc9MCwgc3VjY2Vzc2Z1bF9ib290PTApLgorICAgKi8KKyAgc2xvdF9ub3JtYWxpemUoJmFiX2RhdGEtPnNsb3RzWzBdKTsKKyAgc2xvdF9ub3JtYWxpemUoJmFiX2RhdGEtPnNsb3RzWzFdKTsKKyAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7Cit9CisKKy8qIFdyaXRlcyBBL0IgbWV0YWRhdGEgdG8gZGlzayBvbmx5IGlmIGl0IGhhcyBjaGFuZ2VkIC0gcmV0dXJucworICogQVZCX0lPX1JFU1VMVF9PSyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIEF2YklPUmVzdWx0IHNhdmVfbWV0YWRhdGFfaWZfY2hhbmdlZChBdmJBQk9wcyogYWJfb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmJBQkRhdGEqIGFiX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2YkFCRGF0YSogYWJfZGF0YV9vcmlnKSB7CisgIGlmIChhdmJfc2FmZV9tZW1jbXAoYWJfZGF0YSwgYWJfZGF0YV9vcmlnLCBzaXplb2YoQXZiQUJEYXRhKSkgIT0gMCkgeworICAgIGF2Yl9kZWJ1ZygiV3JpdGluZyBBL0IgbWV0YWRhdGEgdG8gZGlzay5cbiIpOworICAgIHJldHVybiBhYl9vcHMtPndyaXRlX2FiX21ldGFkYXRhKGFiX29wcywgYWJfZGF0YSk7CisgIH0KKyAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7Cit9CisKK0F2YkFCRmxvd1Jlc3VsdCBhdmJfYWJfZmxvdyhBdmJBQk9wcyogYWJfb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmJTbG90VmVyaWZ5RGF0YSoqIG91dF9kYXRhKSB7CisgIEF2Yk9wcyogb3BzID0gYWJfb3BzLT5vcHM7CisgIEF2YlNsb3RWZXJpZnlEYXRhKiBzbG90X2RhdGFbMl0gPSB7TlVMTCwgTlVMTH07CisgIEF2YlNsb3RWZXJpZnlEYXRhKiBkYXRhID0gTlVMTDsKKyAgQXZiQUJGbG93UmVzdWx0IHJldDsKKyAgQXZiQUJEYXRhIGFiX2RhdGEsIGFiX2RhdGFfb3JpZzsKKyAgc2l6ZV90IHNsb3RfaW5kZXhfdG9fYm9vdCwgbjsKKyAgQXZiSU9SZXN1bHQgaW9fcmV0OworICBib29sIHNhd19hbmRfYWxsb3dlZF92ZXJpZmljYXRpb25fZXJyb3IgPSBmYWxzZTsKKworICBpb19yZXQgPSBsb2FkX21ldGFkYXRhKGFiX29wcywgJmFiX2RhdGEsICZhYl9kYXRhX29yaWcpOworICBpZiAoaW9fcmV0ID09IEFWQl9JT19SRVNVTFRfRVJST1JfT09NKSB7CisgICAgcmV0ID0gQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX09PTTsKKyAgICBnb3RvIG91dDsKKyAgfSBlbHNlIGlmIChpb19yZXQgIT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgIHJldCA9IEFWQl9BQl9GTE9XX1JFU1VMVF9FUlJPUl9JTzsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIFZhbGlkYXRlIGFsbCBib290YWJsZSBzbG90cy4gKi8KKyAgZm9yIChuID0gMDsgbiA8IDI7IG4rKykgeworICAgIGlmIChzbG90X2lzX2Jvb3RhYmxlKCZhYl9kYXRhLnNsb3RzW25dKSkgeworICAgICAgQXZiU2xvdFZlcmlmeVJlc3VsdCB2ZXJpZnlfcmVzdWx0OworICAgICAgYm9vbCBzZXRfc2xvdF91bmJvb3RhYmxlID0gZmFsc2U7CisKKyAgICAgIHZlcmlmeV9yZXN1bHQgPSBhdmJfc2xvdF92ZXJpZnkob3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdF9zdWZmaXhlc1tuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhW25dKTsKKyAgICAgIHN3aXRjaCAodmVyaWZ5X3Jlc3VsdCkgeworICAgICAgICBjYXNlIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfT09NOgorICAgICAgICAgIHJldCA9IEFWQl9BQl9GTE9XX1JFU1VMVF9FUlJPUl9PT007CisgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgY2FzZSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lPOgorICAgICAgICAgIHJldCA9IEFWQl9BQl9GTE9XX1JFU1VMVF9FUlJPUl9JTzsKKyAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICBjYXNlIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfT0s6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lOVkFMSURfTUVUQURBVEE6CisgICAgICAgICAgLyogRXZlbiB3aXRoIHxhbGxvd192ZXJpZmljYXRpb25fZXJyb3J8IHRoaXMgaXMgZ2FtZSBvdmVyLiAqLworICAgICAgICAgIHNldF9zbG90X3VuYm9vdGFibGUgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGV4cGxpY2l0IGZhbGx0aHJvdWdoLiAqLworICAgICAgICBjYXNlIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfVkVSSUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfUk9MTEJBQ0tfSU5ERVg6CisgICAgICAgIGNhc2UgQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9QVUJMSUNfS0VZX1JFSkVDVEVEOgorICAgICAgICAgIGlmIChhbGxvd192ZXJpZmljYXRpb25fZXJyb3IpIHsKKyAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgc2luY2Ugd2UgYWxsb3cgdGhpcy4gKi8KKyAgICAgICAgICAgIGF2Yl9kZWJ1Z3YoIkFsbG93aW5nIHNsb3QgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2xvdF9zdWZmaXhlc1tuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIiB3aGljaCB2ZXJpZmllZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHJlc3VsdCAiLAorICAgICAgICAgICAgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnlfcmVzdWx0X3RvX3N0cmluZyh2ZXJpZnlfcmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIiBiZWNhdXNlIHxhbGxvd192ZXJpZmljYXRpb25fZXJyb3J8IGlzIHRydWUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIHNhd19hbmRfYWxsb3dlZF92ZXJpZmljYXRpb25fZXJyb3IgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRfc2xvdF91bmJvb3RhYmxlID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChzZXRfc2xvdF91bmJvb3RhYmxlKSB7CisgICAgICAgIGF2Yl9lcnJvcnYoIkVycm9yIHZlcmlmeWluZyBzbG90ICIsCisgICAgICAgICAgICAgICAgICAgc2xvdF9zdWZmaXhlc1tuXSwKKyAgICAgICAgICAgICAgICAgICAiIHdpdGggcmVzdWx0ICIsCisgICAgICAgICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5X3Jlc3VsdF90b19zdHJpbmcodmVyaWZ5X3Jlc3VsdCksCisgICAgICAgICAgICAgICAgICAgIiAtIHNldHRpbmcgdW5ib290YWJsZS5cbiIsCisgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIHNsb3Rfc2V0X3VuYm9vdGFibGUoJmFiX2RhdGEuc2xvdHNbbl0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChzbG90X2lzX2Jvb3RhYmxlKCZhYl9kYXRhLnNsb3RzWzBdKSAmJgorICAgICAgc2xvdF9pc19ib290YWJsZSgmYWJfZGF0YS5zbG90c1sxXSkpIHsKKyAgICBpZiAoYWJfZGF0YS5zbG90c1sxXS5wcmlvcml0eSA+IGFiX2RhdGEuc2xvdHNbMF0ucHJpb3JpdHkpIHsKKyAgICAgIHNsb3RfaW5kZXhfdG9fYm9vdCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHNsb3RfaW5kZXhfdG9fYm9vdCA9IDA7CisgICAgfQorICB9IGVsc2UgaWYgKHNsb3RfaXNfYm9vdGFibGUoJmFiX2RhdGEuc2xvdHNbMF0pKSB7CisgICAgc2xvdF9pbmRleF90b19ib290ID0gMDsKKyAgfSBlbHNlIGlmIChzbG90X2lzX2Jvb3RhYmxlKCZhYl9kYXRhLnNsb3RzWzFdKSkgeworICAgIHNsb3RfaW5kZXhfdG9fYm9vdCA9IDE7CisgIH0gZWxzZSB7CisgICAgLyogTm8gYm9vdGFibGUgc2xvdHMhICovCisgICAgYXZiX2Vycm9yKCJObyBib290YWJsZSBzbG90cyBmb3VuZC5cbiIpOworICAgIHJldCA9IEFWQl9BQl9GTE9XX1JFU1VMVF9FUlJPUl9OT19CT09UQUJMRV9TTE9UUzsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIFVwZGF0ZSBzdG9yZWQgcm9sbGJhY2sgaW5kZXggc3VjaCB0aGF0IHRoZSBzdG9yZWQgcm9sbGJhY2sgaW5kZXgKKyAgICogaXMgdGhlIGxhcmdlc3QgdmFsdWUgc3VwcG9ydGluZyBhbGwgY3VycmVudGx5IGJvb3RhYmxlIHNsb3RzLiBEbworICAgKiB0aGlzIGZvciBldmVyeSByb2xsYmFjayBpbmRleCBsb2NhdGlvbi4KKyAgICovCisgIGZvciAobiA9IDA7IG4gPCBBVkJfTUFYX05VTUJFUl9PRl9ST0xMQkFDS19JTkRFWF9MT0NBVElPTlM7IG4rKykgeworICAgIHVpbnQ2NF90IHJvbGxiYWNrX2luZGV4X3ZhbHVlID0gMDsKKworICAgIGlmIChzbG90X2RhdGFbMF0gIT0gTlVMTCAmJiBzbG90X2RhdGFbMV0gIT0gTlVMTCkgeworICAgICAgdWludDY0X3QgYV9yb2xsYmFja19pbmRleCA9IHNsb3RfZGF0YVswXS0+cm9sbGJhY2tfaW5kZXhlc1tuXTsKKyAgICAgIHVpbnQ2NF90IGJfcm9sbGJhY2tfaW5kZXggPSBzbG90X2RhdGFbMV0tPnJvbGxiYWNrX2luZGV4ZXNbbl07CisgICAgICByb2xsYmFja19pbmRleF92YWx1ZSA9CisgICAgICAgICAgKGFfcm9sbGJhY2tfaW5kZXggPCBiX3JvbGxiYWNrX2luZGV4ID8gYV9yb2xsYmFja19pbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJfcm9sbGJhY2tfaW5kZXgpOworICAgIH0gZWxzZSBpZiAoc2xvdF9kYXRhWzBdICE9IE5VTEwpIHsKKyAgICAgIHJvbGxiYWNrX2luZGV4X3ZhbHVlID0gc2xvdF9kYXRhWzBdLT5yb2xsYmFja19pbmRleGVzW25dOworICAgIH0gZWxzZSBpZiAoc2xvdF9kYXRhWzFdICE9IE5VTEwpIHsKKyAgICAgIHJvbGxiYWNrX2luZGV4X3ZhbHVlID0gc2xvdF9kYXRhWzFdLT5yb2xsYmFja19pbmRleGVzW25dOworICAgIH0KKworICAgIGlmIChyb2xsYmFja19pbmRleF92YWx1ZSAhPSAwKSB7CisgICAgICB1aW50NjRfdCBjdXJyZW50X3JvbGxiYWNrX2luZGV4X3ZhbHVlOworICAgICAgaW9fcmV0ID0gb3BzLT5yZWFkX3JvbGxiYWNrX2luZGV4KG9wcywgbiwgJmN1cnJlbnRfcm9sbGJhY2tfaW5kZXhfdmFsdWUpOworICAgICAgaWYgKGlvX3JldCA9PSBBVkJfSU9fUkVTVUxUX0VSUk9SX09PTSkgeworICAgICAgICByZXQgPSBBVkJfQUJfRkxPV19SRVNVTFRfRVJST1JfT09NOworICAgICAgICBnb3RvIG91dDsKKyAgICAgIH0gZWxzZSBpZiAoaW9fcmV0ICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICAgICAgYXZiX2Vycm9yKCJFcnJvciBnZXR0aW5nIHJvbGxiYWNrIGluZGV4IGZvciBzbG90LlxuIik7CisgICAgICAgIHJldCA9IEFWQl9BQl9GTE9XX1JFU1VMVF9FUlJPUl9JTzsKKyAgICAgICAgZ290byBvdXQ7CisgICAgICB9CisgICAgICBpZiAoY3VycmVudF9yb2xsYmFja19pbmRleF92YWx1ZSAhPSByb2xsYmFja19pbmRleF92YWx1ZSkgeworICAgICAgICBpb19yZXQgPSBvcHMtPndyaXRlX3JvbGxiYWNrX2luZGV4KG9wcywgbiwgcm9sbGJhY2tfaW5kZXhfdmFsdWUpOworICAgICAgICBpZiAoaW9fcmV0ID09IEFWQl9JT19SRVNVTFRfRVJST1JfT09NKSB7CisgICAgICAgICAgcmV0ID0gQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX09PTTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfSBlbHNlIGlmIChpb19yZXQgIT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgICAgICAgIGF2Yl9lcnJvcigiRXJyb3Igc2V0dGluZyBzdG9yZWQgcm9sbGJhY2sgaW5kZXguXG4iKTsKKyAgICAgICAgICByZXQgPSBBVkJfQUJfRkxPV19SRVNVTFRfRVJST1JfSU87CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBGaW5hbGx5LCBzZWxlY3QgdGhpcyBzbG90LiAqLworICBhdmJfYXNzZXJ0KHNsb3RfZGF0YVtzbG90X2luZGV4X3RvX2Jvb3RdICE9IE5VTEwpOworICBkYXRhID0gc2xvdF9kYXRhW3Nsb3RfaW5kZXhfdG9fYm9vdF07CisgIHNsb3RfZGF0YVtzbG90X2luZGV4X3RvX2Jvb3RdID0gTlVMTDsKKyAgaWYgKHNhd19hbmRfYWxsb3dlZF92ZXJpZmljYXRpb25fZXJyb3IpIHsKKyAgICBhdmJfYXNzZXJ0KGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvcik7CisgICAgcmV0ID0gQVZCX0FCX0ZMT1dfUkVTVUxUX09LX1dJVEhfVkVSSUZJQ0FUSU9OX0VSUk9SOworICB9IGVsc2UgeworICAgIHJldCA9IEFWQl9BQl9GTE9XX1JFU1VMVF9PSzsKKyAgfQorCisgIC8qIC4uLiBhbmQgZGVjcmVtZW50IHRyaWVzIHJlbWFpbmluZywgaWYgYXBwbGljYWJsZS4gKi8KKyAgaWYgKCFhYl9kYXRhLnNsb3RzW3Nsb3RfaW5kZXhfdG9fYm9vdF0uc3VjY2Vzc2Z1bF9ib290ICYmCisgICAgICBhYl9kYXRhLnNsb3RzW3Nsb3RfaW5kZXhfdG9fYm9vdF0udHJpZXNfcmVtYWluaW5nID4gMCkgeworICAgIGFiX2RhdGEuc2xvdHNbc2xvdF9pbmRleF90b19ib290XS50cmllc19yZW1haW5pbmcgLT0gMTsKKyAgfQorCitvdXQ6CisgIGlvX3JldCA9IHNhdmVfbWV0YWRhdGFfaWZfY2hhbmdlZChhYl9vcHMsICZhYl9kYXRhLCAmYWJfZGF0YV9vcmlnKTsKKyAgaWYgKGlvX3JldCAhPSBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgaWYgKGlvX3JldCA9PSBBVkJfSU9fUkVTVUxUX0VSUk9SX09PTSkgeworICAgICAgcmV0ID0gQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX09PTTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX0lPOworICAgIH0KKyAgICBpZiAoZGF0YSAhPSBOVUxMKSB7CisgICAgICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKGRhdGEpOworICAgICAgZGF0YSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgZm9yIChuID0gMDsgbiA8IDI7IG4rKykgeworICAgIGlmIChzbG90X2RhdGFbbl0gIT0gTlVMTCkgeworICAgICAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShzbG90X2RhdGFbbl0pOworICAgIH0KKyAgfQorCisgIGlmIChvdXRfZGF0YSAhPSBOVUxMKSB7CisgICAgKm91dF9kYXRhID0gZGF0YTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZGF0YSAhPSBOVUxMKSB7CisgICAgICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKGRhdGEpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK0F2YklPUmVzdWx0IGF2Yl9hYl9tYXJrX3Nsb3RfYWN0aXZlKEF2YkFCT3BzKiBhYl9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2xvdF9udW1iZXIpIHsKKyAgQXZiQUJEYXRhIGFiX2RhdGEsIGFiX2RhdGFfb3JpZzsKKyAgdW5zaWduZWQgaW50IG90aGVyX3Nsb3RfbnVtYmVyOworICBBdmJJT1Jlc3VsdCByZXQ7CisKKyAgYXZiX2Fzc2VydChzbG90X251bWJlciA8IDIpOworCisgIHJldCA9IGxvYWRfbWV0YWRhdGEoYWJfb3BzLCAmYWJfZGF0YSwgJmFiX2RhdGFfb3JpZyk7CisgIGlmIChyZXQgIT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogTWFrZSByZXF1ZXN0ZWQgc2xvdCB0b3AgcHJpb3JpdHksIHVuc3VjY2Vzc2Z1bCwgYW5kIHdpdGggbWF4IHRyaWVzLiAqLworICBhYl9kYXRhLnNsb3RzW3Nsb3RfbnVtYmVyXS5wcmlvcml0eSA9IEFWQl9BQl9NQVhfUFJJT1JJVFk7CisgIGFiX2RhdGEuc2xvdHNbc2xvdF9udW1iZXJdLnRyaWVzX3JlbWFpbmluZyA9IEFWQl9BQl9NQVhfVFJJRVNfUkVNQUlOSU5HOworICBhYl9kYXRhLnNsb3RzW3Nsb3RfbnVtYmVyXS5zdWNjZXNzZnVsX2Jvb3QgPSAwOworCisgIC8qIEVuc3VyZSBvdGhlciBzbG90IGRvZXNuJ3QgaGF2ZSBhcyBoaWdoIGEgcHJpb3JpdHkuICovCisgIG90aGVyX3Nsb3RfbnVtYmVyID0gMSAtIHNsb3RfbnVtYmVyOworICBpZiAoYWJfZGF0YS5zbG90c1tvdGhlcl9zbG90X251bWJlcl0ucHJpb3JpdHkgPT0gQVZCX0FCX01BWF9QUklPUklUWSkgeworICAgIGFiX2RhdGEuc2xvdHNbb3RoZXJfc2xvdF9udW1iZXJdLnByaW9yaXR5ID0gQVZCX0FCX01BWF9QUklPUklUWSAtIDE7CisgIH0KKworICByZXQgPSBBVkJfSU9fUkVTVUxUX09LOworCitvdXQ6CisgIGlmIChyZXQgPT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgIHJldCA9IHNhdmVfbWV0YWRhdGFfaWZfY2hhbmdlZChhYl9vcHMsICZhYl9kYXRhLCAmYWJfZGF0YV9vcmlnKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitBdmJJT1Jlc3VsdCBhdmJfYWJfbWFya19zbG90X3VuYm9vdGFibGUoQXZiQUJPcHMqIGFiX29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2xvdF9udW1iZXIpIHsKKyAgQXZiQUJEYXRhIGFiX2RhdGEsIGFiX2RhdGFfb3JpZzsKKyAgQXZiSU9SZXN1bHQgcmV0OworCisgIGF2Yl9hc3NlcnQoc2xvdF9udW1iZXIgPCAyKTsKKworICByZXQgPSBsb2FkX21ldGFkYXRhKGFiX29wcywgJmFiX2RhdGEsICZhYl9kYXRhX29yaWcpOworICBpZiAocmV0ICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIHNsb3Rfc2V0X3VuYm9vdGFibGUoJmFiX2RhdGEuc2xvdHNbc2xvdF9udW1iZXJdKTsKKworICByZXQgPSBBVkJfSU9fUkVTVUxUX09LOworCitvdXQ6CisgIGlmIChyZXQgPT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgIHJldCA9IHNhdmVfbWV0YWRhdGFfaWZfY2hhbmdlZChhYl9vcHMsICZhYl9kYXRhLCAmYWJfZGF0YV9vcmlnKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitBdmJJT1Jlc3VsdCBhdmJfYWJfbWFya19zbG90X3N1Y2Nlc3NmdWwoQXZiQUJPcHMqIGFiX29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2xvdF9udW1iZXIpIHsKKyAgQXZiQUJEYXRhIGFiX2RhdGEsIGFiX2RhdGFfb3JpZzsKKyAgQXZiSU9SZXN1bHQgcmV0OworCisgIGF2Yl9hc3NlcnQoc2xvdF9udW1iZXIgPCAyKTsKKworICByZXQgPSBsb2FkX21ldGFkYXRhKGFiX29wcywgJmFiX2RhdGEsICZhYl9kYXRhX29yaWcpOworICBpZiAocmV0ICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGlmICghc2xvdF9pc19ib290YWJsZSgmYWJfZGF0YS5zbG90c1tzbG90X251bWJlcl0pKSB7CisgICAgYXZiX2Vycm9yKCJDYW5ub3QgbWFyayB1bmJvb3RhYmxlIHNsb3QgYXMgc3VjY2Vzc2Z1bC5cbiIpOworICAgIHJldCA9IEFWQl9JT19SRVNVTFRfT0s7CisgICAgZ290byBvdXQ7CisgIH0KKworICBhYl9kYXRhLnNsb3RzW3Nsb3RfbnVtYmVyXS50cmllc19yZW1haW5pbmcgPSAwOworICBhYl9kYXRhLnNsb3RzW3Nsb3RfbnVtYmVyXS5zdWNjZXNzZnVsX2Jvb3QgPSAxOworCisgIHJldCA9IEFWQl9JT19SRVNVTFRfT0s7CisKK291dDoKKyAgaWYgKHJldCA9PSBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgcmV0ID0gc2F2ZV9tZXRhZGF0YV9pZl9jaGFuZ2VkKGFiX29wcywgJmFiX2RhdGEsICZhYl9kYXRhX29yaWcpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2NvbnN0IGNoYXIqIGF2Yl9hYl9mbG93X3Jlc3VsdF90b19zdHJpbmcoQXZiQUJGbG93UmVzdWx0IHJlc3VsdCkgeworICBjb25zdCBjaGFyKiByZXQgPSBOVUxMOworCisgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgY2FzZSBBVkJfQUJfRkxPV19SRVNVTFRfT0s6CisgICAgICByZXQgPSAiT0siOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFWQl9BQl9GTE9XX1JFU1VMVF9PS19XSVRIX1ZFUklGSUNBVElPTl9FUlJPUjoKKyAgICAgIHJldCA9ICJPS19XSVRIX1ZFUklGSUNBVElPTl9FUlJPUiI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX09PTToKKyAgICAgIHJldCA9ICJFUlJPUl9PT00iOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFWQl9BQl9GTE9XX1JFU1VMVF9FUlJPUl9JTzoKKyAgICAgIHJldCA9ICJFUlJPUl9JTyI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX05PX0JPT1RBQkxFX1NMT1RTOgorICAgICAgcmV0ID0gIkVSUk9SX05PX0JPT1RBQkxFX1NMT1RTIjsKKyAgICAgIGJyZWFrOworICAgICAgLyogRG8gbm90IGFkZCBhICdkZWZhdWx0OicgY2FzZSBoZXJlIGJlY2F1c2Ugb2YgLVdzd2l0Y2guICovCisgIH0KKworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBhdmJfZXJyb3IoIlVua25vd24gQXZiQUJGbG93UmVzdWx0IHZhbHVlLlxuIik7CisgICAgcmV0ID0gIih1bmtub3duKSI7CisgIH0KKworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYXZiL2xpYmF2Yl9hYi9hdmJfYWJfZmxvdy5oIGIvYXZiL2xpYmF2Yl9hYi9hdmJfYWJfZmxvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNmEzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiX2FiL2F2Yl9hYl9mbG93LmgKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZChBVkJfSU5TSURFX0xJQkFWQl9BQl9IKSAmJiAhZGVmaW5lZChBVkJfQ09NUElMQVRJT04pCisjZXJyb3IgXAorICAgICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSwgaW5jbHVkZSBsaWJhdmJfYWIvbGliYXZiX2FiLmggaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBBVkJfQUJfRkxPV19IXworI2RlZmluZSBBVkJfQUJfRkxPV19IXworCisjaW5jbHVkZSAiYXZiX2FiX29wcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIE1hZ2ljIGZvciB0aGUgQS9CIHN0cnVjdCB3aGVuIHNlcmlhbGl6ZWQuICovCisjZGVmaW5lIEFWQl9BQl9NQUdJQyAiXDBBQjAiCisjZGVmaW5lIEFWQl9BQl9NQUdJQ19MRU4gNAorCisvKiBWZXJzaW9uaW5nIGZvciB0aGUgb24tZGlzayBBL0IgbWV0YWRhdGEgLSBrZWVwIGluIHN5bmMgd2l0aCBhdmJ0b29sLiAqLworI2RlZmluZSBBVkJfQUJfTUFKT1JfVkVSU0lPTiAxCisjZGVmaW5lIEFWQl9BQl9NSU5PUl9WRVJTSU9OIDAKKworLyogU2l6ZSBvZiBBdmJBQkRhdGEgc3RydWN0LiAqLworI2RlZmluZSBBVkJfQUJfREFUQV9TSVpFIDMyCisKKy8qIE1heGltdW0gdmFsdWVzIGZvciBzbG90IGRhdGEgKi8KKyNkZWZpbmUgQVZCX0FCX01BWF9QUklPUklUWSAxNQorI2RlZmluZSBBVkJfQUJfTUFYX1RSSUVTX1JFTUFJTklORyA3CisKKy8qIFN0cnVjdCB1c2VkIGZvciByZWNvcmRpbmcgcGVyLXNsb3QgbWV0YWRhdGEuCisgKgorICogV2hlbiBzZXJpYWxpemVkLCBkYXRhIGlzIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUtb3JkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IEF2YkFCU2xvdERhdGEgeworICAvKiBTbG90IHByaW9yaXR5LiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIEFWQl9BQl9NQVhfUFJJT1JJVFksCisgICAqIGJvdGggaW5jbHVzaXZlIHdpdGggMSBiZWluZyB0aGUgbG93ZXN0IGFuZCBBVkJfQUJfTUFYX1BSSU9SSVRZCisgICAqIGJlaW5nIHRoZSBoaWdoZXN0LiBUaGUgc3BlY2lhbCB2YWx1ZSAwIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlCisgICAqIHNsb3QgaXMgdW5ib290YWJsZS4KKyAgICovCisgIHVpbnQ4X3QgcHJpb3JpdHk7CisKKyAgLyogTnVtYmVyIG9mIHRpbWVzIGxlZnQgYXR0ZW1wdGluZyB0byBib290IHRoaXMgc2xvdCByYW5naW5nIGZyb20gMAorICAgKiB0byBBVkJfQUJfTUFYX1RSSUVTX1JFTUFJTklORy4KKyAgICovCisgIHVpbnQ4X3QgdHJpZXNfcmVtYWluaW5nOworCisgIC8qIE5vbi16ZXJvIGlmIHRoaXMgc2xvdCBoYXMgYm9vdGVkIHN1Y2Nlc3NmdWxseSwgMCBvdGhlcndpc2UuICovCisgIHVpbnQ4X3Qgc3VjY2Vzc2Z1bF9ib290OworCisgIC8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqLworICB1aW50OF90IHJlc2VydmVkWzFdOworfSBBVkJfQVRUUl9QQUNLRUQgQXZiQUJTbG90RGF0YTsKKworLyogU3RydWN0IHVzZWQgZm9yIHJlY29yZGluZyBBL0IgbWV0YWRhdGEuCisgKgorICogV2hlbiBzZXJpYWxpemVkLCBkYXRhIGlzIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUtb3JkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IEF2YkFCRGF0YSB7CisgIC8qIE1hZ2ljIG51bWJlciB1c2VkIGZvciBpZGVudGlmaWNhdGlvbiAtIHNlZSBBVkJfQUJfTUFHSUMuICovCisgIHVpbnQ4X3QgbWFnaWNbQVZCX0FCX01BR0lDX0xFTl07CisKKyAgLyogVmVyc2lvbiBvZiBvbi1kaXNrIHN0cnVjdCAtIHNlZSBBVkJfQUJfe01BSk9SLE1JTk9SfV9WRVJTSU9OLiAqLworICB1aW50OF90IHZlcnNpb25fbWFqb3I7CisgIHVpbnQ4X3QgdmVyc2lvbl9taW5vcjsKKworICAvKiBQYWRkaW5nIHRvIGVuc3VyZSB8c2xvdHN8IGZpZWxkIHN0YXJ0IGVpZ2h0IGJ5dGVzIGluLiAqLworICB1aW50OF90IHJlc2VydmVkMVsyXTsKKworICAvKiBQZXItc2xvdCBtZXRhZGF0YS4gKi8KKyAgQXZiQUJTbG90RGF0YSBzbG90c1syXTsKKworICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KKyAgdWludDhfdCByZXNlcnZlZDJbMTJdOworCisgIC8qIENSQzMyIG9mIGFsbCAyOCBieXRlcyBwcmVjZWRpbmcgdGhpcyBmaWVsZC4gKi8KKyAgdWludDMyX3QgY3JjMzI7Cit9IEFWQl9BVFRSX1BBQ0tFRCBBdmJBQkRhdGE7CisKKy8qIENvcGllcyB8c3JjfCB0byB8ZGVzdHwsIGJ5dGUtc3dhcHBpbmcgZmllbGRzIGluIHRoZQorICogcHJvY2Vzcy4gUmV0dXJucyBmYWxzZSBpZiB0aGUgZGF0YSBpcyBpbnZhbGlkIChlLmcuIHdyb25nIG1hZ2ljLAorICogd3JvbmcgQ1JDMzIgZXRjLiksIHRydWUgb3RoZXJ3aXNlLgorICovCitib29sIGF2Yl9hYl9kYXRhX3ZlcmlmeV9hbmRfYnl0ZXN3YXAoY29uc3QgQXZiQUJEYXRhKiBzcmMsIEF2YkFCRGF0YSogZGVzdCk7CisKKy8qIENvcGllcyB8c3JjfCB0byB8ZGVzdHwsIGJ5dGUtc3dhcHBpbmcgZmllbGRzIGluIHRoZSBwcm9jZXNzLiBBbHNvCisgKiB1cGRhdGVzIHRoZSB8Y3JjMzJ8IGZpZWxkIGluIHxkZXN0fC4KKyAqLwordm9pZCBhdmJfYWJfZGF0YV91cGRhdGVfY3JjX2FuZF9ieXRlc3dhcChjb25zdCBBdmJBQkRhdGEqIHNyYywgQXZiQUJEYXRhKiBkZXN0KTsKKworLyogSW5pdGlhbGl6ZXMgfGRhdGF8IHN1Y2ggdGhhdCBpdCBoYXMgdHdvIHNsb3RzIGFuZCBib3RoIHNsb3RzIGhhdmUKKyAqIG1heGltdW0gdHJpZXMgcmVtYWluaW5nLiBUaGUgQ1JDIGlzIG5vdCBzZXQuCisgKi8KK3ZvaWQgYXZiX2FiX2RhdGFfaW5pdChBdmJBQkRhdGEqIGRhdGEpOworCisvKiBSZWFkcyBBL0IgbWV0YWRhdGEgZnJvbSB0aGUgJ21pc2MnIHBhcnRpdGlvbiB1c2luZyB8b3BzfC4gUmV0dXJuZWQKKyAqIGRhdGEgaXMgcHJvcGVybHkgYnl0ZXN3YXBwZWQuIFJldHVybnMgQVZCX0lPX1JFU1VMVF9PSyBvbgorICogc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKgorICogSWYgdGhlIGRhdGEgcmVhZCBmcm9tIGRpc2sgaXMgaW52YWxpZCAoZS5nLiB3cm9uZyBtYWdpYyBvciBDUkMKKyAqIGNoZWNrc3VtIGZhaWx1cmUpLCB0aGUgbWV0YWRhdGEgd2lsbCBiZSByZXNldCB1c2luZworICogYXZiX2FiX2RhdGFfaW5pdCgpIGFuZCB0aGVuIHdyaXR0ZW4gdG8gZGlzay4KKyAqLworQXZiSU9SZXN1bHQgYXZiX2FiX2RhdGFfcmVhZChBdmJBQk9wcyogYWJfb3BzLCBBdmJBQkRhdGEqIGRhdGEpOworCisvKiBXcml0ZXMgQS9CIG1ldGFkYXRhIHRvIHRoZSAnbWlzYycgcGFydGl0aW9uIHVzaW5nIHxvcHN8LiBUaGlzIHdpbGwKKyAqIGJ5dGVzd2FwIGFuZCB1cGRhdGUgdGhlIENSQyBhcyBuZWVkZWQuIFJldHVybnMgQVZCX0lPX1JFU1VMVF9PSyBvbgorICogc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK0F2YklPUmVzdWx0IGF2Yl9hYl9kYXRhX3dyaXRlKEF2YkFCT3BzKiBhYl9vcHMsIGNvbnN0IEF2YkFCRGF0YSogZGF0YSk7CisKKy8qIFJldHVybiBjb2RlcyB1c2VkIGluIGF2Yl9hYl9mbG93KCksIHNlZSB0aGF0IGZ1bmN0aW9uIGZvcgorICogZG9jdW1lbnRhdGlvbiBvZiBlYWNoIHZhbHVlLgorICovCit0eXBlZGVmIGVudW0geworICBBVkJfQUJfRkxPV19SRVNVTFRfT0ssCisgIEFWQl9BQl9GTE9XX1JFU1VMVF9PS19XSVRIX1ZFUklGSUNBVElPTl9FUlJPUiwKKyAgQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX09PTSwKKyAgQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX0lPLAorICBBVkJfQUJfRkxPV19SRVNVTFRfRVJST1JfTk9fQk9PVEFCTEVfU0xPVFMKK30gQXZiQUJGbG93UmVzdWx0OworCisvKiBHZXQgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHxyZXN1bHR8LiAqLworY29uc3QgY2hhciogYXZiX2FiX2Zsb3dfcmVzdWx0X3RvX3N0cmluZyhBdmJBQkZsb3dSZXN1bHQgcmVzdWx0KTsKKworLyogSGlnaC1sZXZlbCBmdW5jdGlvbiB0byBzZWxlY3QgYSBzbG90IHRvIGJvb3QuIFRoZSBmb2xsb3dpbmcKKyAqIGFsZ29yaXRobSBpcyB1c2VkOgorICoKKyAqIDEuIEEvQiBtZXRhZGF0YSBpcyBsb2FkZWQgYW5kIHZhbGlkYXRlZCB1c2luZyB0aGUKKyAqIHJlYWRfYWJfbWV0YWRhdGEoKSBvcGVyYXRpb24uIFR5cGljYWxseSB0aGlzIG1lYW5zIGl0J3MgcmVhZCBmcm9tCisgKiB0aGUgJ21pc2MnIHBhcnRpdGlvbiBhbmQgaWYgaXQncyBpbnZhbGlkIHRoZW4gaXQncyByZXNldCB1c2luZworICogYXZiX2FiX2RhdGFfaW5pdCgpIGFuZCB0aGlzIHJlc2V0IG1ldGFkYXRhIGlzIHJldHVybmVkLgorICoKKyAqIDIuIEFsbCBib290YWJsZSBzbG90cyBsaXN0ZWQgaW4gdGhlIEEvQiBtZXRhZGF0YSBhcmUgdmVyaWZpZWQgdXNpbmcKKyAqIGF2Yl9zbG90X3ZlcmlmeSgpLiBJZiBhIHNsb3QgaXMgaW52YWxpZCBvciBpZiBpdCBmYWlscyB2ZXJpZmljYXRpb24KKyAqIChhbmQgfGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvcnwgaXMgZmFsc2UsIHNlZSBiZWxvdyksIGl0IHdpbGwgYmUKKyAqIG1hcmtlZCBhcyB1bmJvb3RhYmxlIGluIHRoZSBBL0IgbWV0YWRhdGEgYW5kIHRoZSBtZXRhZGF0YSB3aWxsIGJlCisgKiBzYXZlZCB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcuCisgKgorICogMy4gSWYgdGhlcmUgYXJlIG5vIGJvb3RhYmxlIHNsb3RzLCB0aGUgdmFsdWUKKyAqIEFWQl9BQl9GTE9XX1JFU1VMVF9FUlJPUl9OT19CT09UQUJMRV9TTE9UUyBpcyByZXR1cm5lZC4KKyAqCisgKiA0LiBGb3IgZWFjaCBib290YWJsZSBzbG90LCB0aGUgU3RvcmVkIFJvbGxiYWNrIEluZGV4ZXMgYXJlIHVwZGF0ZWQKKyAqIHN1Y2ggdGhhdCBmb3IgZWFjaCByb2xsYmFjayBpbmRleCBsb2NhdGlvbiwgdGhlIFN0b3JlZCBSb2xsYmFjaworICogSW5kZXggaXMgdGhlIGxhcmdlc3QgbnVtYmVyIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgUm9sbGJhY2sKKyAqIEluZGV4IG9mIGVhY2ggc2xvdC4KKyAqCisgKiA1LiBUaGUgYm9vdGFibGUgc2xvdCB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IGlzIHNlbGVjdGVkIGFuZAorICogcmV0dXJuZWQgaW4gfG91dF9kYXRhfC4gSWYgdGhpcyBzbG90IGlzIGFscmVhZHkgbWFya2VkIGFzCisgKiBzdWNjZXNzZnVsLCB0aGUgQS9CIG1ldGFkYXRhIGlzIG5vdCBtb2RpZmllZC4gSG93ZXZlciwgaWYgdGhlIHNsb3QKKyAqIGlzIG5vdCBtYXJrZWQgYXMgYm9vdGFibGUgaXRzIHx0cmllc19yZW1haW5pbmd8IGNvdW50IGlzCisgKiBkZWNyZW1lbnRlZCBhbmQgdGhlIEEvQiBtZXRhZGF0YSBpcyBzYXZlZCB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcuCisgKiBJbiBlaXRoZXIgY2FzZSB0aGUgdmFsdWUgQVZCX0FCX0ZMT1dfUkVTVUxUX09LIGlzIHJldHVybmluZy4KKyAqCisgKiBUaGUgcGFydGl0aW9ucyB0byBsb2FkIGlzIGdpdmVuIGluIHxyZXF1ZXN0ZWRfcGFydGl0aW9uc3wgYXMgYQorICogTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIE5VTC10ZXJtaW5hdGVkIHN0cmluZ3MuIFR5cGljYWxseSB0aGUKKyAqIHxyZXF1ZXN0ZWRfcGFydGl0aW9uc3wgYXJyYXkgb25seSBjb250YWlucyBhIHNpbmdsZSBpdGVtIGZvciB0aGUKKyAqIGJvb3QgcGFydGl0aW9uLCAnYm9vdCcuCisgKgorICogSWYgdGhlIGRldmljZSBpcyB1bmxvY2tlZCAoYW5kIF9vbmx5XyBpZiBpdCdzIHVubG9ja2VkKSwgdHJ1ZQorICogc2hvdWxkIGJlIHBhc3NlZCBpbiB0aGUgfGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvcnwgcGFyYW1ldGVyLiBUaGlzCisgKiB3aWxsIGFsbG93IGNvbnNpZGVyaW5nIHNsb3RzIGFzIHZlcmlmaWVkIGV2ZW4gd2hlbgorICogYXZiX3Nsb3RfdmVyaWZ5KCkgcmV0dXJucworICogQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9QVUJMSUNfS0VZX1JFSkVDVEVELAorICogQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9WRVJJRklDQVRJT04sIG9yCisgKiBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1JPTExCQUNLX0lOREVYIGZvciB0aGUgc2xvdCBpbgorICogcXVlc3Rpb24uCisgKgorICogSWYgYSBzbG90IHdhcyBzZWxlY3RlZCBhbmQgaXQgdmVyaWZpZWQgdGhlbiBBVkJfQUJfRkxPV19SRVNVTFRfT0sKKyAqIGlzIHJldHVybmVkLgorICoKKyAqIElmIGEgc2xvdCB3YXMgc2VsZWN0ZWQgYnV0IGl0IGRpZG4ndCB2ZXJpZnkgdGhlbgorICogQVZCX0FCX0ZMT1dfUkVTVUxUX09LX1dJVEhfVkVSSUZJQ0FUSU9OX0VSUk9SIGlzIHJldHVybmVkLiBUaGlzIGNhbgorICogb25seSBoYXBwZW4gd2hlbiB8YWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yfCBpcyB0cnVlLgorICoKKyAqIElmIGFuIEkvTyBvcGVyYXRpb24gLSBzdWNoIGFzIGxvYWRpbmcvc2F2aW5nIG1ldGFkYXRhIG9yIGNoZWNraW5nCisgKiByb2xsYmFjayBpbmRleGVzIC0gZmFpbCwgdGhlIHZhbHVlIEFWQl9BQl9GTE9XX1JFU1VMVF9FUlJPUl9JTyBpcworICogcmV0dXJuZWQuCisgKgorICogSWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMsIEFWQl9BQl9GTE9XX1JFU1VMVF9FUlJPUl9PT00gaXMKKyAqIHJldHVybmVkLgorICoKKyAqIFJlYXNvbmFibGUgYmVoYXZpb3IgZm9yIGhhbmRsaW5nIEFWQl9BQl9GTE9XX1JFU1VMVF9FUlJPUl9OT19CT09UQUJMRV9TTE9UUworICogaXMgdG8gaW5pdGlhdGUgZGV2aWNlIHJlcGFpciAod2hpY2ggaXMgZGV2aWNlLWRlcGVuZGVudCkuCisgKi8KK0F2YkFCRmxvd1Jlc3VsdCBhdmJfYWJfZmxvdyhBdmJBQk9wcyogYWJfb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmJTbG90VmVyaWZ5RGF0YSoqIG91dF9kYXRhKTsKKworLyogTWFya3MgdGhlIHNsb3Qgd2l0aCB0aGUgZ2l2ZW4gc2xvdCBudW1iZXIgYXMgYWN0aXZlLiBSZXR1cm5zCisgKiBBVkJfSU9fUkVTVUxUX09LIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdHlwaWNhbGx5IHVzZWQgYnkgdGhlIE9TIHVwZGF0ZXIgd2hlbiBjb21wbGV0aW5nCisgKiBhbiB1cGRhdGUuIEl0IGNhbiBhbHNvIHVzZWQgYnkgdGhlIGZpcm13YXJlIGZvciBpbXBsZW1lbnRpbmcgdGhlCisgKiAic2V0X2FjdGl2ZSIgY29tbWFuZC4KKyAqLworQXZiSU9SZXN1bHQgYXZiX2FiX21hcmtfc2xvdF9hY3RpdmUoQXZiQUJPcHMqIGFiX29wcywgdW5zaWduZWQgaW50IHNsb3RfbnVtYmVyKTsKKworLyogTWFya3MgdGhlIHNsb3Qgd2l0aCB0aGUgZ2l2ZW4gc2xvdCBudW1iZXIgYXMgdW5ib290YWJsZS4gUmV0dXJucworICogQVZCX0lPX1JFU1VMVF9PSyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHR5cGljYWxseSB1c2VkIGJ5IHRoZSBPUyB1cGRhdGVyIGJlZm9yZSB3cml0aW5nIHRvCisgKiBhIHNsb3QuCisgKi8KK0F2YklPUmVzdWx0IGF2Yl9hYl9tYXJrX3Nsb3RfdW5ib290YWJsZShBdmJBQk9wcyogYWJfb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzbG90X251bWJlcik7CisKKy8qIE1hcmtzIHRoZSBzbG90IHdpdGggdGhlIGdpdmVuIHNsb3QgbnVtYmVyIGFzIGhhdmluZyBib290ZWQKKyAqIHN1Y2Nlc3NmdWxseS4gUmV0dXJucyBBVkJfSU9fUkVTVUxUX09LIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUKKyAqIG90aGVyd2lzZS4KKyAqCisgKiBDYWxsaW5nIHRoaXMgb24gYW4gdW5ib290YWJsZSBzbG90IGlzIGFuIGVycm9yIC0gQVZCX0lPX1JFU1VMVF9PSworICogd2lsbCBiZSByZXR1cm5lZCB5ZXQgdGhlIGZ1bmN0aW9uIHdpbGwgaGF2ZSBubyBzaWRlLWVmZmVjdHMuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0eXBpY2FsbHkgdXNlZCBieSB0aGUgT1MgdXBkYXRlciBhZnRlciBoYXZpbmcKKyAqIGNvbmZpcm1lZCB0aGF0IHRoZSBzbG90IHdvcmtzIGFzIGludGVuZGVkLgorICovCitBdmJJT1Jlc3VsdCBhdmJfYWJfbWFya19zbG90X3N1Y2Nlc3NmdWwoQXZiQUJPcHMqIGFiX29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2xvdF9udW1iZXIpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQVZCX0FCX0ZMT1dfSF8gKi8KZGlmZiAtLWdpdCBhL2F2Yi9saWJhdmJfYWIvYXZiX2FiX29wcy5oIGIvYXZiL2xpYmF2Yl9hYi9hdmJfYWJfb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4ZmRlNwotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmJfYWIvYXZiX2FiX29wcy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZChBVkJfSU5TSURFX0xJQkFWQl9BQl9IKSAmJiAhZGVmaW5lZChBVkJfQ09NUElMQVRJT04pCisjZXJyb3IgXAorICAgICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSwgaW5jbHVkZSBsaWJhdmJfYWIvbGliYXZiX2FiLmggaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBBVkJfQUJfT1BTX0hfCisjZGVmaW5lIEFWQl9BQl9PUFNfSF8KKworI2luY2x1ZGUgPGxpYmF2Yi9saWJhdmIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQXZiQUJPcHM7Cit0eXBlZGVmIHN0cnVjdCBBdmJBQk9wcyBBdmJBQk9wczsKKworc3RydWN0IEF2YkFCRGF0YTsKKworLyogSGlnaC1sZXZlbCBvcGVyYXRpb25zL2Z1bmN0aW9ucy9tZXRob2RzIGZvciBBL0IgdGhhdCBhcmUgcGxhdGZvcm0KKyAqIGRlcGVuZGVudC4KKyAqLworc3RydWN0IEF2YkFCT3BzIHsKKyAgLyogT3BlcmF0aW9ucyBmcm9tIGxpYmF2Yi4gKi8KKyAgQXZiT3BzKiBvcHM7CisKKyAgLyogUmVhZHMgQS9CIG1ldGFkYXRhIGZyb20gcGVyc2lzdGVudCBzdG9yYWdlLiBSZXR1cm5lZCBkYXRhIGlzCisgICAqIHByb3Blcmx5IGJ5dGVzd2FwcGVkLiBSZXR1cm5zIEFWQl9JT19SRVNVTFRfT0sgb24gc3VjY2VzcywgZXJyb3IKKyAgICogY29kZSBvdGhlcndpc2UuCisgICAqCisgICAqIElmIHRoZSBkYXRhIHJlYWQgaXMgaW52YWxpZCAoZS5nLiB3cm9uZyBtYWdpYyBvciBDUkMgY2hlY2tzdW0KKyAgICogZmFpbHVyZSksIHRoZSBtZXRhZGF0YSBzaG91bGUgYmUgcmVzZXQgdXNpbmcgYXZiX2FiX2RhdGFfaW5pdCgpCisgICAqIGFuZCB0aGVuIHdyaXR0ZW4gdG8gcGVyc2lzdGVudCBzdG9yYWdlLgorICAgKgorICAgKiBJbXBsZW1lbnRhdGlvbnMgd2lsbCB0eXBpY2FsbHkgd2FudCB0byB1c2UgYXZiX2FiX2RhdGFfcmVhZCgpCisgICAqIGhlcmUgdG8gdXNlIHRoZSAnbWlzYycgcGFydGl0aW9uIGZvciBwZXJzaXN0ZW50IHN0b3JhZ2UuCisgICAqLworICBBdmJJT1Jlc3VsdCAoKnJlYWRfYWJfbWV0YWRhdGEpKEF2YkFCT3BzKiBhYl9vcHMsIHN0cnVjdCBBdmJBQkRhdGEqIGRhdGEpOworCisgIC8qIFdyaXRlcyBBL0IgbWV0YWRhdGEgdG8gcGVyc2lzdGVudCBzdG9yYWdlLiBUaGlzIHdpbGwgYnl0ZXN3YXAgYW5kCisgICAqIHVwZGF0ZSB0aGUgQ1JDIGFzIG5lZWRlZC4gUmV0dXJucyBBVkJfSU9fUkVTVUxUX09LIG9uIHN1Y2Nlc3MsCisgICAqIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgKgorICAgKiBJbXBsZW1lbnRhdGlvbnMgd2lsbCB0eXBpY2FsbHkgd2FudCB0byB1c2UgYXZiX2FiX2RhdGFfd3JpdGUoKQorICAgKiBoZXJlIHRvIHVzZSB0aGUgJ21pc2MnIHBhcnRpdGlvbiBmb3IgcGVyc2lzdGVudCBzdG9yYWdlLgorICAgKi8KKyAgQXZiSU9SZXN1bHQgKCp3cml0ZV9hYl9tZXRhZGF0YSkoQXZiQUJPcHMqIGFiX29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IEF2YkFCRGF0YSogZGF0YSk7Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQVZCX0FCX09QU19IXyAqLwpkaWZmIC0tZ2l0IGEvYXZiL2xpYmF2Yl9hYi9saWJhdmJfYWIuaCBiL2F2Yi9saWJhdmJfYWIvbGliYXZiX2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjZjNlOQotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmJfYWIvbGliYXZiX2FiLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBMSUJBVkJfQUJfSF8KKyNkZWZpbmUgTElCQVZCX0FCX0hfCisKKyNpbmNsdWRlIDxsaWJhdmIvbGliYXZiLmg+CisKKy8qIFRoZSBBVkJfSU5TSURFX0xJQkFWQl9BQl9IIHByZXByb2Nlc3NvciBzeW1ib2wgaXMgdXNlZCB0byBlbmZvcmNlCisgKiBsaWJyYXJ5IHVzZXJzIHRvIGluY2x1ZGUgb25seSB0aGlzIGZpbGUuIEFsbCBwdWJsaWMgaW50ZXJmYWNlcywgYW5kCisgKiBvbmx5IHB1YmxpYyBpbnRlcmZhY2VzLCBtdXN0IGJlIGluY2x1ZGVkIGhlcmUuCisgKi8KKworI2RlZmluZSBBVkJfSU5TSURFX0xJQkFWQl9BQl9ICisjaW5jbHVkZSAiYXZiX2FiX2Zsb3cuaCIKKyNpbmNsdWRlICJhdmJfYWJfb3BzLmgiCisjdW5kZWYgQVZCX0lOU0lERV9MSUJBVkJfQUJfSAorCisjZW5kaWYgLyogTElCQVZCX0FCX0hfICovCmRpZmYgLS1naXQgYS9hdmIvbGliYXZiX2F0eC9hdmJfYXR4X29wcy5oIGIvYXZiL2xpYmF2Yl9hdHgvYXZiX2F0eF9vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDVjZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL2xpYmF2Yl9hdHgvYXZiX2F0eF9vcHMuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoQVZCX0lOU0lERV9MSUJBVkJfQVRYX0gpICYmICFkZWZpbmVkKEFWQl9DT01QSUxBVElPTikKKyNlcnJvciBcCisgICAgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LCBpbmNsdWRlIGxpYmF2Yl9hdHgvbGliYXZiX2F0eC5oIGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgQVZCX0FUWF9PUFNfSF8KKyNkZWZpbmUgQVZCX0FUWF9PUFNfSF8KKworI2luY2x1ZGUgPGxpYmF2Yi9saWJhdmIuaD4KKworI2luY2x1ZGUgImxpYmF2Yl9hdHgvYXZiX2F0eF90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBBdmJBdHhPcHM7Cit0eXBlZGVmIHN0cnVjdCBBdmJBdHhPcHMgQXZiQXR4T3BzOworCisvKiBBbiBleHRlbnNpb24gdG8gQXZiT3BzIHJlcXVpcmVkIGJ5IGF2Yl9hdHhfdmFsaWRhdGVfdmJtZXRhX3B1YmxpY19rZXkoKS4gKi8KK3N0cnVjdCBBdmJBdHhPcHMgeworICAvKiBPcGVyYXRpb25zIGZyb20gbGliYXZiLiAqLworICBBdmJPcHMqIG9wczsKKworICAvKiBSZWFkcyBwZXJtYW5lbnQgfGF0dHJpYnV0ZXN8IGRhdGEuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gd2hlcmUgdGhpcworICAgKiBkYXRhIGlzIHN0b3JlZC4gT24gc3VjY2VzcywgcmV0dXJucyBBVkJfSU9fUkVTVUxUX09LIGFuZCBwb3B1bGF0ZXMKKyAgICogfGF0dHJpYnV0ZXN8LgorICAgKi8KKyAgQXZiSU9SZXN1bHQgKCpyZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzKSgKKyAgICAgIEF2YkF0eE9wcyogYXR4X29wcywgQXZiQXR4UGVybWFuZW50QXR0cmlidXRlcyogYXR0cmlidXRlcyk7CisKKyAgLyogUmVhZHMgYSB8aGFzaHwgb2YgcGVybWFuZW50IGF0dHJpYnV0ZXMuIFRoaXMgaGFzaCBNVVNUIGJlIHJldHJpZXZlZCBmcm9tIGEKKyAgICogcGVybWFuZW50bHkgcmVhZC1vbmx5IGxvY2F0aW9uIChlLmcuIGZ1c2VzKSB3aGVuIGEgZGV2aWNlIGlzIExPQ0tFRC4gT24KKyAgICogc3VjY2VzcywgcmV0dXJuZWQgQVZCX0lPX1JFU1VMVF9PSyBhbmQgcG9wdWxhdGVzIHxoYXNofC4KKyAgICovCisgIEF2YklPUmVzdWx0ICgqcmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoKSgKKyAgICAgIEF2YkF0eE9wcyogYXR4X29wcywgdWludDhfdCBoYXNoW0FWQl9TSEEyNTZfRElHRVNUX1NJWkVdKTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBVkJfQVRYX09QU19IXyAqLwpkaWZmIC0tZ2l0IGEvYXZiL2xpYmF2Yl9hdHgvYXZiX2F0eF90eXBlcy5oIGIvYXZiL2xpYmF2Yl9hdHgvYXZiX2F0eF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMWI0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiX2F0eC9hdmJfYXR4X3R5cGVzLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKEFWQl9JTlNJREVfTElCQVZCX0FUWF9IKSAmJiAhZGVmaW5lZChBVkJfQ09NUElMQVRJT04pCisjZXJyb3IgXAorICAgICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSwgaW5jbHVkZSBsaWJhdmJfYXR4L2xpYmF2Yl9hdHguaCBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIEFWQl9BVFhfVFlQRVNfSF8KKyNkZWZpbmUgQVZCX0FUWF9UWVBFU19IXworCisjaW5jbHVkZSA8bGliYXZiL2xpYmF2Yi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFNpemUgaW4gYnl0ZXMgb2YgYW4gQW5kcm9pZCBUaGluZ3MgcHJvZHVjdCBJRC4gKi8KKyNkZWZpbmUgQVZCX0FUWF9QUk9EVUNUX0lEX1NJWkUgMTYKKworLyogU2l6ZSBpbiBieXRlcyBvZiBhIHNlcmlhbGl6ZWQgcHVibGljIGtleSB3aXRoIGEgMjA0OC1iaXQgbW9kdWx1cy4gKi8KKyNkZWZpbmUgQVZCX0FUWF9QVUJMSUNfS0VZX1NJWkVfMjA0OCAoc2l6ZW9mKEF2YlJTQVB1YmxpY0tleUhlYWRlcikgKyA1MTIpCisKKy8qIFNpemUgaW4gYnl0ZXMgb2YgYSBzZXJpYWxpemVkIHB1YmxpYyBrZXkgd2l0aCBhIDQwOTYtYml0IG1vZHVsdXMuICovCisjZGVmaW5lIEFWQl9BVFhfUFVCTElDX0tFWV9TSVpFXzQwOTYgKHNpemVvZihBdmJSU0FQdWJsaWNLZXlIZWFkZXIpICsgMTAyNCkKKworLyogRGF0YSBzdHJ1Y3R1cmUgb2YgQW5kcm9pZCBUaGluZ3MgcGVybWFuZW50IGF0dHJpYnV0ZXMuICovCit0eXBlZGVmIHN0cnVjdCBBdmJBdHhQZXJtYW5lbnRBdHRyaWJ1dGVzIHsKKyAgdWludDMyX3QgdmVyc2lvbjsKKyAgdWludDhfdCBwcm9kdWN0X3Jvb3RfcHVibGljX2tleVtBVkJfQVRYX1BVQkxJQ19LRVlfU0laRV80MDk2XTsKKyAgdWludDhfdCBwcm9kdWN0X2lkW0FWQl9BVFhfUFJPRFVDVF9JRF9TSVpFXTsKK30gQVZCX0FUVFJfUEFDS0VEIEF2YkF0eFBlcm1hbmVudEF0dHJpYnV0ZXM7CisKKy8qIERhdGEgc3RydWN0dXJlIG9mIHNpZ25lZCBmaWVsZHMgaW4gYW4gQW5kcm9pZCBUaGluZ3MgY2VydGlmaWNhdGUuICovCit0eXBlZGVmIHN0cnVjdCBBdmJBdHhDZXJ0aWZpY2F0ZVNpZ25lZERhdGEgeworICB1aW50MzJfdCB2ZXJzaW9uOworICB1aW50OF90IHB1YmxpY19rZXlbQVZCX0FUWF9QVUJMSUNfS0VZX1NJWkVfMjA0OF07CisgIHVpbnQ4X3Qgc3ViamVjdFtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXTsKKyAgdWludDhfdCB1c2FnZVtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXTsKKyAgdWludDY0X3Qga2V5X3ZlcnNpb247Cit9IEFWQl9BVFRSX1BBQ0tFRCBBdmJBdHhDZXJ0aWZpY2F0ZVNpZ25lZERhdGE7CisKKy8qIERhdGEgc3RydWN0dXJlIG9mIGEgY2VydGlmaWNhdGUgc2lnbmVkIGJ5IGEgNDA5Ni1iaXQga2V5LiAqLwordHlwZWRlZiBzdHJ1Y3QgQXZiQXR4Q2VydGlmaWNhdGU0MDk2IHsKKyAgQXZiQXR4Q2VydGlmaWNhdGVTaWduZWREYXRhIHNpZ25lZF9kYXRhOworICB1aW50OF90IHNpZ25hdHVyZVtBVkJfUlNBNDA5Nl9OVU1fQllURVNdOworfSBBVkJfQVRUUl9QQUNLRUQgQXZiQXR4Q2VydGlmaWNhdGU0MDk2OworCisvKiBEYXRhIHN0cnVjdHVyZSBvZiBhIGNlcnRpZmljYXRlIHNpZ25lZCBieSBhIDIwNDgtYml0IGtleS4gKi8KK3R5cGVkZWYgc3RydWN0IEF2YkF0eENlcnRpZmljYXRlMjA0OCB7CisgIEF2YkF0eENlcnRpZmljYXRlU2lnbmVkRGF0YSBzaWduZWRfZGF0YTsKKyAgdWludDhfdCBzaWduYXR1cmVbQVZCX1JTQTIwNDhfTlVNX0JZVEVTXTsKK30gQVZCX0FUVFJfUEFDS0VEIEF2YkF0eENlcnRpZmljYXRlMjA0ODsKKworLyogRGF0YSBzdHJ1Y3R1cmUgb2YgQW5kcm9pZCBUaGluZ3MgcHVibGljIGtleSBtZXRhZGF0YSBpbiB2Ym1ldGEuICovCit0eXBlZGVmIHN0cnVjdCBBdmJBdHhQdWJsaWNLZXlNZXRhZGF0YSB7CisgIHVpbnQzMl90IHZlcnNpb247CisgIEF2YkF0eENlcnRpZmljYXRlNDA5NiBwcm9kdWN0X2ludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGU7CisgIEF2YkF0eENlcnRpZmljYXRlMjA0OCBwcm9kdWN0X3NpZ25pbmdfa2V5X2NlcnRpZmljYXRlOworICB1aW50NjRfdCBnb29nbGVfc2lnbmluZ19rZXlfdmVyc2lvbjsKK30gQVZCX0FUVFJfUEFDS0VEIEF2YkF0eFB1YmxpY0tleU1ldGFkYXRhOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQVZCX0FUWF9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvYXZiL2xpYmF2Yl9hdHgvYXZiX2F0eF92YWxpZGF0ZS5jIGIvYXZiL2xpYmF2Yl9hdHgvYXZiX2F0eF92YWxpZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjlkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvbGliYXZiX2F0eC9hdmJfYXR4X3ZhbGlkYXRlLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJsaWJhdmJfYXR4L2F2Yl9hdHhfdmFsaWRhdGUuaCIKKworI2luY2x1ZGUgImxpYmF2Yi9hdmJfcnNhLmgiCisjaW5jbHVkZSAibGliYXZiL2F2Yl9zaGEuaCIKKyNpbmNsdWRlICJsaWJhdmIvYXZiX3N5c2RlcHMuaCIKKyNpbmNsdWRlICJsaWJhdmIvYXZiX3V0aWwuaCIKKworLyogQ29tcHV0ZXMgdGhlIFNIQTI1NiB8aGFzaHwgb2YgfGxlbmd0aHwgYnl0ZXMgb2YgfGRhdGF8LiAqLworc3RhdGljIHZvaWQgc2hhMjU2KGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaGFzaFtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXSkgeworICBBdmJTSEEyNTZDdHggY29udGV4dDsKKyAgYXZiX3NoYTI1Nl9pbml0KCZjb250ZXh0KTsKKyAgYXZiX3NoYTI1Nl91cGRhdGUoJmNvbnRleHQsIGRhdGEsIGxlbmd0aCk7CisgIHVpbnQ4X3QqIHRtcCA9IGF2Yl9zaGEyNTZfZmluYWwoJmNvbnRleHQpOworICBhdmJfbWVtY3B5KGhhc2gsIHRtcCwgQVZCX1NIQTI1Nl9ESUdFU1RfU0laRSk7Cit9CisKKy8qIENvbXB1dGVzIHRoZSBTSEE1MTIgfGhhc2h8IG9mIHxsZW5ndGh8IGJ5dGVzIG9mIHxkYXRhfC4gKi8KK3N0YXRpYyB2b2lkIHNoYTUxMihjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90IGhhc2hbQVZCX1NIQTUxMl9ESUdFU1RfU0laRV0pIHsKKyAgQXZiU0hBNTEyQ3R4IGNvbnRleHQ7CisgIGF2Yl9zaGE1MTJfaW5pdCgmY29udGV4dCk7CisgIGF2Yl9zaGE1MTJfdXBkYXRlKCZjb250ZXh0LCBkYXRhLCBsZW5ndGgpOworICB1aW50OF90KiB0bXAgPSBhdmJfc2hhNTEyX2ZpbmFsKCZjb250ZXh0KTsKKyAgYXZiX21lbWNweShoYXNoLCB0bXAsIEFWQl9TSEE1MTJfRElHRVNUX1NJWkUpOworfQorCisvKiBDb21wdXRlcyB0aGUgU0hBMjU2IHxoYXNofCBvZiBhIE5VTC10ZXJtaW5hdGVkIHxzdHJ8LiAqLworc3RhdGljIHZvaWQgc2hhMjU2X3N0cihjb25zdCBjaGFyKiBzdHIsIHVpbnQ4X3QgaGFzaFtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXSkgeworICBzaGEyNTYoKGNvbnN0IHVpbnQ4X3QqKXN0ciwgYXZiX3N0cmxlbihzdHIpLCBoYXNoKTsKK30KKworLyogVmVyaWZpZXMgc3RydWN0dXJlIGFuZCB8ZXhwZWN0ZWRfaGFzaHwgb2YgcGVybWFuZW50IHxhdHRyaWJ1dGVzfC4gKi8KK3N0YXRpYyBib29sIHZlcmlmeV9wZXJtYW5lbnRfYXR0cmlidXRlcygKKyAgICBjb25zdCBBdmJBdHhQZXJtYW5lbnRBdHRyaWJ1dGVzKiBhdHRyaWJ1dGVzLAorICAgIHVpbnQ4X3QgZXhwZWN0ZWRfaGFzaFtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXSkgeworICB1aW50OF90IGhhc2hbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV07CisKKyAgaWYgKGF0dHJpYnV0ZXMtPnZlcnNpb24gIT0gMSkgeworICAgIGF2Yl9lcnJvcigiVW5zdXBwb3J0ZWQgcGVybWFuZW50IGF0dHJpYnV0ZXMgdmVyc2lvbi5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzaGEyNTYoKGNvbnN0IHVpbnQ4X3QqKWF0dHJpYnV0ZXMsIHNpemVvZihBdmJBdHhQZXJtYW5lbnRBdHRyaWJ1dGVzKSwgaGFzaCk7CisgIGlmICgwICE9IGF2Yl9zYWZlX21lbWNtcChoYXNoLCBleHBlY3RlZF9oYXNoLCBBVkJfU0hBMjU2X0RJR0VTVF9TSVpFKSkgeworICAgIGF2Yl9lcnJvcigiSW52YWxpZCBwZXJtYW5lbnQgYXR0cmlidXRlcy5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyogVmVyaWZpZXMgc2lnbmF0dXJlIGFuZCBmaWVsZHMgb2YgYSBQSUsgY2VydGlmaWNhdGUuICovCitzdGF0aWMgYm9vbCB2ZXJpZnlfcGlrX2NlcnRpZmljYXRlKAorICAgIEF2YkF0eENlcnRpZmljYXRlNDA5NiogY2VydGlmaWNhdGUsCisgICAgdWludDhfdCBhdXRob3JpdHlbQVZCX0FUWF9QVUJMSUNfS0VZX1NJWkVfNDA5Nl0sCisgICAgdWludDY0X3QgbWluaW11bV92ZXJzaW9uKSB7CisgIGNvbnN0IEF2YkFsZ29yaXRobURhdGEqIGFsZ29yaXRobV9kYXRhOworICB1aW50OF90IGNlcnRpZmljYXRlX2hhc2hbQVZCX1NIQTUxMl9ESUdFU1RfU0laRV07CisgIHVpbnQ4X3QgZXhwZWN0ZWRfdXNhZ2VbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV07CisKKyAgaWYgKGNlcnRpZmljYXRlLT5zaWduZWRfZGF0YS52ZXJzaW9uICE9IDEpIHsKKyAgICBhdmJfZXJyb3IoIlVuc3VwcG9ydGVkIFBJSyBjZXJ0aWZpY2F0ZSBmb3JtYXQuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYWxnb3JpdGhtX2RhdGEgPSBhdmJfZ2V0X2FsZ29yaXRobV9kYXRhKEFWQl9BTEdPUklUSE1fVFlQRV9TSEE1MTJfUlNBNDA5Nik7CisgIHNoYTUxMigoY29uc3QgdWludDhfdCopJmNlcnRpZmljYXRlLT5zaWduZWRfZGF0YSwKKyAgICAgICAgIHNpemVvZihBdmJBdHhDZXJ0aWZpY2F0ZVNpZ25lZERhdGEpLAorICAgICAgICAgY2VydGlmaWNhdGVfaGFzaCk7CisgIGlmICghYXZiX3JzYV92ZXJpZnkoYXV0aG9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgIEFWQl9BVFhfUFVCTElDX0tFWV9TSVpFXzQwOTYsCisgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUtPnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICBBVkJfUlNBNDA5Nl9OVU1fQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICBBVkJfU0hBNTEyX0RJR0VTVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobV9kYXRhLT5wYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobV9kYXRhLT5wYWRkaW5nX2xlbikpIHsKKyAgICBhdmJfZXJyb3IoIkludmFsaWQgUElLIGNlcnRpZmljYXRlIHNpZ25hdHVyZS5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzaGEyNTZfc3RyKCJjb20uZ29vZ2xlLmFuZHJvaWQudGhpbmdzLnZib290LmNhIiwgZXhwZWN0ZWRfdXNhZ2UpOworICBpZiAoMCAhPSBhdmJfc2FmZV9tZW1jbXAoY2VydGlmaWNhdGUtPnNpZ25lZF9kYXRhLnVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJfU0hBMjU2X0RJR0VTVF9TSVpFKSkgeworICAgIGF2Yl9lcnJvcigiSW52YWxpZCBQSUsgY2VydGlmaWNhdGUgdXNhZ2UuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGNlcnRpZmljYXRlLT5zaWduZWRfZGF0YS5rZXlfdmVyc2lvbiA8IG1pbmltdW1fdmVyc2lvbikgeworICAgIGF2Yl9lcnJvcigiUElLIHJvbGxiYWNrIGRldGVjdGVkLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiBWZXJpZmllcyBzaWduYXR1cmUgYW5kIGZpZWxkcyBvZiBhIFBTSyBjZXJ0aWZpY2F0ZS4gKi8KK3N0YXRpYyBib29sIHZlcmlmeV9wc2tfY2VydGlmaWNhdGUoCisgICAgQXZiQXR4Q2VydGlmaWNhdGUyMDQ4KiBjZXJ0aWZpY2F0ZSwKKyAgICB1aW50OF90IGF1dGhvcml0eVtBVkJfQVRYX1BVQkxJQ19LRVlfU0laRV8yMDQ4XSwKKyAgICB1aW50NjRfdCBtaW5pbXVtX3ZlcnNpb24sCisgICAgdWludDhfdCBwcm9kdWN0X2lkW0FWQl9BVFhfUFJPRFVDVF9JRF9TSVpFXSkgeworICBjb25zdCBBdmJBbGdvcml0aG1EYXRhKiBhbGdvcml0aG1fZGF0YTsKKyAgdWludDhfdCBjZXJ0aWZpY2F0ZV9oYXNoW0FWQl9TSEEyNTZfRElHRVNUX1NJWkVdOworICB1aW50OF90IGV4cGVjdGVkX3N1YmplY3RbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV07CisgIHVpbnQ4X3QgZXhwZWN0ZWRfdXNhZ2VbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV07CisgIGlmIChjZXJ0aWZpY2F0ZS0+c2lnbmVkX2RhdGEudmVyc2lvbiAhPSAxKSB7CisgICAgYXZiX2Vycm9yKCJVbnN1cHBvcnRlZCBQU0sgY2VydGlmaWNhdGUgZm9ybWF0LlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGFsZ29yaXRobV9kYXRhID0gYXZiX2dldF9hbGdvcml0aG1fZGF0YShBVkJfQUxHT1JJVEhNX1RZUEVfU0hBMjU2X1JTQTIwNDgpOworICBzaGEyNTYoKGNvbnN0IHVpbnQ4X3QqKSZjZXJ0aWZpY2F0ZS0+c2lnbmVkX2RhdGEsCisgICAgICAgICBzaXplb2YoQXZiQXR4Q2VydGlmaWNhdGVTaWduZWREYXRhKSwKKyAgICAgICAgIGNlcnRpZmljYXRlX2hhc2gpOworICBpZiAoIWF2Yl9yc2FfdmVyaWZ5KGF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICBBVkJfQVRYX1BVQkxJQ19LRVlfU0laRV8yMDQ4LAorICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgQVZCX1JTQTIwNDhfTlVNX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgQVZCX1NIQTI1Nl9ESUdFU1RfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG1fZGF0YS0+cGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG1fZGF0YS0+cGFkZGluZ19sZW4pKSB7CisgICAgYXZiX2Vycm9yKCJJbnZhbGlkIFBTSyBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc2hhMjU2KHByb2R1Y3RfaWQsIEFWQl9BVFhfUFJPRFVDVF9JRF9TSVpFLCBleHBlY3RlZF9zdWJqZWN0KTsKKyAgaWYgKDAgIT0gYXZiX3NhZmVfbWVtY21wKGNlcnRpZmljYXRlLT5zaWduZWRfZGF0YS5zdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfc3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQl9TSEEyNTZfRElHRVNUX1NJWkUpKSB7CisgICAgYXZiX2Vycm9yKCJQcm9kdWN0IElEIG1pc21hdGNoLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHNoYTI1Nl9zdHIoImNvbS5nb29nbGUuYW5kcm9pZC50aGluZ3MudmJvb3QiLCBleHBlY3RlZF91c2FnZSk7CisgIGlmICgwICE9IGF2Yl9zYWZlX21lbWNtcChjZXJ0aWZpY2F0ZS0+c2lnbmVkX2RhdGEudXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF91c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQl9TSEEyNTZfRElHRVNUX1NJWkUpKSB7CisgICAgYXZiX2Vycm9yKCJJbnZhbGlkIFBTSyBjZXJ0aWZpY2F0ZSB1c2FnZS5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoY2VydGlmaWNhdGUtPnNpZ25lZF9kYXRhLmtleV92ZXJzaW9uIDwgbWluaW11bV92ZXJzaW9uKSB7CisgICAgYXZiX2Vycm9yKCJQU0sgcm9sbGJhY2sgZGV0ZWN0ZWQuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK0F2YklPUmVzdWx0IGF2Yl9hdHhfdmFsaWRhdGVfdmJtZXRhX3B1YmxpY19rZXkoCisgICAgQXZiT3BzKiBvcHMsCisgICAgY29uc3QgdWludDhfdCogcHVibGljX2tleV9kYXRhLAorICAgIHNpemVfdCBwdWJsaWNfa2V5X2xlbmd0aCwKKyAgICBjb25zdCB1aW50OF90KiBwdWJsaWNfa2V5X21ldGFkYXRhLAorICAgIHNpemVfdCBwdWJsaWNfa2V5X21ldGFkYXRhX2xlbmd0aCwKKyAgICBib29sKiBvdXRfaXNfdHJ1c3RlZCkgeworICBBdmJJT1Jlc3VsdCByZXN1bHQgPSBBVkJfSU9fUkVTVUxUX09LOworICBBdmJBdHhQZXJtYW5lbnRBdHRyaWJ1dGVzIHBlcm1hbmVudF9hdHRyaWJ1dGVzOworICB1aW50OF90IHBlcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2hbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV07CisgIEF2YkF0eFB1YmxpY0tleU1ldGFkYXRhIG1ldGFkYXRhOworICB1aW50NjRfdCBtaW5pbXVtX3ZlcnNpb247CisKKyAgLyogQmUgcGVzc2ltaXN0aWMgc28gd2UgY2FuIGV4aXQgZWFybHkgd2l0aG91dCBoYXZpbmcgdG8gcmVtZW1iZXIgdG8gY2xlYXIuICovCisgICpvdXRfaXNfdHJ1c3RlZCA9IGZhbHNlOworCisgIC8qIFJlYWQgYW5kIHZlcmlmeSBwZXJtYW5lbnQgYXR0cmlidXRlcy4gKi8KKyAgcmVzdWx0ID0gb3BzLT5hdHhfb3BzLT5yZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzKG9wcy0+YXR4X29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtYW5lbnRfYXR0cmlidXRlcyk7CisgIGlmIChyZXN1bHQgIT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgIGF2Yl9lcnJvcigiRmFpbGVkIHRvIHJlYWQgcGVybWFuZW50IGF0dHJpYnV0ZXMuXG4iKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHJlc3VsdCA9IG9wcy0+YXR4X29wcy0+cmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoKAorICAgICAgb3BzLT5hdHhfb3BzLCBwZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoKTsKKyAgaWYgKHJlc3VsdCAhPSBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgYXZiX2Vycm9yKCJGYWlsZWQgdG8gcmVhZCBwZXJtYW5lbnQgYXR0cmlidXRlcyBoYXNoLlxuIik7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBpZiAoIXZlcmlmeV9wZXJtYW5lbnRfYXR0cmlidXRlcygmcGVybWFuZW50X2F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2gpKSB7CisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7CisgIH0KKworICAvKiBTYW5pdHkgY2hlY2sgcHVibGljIGtleSBtZXRhZGF0YS4gKi8KKyAgaWYgKHB1YmxpY19rZXlfbWV0YWRhdGFfbGVuZ3RoICE9IHNpemVvZihBdmJBdHhQdWJsaWNLZXlNZXRhZGF0YSkpIHsKKyAgICBhdmJfZXJyb3IoIkludmFsaWQgcHVibGljIGtleSBtZXRhZGF0YS5cbiIpOworICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworICB9CisgIGF2Yl9tZW1jcHkoJm1ldGFkYXRhLCBwdWJsaWNfa2V5X21ldGFkYXRhLCBzaXplb2YoQXZiQXR4UHVibGljS2V5TWV0YWRhdGEpKTsKKyAgaWYgKG1ldGFkYXRhLnZlcnNpb24gIT0gMSkgeworICAgIGF2Yl9lcnJvcigiVW5zdXBwb3J0ZWQgcHVibGljIGtleSBtZXRhZGF0YS5cbiIpOworICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworICB9CisKKyAgLyogVmVyaWZ5IHRoZSBQSUsgY2VydGlmaWNhdGUuICovCisgIHJlc3VsdCA9IG9wcy0+cmVhZF9yb2xsYmFja19pbmRleCgKKyAgICAgIG9wcywgQVZCX0FUWF9QSUtfVkVSU0lPTl9MT0NBVElPTiwgJm1pbmltdW1fdmVyc2lvbik7CisgIGlmIChyZXN1bHQgIT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgIGF2Yl9lcnJvcigiRmFpbGVkIHRvIHJlYWQgUElLIG1pbmltdW0gdmVyc2lvbi5cbiIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgaWYgKCF2ZXJpZnlfcGlrX2NlcnRpZmljYXRlKCZtZXRhZGF0YS5wcm9kdWN0X2ludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtYW5lbnRfYXR0cmlidXRlcy5wcm9kdWN0X3Jvb3RfcHVibGljX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1fdmVyc2lvbikpIHsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9PSzsKKyAgfQorCisgIC8qIFZlcmlmeSB0aGUgUFNLIGNlcnRpZmljYXRlLiAqLworICByZXN1bHQgPSBvcHMtPnJlYWRfcm9sbGJhY2tfaW5kZXgoCisgICAgICBvcHMsIEFWQl9BVFhfUFNLX1ZFUlNJT05fTE9DQVRJT04sICZtaW5pbXVtX3ZlcnNpb24pOworICBpZiAocmVzdWx0ICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICBhdmJfZXJyb3IoIkZhaWxlZCB0byByZWFkIFBTSyBtaW5pbXVtIHZlcnNpb24uXG4iKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGlmICghdmVyaWZ5X3Bza19jZXJ0aWZpY2F0ZSgKKyAgICAgICAgICAmbWV0YWRhdGEucHJvZHVjdF9zaWduaW5nX2tleV9jZXJ0aWZpY2F0ZSwKKyAgICAgICAgICBtZXRhZGF0YS5wcm9kdWN0X2ludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEucHVibGljX2tleSwKKyAgICAgICAgICBtaW5pbXVtX3ZlcnNpb24sCisgICAgICAgICAgcGVybWFuZW50X2F0dHJpYnV0ZXMucHJvZHVjdF9pZCkpIHsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9PSzsKKyAgfQorCisgIC8qIFZlcmlmeSB0aGUgUFNLIGlzIHRoZSBzYW1lIGtleSB0aGF0IHZlcmlmaWVkIHZibWV0YS4gKi8KKyAgaWYgKHB1YmxpY19rZXlfbGVuZ3RoICE9IEFWQl9BVFhfUFVCTElDX0tFWV9TSVpFXzIwNDgpIHsKKyAgICBhdmJfZXJyb3IoIlB1YmxpYyBrZXkgbGVuZ3RoIG1pc21hdGNoLlxuIik7CisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7CisgIH0KKyAgaWYgKDAgIT0gYXZiX3NhZmVfbWVtY21wKAorICAgICAgICAgICAgICAgbWV0YWRhdGEucHJvZHVjdF9zaWduaW5nX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YS5wdWJsaWNfa2V5LAorICAgICAgICAgICAgICAgcHVibGljX2tleV9kYXRhLAorICAgICAgICAgICAgICAgQVZCX0FUWF9QVUJMSUNfS0VZX1NJWkVfMjA0OCkpIHsKKyAgICBhdmJfZXJyb3IoIlB1YmxpYyBrZXkgbWlzbWF0Y2guXG4iKTsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9PSzsKKyAgfQorCisgIC8qIFZlcmlmeSB0aGUgR1NLIG1pbmltdW0gdmVyc2lvbi4gKi8KKyAgcmVzdWx0ID0gb3BzLT5yZWFkX3JvbGxiYWNrX2luZGV4KAorICAgICAgb3BzLCBBVkJfQVRYX0dTS19WRVJTSU9OX0xPQ0FUSU9OLCAmbWluaW11bV92ZXJzaW9uKTsKKyAgaWYgKHJlc3VsdCAhPSBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgYXZiX2Vycm9yKCJGYWlsZWQgdG8gcmVhZCBHU0sgbWluaW11bSB2ZXJzaW9uLlxuIik7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBpZiAobWV0YWRhdGEuZ29vZ2xlX3NpZ25pbmdfa2V5X3ZlcnNpb24gPCBtaW5pbXVtX3ZlcnNpb24pIHsKKyAgICBhdmJfZXJyb3IoIkdvb2dsZSBzaWduaW5nIGtleSByb2xsYmFjayBkZXRlY3RlZC5cbiIpOworICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworICB9CisKKyAgKm91dF9pc190cnVzdGVkID0gdHJ1ZTsKKyAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7Cit9CmRpZmYgLS1naXQgYS9hdmIvbGliYXZiX2F0eC9hdmJfYXR4X3ZhbGlkYXRlLmggYi9hdmIvbGliYXZiX2F0eC9hdmJfYXR4X3ZhbGlkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjMTU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmJfYXR4L2F2Yl9hdHhfdmFsaWRhdGUuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoQVZCX0lOU0lERV9MSUJBVkJfQVRYX0gpICYmICFkZWZpbmVkKEFWQl9DT01QSUxBVElPTikKKyNlcnJvciBcCisgICAgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LCBpbmNsdWRlIGxpYmF2Yl9hdHgvbGliYXZiX2F0eC5oIGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgQVZCX0FUWF9WQUxJREFURV9IXworI2RlZmluZSBBVkJfQVRYX1ZBTElEQVRFX0hfCisKKyNpbmNsdWRlICJsaWJhdmJfYXR4L2F2Yl9hdHhfb3BzLmgiCisjaW5jbHVkZSAibGliYXZiX2F0eC9hdmJfYXR4X3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogUm9sbGJhY2sgaW5kZXggbG9jYXRpb25zIGZvciBBbmRyb2lkIFRoaW5ncyBrZXkgdmVyc2lvbnMuICovCisjZGVmaW5lIEFWQl9BVFhfUElLX1ZFUlNJT05fTE9DQVRJT04gMHgxMDAwCisjZGVmaW5lIEFWQl9BVFhfUFNLX1ZFUlNJT05fTE9DQVRJT04gMHgxMDAxCisjZGVmaW5lIEFWQl9BVFhfR1NLX1ZFUlNJT05fTE9DQVRJT04gMHgxMDAyCisKKy8qIEFuIGltcGxlbWVudGF0aW9uIG9mIHZhbGlkYXRlX3ZibWV0YV9wdWJsaWNfa2V5IGZvciBBbmRyb2lkIFRoaW5ncy4gU2VlCisgKiBsaWJhdmIvYXZiX29wcy5oIGZvciBkZXRhaWxzIG9uIHZhbGlkYXRlX3ZibWV0YV9wdWJsaWNfa2V5IGluIGdlbmVyYWwuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIG1ldGFkYXRhIGV4cGVjdGVkIHdpdGggQW5kcm9pZCBUaGluZ3MgdmJtZXRhIGltYWdlcworICogdG8gcGVyZm9ybSB2YWxpZGF0aW9uIG9uIHRoZSBwdWJsaWMga2V5LiBUaGUgQVRYIG9wcyBtdXN0IGJlIGltcGxlbWVudGVkLgorICogVGhhdCBpcywgfG9wcy0+YXR4X29wc3wgbXVzdCBiZSB2YWxpZC4KKyAqCisgKiBUaGVyZSBhcmUgYSBtdWx0aXBsZSB2YWx1ZXMgdGhhdCBuZWVkIHZlcmlmaWNhdGlvbjoKKyAqICAgLSBQZXJtYW5lbnQgUHJvZHVjdCBBdHRyaWJ1dGVzOiBBIGhhc2ggb2YgdGhlc2UgYXR0cmlidXRlcyBpcyBmdXNlZCBpbnRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUuIENvbnNpc3RlbmN5IGlzIGNoZWNrZWQuCisgKiAgIC0gUHJvZHVjdCBSb290IEtleSAoUFJLKTogVGhpcyBrZXkgaXMgcHJvdmlkZWQgaW4gcGVybWFuZW50IGF0dHJpYnV0ZXMgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHJvb3QgYXV0aG9yaXR5IGZvciBhbGwgQW5kcm9pZCBUaGluZ3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0cy4KKyAqICAgLSBQcm9kdWN0IEludGVybWVkaWF0ZSBLZXkgKFBJSyk6IFRoaXMga2V5IGlzIGEgcm90YXRlZCBpbnRlcm1lZGlhcnkuIEl0IGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpZWQgYnkgdGhlIFBSSy4KKyAqICAgLSBQcm9kdWN0IFNpZ25pbmcgS2V5IChQU0spOiBUaGlzIGtleSBpcyBhIHJvdGF0ZWQgYXV0aG9yaXR5IGZvciBhIHNwZWNpZmljCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZCBUaGluZ3MgcHJvZHVjdC4gSXQgaXMgY2VydGlmaWVkIGJ5IGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSUsgYW5kIG11c3QgbWF0Y2ggfHB1YmxpY19rZXlfZGF0YXwuCisgKiAgIC0gR29vZ2xlIFNpZ25pbmcgS2V5IChHU0spOiBUaGlzIGtleSBpcyBhIHJvdGF0ZWQgYXV0aG9yaXR5IGZvciBzeXN0ZW0gYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib290IHBhcnRpdGlvbnMgYnVpbHQgYnkgR29vZ2xlLiBUaGUga2V5IGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IHZlcmlmaWVkIGFzIHBhcnQgb2YgdmJtZXRhIHNvIG9ubHkgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgdmVyc2lvbiBuZWVkcyB2ZXJpZmljYXRpb24gaGVyZS4KKyAqICAgLSBQcm9kdWN0IElEOiBUaGlzIHZhbHVlIGlzIHByb3ZpZGVkIGluIHBlcm1hbmVudCBhdHRyaWJ1dGVzIGFuZCBpcyB1bmlxdWUKKyAqICAgICAgICAgICAgICAgICB0byBhIHNwZWNpZmljIEFuZHJvaWQgVGhpbmdzIHByb2R1Y3QuIFRoaXMgdmFsdWUgbXVzdCBtYXRjaAorICogICAgICAgICAgICAgICAgIHRoZSBzdWJqZWN0IG9mIHRoZSBQU0sgY2VydGlmaWNhdGUuCisgKi8KK0F2YklPUmVzdWx0IGF2Yl9hdHhfdmFsaWRhdGVfdmJtZXRhX3B1YmxpY19rZXkoCisgICAgQXZiT3BzKiBvcHMsCisgICAgY29uc3QgdWludDhfdCogcHVibGljX2tleV9kYXRhLAorICAgIHNpemVfdCBwdWJsaWNfa2V5X2xlbmd0aCwKKyAgICBjb25zdCB1aW50OF90KiBwdWJsaWNfa2V5X21ldGFkYXRhLAorICAgIHNpemVfdCBwdWJsaWNfa2V5X21ldGFkYXRhX2xlbmd0aCwKKyAgICBib29sKiBvdXRfaXNfdHJ1c3RlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBVkJfQVRYX1ZBTElEQVRFX0hfICovCmRpZmYgLS1naXQgYS9hdmIvbGliYXZiX2F0eC9saWJhdmJfYXR4LmggYi9hdmIvbGliYXZiX2F0eC9saWJhdmJfYXR4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5YzBhZgotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi9saWJhdmJfYXR4L2xpYmF2Yl9hdHguaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIExJQkFWQl9BVFhfSF8KKyNkZWZpbmUgTElCQVZCX0FUWF9IXworCisjaW5jbHVkZSA8bGliYXZiL2xpYmF2Yi5oPgorCisvKiBUaGUgQVZCX0lOU0lERV9MSUJBVkJfQVRYX0ggcHJlcHJvY2Vzc29yIHN5bWJvbCBpcyB1c2VkIHRvIGVuZm9yY2UKKyAqIGxpYnJhcnkgdXNlcnMgdG8gaW5jbHVkZSBvbmx5IHRoaXMgZmlsZS4gQWxsIHB1YmxpYyBpbnRlcmZhY2VzLCBhbmQKKyAqIG9ubHkgcHVibGljIGludGVyZmFjZXMsIG11c3QgYmUgaW5jbHVkZWQgaGVyZS4KKyAqLworCisjZGVmaW5lIEFWQl9JTlNJREVfTElCQVZCX0FUWF9ICisjaW5jbHVkZSAiYXZiX2F0eF9vcHMuaCIKKyNpbmNsdWRlICJhdmJfYXR4X3R5cGVzLmgiCisjaW5jbHVkZSAiYXZiX2F0eF92YWxpZGF0ZS5oIgorI3VuZGVmIEFWQl9JTlNJREVfTElCQVZCX0FUWF9ICisKKyNlbmRpZiAvKiBMSUJBVkJfQVRYX0hfICovCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9hdmJfYWJfZmxvd191bml0dGVzdC5jYyBiL2F2Yi90ZXN0L2F2Yl9hYl9mbG93X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxM2ZjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvdGVzdC9hdmJfYWJfZmxvd191bml0dGVzdC5jYwpAQCAtMCwwICsxLDEzMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bGliYXZiX2FiL2xpYmF2Yl9hYi5oPgorCisjaW5jbHVkZSAiYXZiX3VuaXR0ZXN0X3V0aWwuaCIKKyNpbmNsdWRlICJmYWtlX2F2Yl9vcHMuaCIKKworbmFtZXNwYWNlIGF2YiB7CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKEF2YkFCU2xvdERhdGEpID09IDQsICJBdmJBQlNsb3REYXRhIGhhcyB3cm9uZyBzaXplIik7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihBdmJBQkRhdGEpID09IEFWQl9BQl9EQVRBX1NJWkUsCisgICAgICAgICAgICAgICJBdmJBQkRhdGEgaGFzIHdyb25nIHNpemUiKTsKK3N0YXRpY19hc3NlcnQob2Zmc2V0b2YoQXZiQUJEYXRhLCBzbG90cykgJSA4ID09IDAsCisgICAgICAgICAgICAgICJBdmJBQkRhdGEgc2xvdHMgbWVtYmVyIGhhcyB3cm9uZyBvZmZzZXQiKTsKKworVEVTVChBQlRlc3QsIEluaXREYXRhKSB7CisgIEF2YkFCRGF0YSBkYXRhOworICBhdmJfYWJfZGF0YV9pbml0KCZkYXRhKTsKKyAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICBzdHJuY21wKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEubWFnaWMpLAorICAgICAgICAgICAgICAgICAgICBBVkJfQUJfTUFHSUMsCisgICAgICAgICAgICAgICAgICAgIEFWQl9BQl9NQUdJQ19MRU4pKTsKKyAgRVhQRUNUX0VRKEFWQl9BQl9NQVhfUFJJT1JJVFksIGRhdGEuc2xvdHNbMF0ucHJpb3JpdHkpOworICBFWFBFQ1RfRVEoQVZCX0FCX01BWF9UUklFU19SRU1BSU5JTkcsIGRhdGEuc2xvdHNbMF0udHJpZXNfcmVtYWluaW5nKTsKKyAgRVhQRUNUX0VRKDAsIGRhdGEuc2xvdHNbMF0uc3VjY2Vzc2Z1bF9ib290KTsKKyAgRVhQRUNUX0VRKEFWQl9BQl9NQVhfUFJJT1JJVFkgLSAxLCBkYXRhLnNsb3RzWzFdLnByaW9yaXR5KTsKKyAgRVhQRUNUX0VRKEFWQl9BQl9NQVhfVFJJRVNfUkVNQUlOSU5HLCBkYXRhLnNsb3RzWzFdLnRyaWVzX3JlbWFpbmluZyk7CisgIEVYUEVDVF9FUSgwLCBkYXRhLnNsb3RzWzFdLnN1Y2Nlc3NmdWxfYm9vdCk7CisgIEVYUEVDVF9FUSh1aW50MzJfdCgwKSwgZGF0YS5jcmMzMik7Cit9CisKK1RFU1QoQUJUZXN0LCBEYXRhU2VyaWFsaXphdGlvbikgeworICBBdmJBQkRhdGEgZGF0YTsKKyAgQXZiQUJEYXRhIHNlcmlhbGl6ZWQ7CisgIEF2YkFCRGF0YSByZXN0b3JlZDsKKworICBhdmJfYWJfZGF0YV9pbml0KCZkYXRhKTsKKyAgRVhQRUNUX0VRKHVpbnQzMl90KDApLCBkYXRhLmNyYzMyKTsKKyAgYXZiX2FiX2RhdGFfdXBkYXRlX2NyY19hbmRfYnl0ZXN3YXAoJmRhdGEsICZzZXJpYWxpemVkKTsKKyAgRVhQRUNUX05FKHVpbnQzMl90KDApLCBzZXJpYWxpemVkLmNyYzMyKTsKKyAgRVhQRUNUX1RSVUUoYXZiX2FiX2RhdGFfdmVyaWZ5X2FuZF9ieXRlc3dhcCgmc2VyaWFsaXplZCwgJnJlc3RvcmVkKSk7CisgIEVYUEVDVF9FUShzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkYXRhLm1hZ2ljKSwgNCksCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyZXN0b3JlZC5tYWdpYyksIDQpKTsKKyAgRVhQRUNUX0VRKGRhdGEudmVyc2lvbl9tYWpvciwgcmVzdG9yZWQudmVyc2lvbl9tYWpvcik7CisgIEVYUEVDVF9FUShkYXRhLnZlcnNpb25fbWlub3IsIHJlc3RvcmVkLnZlcnNpb25fbWlub3IpOworICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgIG1lbWNtcChyZWludGVycHJldF9jYXN0PHZvaWQqPihkYXRhLnNsb3RzKSwKKyAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihyZXN0b3JlZC5zbG90cyksCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEF2YkFCU2xvdERhdGEpICogMikpOworfQorCitURVNUKEFCVGVzdCwgQ2F0Y2hCYWRDUkMpIHsKKyAgQXZiQUJEYXRhIGRhdGE7CisgIEF2YkFCRGF0YSBzZXJpYWxpemVkOworICBBdmJBQkRhdGEgcmVzdG9yZWQ7CisKKyAgYXZiX2FiX2RhdGFfaW5pdCgmZGF0YSk7CisgIGF2Yl9hYl9kYXRhX3VwZGF0ZV9jcmNfYW5kX2J5dGVzd2FwKCZkYXRhLCAmc2VyaWFsaXplZCk7CisgIHNlcmlhbGl6ZWQuY3JjMzIgKz0gMTsKKyAgRVhQRUNUX0ZBTFNFKGF2Yl9hYl9kYXRhX3ZlcmlmeV9hbmRfYnl0ZXN3YXAoJnNlcmlhbGl6ZWQsICZyZXN0b3JlZCkpOworfQorCitURVNUKEFCVGVzdCwgQ2F0Y2hVbnN1cHBvcnRlZE1ham9yVmVyc2lvbikgeworICBBdmJBQkRhdGEgZGF0YTsKKyAgQXZiQUJEYXRhIHNlcmlhbGl6ZWQ7CisgIEF2YkFCRGF0YSByZXN0b3JlZDsKKworICBhdmJfYWJfZGF0YV9pbml0KCZkYXRhKTsKKyAgZGF0YS52ZXJzaW9uX21ham9yICs9IDE7CisgIGF2Yl9hYl9kYXRhX3VwZGF0ZV9jcmNfYW5kX2J5dGVzd2FwKCZkYXRhLCAmc2VyaWFsaXplZCk7CisgIEVYUEVDVF9GQUxTRShhdmJfYWJfZGF0YV92ZXJpZnlfYW5kX2J5dGVzd2FwKCZzZXJpYWxpemVkLCAmcmVzdG9yZWQpKTsKK30KKworVEVTVChBQlRlc3QsIFN1cHBvcnRTYW1lTWFqb3JGdXR1cmVNaW5vclZlcnNpb24pIHsKKyAgQXZiQUJEYXRhIGRhdGE7CisgIEF2YkFCRGF0YSBzZXJpYWxpemVkOworICBBdmJBQkRhdGEgcmVzdG9yZWQ7CisKKyAgYXZiX2FiX2RhdGFfaW5pdCgmZGF0YSk7CisgIGRhdGEudmVyc2lvbl9taW5vciArPSAxOworICBhdmJfYWJfZGF0YV91cGRhdGVfY3JjX2FuZF9ieXRlc3dhcCgmZGF0YSwgJnNlcmlhbGl6ZWQpOworICBFWFBFQ1RfVFJVRShhdmJfYWJfZGF0YV92ZXJpZnlfYW5kX2J5dGVzd2FwKCZzZXJpYWxpemVkLCAmcmVzdG9yZWQpKTsKK30KKworI2RlZmluZSBNSVNDX1BBUlRfU0laRSA4ICogMTAyNAorCisvLyBUaGVzZSB2YWx1ZXMgYXJlIGtlcHQgc2hvcnQgc2luY2UgdGhleSBhcmUgdXNlZCBpbiBTZXRNRCgpIGFuZCBpdCdzCisvLyBoZWxwZnVsIGlmIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBzbG90IGZpdHMgaW4gb25lIDgwLWNoYXJhY3RlcgorLy8gbGluZS4KK2VudW0gU2xvdFZhbGlkaXR5IHsKKyAgU1ZfT0ssICAgLy8gU2xvdCBpcyB2YWxpZCBhbmQgdmVyaWZpZWQuCisgIFNWX0lOViwgIC8vIFNsb3QgaXMgaW52YWxpZC4KKyAgU1ZfVU5WLCAgLy8gU2xvdCBpcyB2YWxpZCBidXQgdW52ZXJpZmllZC4KK307CisKK2NsYXNzIEF2YkFCRmxvd1Rlc3QgOiBwdWJsaWMgQmFzZUF2YlRvb2xUZXN0IHsKKyBwdWJsaWM6CisgIEF2YkFCRmxvd1Rlc3QoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBCYXNlQXZiVG9vbFRlc3Q6OlNldFVwKCk7CisgICAgb3BzXy5zZXRfcGFydGl0aW9uX2Rpcih0ZXN0ZGlyXyk7CisgICAgb3BzXy5zZXRfc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMoe3swLCAwfSwgezEsIDB9LCB7MiwgMH0sIHszLCAwfX0pOworICAgIG9wc18uc2V0X3N0b3JlZF9pc19kZXZpY2VfdW5sb2NrZWQoZmFsc2UpOworCisgICAgLy8gQ3JlYXRlIGxhcmdlIGVub3VnaCAnbWlzYycgcGFydGl0aW9uIGFuZCBpbml0aWFsaXplIGl0IHdpdGgKKyAgICAvLyB6ZXJvZXMuCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWlzYzsKKyAgICBtaXNjLnJlc2l6ZShNSVNDX1BBUlRfU0laRSk7CisgICAgYmFzZTo6RmlsZVBhdGggbWlzY19wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJtaXNjLmltZyIpOworICAgIEVYUEVDVF9FUShtaXNjLnNpemUoKSwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3Qgc2l6ZV90PigKKyAgICAgICAgICAgICAgICAgIGJhc2U6OldyaXRlRmlsZShtaXNjX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obWlzYy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2Muc2l6ZSgpKSkpOworCisgICAgLy8gV2UncmUgZ29pbmcgdG8gdXNlIHRoaXMga2V5IGZvciBhbGwgaW1hZ2VzLgorICAgIG9wc18uc2V0X2V4cGVjdGVkX3B1YmxpY19rZXkoCisgICAgICAgIFB1YmxpY0tleUFWQihiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSkpOworICB9CisKKyAgdm9pZCBHZW5lcmF0ZVNsb3QodW5zaWduZWQgaW50IHNsb3RfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBTbG90VmFsaWRpdHkgc2xvdF92YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgcm9sbGJhY2tfYm9vdCwKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgcm9sbGJhY2tfb2RtKSB7CisgICAgc3RkOjpzdHJpbmcgYm9vdF9uYW1lID0gImJvb3RfYS5pbWciOworICAgIHN0ZDo6c3RyaW5nIHZibWV0YV9uYW1lID0gInZibWV0YV9hLmltZyI7CisgICAgc3RkOjpzdHJpbmcgb2RtX25hbWUgPSAib2RtX2EuaW1nIjsKKyAgICBpZiAoc2xvdF9udW1iZXIgPiAwKSB7CisgICAgICBib290X25hbWUgPSAiYm9vdF9iLmltZyI7CisgICAgICB2Ym1ldGFfbmFtZSA9ICJ2Ym1ldGFfYi5pbWciOworICAgICAgb2RtX25hbWUgPSAib2RtX2IuaW1nIjsKKyAgICB9CisKKyAgICAvLyBJZiBhc2tlZCB0byBtYWtlIGFuIGludmFsaWQgc2xvdCwganVzdCBnZW5lcmF0ZSAxTWlCIGdhcmJhZ2UKKyAgICAvLyBmb3IgZWFjaCB0aGUgdGhyZWUgaW1hZ2VzIGluIHRoZSBzbG90LgorICAgIGlmIChzbG90X3ZhbGlkaXR5ID09IFNWX0lOVikgeworICAgICAgR2VuZXJhdGVJbWFnZShib290X25hbWUsIDEwMjQgKiAxMDI0KTsKKyAgICAgIEdlbmVyYXRlSW1hZ2UodmJtZXRhX25hbWUsIDEwMjQgKiAxMDI0KTsKKyAgICAgIEdlbmVyYXRlSW1hZ2Uob2RtX25hbWUsIDEwMjQgKiAxMDI0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgYm9vdF9wYXJ0aXRpb25fc2l6ZSA9IDE2ICogMTAyNCAqIDEwMjQ7CisgICAgY29uc3Qgc2l6ZV90IGJvb3RfaW1hZ2Vfc2l6ZSA9IDUgKiAxMDI0ICogMTAyNDsKKyAgICBiYXNlOjpGaWxlUGF0aCBib290X3BhdGggPSBHZW5lcmF0ZUltYWdlKGJvb3RfbmFtZSwgYm9vdF9pbWFnZV9zaXplKTsKKyAgICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAgICIuL2F2YnRvb2wgYWRkX2hhc2hfZm9vdGVyIgorICAgICAgICAgICAgICAgICAgICIgLS1pbWFnZSAlcyIKKyAgICAgICAgICAgICAgICAgICAiIC0tcm9sbGJhY2tfaW5kZXggJSIgUFJJdTY0CisgICAgICAgICAgICAgICAgICAgIiAtLXBhcnRpdGlvbl9uYW1lIGJvb3QiCisgICAgICAgICAgICAgICAgICAgIiAtLXBhcnRpdGlvbl9zaXplICV6ZCIKKyAgICAgICAgICAgICAgICAgICAiIC0tc2FsdCBkZWFkYmVlZiIsCisgICAgICAgICAgICAgICAgICAgYm9vdF9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICByb2xsYmFja19ib290LAorICAgICAgICAgICAgICAgICAgIGJvb3RfcGFydGl0aW9uX3NpemUpOworCisgICAgY29uc3Qgc2l6ZV90IG9kbV9wYXJ0aXRpb25fc2l6ZSA9IDUxMiAqIDEwMjQ7CisgICAgY29uc3Qgc2l6ZV90IG9kbV9pbWFnZV9zaXplID0gODAgKiAxMDI0OworICAgIGJhc2U6OkZpbGVQYXRoIG9kbV9wYXRoID0gR2VuZXJhdGVJbWFnZShvZG1fbmFtZSwgb2RtX2ltYWdlX3NpemUpOworICAgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBhZGRfaGFzaHRyZWVfZm9vdGVyIgorICAgICAgICAgICAgICAgICAgICIgLS1pbWFnZSAlcyIKKyAgICAgICAgICAgICAgICAgICAiIC0tcm9sbGJhY2tfaW5kZXggJSIgUFJJdTY0CisgICAgICAgICAgICAgICAgICAgIiAtLXBhcnRpdGlvbl9uYW1lIG9kbSIKKyAgICAgICAgICAgICAgICAgICAiIC0tcGFydGl0aW9uX3NpemUgJXpkIgorICAgICAgICAgICAgICAgICAgICIgLS1zYWx0IGRlYWRiZWVmIgorICAgICAgICAgICAgICAgICAgICIgLS1hbGdvcml0aG0gU0hBNTEyX1JTQTQwOTYgIgorICAgICAgICAgICAgICAgICAgICIgLS1rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhNDA5Ni5wZW0iLAorICAgICAgICAgICAgICAgICAgIG9kbV9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICByb2xsYmFja19vZG0sCisgICAgICAgICAgICAgICAgICAgb2RtX3BhcnRpdGlvbl9zaXplKTsKKworICAgIGJhc2U6OkZpbGVQYXRoIHBrX3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInRlc3RrZXlfcnNhNDA5Ni5hdmJwdWJrZXkiKTsKKyAgICBFWFBFQ1RfQ09NTUFORCgKKyAgICAgICAgMCwKKyAgICAgICAgIi4vYXZidG9vbCBleHRyYWN0X3B1YmxpY19rZXkgLS1rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhNDA5Ni5wZW0iCisgICAgICAgICIgLS1vdXRwdXQgJXMiLAorICAgICAgICBwa19wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgICAvLyBJZiByZXF1ZXN0ZWQgdG8gbWFrZSB0aGUgaW1hZ2UgdW52ZXJpZmllZCwganVzdCB1c2UgYW5vdGhlciBrZXkKKyAgICAvLyBpbiB0aGUgY2hhaW5fcGFydGl0aW9uIGRlc2NyaXB0b3Igc2luY2UgdGhpcyB3aWxsIGNhdXNlCisgICAgLy8gYXZiX3Nsb3RfdmVyaWZ5KCkgdG8gcmV0dXJuIEVSUk9SX1BVQkxJQ19LRVlfUkVKRUNURUQuCisgICAgaWYgKHNsb3RfdmFsaWRpdHkgPT0gU1ZfVU5WKSB7CisgICAgICBwa19wYXRoID0gR2VuZXJhdGVJbWFnZSgiZHVtbXkuYXZicHVia2V5IiwgMzIpOworICAgIH0KKworICAgIEdlbmVyYXRlVkJNZXRhSW1hZ2UodmJtZXRhX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAiU0hBMjU2X1JTQTIwNDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgcm9sbGJhY2tfYm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCItLWluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9pbWFnZSAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC0tY2hhaW5fcGFydGl0aW9uIG9kbToxOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib290X3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrX3BhdGgudmFsdWUoKS5jX3N0cigpKSk7CisgIH0KKworICB2b2lkIFNldE1EKGludCBhX3ByaSwKKyAgICAgICAgICAgICBpbnQgYV90cmllcywKKyAgICAgICAgICAgICBib29sIGFfc3VjY2VzcywKKyAgICAgICAgICAgICBTbG90VmFsaWRpdHkgYV9zbG90X3ZhbGlkaXR5LAorICAgICAgICAgICAgIHVpbnQ2NF90IGFfcm9sbGJhY2tfYm9vdCwKKyAgICAgICAgICAgICB1aW50NjRfdCBhX3JvbGxiYWNrX29kbSwKKyAgICAgICAgICAgICBpbnQgYl9wcmksCisgICAgICAgICAgICAgaW50IGJfdHJpZXMsCisgICAgICAgICAgICAgYm9vbCBiX3N1Y2Nlc3MsCisgICAgICAgICAgICAgU2xvdFZhbGlkaXR5IGJfc2xvdF92YWxpZGl0eSwKKyAgICAgICAgICAgICB1aW50NjRfdCBiX3JvbGxiYWNrX2Jvb3QsCisgICAgICAgICAgICAgdWludDY0X3QgYl9yb2xsYmFja19vZG0sCisgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c2l6ZV90LCB1aW50NjRfdD4mIHN0b3JlZF9yb2xsYmFja19pbmRleGVzKSB7CisgICAgQXZiQUJEYXRhIGRhdGE7CisgICAgYXZiX2FiX2RhdGFfaW5pdCgmZGF0YSk7CisgICAgZGF0YS5zbG90c1swXS5wcmlvcml0eSA9IGFfcHJpOworICAgIGRhdGEuc2xvdHNbMF0udHJpZXNfcmVtYWluaW5nID0gYV90cmllczsKKyAgICBkYXRhLnNsb3RzWzBdLnN1Y2Nlc3NmdWxfYm9vdCA9IChhX3N1Y2Nlc3MgPyAxIDogMCk7CisgICAgZGF0YS5zbG90c1sxXS5wcmlvcml0eSA9IGJfcHJpOworICAgIGRhdGEuc2xvdHNbMV0udHJpZXNfcmVtYWluaW5nID0gYl90cmllczsKKyAgICBkYXRhLnNsb3RzWzFdLnN1Y2Nlc3NmdWxfYm9vdCA9IChiX3N1Y2Nlc3MgPyAxIDogMCk7CisgICAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssCisgICAgICAgICAgICAgIG9wc18uYXZiX2FiX29wcygpLT53cml0ZV9hYl9tZXRhZGF0YShvcHNfLmF2Yl9hYl9vcHMoKSwgJmRhdGEpKTsKKyAgICBHZW5lcmF0ZVNsb3QoMCwgYV9zbG90X3ZhbGlkaXR5LCBhX3JvbGxiYWNrX2Jvb3QsIGFfcm9sbGJhY2tfb2RtKTsKKyAgICBHZW5lcmF0ZVNsb3QoMSwgYl9zbG90X3ZhbGlkaXR5LCBiX3JvbGxiYWNrX2Jvb3QsIGJfcm9sbGJhY2tfb2RtKTsKKyAgICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcyhzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcyk7CisgIH0KKworICBzdGQ6Om1hcDxzaXplX3QsIHVpbnQ2NF90PiBNYWtlUm9sbGJhY2tJbmRleGVzKHVpbnQ2NF90IHNsb3RfMF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzbG90XzFfdmFsdWUpIHsKKyAgICByZXR1cm4gc3RkOjptYXA8c2l6ZV90LCB1aW50NjRfdD57ezAsIHNsb3RfMF92YWx1ZX0sIHsxLCBzbG90XzFfdmFsdWV9fTsKKyAgfQorCisgIEZha2VBdmJPcHMgb3BzXzsKK307CisKKyNkZWZpbmUgRXhwTUQoYV9wcmksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgYV90cmllcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgYV9zdWNjZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgYl9wcmksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgYl90cmllcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgYl9zdWNjZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBdmJBQkRhdGEgZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgb3BzXy5hdmJfYWJfb3BzKCktPnJlYWRfYWJfbWV0YWRhdGEob3BzXy5hdmJfYWJfb3BzKCksICZkYXRhKSk7IFwKKyAgICBFWFBFQ1RfRVEoYV9wcmksIGRhdGEuc2xvdHNbMF0ucHJpb3JpdHkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFWFBFQ1RfRVEoYV90cmllcywgZGF0YS5zbG90c1swXS50cmllc19yZW1haW5pbmcpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFWFBFQ1RfRVEoYV9zdWNjZXNzID8gMSA6IDAsIGRhdGEuc2xvdHNbMF0uc3VjY2Vzc2Z1bF9ib290KTsgICAgICAgICAgICAgIFwKKyAgICBFWFBFQ1RfRVEoYl9wcmksIGRhdGEuc2xvdHNbMV0ucHJpb3JpdHkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFWFBFQ1RfRVEoYl90cmllcywgZGF0YS5zbG90c1sxXS50cmllc19yZW1haW5pbmcpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFWFBFQ1RfRVEoYl9zdWNjZXNzID8gMSA6IDAsIGRhdGEuc2xvdHNbMV0uc3VjY2Vzc2Z1bF9ib290KTsgICAgICAgICAgICAgIFwKKyAgICBFWFBFQ1RfRVEoc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMsIG9wc18uZ2V0X3N0b3JlZF9yb2xsYmFja19pbmRleGVzKCkpOyAgIFwKKyAgfSB3aGlsZSAoMCk7CisKK1RFU1RfRihBdmJBQkZsb3dUZXN0LCBNZXRhZGF0YVJlYWRBbmRXcml0ZSkgeworICBBdmJBQkRhdGEgZGF0YTsKKyAgQXZiQUJEYXRhIGxvYWRlZDsKKworICAvLyBGaXJzdCBsb2FkIGZyb20gYW4gdW5pbml0aWFsaXplZCAnbWlzYycgcGFydGl0aW9uLiBUaGlzIHNob3VsZAorICAvLyBub3QgZmFpbCBhbmQganVzdCByZXR1cm5lZCBpbml0aWFsaXplZCBkYXRhLgorICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgYXZiX2FiX2RhdGFfcmVhZChvcHNfLmF2Yl9hYl9vcHMoKSwgJmxvYWRlZCkpOworICBFWFBFQ1RfRVEoQVZCX0FCX01BWF9QUklPUklUWSwgbG9hZGVkLnNsb3RzWzBdLnByaW9yaXR5KTsKKyAgRVhQRUNUX0VRKEFWQl9BQl9NQVhfVFJJRVNfUkVNQUlOSU5HLCBsb2FkZWQuc2xvdHNbMF0udHJpZXNfcmVtYWluaW5nKTsKKyAgRVhQRUNUX0VRKDAsIGxvYWRlZC5zbG90c1swXS5zdWNjZXNzZnVsX2Jvb3QpOworICBFWFBFQ1RfRVEoQVZCX0FCX01BWF9QUklPUklUWSAtIDEsIGxvYWRlZC5zbG90c1sxXS5wcmlvcml0eSk7CisgIEVYUEVDVF9FUShBVkJfQUJfTUFYX1RSSUVTX1JFTUFJTklORywgbG9hZGVkLnNsb3RzWzFdLnRyaWVzX3JlbWFpbmluZyk7CisgIEVYUEVDVF9FUSgwLCBsb2FkZWQuc2xvdHNbMV0uc3VjY2Vzc2Z1bF9ib290KTsKKworICAvLyBUaGVuIGluaXRpYWxpemUgYW5kIHNhdmUgd2VsbC1rbm93biBBL0IgbWV0YWRhdGEgYW5kIGNoZWNrIHdlCisgIC8vIHJlYWQgYmFjayB0aGUgc2FtZSB0aGluZy4KKyAgYXZiX2FiX2RhdGFfaW5pdCgmZGF0YSk7CisgIGRhdGEuc2xvdHNbMF0ucHJpb3JpdHkgPSAyOworICBkYXRhLnNsb3RzWzBdLnRyaWVzX3JlbWFpbmluZyA9IDM7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBhdmJfYWJfZGF0YV93cml0ZShvcHNfLmF2Yl9hYl9vcHMoKSwgJmRhdGEpKTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIGF2Yl9hYl9kYXRhX3JlYWQob3BzXy5hdmJfYWJfb3BzKCksICZsb2FkZWQpKTsKKyAgRVhQRUNUX0VRKDIsIGxvYWRlZC5zbG90c1swXS5wcmlvcml0eSk7CisgIEVYUEVDVF9FUSgzLCBsb2FkZWQuc2xvdHNbMF0udHJpZXNfcmVtYWluaW5nKTsKK30KKworVEVTVF9GKEF2YkFCRmxvd1Rlc3QsIEV2ZXJ5dGhpbmdJc1ZhbGlkKSB7CisgIEF2YlNsb3RWZXJpZnlEYXRhKiBkYXRhOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisKKyAgU2V0TUQoMTQsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX09LLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIDE1LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEVYUEVDVF9FUShBVkJfQUJfRkxPV19SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfYWJfZmxvdyhvcHNfLmF2Yl9hYl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKTsKKyAgRXhwTUQoMTQsCisgICAgICAgIDAsCisgICAgICAgIDEsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIDE1LAorICAgICAgICAwLAorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgIEVYUEVDVF9FUSgiX2IiLCBzdGQ6OnN0cmluZyhkYXRhLT5hYl9zdWZmaXgpKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShkYXRhKTsKKworICAvLyBBbHNvIGNoZWNrIHRoZSBvdGhlciBzbG90LgorICBTZXRNRCgxNSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgMTQsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX09LLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgRVhQRUNUX0VRKEFWQl9BQl9GTE9XX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9hYl9mbG93KG9wc18uYXZiX2FiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpOworICBFeHBNRCgxNSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgMTQsCisgICAgICAgIDAsCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgRVhQRUNUX0VRKCJfYSIsIHN0ZDo6c3RyaW5nKGRhdGEtPmFiX3N1ZmZpeCkpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKGRhdGEpOworfQorCitURVNUX0YoQXZiQUJGbG93VGVzdCwgTm9Cb290YWJsZVNsb3RzKSB7CisgIEF2YlNsb3RWZXJpZnlEYXRhKiBkYXRhOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisKKyAgU2V0TUQoMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBFWFBFQ1RfRVEoQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX05PX0JPT1RBQkxFX1NMT1RTLAorICAgICAgICAgICAgYXZiX2FiX2Zsb3cob3BzXy5hdmJfYWJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSk7CisgIEV4cE1EKDAsCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEFTU0VSVF9FUShudWxscHRyLCBkYXRhKTsKK30KKworVEVTVF9GKEF2YkFCRmxvd1Rlc3QsIFRyaWVzUmVtYWluaW5nRGVjcmVhc2luZykgeworICBBdmJTbG90VmVyaWZ5RGF0YSogZGF0YTsKKyAgY29uc3QgY2hhciogcmVxdWVzdGVkX3BhcnRpdGlvbnNbXSA9IHsiYm9vdCIsIE5VTEx9OworCisgIFNldE1EKDE1LAorICAgICAgICAzLAorICAgICAgICAwLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisKKyAgRVhQRUNUX0VRKEFWQl9BQl9GTE9XX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9hYl9mbG93KG9wc18uYXZiX2FiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpOworICBFeHBNRCgxNSwKKyAgICAgICAgMiwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICBFWFBFQ1RfRVEoIl9hIiwgc3RkOjpzdHJpbmcoZGF0YS0+YWJfc3VmZml4KSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoZGF0YSk7CisKKyAgLy8gS2VlcCBjb3VudGluZyBkb3duLi4uCisgIEVYUEVDVF9FUShBVkJfQUJfRkxPV19SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfYWJfZmxvdyhvcHNfLmF2Yl9hYl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKTsKKyAgRXhwTUQoMTUsCisgICAgICAgIDEsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgRVhQRUNUX0VRKCJfYSIsIHN0ZDo6c3RyaW5nKGRhdGEtPmFiX3N1ZmZpeCkpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKGRhdGEpOworCisgIC8vIExhc3QgdHJ5Li4uCisgIEVYUEVDVF9FUShBVkJfQUJfRkxPV19SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfYWJfZmxvdyhvcHNfLmF2Yl9hYl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKTsKKyAgRXhwTUQoMTUsCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgRVhQRUNUX0VRKCJfYSIsIHN0ZDo6c3RyaW5nKGRhdGEtPmFiX3N1ZmZpeCkpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKGRhdGEpOworCisgIC8vIEFuZCB3ZSdyZSBvdXQgb2YgdHJpZXMuIEF0IHRoaXMgcG9pbnQsICgxNSwgMCwgMCkgaXMgbm9ybWFsaXplZAorICAvLyB0byAoMCwgMCwgMCkgc28gZXhwZWN0IHRoYXQuCisgIEVYUEVDVF9FUShBVkJfQUJfRkxPV19SRVNVTFRfRVJST1JfTk9fQk9PVEFCTEVfU0xPVFMsCisgICAgICAgICAgICBhdmJfYWJfZmxvdyhvcHNfLmF2Yl9hYl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKTsKKyAgRXhwTUQoMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgQVNTRVJUX0VRKG51bGxwdHIsIGRhdGEpOworfQorCitURVNUX0YoQXZiQUJGbG93VGVzdCwgVHJ5aW5nVGhlbkZhbGxiYWNrKSB7CisgIEF2YlNsb3RWZXJpZnlEYXRhKiBkYXRhOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisKKyAgU2V0TUQoMTUsCisgICAgICAgIDIsCisgICAgICAgIDAsCisgICAgICAgIFNWX09LLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIDE0LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEVYUEVDVF9FUShBVkJfQUJfRkxPV19SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfYWJfZmxvdyhvcHNfLmF2Yl9hYl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKTsKKyAgRXhwTUQoMTUsCisgICAgICAgIDEsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIDE0LAorICAgICAgICAwLAorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgIEVYUEVDVF9FUSgiX2EiLCBzdGQ6OnN0cmluZyhkYXRhLT5hYl9zdWZmaXgpKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShkYXRhKTsKKworICAvLyBMYXN0IHRyeS4uLgorICBFWFBFQ1RfRVEoQVZCX0FCX0ZMT1dfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX2FiX2Zsb3cob3BzXy5hdmJfYWJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSk7CisgIEV4cE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICBFWFBFQ1RfRVEoIl9hIiwgc3RkOjpzdHJpbmcoZGF0YS0+YWJfc3VmZml4KSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoZGF0YSk7CisKKyAgLy8gQW5kIHdlJ3JlIG91dCBvZiB0cmllcy4gQ2hlY2sgd2UgZmFsbCBiYWNrIHRvIHNsb3QgQi4KKyAgRVhQRUNUX0VRKEFWQl9BQl9GTE9XX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9hYl9mbG93KG9wc18uYXZiX2FiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpOworICBFeHBNRCgwLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICBFWFBFQ1RfRVEoIl9iIiwgc3RkOjpzdHJpbmcoZGF0YS0+YWJfc3VmZml4KSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoZGF0YSk7Cit9CisKK1RFU1RfRihBdmJBQkZsb3dUZXN0LCBUcmllc1JlbWFpbmluZ05vdERlY3JlYXNpbmdJZk5vdFByaW9yaXR5KSB7CisgIEF2YlNsb3RWZXJpZnlEYXRhKiBkYXRhOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisKKyAgU2V0TUQoMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX09LLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIDE0LAorICAgICAgICA3LAorICAgICAgICAwLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEVYUEVDVF9FUShBVkJfQUJfRkxPV19SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfYWJfZmxvdyhvcHNfLmF2Yl9hYl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKTsKKyAgRXhwTUQoMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIDE0LAorICAgICAgICA3LAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgIEVYUEVDVF9FUSgiX2EiLCBzdGQ6OnN0cmluZyhkYXRhLT5hYl9zdWZmaXgpKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShkYXRhKTsKK30KKworVEVTVF9GKEF2YkFCRmxvd1Rlc3QsIEludmFsaWRTbG90SXNNYXJrZWRBc1N1Y2gpIHsKKyAgQXZiU2xvdFZlcmlmeURhdGEqIGRhdGE7CisgIGNvbnN0IGNoYXIqIHJlcXVlc3RlZF9wYXJ0aXRpb25zW10gPSB7ImJvb3QiLCBOVUxMfTsKKworICAvLyBTbG90IEEgaXMgaW52YWxpZC4KKyAgU2V0TUQoMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX0lOViwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBFWFBFQ1RfRVEoQVZCX0FCX0ZMT1dfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX2FiX2Zsb3cob3BzXy5hdmJfYWJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSk7CisgIEV4cE1EKDAsCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIDE0LAorICAgICAgICAwLAorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgIEVYUEVDVF9FUSgiX2IiLCBzdGQ6OnN0cmluZyhkYXRhLT5hYl9zdWZmaXgpKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShkYXRhKTsKKworICAvLyBTbG90IEIgaXMgaW52YWxpZC4KKyAgU2V0TUQoMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX09LLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIDE0LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9JTlYsCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBFWFBFQ1RfRVEoQVZCX0FCX0ZMT1dfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX2FiX2Zsb3cob3BzXy5hdmJfYWJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSk7CisgIEV4cE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAxLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgIEVYUEVDVF9FUSgiX2EiLCBzdGQ6OnN0cmluZyhkYXRhLT5hYl9zdWZmaXgpKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShkYXRhKTsKKworICAvLyBCb3RoIHNsb3RzIGFyZSBpbnZhbGlkLgorICBTZXRNRCgxNSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfSU5WLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIDE0LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9JTlYsCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBFWFBFQ1RfRVEoQVZCX0FCX0ZMT1dfUkVTVUxUX0VSUk9SX05PX0JPT1RBQkxFX1NMT1RTLAorICAgICAgICAgICAgYXZiX2FiX2Zsb3cob3BzXy5hdmJfYWJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSk7CisgIEV4cE1EKDAsCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEFTU0VSVF9FUShudWxscHRyLCBkYXRhKTsKK30KKworVEVTVF9GKEF2YkFCRmxvd1Rlc3QsIFVudmVyaWZpZWRTbG90SXNNYXJrZWRBc1N1Y2gpIHsKKyAgQXZiU2xvdFZlcmlmeURhdGEqIGRhdGE7CisgIGNvbnN0IGNoYXIqIHJlcXVlc3RlZF9wYXJ0aXRpb25zW10gPSB7ImJvb3QiLCBOVUxMfTsKKworICAvLyBTbG90IEEgZmFpbHMgdmVyaWZpY2F0aW9uLgorICBTZXRNRCgxNSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfVU5WLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIDE0LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEVYUEVDVF9FUShBVkJfQUJfRkxPV19SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfYWJfZmxvdyhvcHNfLmF2Yl9hYl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKTsKKyAgRXhwTUQoMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgMTQsCisgICAgICAgIDAsCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgRVhQRUNUX0VRKCJfYiIsIHN0ZDo6c3RyaW5nKGRhdGEtPmFiX3N1ZmZpeCkpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKGRhdGEpOworCisgIC8vIFNsb3QgQiBmYWlscyB2ZXJpZmljYXRpb24uCisgIFNldE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfVU5WLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgRVhQRUNUX0VRKEFWQl9BQl9GTE9XX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9hYl9mbG93KG9wc18uYXZiX2FiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpOworICBFeHBNRCgxNSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICBFWFBFQ1RfRVEoIl9hIiwgc3RkOjpzdHJpbmcoZGF0YS0+YWJfc3VmZml4KSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoZGF0YSk7CisKKyAgLy8gQm90aCBzbG90cyBmYWlsIHZlcmlmaWNhdGlvbi4KKyAgU2V0TUQoMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX1VOViwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfVU5WLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgRVhQRUNUX0VRKEFWQl9BQl9GTE9XX1JFU1VMVF9FUlJPUl9OT19CT09UQUJMRV9TTE9UUywKKyAgICAgICAgICAgIGF2Yl9hYl9mbG93KG9wc18uYXZiX2FiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpOworICBFeHBNRCgwLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBBU1NFUlRfRVEobnVsbHB0ciwgZGF0YSk7Cit9CisKK1RFU1RfRihBdmJBQkZsb3dUZXN0LCBSb2xsYmFja0luZGV4RmFpbHVyZXMpIHsKKyAgQXZiU2xvdFZlcmlmeURhdGEqIGRhdGE7CisgIGNvbnN0IGNoYXIqIHJlcXVlc3RlZF9wYXJ0aXRpb25zW10gPSB7ImJvb3QiLCBOVUxMfTsKKworICAvLyBTbG90IEEgcm9sbGJhY2sgaW5kZXggZmFpbHVyZSBmb3IgJ2Jvb3QnLgorICBTZXRNRCgxNSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDAsCisgICAgICAgIDIsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgMTQsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX09LLAorICAgICAgICAyLAorICAgICAgICAyLCAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMiwgMikpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgRVhQRUNUX0VRKEFWQl9BQl9GTE9XX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9hYl9mbG93KG9wc18uYXZiX2FiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpOworICBFeHBNRCgwLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMiwgMikpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICBFWFBFQ1RfRVEoIl9iIiwgc3RkOjpzdHJpbmcoZGF0YS0+YWJfc3VmZml4KSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoZGF0YSk7CisKKyAgLy8gU2xvdCBBIHJvbGxiYWNrIGluZGV4IGZhaWx1cmUgZm9yICdvZG0nLgorICBTZXRNRCgxNSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDIsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgMTQsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX09LLAorICAgICAgICAyLAorICAgICAgICAyLCAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMiwgMikpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgRVhQRUNUX0VRKEFWQl9BQl9GTE9XX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9hYl9mbG93KG9wc18uYXZiX2FiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpOworICBFeHBNRCgwLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMiwgMikpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICBFWFBFQ1RfRVEoIl9iIiwgc3RkOjpzdHJpbmcoZGF0YS0+YWJfc3VmZml4KSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoZGF0YSk7Cit9CisKK1RFU1RfRihBdmJBQkZsb3dUZXN0LCBTdG9yZWRSb2xsYmFja0luZGV4QnVtcGVkKSB7CisgIEF2YlNsb3RWZXJpZnlEYXRhKiBkYXRhOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisKKyAgU2V0TUQoMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX09LLAorICAgICAgICAzLAorICAgICAgICAzLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIDE0LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMywKKyAgICAgICAgMywgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDIsIDIpKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEVYUEVDVF9FUShBVkJfQUJfRkxPV19SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfYWJfZmxvdyhvcHNfLmF2Yl9hYl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKTsKKyAgRXhwTUQoMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIDE0LAorICAgICAgICAwLAorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygzLCAzKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgIEVYUEVDVF9FUSgiX2EiLCBzdGQ6OnN0cmluZyhkYXRhLT5hYl9zdWZmaXgpKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShkYXRhKTsKKworICAvLyBUaGUgY2FzZSB3aGVyZSBkaWZmZXJlbnQgcGFydGl0aW9ucyBoYXZlIGRpZmZlcmVudCByb2xsYmFjaworICAvLyBpbmRleCB2YWx1ZXMuCisgIFNldE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9PSywKKyAgICAgICAgNCwKKyAgICAgICAgOSwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDUsCisgICAgICAgIDcsICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBFWFBFQ1RfRVEoQVZCX0FCX0ZMT1dfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX2FiX2Zsb3cob3BzXy5hdmJfYWJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSk7CisgIEV4cE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAxLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoNCwgNykpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICBFWFBFQ1RfRVEoIl9hIiwgc3RkOjpzdHJpbmcoZGF0YS0+YWJfc3VmZml4KSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoZGF0YSk7CisKKyAgLy8gSWYgdGhlIHNsb3Qgd2l0aCB0aGUgbG93IFJJIGZhaWxzIHZlcmlmaWNhdGlvbiAob3IgaXMgaW52YWxpZCksCisgIC8vIGNoZWNrIHRoYXQgdGhlc2UgbG93IFJvbGxiYWNrIEluZGV4cyBhcmUgbm90IHRha2VuIGludG8gYWNjb3VudAorICAvLyBhZnRlciBtYXJraW5nIGl0IGFzIHVuYm9vdGFibGUuCisgIFNldE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9JTlYsCisgICAgICAgIDQsCisgICAgICAgIDksICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgMTQsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX09LLAorICAgICAgICA1LAorICAgICAgICA3LCAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgRVhQRUNUX0VRKEFWQl9BQl9GTE9XX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9hYl9mbG93KG9wc18uYXZiX2FiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpOworICBFeHBNRCgwLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoNSwgNykpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICBFWFBFQ1RfRVEoIl9iIiwgc3RkOjpzdHJpbmcoZGF0YS0+YWJfc3VmZml4KSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoZGF0YSk7Cit9CisKK1RFU1RfRihBdmJBQkZsb3dUZXN0LCBNYXJrU2xvdEFjdGl2ZSkgeworICBTZXRNRCgxNSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfSU5WLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIDExLAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBhdmJfYWJfbWFya19zbG90X2FjdGl2ZShvcHNfLmF2Yl9hYl9vcHMoKSwgMCkpOworICBFeHBNRCgxNSwKKyAgICAgICAgNywKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgMTEsCisgICAgICAgIDAsCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisKKyAgLy8gTm90ZSBob3cgcHJpb3JpdHkgb2Ygc2xvdCBBIGlzIGFsdGVyZWQgdG8gbWFrZSByb29tIGZvciBuZXdseQorICAvLyBhY3RpdmF0ZWQgc2xvdC4KKyAgU2V0TUQoMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX0lOViwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgYXZiX2FiX21hcmtfc2xvdF9hY3RpdmUob3BzXy5hdmJfYWJfb3BzKCksIDEpKTsKKyAgRXhwTUQoMTQsCisgICAgICAgIDAsCisgICAgICAgIDEsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIDE1LAorICAgICAgICA3LAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworfQorCitURVNUX0YoQXZiQUJGbG93VGVzdCwgTWFya1Nsb3RVbmJvb3RhYmxlKSB7CisgIFNldE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9JTlYsCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgMTEsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX09LLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfYWJfbWFya19zbG90X3VuYm9vdGFibGUob3BzXy5hdmJfYWJfb3BzKCksIDApKTsKKyAgRXhwTUQoMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgMTEsCisgICAgICAgIDAsCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisKKyAgU2V0TUQoMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX0lOViwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9hYl9tYXJrX3Nsb3RfdW5ib290YWJsZShvcHNfLmF2Yl9hYl9vcHMoKSwgMSkpOworICBFeHBNRCgxNSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKK30KKworVEVTVF9GKEF2YkFCRmxvd1Rlc3QsIE1hcmtTbG90U3VjY2Vzc2Z1bCkgeworICBTZXRNRCgxNSwKKyAgICAgICAgNSwKKyAgICAgICAgMCwKKyAgICAgICAgU1ZfSU5WLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIDExLAorICAgICAgICAzLAorICAgICAgICAwLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX2FiX21hcmtfc2xvdF9zdWNjZXNzZnVsKG9wc18uYXZiX2FiX29wcygpLCAwKSk7CisgIEV4cE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAxLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAxMSwKKyAgICAgICAgMywKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKworICBTZXRNRCgxNSwKKyAgICAgICAgNSwKKyAgICAgICAgMCwKKyAgICAgICAgU1ZfSU5WLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIDE0LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX2FiX21hcmtfc2xvdF9zdWNjZXNzZnVsKG9wc18uYXZiX2FiX29wcygpLCAxKSk7CisgIEV4cE1EKDE1LAorICAgICAgICA1LAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKworICAvLyBNYXJraW5nIGFuIHVuYm9vdGFibGUgc2xvdCAoQSkgYXMgc3VjY2Vzc2Z1bCB3b24ndCB3b3JrIChpdCdzIGEKKyAgLy8gcHJvZ3JhbW1lciBlcnJvciB0byBkbyBzbykuLi4gbm90aWNlIGhvd2V2ZXIgdGhhdCB0aGUgdW5ib290YWJsZQorICAvLyBzbG90IGlzIG5vcm1hbGl6ZWQgaW4gdGhlIHByb2Nlc3MuCisgIFNldE1EKDAsCisgICAgICAgIDMsCisgICAgICAgIDIsCisgICAgICAgIFNWX0lOViwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9hYl9tYXJrX3Nsb3Rfc3VjY2Vzc2Z1bChvcHNfLmF2Yl9hYl9vcHMoKSwgMCkpOworICBFeHBNRCgwLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKK30KKworc3RhdGljIEF2YkFCRGF0YSBteV9zZXJpYWxpemVkX2RhdGE7CisKK3N0YXRpYyBBdmJJT1Jlc3VsdCBteV93cml0ZV9hYl9tZXRhZGF0YShBdmJBQk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBBdmJBQkRhdGEqIGRhdGEpIHsKKyAgYXZiX2FiX2RhdGFfdXBkYXRlX2NyY19hbmRfYnl0ZXN3YXAoZGF0YSwgJm15X3NlcmlhbGl6ZWRfZGF0YSk7CisgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworfQorCitzdGF0aWMgQXZiSU9SZXN1bHQgbXlfcmVhZF9hYl9tZXRhZGF0YShBdmJBQk9wcyogb3BzLCBzdHJ1Y3QgQXZiQUJEYXRhKiBkYXRhKSB7CisgIGlmICghYXZiX2FiX2RhdGFfdmVyaWZ5X2FuZF9ieXRlc3dhcCgmbXlfc2VyaWFsaXplZF9kYXRhLCBkYXRhKSkgeworICAgIGF2Yl9lcnJvcigKKyAgICAgICAgIkVycm9yIHZhbGlkYXRpbmcgQS9CIG1ldGFkYXRhIGZyb20gcGVyc2lzdGVudCBzdG9yYWdlLiAiCisgICAgICAgICJSZXNldHRpbmcgYW5kIHdyaXRpbmcgbmV3IEEvQiBtZXRhZGF0YSB0byBwZXJzaXN0ZW50IHN0b3JhZ2UuXG4iKTsKKyAgICBhdmJfYWJfZGF0YV9pbml0KGRhdGEpOworICAgIHJldHVybiBteV93cml0ZV9hYl9tZXRhZGF0YShvcHMsIGRhdGEpOworICB9CisgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworfQorCitURVNUX0YoQXZiQUJGbG93VGVzdCwgT3RoZXJNZXRhZGF0YVN0b3JhZ2UpIHsKKyAgQXZiU2xvdFZlcmlmeURhdGEqIGRhdGE7CisgIGNvbnN0IGNoYXIqIHJlcXVlc3RlZF9wYXJ0aXRpb25zW10gPSB7ImJvb3QiLCBOVUxMfTsKKworICAvLyBVc2Ugb3VyIG93biBBL0Igc3RvcmFnZSByb3V0aW5lcyAoc2VlIGFib3ZlKS4KKyAgb3BzXy5hdmJfYWJfb3BzKCktPnJlYWRfYWJfbWV0YWRhdGEgPSBteV9yZWFkX2FiX21ldGFkYXRhOworICBvcHNfLmF2Yl9hYl9vcHMoKS0+d3JpdGVfYWJfbWV0YWRhdGEgPSBteV93cml0ZV9hYl9tZXRhZGF0YTsKKworICBTZXRNRCgxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX09LLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgRVhQRUNUX0VRKEFWQl9BQl9GTE9XX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9hYl9mbG93KG9wc18uYXZiX2FiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpOworICBFeHBNRCgxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgRVhQRUNUX0VRKCJfYiIsIHN0ZDo6c3RyaW5nKGRhdGEtPmFiX3N1ZmZpeCkpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKGRhdGEpOworCisgIC8vIEFsc28gY2hlY2sgdGhlIG90aGVyIHNsb3QuCisgIFNldE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9PSywKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgTWFrZVJvbGxiYWNrSW5kZXhlcygwLCAwKSk7ICAvLyBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcworICBFWFBFQ1RfRVEoQVZCX0FCX0ZMT1dfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX2FiX2Zsb3cob3BzXy5hdmJfYWJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSk7CisgIEV4cE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAxLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICBFWFBFQ1RfRVEoIl9hIiwgc3RkOjpzdHJpbmcoZGF0YS0+YWJfc3VmZml4KSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoZGF0YSk7CisKKyAgLy8gQ2hlY2sgdGhhdCAnbWlzYycgaGFzbid0IGJlZW4gd3JpdHRlbiB0byBhdCBhbGwuCisgIHN0ZDo6c3RyaW5nIG1pc2NfZGF0YTsKKyAgYmFzZTo6RmlsZVBhdGggbWlzY19wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJtaXNjLmltZyIpOworICBBU1NFUlRfVFJVRShiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKG1pc2NfcGF0aCwgJm1pc2NfZGF0YSkpOworICBFWFBFQ1RfRVEoc2l6ZV90KE1JU0NfUEFSVF9TSVpFKSwgbWlzY19kYXRhLnNpemUoKSk7CisgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgbWlzY19kYXRhLnNpemUoKTsgbisrKSB7CisgICAgQVNTRVJUX0VRKHVpbnQ4X3QobWlzY19kYXRhW25dKSwgMCk7CisgIH0KK30KKworVEVTVF9GKEF2YkFCRmxvd1Rlc3QsIFVubG9ja2VkVW52ZXJpZmllZFNsb3QpIHsKKyAgQXZiU2xvdFZlcmlmeURhdGEqIGRhdGE7CisgIGNvbnN0IGNoYXIqIHJlcXVlc3RlZF9wYXJ0aXRpb25zW10gPSB7ImJvb3QiLCBOVUxMfTsKKworICBTZXRNRCgxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgU1ZfT0ssCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX1VOViwKKyAgICAgICAgMCwKKyAgICAgICAgMCwgIC8vIEI6IHByaSwgdHJpZXMsIHN1Y2Nlc3MsIHNsb3RfdmFsaWRpdHksIFJJcworICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEVYUEVDVF9FUShBVkJfQUJfRkxPV19SRVNVTFRfT0tfV0lUSF9WRVJJRklDQVRJT05fRVJST1IsCisgICAgICAgICAgICBhdmJfYWJfZmxvdyhvcHNfLmF2Yl9hYl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpOworICBFeHBNRCgxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgIC8vIEE6IHByaSwgdHJpZXMsIHN1Y2Nlc3NmdWwKKyAgICAgICAgMTUsCisgICAgICAgIDAsCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICBNYWtlUm9sbGJhY2tJbmRleGVzKDAsIDApKTsgIC8vIHN0b3JlZF9yb2xsYmFja19pbmRleGVzCisgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgRVhQRUNUX0VRKCJfYiIsIHN0ZDo6c3RyaW5nKGRhdGEtPmFiX3N1ZmZpeCkpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKGRhdGEpOworCisgIC8vIEFsc28gY2hlY2sgdGhlIG90aGVyIHNsb3QuCisgIFNldE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICBTVl9VTlYsCisgICAgICAgIDAsCisgICAgICAgIDAsICAvLyBBOiBwcmksIHRyaWVzLCBzdWNjZXNzLCBzbG90X3ZhbGlkaXR5LCBSSXMKKyAgICAgICAgMTQsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIFNWX09LLAorICAgICAgICAwLAorICAgICAgICAwLCAgLy8gQjogcHJpLCB0cmllcywgc3VjY2Vzcywgc2xvdF92YWxpZGl0eSwgUklzCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgRVhQRUNUX0VRKEFWQl9BQl9GTE9XX1JFU1VMVF9PS19XSVRIX1ZFUklGSUNBVElPTl9FUlJPUiwKKyAgICAgICAgICAgIGF2Yl9hYl9mbG93KG9wc18uYXZiX2FiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSk7CisgIEV4cE1EKDE1LAorICAgICAgICAwLAorICAgICAgICAxLCAgLy8gQTogcHJpLCB0cmllcywgc3VjY2Vzc2Z1bAorICAgICAgICAxNCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCOiBwcmksIHRyaWVzLCBzdWNjZXNzZnVsCisgICAgICAgIE1ha2VSb2xsYmFja0luZGV4ZXMoMCwgMCkpOyAgLy8gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICBFWFBFQ1RfRVEoIl9hIiwgc3RkOjpzdHJpbmcoZGF0YS0+YWJfc3VmZml4KSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoZGF0YSk7Cit9CisKK1RFU1RfRihBdmJBQkZsb3dUZXN0LCBBdmJ0b29sTWV0YWRhdGFHZW5lcmF0b3JFbXB0eUZpbGUpIHsKKyAgQXZiQUJEYXRhIGRhdGE7CisKKyAgYmFzZTo6RmlsZVBhdGggbWlzY19wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJtaXNjLmltZyIpOworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIHNldF9hYl9tZXRhZGF0YSIKKyAgICAgICAgICAgICAgICAgIiAtLW1pc2NfaW1hZ2UgJXMiCisgICAgICAgICAgICAgICAgICIgLS1zbG90X2RhdGEgMTM6MzowOjExOjI6MSIsCisgICAgICAgICAgICAgICAgIG1pc2NfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworCisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLAorICAgICAgICAgICAgb3BzXy5hdmJfYWJfb3BzKCktPnJlYWRfYWJfbWV0YWRhdGEob3BzXy5hdmJfYWJfb3BzKCksICZkYXRhKSk7CisgIEVYUEVDVF9FUSgxMywgZGF0YS5zbG90c1swXS5wcmlvcml0eSk7CisgIEVYUEVDVF9FUSgzLCBkYXRhLnNsb3RzWzBdLnRyaWVzX3JlbWFpbmluZyk7CisgIEVYUEVDVF9FUSgwLCBkYXRhLnNsb3RzWzBdLnN1Y2Nlc3NmdWxfYm9vdCk7CisgIEVYUEVDVF9FUSgxMSwgZGF0YS5zbG90c1sxXS5wcmlvcml0eSk7CisgIEVYUEVDVF9FUSgyLCBkYXRhLnNsb3RzWzFdLnRyaWVzX3JlbWFpbmluZyk7CisgIEVYUEVDVF9FUSgxLCBkYXRhLnNsb3RzWzFdLnN1Y2Nlc3NmdWxfYm9vdCk7Cit9CisKK1RFU1RfRihBdmJBQkZsb3dUZXN0LCBBdmJ0b29sTWV0YWRhdGFHZW5lcmF0b3JFeGlzdGluZ0ZpbGUpIHsKKyAgQXZiQUJEYXRhIGRhdGE7CisgIHNpemVfdCBuOworCisgIHNpemVfdCBtaXNjX3NpemUgPSAxMDI0ICogMTAyNDsKKyAgYmFzZTo6RmlsZVBhdGggbWlzY19wYXRoID0gR2VuZXJhdGVJbWFnZSgibWlzYy5pbWciLCBtaXNjX3NpemUpOworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIHNldF9hYl9tZXRhZGF0YSIKKyAgICAgICAgICAgICAgICAgIiAtLW1pc2NfaW1hZ2UgJXMiCisgICAgICAgICAgICAgICAgICIgLS1zbG90X2RhdGEgMTI6MjoxOjEwOjU6MCIsCisgICAgICAgICAgICAgICAgIG1pc2NfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworCisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLAorICAgICAgICAgICAgb3BzXy5hdmJfYWJfb3BzKCktPnJlYWRfYWJfbWV0YWRhdGEob3BzXy5hdmJfYWJfb3BzKCksICZkYXRhKSk7CisgIEVYUEVDVF9FUSgxMiwgZGF0YS5zbG90c1swXS5wcmlvcml0eSk7CisgIEVYUEVDVF9FUSgyLCBkYXRhLnNsb3RzWzBdLnRyaWVzX3JlbWFpbmluZyk7CisgIEVYUEVDVF9FUSgxLCBkYXRhLnNsb3RzWzBdLnN1Y2Nlc3NmdWxfYm9vdCk7CisgIEVYUEVDVF9FUSgxMCwgZGF0YS5zbG90c1sxXS5wcmlvcml0eSk7CisgIEVYUEVDVF9FUSg1LCBkYXRhLnNsb3RzWzFdLnRyaWVzX3JlbWFpbmluZyk7CisgIEVYUEVDVF9FUSgwLCBkYXRhLnNsb3RzWzFdLnN1Y2Nlc3NmdWxfYm9vdCk7CisKKyAgc3RkOjpzdHJpbmcgbWlzY19kYXRhOworICBBU1NFUlRfVFJVRShiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKG1pc2NfcGF0aCwgJm1pc2NfZGF0YSkpOworICBFWFBFQ1RfRVEobWlzY19zaXplLCBtaXNjX2RhdGEuc2l6ZSgpKTsKKyAgZm9yIChuID0gMDsgbiA8IDIwNDg7IG4rKykgeworICAgIEFTU0VSVF9FUSh1aW50OF90KG1pc2NfZGF0YVtuXSksIHVpbnQ4X3QobikpOworICB9CisgIGZvciAobiA9IDIwNDggKyAzMjsgbiA8IG1pc2NfZGF0YS5zaXplKCk7IG4rKykgeworICAgIEFTU0VSVF9FUSh1aW50OF90KG1pc2NfZGF0YVtuXSksIHVpbnQ4X3QobikpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhdmIKZGlmZiAtLWdpdCBhL2F2Yi90ZXN0L2F2Yl9hdHhfdmFsaWRhdGVfdW5pdHRlc3QuY2MgYi9hdmIvdGVzdC9hdmJfYXR4X3ZhbGlkYXRlX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZmE4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvdGVzdC9hdmJfYXR4X3ZhbGlkYXRlX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNjg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGJhc2UvZmlsZXMvZmlsZV91dGlsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKworI2luY2x1ZGUgPGxpYmF2Yl9hdHgvbGliYXZiX2F0eC5oPgorCisjaW5jbHVkZSAiYXZiX3VuaXR0ZXN0X3V0aWwuaCIKKyNpbmNsdWRlICJmYWtlX2F2Yl9vcHMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgY2hhciBrTWV0YWRhdGFQYXRoW10gPSAidGVzdC9kYXRhL2F0eF9tZXRhZGF0YS5iaW4iOworY29uc3QgY2hhciBrUGVybWFuZW50QXR0cmlidXRlc1BhdGhbXSA9CisgICAgInRlc3QvZGF0YS9hdHhfcGVybWFuZW50X2F0dHJpYnV0ZXMuYmluIjsKK2NvbnN0IGNoYXIga1BSS1ByaXZhdGVLZXlQYXRoW10gPSAidGVzdC9kYXRhL3Rlc3RrZXlfcnNhNDA5Ni5wZW0iOworY29uc3QgY2hhciBrUElLUHJpdmF0ZUtleVBhdGhbXSA9ICJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSI7CisKK2NsYXNzIFNjb3BlZFJTQSB7CisgcHVibGljOgorICBTY29wZWRSU0EoY29uc3QgY2hhciogcGVtX2tleV9wYXRoKSB7CisgICAgRklMRSogZmlsZSA9IGZvcGVuKHBlbV9rZXlfcGF0aCwgInIiKTsKKyAgICByc2FfID0gUEVNX3JlYWRfUlNBUHJpdmF0ZUtleShmaWxlLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKKyAgICBmY2xvc2UoZmlsZSk7CisgIH0KKworICB+U2NvcGVkUlNBKCkgeworICAgIGlmIChyc2FfKSB7CisgICAgICBSU0FfZnJlZShyc2FfKTsKKyAgICB9CisgIH0KKworICAvLyBQS0NTICMxIHYxLjUgc2lnbmF0dXJlIHVzaW5nIFNIQTUxMiBpZiB8cnNhX3wgaXMgNDA5NiBiaXRzLCBTSEEyNTYKKyAgLy8gb3RoZXJ3aXNlLiBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKyAgYm9vbCBTaWduKGNvbnN0IHZvaWQqIGRhdGFfdG9fc2lnbiwgc2l6ZV90IGxlbmd0aCwgdWludDhfdCBzaWduYXR1cmVbXSkgeworICAgIGJvb2wgdXNlX3NoYTUxMiA9IChSU0Ffc2l6ZShyc2FfKSA9PSBBVkJfUlNBNDA5Nl9OVU1fQllURVMpOworICAgIHVpbnQ4X3QgZGlnZXN0W0FWQl9TSEE1MTJfRElHRVNUX1NJWkVdOworICAgIHVuc2lnbmVkIGludCBkaWdlc3Rfc2l6ZSA9CisgICAgICAgIHVzZV9zaGE1MTIgPyBBVkJfU0hBNTEyX0RJR0VTVF9TSVpFIDogQVZCX1NIQTI1Nl9ESUdFU1RfU0laRTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhX3RvX3NpZ25fYnVmID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oZGF0YV90b19zaWduKTsKKyAgICBpZiAodXNlX3NoYTUxMikgeworICAgICAgU0hBNTEyKGRhdGFfdG9fc2lnbl9idWYsIGxlbmd0aCwgZGlnZXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgU0hBMjU2KGRhdGFfdG9fc2lnbl9idWYsIGxlbmd0aCwgZGlnZXN0KTsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IHNpZ25hdHVyZV9sZW5ndGggPSAwOworICAgIHJldHVybiAoMSA9PSBSU0Ffc2lnbih1c2Vfc2hhNTEyID8gTklEX3NoYTUxMiA6IE5JRF9zaGEyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hdHVyZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJzYV8pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgUlNBKiByc2FfOworfTsKKworfSAvKiBuYW1lc3BhY2UgKi8KKworbmFtZXNwYWNlIGF2YiB7CisKK2NsYXNzIEF2YkF0eFZhbGlkYXRlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QsIHB1YmxpYyBGYWtlQXZiT3BzRGVsZWdhdGUgeworIHB1YmxpYzoKKyAgfkF2YkF0eFZhbGlkYXRlVGVzdCgpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZWFkRGVmYXVsdERhdGEoKTsKKyAgICBvcHNfLnNldF9kZWxlZ2F0ZSh0aGlzKTsKKyAgICBvcHNfLnNldF9wZXJtYW5lbnRfYXR0cmlidXRlcyhhdHRyaWJ1dGVzXyk7CisgICAgb3BzXy5zZXRfc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMoe3tBVkJfQVRYX1BJS19WRVJTSU9OX0xPQ0FUSU9OLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0FWQl9BVFhfUFNLX1ZFUlNJT05fTE9DQVRJT04sIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QVZCX0FUWF9HU0tfVkVSU0lPTl9MT0NBVElPTiwgMH19KTsKKyAgfQorCisgIC8vIEZha2VBdmJPcHNEZWxlZ2F0ZSBtZXRob2RzLgorICBBdmJJT1Jlc3VsdCByZWFkX2Zyb21fcGFydGl0aW9uKGNvbnN0IGNoYXIqIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIG91dF9udW1fcmVhZCkgb3ZlcnJpZGUgeworICAgIC8vIEV4cGVjdCBtZXRob2Qgbm90IHVzZWQuCisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfTk9fU1VDSF9QQVJUSVRJT047CisgIH0KKworICBBdmJJT1Jlc3VsdCB3cml0ZV90b19wYXJ0aXRpb24oY29uc3QgY2hhciogcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyKSBvdmVycmlkZSB7CisgICAgLy8gRXhwZWN0IG1ldGhvZCBub3QgdXNlZC4KKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9OT19TVUNIX1BBUlRJVElPTjsKKyAgfQorCisgIEF2YklPUmVzdWx0IHZhbGlkYXRlX3ZibWV0YV9wdWJsaWNfa2V5KEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwdWJsaWNfa2V5X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwdWJsaWNfa2V5X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcHVibGljX2tleV9tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHB1YmxpY19rZXlfbWV0YWRhdGFfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBvdXRfa2V5X2lzX3RydXN0ZWQpIG92ZXJyaWRlIHsKKyAgICAvLyBFeHBlY3QgbWV0aG9kIG5vdCB1c2VkLgorICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX0VSUk9SX05PX1NVQ0hfUEFSVElUSU9OOworICB9CisKKyAgQXZiSU9SZXN1bHQgcmVhZF9yb2xsYmFja19pbmRleChBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm9sbGJhY2tfaW5kZXhfc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogb3V0X3JvbGxiYWNrX2luZGV4KSBvdmVycmlkZSB7CisgICAgaWYgKChmYWlsX3JlYWRfcGlrX3JvbGxiYWNrX2luZGV4XyAmJgorICAgICAgICAgcm9sbGJhY2tfaW5kZXhfc2xvdCA9PSBBVkJfQVRYX1BJS19WRVJTSU9OX0xPQ0FUSU9OKSB8fAorICAgICAgICAoZmFpbF9yZWFkX3Bza19yb2xsYmFja19pbmRleF8gJiYKKyAgICAgICAgIHJvbGxiYWNrX2luZGV4X3Nsb3QgPT0gQVZCX0FUWF9QU0tfVkVSU0lPTl9MT0NBVElPTikgfHwKKyAgICAgICAgKGZhaWxfcmVhZF9nc2tfcm9sbGJhY2tfaW5kZXhfICYmCisgICAgICAgICByb2xsYmFja19pbmRleF9zbG90ID09IEFWQl9BVFhfR1NLX1ZFUlNJT05fTE9DQVRJT04pKSB7CisgICAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9JTzsKKyAgICB9CisgICAgcmV0dXJuIG9wc18ucmVhZF9yb2xsYmFja19pbmRleCgKKyAgICAgICAgb3BzLCByb2xsYmFja19pbmRleF9zbG90LCBvdXRfcm9sbGJhY2tfaW5kZXgpOworICB9CisKKyAgQXZiSU9SZXN1bHQgd3JpdGVfcm9sbGJhY2tfaW5kZXgoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByb2xsYmFja19pbmRleF9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCByb2xsYmFja19pbmRleCkgb3ZlcnJpZGUgeworICAgIC8vIEV4cGVjdCBtZXRob2Qgbm90IHVzZWQuCisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfTk9fU1VDSF9QQVJUSVRJT047CisgIH0KKworICBBdmJJT1Jlc3VsdCByZWFkX2lzX2RldmljZV91bmxvY2tlZChBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogb3V0X2lzX2RldmljZV91bmxvY2tlZCkgb3ZlcnJpZGUgeworICAgIC8vIEV4cGVjdCBtZXRob2Qgbm90IHVzZWQuCisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfTk9fU1VDSF9QQVJUSVRJT047CisgIH0KKworICBBdmJJT1Jlc3VsdCBnZXRfdW5pcXVlX2d1aWRfZm9yX3BhcnRpdGlvbihBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBndWlkX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGd1aWRfYnVmX3NpemUpIG92ZXJyaWRlIHsKKyAgICAvLyBFeHBlY3QgbWV0aG9kIG5vdCB1c2VkLgorICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX0VSUk9SX05PX1NVQ0hfUEFSVElUSU9OOworICB9CisKKyAgQXZiSU9SZXN1bHQgcmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlcygKKyAgICAgIEF2YkF0eFBlcm1hbmVudEF0dHJpYnV0ZXMqIGF0dHJpYnV0ZXMpIG92ZXJyaWRlIHsKKyAgICBpZiAoZmFpbF9yZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzXykgeworICAgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfSU87CisgICAgfQorICAgIHJldHVybiBvcHNfLnJlYWRfcGVybWFuZW50X2F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgIH0KKworICBBdmJJT1Jlc3VsdCByZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2goCisgICAgICB1aW50OF90IGhhc2hbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV0pIG92ZXJyaWRlIHsKKyAgICBpZiAoZmFpbF9yZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2hfKSB7CisgICAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9JTzsKKyAgICB9CisgICAgcmV0dXJuIG9wc18ucmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoKGhhc2gpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgQXZiSU9SZXN1bHQgVmFsaWRhdGUoYm9vbCogaXNfdHJ1c3RlZCkgeworICAgIHJldHVybiBhdmJfYXR4X3ZhbGlkYXRlX3ZibWV0YV9wdWJsaWNfa2V5KAorICAgICAgICBvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgbWV0YWRhdGFfLnByb2R1Y3Rfc2lnbmluZ19rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEucHVibGljX2tleSwKKyAgICAgICAgQVZCX0FUWF9QVUJMSUNfS0VZX1NJWkVfMjA0OCwKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJm1ldGFkYXRhXyksCisgICAgICAgIHNpemVvZihtZXRhZGF0YV8pLAorICAgICAgICBpc190cnVzdGVkKTsKKyAgfQorCisgIHZvaWQgU2lnblBJS0NlcnRpZmljYXRlKCkgeworICAgIG1lbXNldChtZXRhZGF0YV8ucHJvZHVjdF9pbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlLnNpZ25hdHVyZSwKKyAgICAgICAgICAgMCwKKyAgICAgICAgICAgQVZCX1JTQTQwOTZfTlVNX0JZVEVTKTsKKyAgICBTY29wZWRSU0Ega2V5KGtQUktQcml2YXRlS2V5UGF0aCk7CisgICAgQVNTRVJUX1RSVUUoCisgICAgICAgIGtleS5TaWduKCZtZXRhZGF0YV8ucHJvZHVjdF9pbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLAorICAgICAgICAgICAgICAgICBzaXplb2YoQXZiQXR4Q2VydGlmaWNhdGVTaWduZWREYXRhKSwKKyAgICAgICAgICAgICAgICAgbWV0YWRhdGFfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduYXR1cmUpKTsKKyAgfQorCisgIHZvaWQgU2lnblBTS0NlcnRpZmljYXRlKCkgeworICAgIG1lbXNldChtZXRhZGF0YV8ucHJvZHVjdF9zaWduaW5nX2tleV9jZXJ0aWZpY2F0ZS5zaWduYXR1cmUsCisgICAgICAgICAgIDAsCisgICAgICAgICAgIEFWQl9SU0EyMDQ4X05VTV9CWVRFUyk7CisgICAgU2NvcGVkUlNBIGtleShrUElLUHJpdmF0ZUtleVBhdGgpOworICAgIEFTU0VSVF9UUlVFKGtleS5TaWduKCZtZXRhZGF0YV8ucHJvZHVjdF9zaWduaW5nX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQXZiQXR4Q2VydGlmaWNhdGVTaWduZWREYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV8ucHJvZHVjdF9zaWduaW5nX2tleV9jZXJ0aWZpY2F0ZS5zaWduYXR1cmUpKTsKKyAgfQorCisgIEZha2VBdmJPcHMgb3BzXzsKKyAgQXZiQXR4UGVybWFuZW50QXR0cmlidXRlcyBhdHRyaWJ1dGVzXzsKKyAgQXZiQXR4UHVibGljS2V5TWV0YWRhdGEgbWV0YWRhdGFfOworICBib29sIGZhaWxfcmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc197ZmFsc2V9OworICBib29sIGZhaWxfcmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoX3tmYWxzZX07CisgIGJvb2wgZmFpbF9yZWFkX3Bpa19yb2xsYmFja19pbmRleF97ZmFsc2V9OworICBib29sIGZhaWxfcmVhZF9wc2tfcm9sbGJhY2tfaW5kZXhfe2ZhbHNlfTsKKyAgYm9vbCBmYWlsX3JlYWRfZ3NrX3JvbGxiYWNrX2luZGV4X3tmYWxzZX07CisKKyBwcml2YXRlOgorICB2b2lkIFJlYWREZWZhdWx0RGF0YSgpIHsKKyAgICBzdGQ6OnN0cmluZyB0bXA7CisgICAgQVNTRVJUX1RSVUUoYmFzZTo6UmVhZEZpbGVUb1N0cmluZyhiYXNlOjpGaWxlUGF0aChrTWV0YWRhdGFQYXRoKSwgJnRtcCkpOworICAgIEFTU0VSVF9FUSh0bXAuc2l6ZSgpLCBzaXplb2YoQXZiQXR4UHVibGljS2V5TWV0YWRhdGEpKTsKKyAgICBtZW1jcHkoJm1ldGFkYXRhXywgdG1wLmRhdGEoKSwgdG1wLnNpemUoKSk7CisgICAgQVNTRVJUX1RSVUUoCisgICAgICAgIGJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoYmFzZTo6RmlsZVBhdGgoa1Blcm1hbmVudEF0dHJpYnV0ZXNQYXRoKSwgJnRtcCkpOworICAgIEFTU0VSVF9FUSh0bXAuc2l6ZSgpLCBzaXplb2YoQXZiQXR4UGVybWFuZW50QXR0cmlidXRlcykpOworICAgIG1lbWNweSgmYXR0cmlidXRlc18sIHRtcC5kYXRhKCksIHRtcC5zaXplKCkpOworICB9Cit9OworCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBTdWNjZXNzKSB7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IGZhbHNlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGUoJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX1RSVUUoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIFN1Y2Nlc3NBZnRlck5ld1NpZ24pIHsKKyAgc3RkOjpzdHJpbmcgb2xkX3Bpa19zaWcoCisgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigKKyAgICAgICAgICBtZXRhZGF0YV8ucHJvZHVjdF9pbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlLnNpZ25hdHVyZSksCisgICAgICBBVkJfUlNBNDA5Nl9OVU1fQllURVMpOworICBzdGQ6OnN0cmluZyBvbGRfcHNrX3NpZygKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KAorICAgICAgICAgIG1ldGFkYXRhXy5wcm9kdWN0X3NpZ25pbmdfa2V5X2NlcnRpZmljYXRlLnNpZ25hdHVyZSksCisgICAgICBBVkJfUlNBMjA0OF9OVU1fQllURVMpOworICBTaWduUElLQ2VydGlmaWNhdGUoKTsKKyAgU2lnblBTS0NlcnRpZmljYXRlKCk7CisgIHN0ZDo6c3RyaW5nIG5ld19waWtfc2lnKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oCisgICAgICAgICAgbWV0YWRhdGFfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduYXR1cmUpLAorICAgICAgQVZCX1JTQTQwOTZfTlVNX0JZVEVTKTsKKyAgc3RkOjpzdHJpbmcgbmV3X3Bza19zaWcoCisgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigKKyAgICAgICAgICBtZXRhZGF0YV8ucHJvZHVjdF9zaWduaW5nX2tleV9jZXJ0aWZpY2F0ZS5zaWduYXR1cmUpLAorICAgICAgQVZCX1JTQTIwNDhfTlVNX0JZVEVTKTsKKyAgRVhQRUNUX0VRKG9sZF9waWtfc2lnLCBuZXdfcGlrX3NpZyk7CisgIEVYUEVDVF9FUShvbGRfcHNrX3NpZywgbmV3X3Bza19zaWcpOworICBib29sIGlzX3RydXN0ZWQgPSBmYWxzZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9UUlVFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBGYWlsUmVhZFBlcm1hbWVudEF0dHJpYnV0ZXMpIHsKKyAgZmFpbF9yZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzXyA9IHRydWU7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX0VSUk9SX0lPLCBWYWxpZGF0ZSgmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIEZhaWxSZWFkUGVybWFtZW50QXR0cmlidXRlc0hhc2gpIHsKKyAgZmFpbF9yZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2hfID0gdHJ1ZTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfRVJST1JfSU8sIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgVW5zdXBwb3J0ZWRQZXJtYW5lbnRBdHRyaWJ1dGVzVmVyc2lvbikgeworICBhdHRyaWJ1dGVzXy52ZXJzaW9uID0gMjU7CisgIG9wc18uc2V0X3Blcm1hbmVudF9hdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfKTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgUGVybWFuZW50QXR0cmlidXRlc0hhc2hNaXNtYXRjaCkgeworICBvcHNfLnNldF9wZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoKCJiYWRfaGFzaCIpOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGUoJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCisvLyBBIGZpeHR1cmUgd2l0aCBwYXJhbWV0ZXJpemVkIG1ldGFkYXRhIGxlbmd0aC4KK2NsYXNzIEF2YkF0eFZhbGlkYXRlVGVzdFdpdGhNZXRhZGF0YUxlbmd0aAorICAgIDogcHVibGljIEF2YkF0eFZhbGlkYXRlVGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxzaXplX3Q+IHsKKyBwcm90ZWN0ZWQ6CisgIEF2YklPUmVzdWx0IFZhbGlkYXRlKGJvb2wqIGlzX3RydXN0ZWQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gYXZiX2F0eF92YWxpZGF0ZV92Ym1ldGFfcHVibGljX2tleSgKKyAgICAgICAgb3BzXy5hdmJfb3BzKCksCisgICAgICAgIG1ldGFkYXRhXy5wcm9kdWN0X3NpZ25pbmdfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLnB1YmxpY19rZXksCisgICAgICAgIEFWQl9BVFhfUFVCTElDX0tFWV9TSVpFXzIwNDgsCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCZtZXRhZGF0YV8pLAorICAgICAgICBHZXRQYXJhbSgpLAorICAgICAgICBpc190cnVzdGVkKTsKKyAgfQorfTsKKworVEVTVF9QKEF2YkF0eFZhbGlkYXRlVGVzdFdpdGhNZXRhZGF0YUxlbmd0aCwgSW52YWxpZE1ldGFkYXRhTGVuZ3RoKSB7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZSgmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKKy8vIFRlc3QgYSBidW5jaCBvZiBpbnZhbGlkIG1ldGFkYXRhIGxlbmd0aCB2YWx1ZXMuCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChQLAorICAgICAgICAgICAgICAgICAgICAgICAgQXZiQXR4VmFsaWRhdGVUZXN0V2l0aE1ldGFkYXRhTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQXZiQXR4UHVibGljS2V5TWV0YWRhdGEpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBdmJBdHhQdWJsaWNLZXlNZXRhZGF0YSkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpKTsKKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgVW5zdXBwb3J0ZWRNZXRhZGF0YVZlcnNpb24pIHsKKyAgbWV0YWRhdGFfLnZlcnNpb24gPSAyNTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgRmFpbFJlYWRQSUtSb2xsYmFja0luZGV4KSB7CisgIGZhaWxfcmVhZF9waWtfcm9sbGJhY2tfaW5kZXhfID0gdHJ1ZTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfRVJST1JfSU8sIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgVW5zdXBwb3J0ZWRQSUtDZXJ0aWZpY2F0ZVZlcnNpb24pIHsKKyAgbWV0YWRhdGFfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YS52ZXJzaW9uID0gMjU7CisgIFNpZ25QSUtDZXJ0aWZpY2F0ZSgpOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGUoJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBCYWRQSUtDZXJ0X01vZGlmaWVkU3ViamVjdFB1YmxpY0tleSkgeworICBtZXRhZGF0YV8ucHJvZHVjdF9pbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLnB1YmxpY19rZXlbMF0gXj0gMTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgQmFkUElLQ2VydF9Nb2RpZmllZFN1YmplY3QpIHsKKyAgbWV0YWRhdGFfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YS5zdWJqZWN0WzBdIF49IDE7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZSgmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIEJhZFBJS0NlcnRfTW9kaWZpZWRVc2FnZSkgeworICBtZXRhZGF0YV8ucHJvZHVjdF9pbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLnVzYWdlWzBdIF49IDE7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZSgmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIEJhZFBJS0NlcnRfTW9kaWZpZWRLZXlWZXJzaW9uKSB7CisgIG1ldGFkYXRhXy5wcm9kdWN0X2ludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEua2V5X3ZlcnNpb24gXj0gMTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgQmFkUElLQ2VydF9CYWRTaWduYXR1cmUpIHsKKyAgbWV0YWRhdGFfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduYXR1cmVbMF0gXj0gMTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgUElLQ2VydFN1YmplY3RJZ25vcmVkKSB7CisgIG1ldGFkYXRhXy5wcm9kdWN0X2ludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEuc3ViamVjdFswXSBePSAxOworICBTaWduUElLQ2VydGlmaWNhdGUoKTsKKyAgYm9vbCBpc190cnVzdGVkID0gZmFsc2U7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZSgmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfVFJVRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgUElLQ2VydFVuZXhwZWN0ZWRVc2FnZSkgeworICBtZXRhZGF0YV8ucHJvZHVjdF9pbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLnVzYWdlWzBdIF49IDE7CisgIFNpZ25QSUtDZXJ0aWZpY2F0ZSgpOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGUoJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBQSUtSb2xsYmFjaykgeworICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcygKKyAgICAgIHt7QVZCX0FUWF9QSUtfVkVSU0lPTl9MT0NBVElPTiwKKyAgICAgICAgbWV0YWRhdGFfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YS5rZXlfdmVyc2lvbiArCisgICAgICAgICAgICAxfSwKKyAgICAgICB7QVZCX0FUWF9QU0tfVkVSU0lPTl9MT0NBVElPTiwgMH0sCisgICAgICAge0FWQl9BVFhfR1NLX1ZFUlNJT05fTE9DQVRJT04sIDB9fSk7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZSgmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIEZhaWxSZWFkUFNLUm9sbGJhY2tJbmRleCkgeworICBmYWlsX3JlYWRfcHNrX3JvbGxiYWNrX2luZGV4XyA9IHRydWU7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX0VSUk9SX0lPLCBWYWxpZGF0ZSgmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIFVuc3VwcG9ydGVkUFNLQ2VydGlmaWNhdGVWZXJzaW9uKSB7CisgIG1ldGFkYXRhXy5wcm9kdWN0X3NpZ25pbmdfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLnZlcnNpb24gPSAyNTsKKyAgU2lnblBTS0NlcnRpZmljYXRlKCk7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZSgmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIEJhZFBTS0NlcnRfTW9kaWZpZWRTdWJqZWN0UHVibGljS2V5KSB7CisgIG1ldGFkYXRhXy5wcm9kdWN0X3NpZ25pbmdfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLnB1YmxpY19rZXlbMF0gXj0gMTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgQmFkUFNLQ2VydF9Nb2RpZmllZFN1YmplY3QpIHsKKyAgbWV0YWRhdGFfLnByb2R1Y3Rfc2lnbmluZ19rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEuc3ViamVjdFswXSBePSAxOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGUoJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBCYWRQU0tDZXJ0X01vZGlmaWVkVXNhZ2UpIHsKKyAgbWV0YWRhdGFfLnByb2R1Y3Rfc2lnbmluZ19rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEudXNhZ2VbMF0gXj0gMTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgQmFkUFNLQ2VydF9Nb2RpZmllZEtleVZlcnNpb24pIHsKKyAgbWV0YWRhdGFfLnByb2R1Y3Rfc2lnbmluZ19rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEua2V5X3ZlcnNpb24gXj0gMTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgQmFkUFNLQ2VydF9CYWRTaWduYXR1cmUpIHsKKyAgbWV0YWRhdGFfLnByb2R1Y3Rfc2lnbmluZ19rZXlfY2VydGlmaWNhdGUuc2lnbmF0dXJlWzBdIF49IDE7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZSgmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIFBTS0NlcnRVbmV4cGVjdGVkU3ViamVjdCkgeworICBtZXRhZGF0YV8ucHJvZHVjdF9zaWduaW5nX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YS5zdWJqZWN0WzBdIF49IDE7CisgIFNpZ25QU0tDZXJ0aWZpY2F0ZSgpOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGUoJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBQU0tDZXJ0VW5leHBlY3RlZFVzYWdlKSB7CisgIG1ldGFkYXRhXy5wcm9kdWN0X3NpZ25pbmdfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLnVzYWdlWzBdIF49IDE7CisgIFNpZ25QU0tDZXJ0aWZpY2F0ZSgpOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGUoJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBQU0tSb2xsYmFjaykgeworICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcygKKyAgICAgIHt7QVZCX0FUWF9QSUtfVkVSU0lPTl9MT0NBVElPTiwgMH0sCisgICAgICAge0FWQl9BVFhfUFNLX1ZFUlNJT05fTE9DQVRJT04sCisgICAgICAgIG1ldGFkYXRhXy5wcm9kdWN0X3NpZ25pbmdfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLmtleV92ZXJzaW9uICsgMX0sCisgICAgICAge0FWQl9BVFhfR1NLX1ZFUlNJT05fTE9DQVRJT04sIDB9fSk7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZSgmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKKy8vIEEgZml4dHVyZSB3aXRoIHBhcmFtZXRlcml6ZWQgcHVibGljIGtleSBsZW5ndGguCitjbGFzcyBBdmJBdHhWYWxpZGF0ZVRlc3RXaXRoUHVibGljS2V5TGVuZ3RoCisgICAgOiBwdWJsaWMgQXZiQXR4VmFsaWRhdGVUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHNpemVfdD4geworIHByb3RlY3RlZDoKKyAgQXZiSU9SZXN1bHQgVmFsaWRhdGUoYm9vbCogaXNfdHJ1c3RlZCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBhdmJfYXR4X3ZhbGlkYXRlX3ZibWV0YV9wdWJsaWNfa2V5KAorICAgICAgICBvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgbWV0YWRhdGFfLnByb2R1Y3Rfc2lnbmluZ19rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEucHVibGljX2tleSwKKyAgICAgICAgR2V0UGFyYW0oKSwKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJm1ldGFkYXRhXyksCisgICAgICAgIHNpemVvZihtZXRhZGF0YV8pLAorICAgICAgICBpc190cnVzdGVkKTsKKyAgfQorfTsKKworVEVTVF9QKEF2YkF0eFZhbGlkYXRlVGVzdFdpdGhQdWJsaWNLZXlMZW5ndGgsIEludmFsaWRQdWJsaWNLZXlMZW5ndGgpIHsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworLy8gVGVzdCBhIGJ1bmNoIG9mIGludmFsaWQgcHVibGljIGtleSBsZW5ndGggdmFsdWVzLgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF2YkF0eFZhbGlkYXRlVGVzdFdpdGhQdWJsaWNLZXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQl9BVFhfUFVCTElDX0tFWV9TSVpFXzIwNDggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCX0FUWF9QVUJMSUNfS0VZX1NJWkVfMjA0OCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJfQVRYX1BVQkxJQ19LRVlfU0laRV80MDk2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpKTsKKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgUFNLTWlzbWF0Y2gpIHsKKyAgdWludDhfdCBiYWRfa2V5W0FWQl9BVFhfUFVCTElDX0tFWV9TSVpFXzIwNDhdID0ge307CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX2F0eF92YWxpZGF0ZV92Ym1ldGFfcHVibGljX2tleSgKKyAgICAgICAgICAgICAgICBvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICBiYWRfa2V5LAorICAgICAgICAgICAgICAgIEFWQl9BVFhfUFVCTElDX0tFWV9TSVpFXzIwNDgsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJm1ldGFkYXRhXyksCisgICAgICAgICAgICAgICAgc2l6ZW9mKG1ldGFkYXRhXyksCisgICAgICAgICAgICAgICAgJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBGYWlsUmVhZEdTS1JvbGxiYWNrSW5kZXgpIHsKKyAgZmFpbF9yZWFkX2dza19yb2xsYmFja19pbmRleF8gPSB0cnVlOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9FUlJPUl9JTywgVmFsaWRhdGUoJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBHU0tSb2xsYmFjaykgeworICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcygKKyAgICAgIHt7QVZCX0FUWF9QSUtfVkVSU0lPTl9MT0NBVElPTiwgMH0sCisgICAgICAge0FWQl9BVFhfUFNLX1ZFUlNJT05fTE9DQVRJT04sIDB9LAorICAgICAgIHtBVkJfQVRYX0dTS19WRVJTSU9OX0xPQ0FUSU9OLAorICAgICAgICBtZXRhZGF0YV8uZ29vZ2xlX3NpZ25pbmdfa2V5X3ZlcnNpb24gKyAxfX0pOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGUoJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCisvLyBBIGZpeHR1cmUgZm9yIHRlc3RpbmcgYXZiX3Nsb3RfdmVyaWZ5KCkgd2l0aCBBVFguCitjbGFzcyBBdmJBdHhTbG90VmVyaWZ5VGVzdCA6IHB1YmxpYyBCYXNlQXZiVG9vbFRlc3QsIHB1YmxpYyBGYWtlQXZiT3BzRGVsZWdhdGUgeworIHB1YmxpYzoKKyAgfkF2YkF0eFNsb3RWZXJpZnlUZXN0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgQmFzZUF2YlRvb2xUZXN0OjpTZXRVcCgpOworICAgIFJlYWRBdHhEZWZhdWx0RGF0YSgpOworICAgIG9wc18uc2V0X3BhcnRpdGlvbl9kaXIodGVzdGRpcl8pOworICAgIG9wc18uc2V0X2RlbGVnYXRlKHRoaXMpOworICAgIG9wc18uc2V0X3Blcm1hbmVudF9hdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfKTsKKyAgICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcyh7ezAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QVZCX0FUWF9QSUtfVkVSU0lPTl9MT0NBVElPTiwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtBVkJfQVRYX1BTS19WRVJTSU9OX0xPQ0FUSU9OLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0FWQl9BVFhfR1NLX1ZFUlNJT05fTE9DQVRJT04sIDB9fSk7CisgICAgb3BzXy5zZXRfc3RvcmVkX2lzX2RldmljZV91bmxvY2tlZChmYWxzZSk7CisgIH0KKworICAvLyBGYWtlQXZiT3BzRGVsZWdhdGUgbWV0aG9kcy4gQWxsIGZvcndhcmQgdG8gRmFrZUF2Yk9wcyBkZWZhdWx0IGV4Y2VwdCBmb3IKKyAgLy8gdmFsaWRhdGVfdmJtZXRhX3B1YmxpY19rZXkoKS4KKyAgQXZiSU9SZXN1bHQgcmVhZF9mcm9tX3BhcnRpdGlvbihjb25zdCBjaGFyKiBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBvdXRfbnVtX3JlYWQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gb3BzXy5yZWFkX2Zyb21fcGFydGl0aW9uKAorICAgICAgICBwYXJ0aXRpb24sIG9mZnNldCwgbnVtX2J5dGVzLCBidWZmZXIsIG91dF9udW1fcmVhZCk7CisgIH0KKworICBBdmJJT1Jlc3VsdCB3cml0ZV90b19wYXJ0aXRpb24oY29uc3QgY2hhciogcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG9wc18ud3JpdGVfdG9fcGFydGl0aW9uKHBhcnRpdGlvbiwgb2Zmc2V0LCBudW1fYnl0ZXMsIGJ1ZmZlcik7CisgIH0KKworICBBdmJJT1Jlc3VsdCB2YWxpZGF0ZV92Ym1ldGFfcHVibGljX2tleShBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcHVibGljX2tleV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHVibGljX2tleV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHB1YmxpY19rZXlfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwdWJsaWNfa2V5X21ldGFkYXRhX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogb3V0X2tleV9pc190cnVzdGVkKSBvdmVycmlkZSB7CisgICAgLy8gU2VuZCB0byBBVFggaW1wbGVtZW50YXRpb24uCisgICAgKytudW1fYXR4X2NhbGxzXzsKKyAgICByZXR1cm4gYXZiX2F0eF92YWxpZGF0ZV92Ym1ldGFfcHVibGljX2tleShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNfa2V5X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljX2tleV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljX2tleV9tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNfa2V5X21ldGFkYXRhX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfa2V5X2lzX3RydXN0ZWQpOworICB9CisKKyAgQXZiSU9SZXN1bHQgcmVhZF9yb2xsYmFja19pbmRleChBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm9sbGJhY2tfaW5kZXhfc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogb3V0X3JvbGxiYWNrX2luZGV4KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG9wc18ucmVhZF9yb2xsYmFja19pbmRleCgKKyAgICAgICAgb3BzLCByb2xsYmFja19pbmRleF9zbG90LCBvdXRfcm9sbGJhY2tfaW5kZXgpOworICB9CisKKyAgQXZiSU9SZXN1bHQgd3JpdGVfcm9sbGJhY2tfaW5kZXgoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByb2xsYmFja19pbmRleF9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCByb2xsYmFja19pbmRleCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBvcHNfLndyaXRlX3JvbGxiYWNrX2luZGV4KG9wcywgcm9sbGJhY2tfaW5kZXhfc2xvdCwgcm9sbGJhY2tfaW5kZXgpOworICB9CisKKyAgQXZiSU9SZXN1bHQgcmVhZF9pc19kZXZpY2VfdW5sb2NrZWQoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIG91dF9pc19kZXZpY2VfdW5sb2NrZWQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gb3BzXy5yZWFkX2lzX2RldmljZV91bmxvY2tlZChvcHMsIG91dF9pc19kZXZpY2VfdW5sb2NrZWQpOworICB9CisKKyAgQXZiSU9SZXN1bHQgZ2V0X3VuaXF1ZV9ndWlkX2Zvcl9wYXJ0aXRpb24oQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZ3VpZF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBndWlkX2J1Zl9zaXplKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG9wc18uZ2V0X3VuaXF1ZV9ndWlkX2Zvcl9wYXJ0aXRpb24oCisgICAgICAgIG9wcywgcGFydGl0aW9uLCBndWlkX2J1ZiwgZ3VpZF9idWZfc2l6ZSk7CisgIH0KKworICBBdmJJT1Jlc3VsdCByZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzKAorICAgICAgQXZiQXR4UGVybWFuZW50QXR0cmlidXRlcyogYXR0cmlidXRlcykgb3ZlcnJpZGUgeworICAgIHJldHVybiBvcHNfLnJlYWRfcGVybWFuZW50X2F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgIH0KKworICBBdmJJT1Jlc3VsdCByZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2goCisgICAgICB1aW50OF90IGhhc2hbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV0pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gb3BzXy5yZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2goaGFzaCk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgRmFrZUF2Yk9wcyBvcHNfOworICBBdmJBdHhQZXJtYW5lbnRBdHRyaWJ1dGVzIGF0dHJpYnV0ZXNfOworICBpbnQgbnVtX2F0eF9jYWxsc18gPSAwOworCisgcHJpdmF0ZToKKyAgdm9pZCBSZWFkQXR4RGVmYXVsdERhdGEoKSB7CisgICAgc3RkOjpzdHJpbmcgdG1wOworICAgIEFTU0VSVF9UUlVFKAorICAgICAgICBiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKGJhc2U6OkZpbGVQYXRoKGtQZXJtYW5lbnRBdHRyaWJ1dGVzUGF0aCksICZ0bXApKTsKKyAgICBBU1NFUlRfRVEodG1wLnNpemUoKSwgc2l6ZW9mKEF2YkF0eFBlcm1hbmVudEF0dHJpYnV0ZXMpKTsKKyAgICBtZW1jcHkoJmF0dHJpYnV0ZXNfLCB0bXAuZGF0YSgpLCB0bXAuc2l6ZSgpKTsKKyAgfQorfTsKKworVEVTVF9GKEF2YkF0eFNsb3RWZXJpZnlUZXN0LCBTbG90VmVyaWZ5V2l0aEF0eCkgeworICBzdGQ6OnN0cmluZyBtZXRhZGF0YV9vcHRpb24gPSAiLS1wdWJsaWNfa2V5X21ldGFkYXRhPSI7CisgIG1ldGFkYXRhX29wdGlvbiArPSBrTWV0YWRhdGFQYXRoOworICBHZW5lcmF0ZVZCTWV0YUltYWdlKCJ2Ym1ldGFfYS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSwKKyAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV9vcHRpb24pOworCisgIG9wc18uc2V0X2V4cGVjdGVkX3B1YmxpY19rZXkoCisgICAgICBQdWJsaWNLZXlBVkIoYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIikpKTsKKworICBBdmJTbG90VmVyaWZ5RGF0YSogc2xvdF9kYXRhID0gTlVMTDsKKyAgY29uc3QgY2hhciogcmVxdWVzdGVkX3BhcnRpdGlvbnNbXSA9IHsiYm9vdCIsIE5VTEx9OworICBFWFBFQ1RfRVEoQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9zbG90X3ZlcmlmeShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzbG90X2RhdGEpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKHNsb3RfZGF0YSk7CisgIEVYUEVDVF9FUSgxLCBudW1fYXR4X2NhbGxzXyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhdmIKZGlmZiAtLWdpdCBhL2F2Yi90ZXN0L2F2Yl9zbG90X3ZlcmlmeV91bml0dGVzdC5jYyBiL2F2Yi90ZXN0L2F2Yl9zbG90X3ZlcmlmeV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWNmYjIzCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvYXZiX3Nsb3RfdmVyaWZ5X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8YmFzZS9maWxlcy9maWxlX3V0aWwuaD4KKyNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX3V0aWwuaD4KKyNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+CisKKyNpbmNsdWRlICJhdmJfdW5pdHRlc3RfdXRpbC5oIgorI2luY2x1ZGUgImZha2VfYXZiX29wcy5oIgorCituYW1lc3BhY2UgYXZiIHsKKworY2xhc3MgQXZiU2xvdFZlcmlmeVRlc3QgOiBwdWJsaWMgQmFzZUF2YlRvb2xUZXN0IHsKKyBwdWJsaWM6CisgIEF2YlNsb3RWZXJpZnlUZXN0KCkge30KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgQmFzZUF2YlRvb2xUZXN0OjpTZXRVcCgpOworICAgIG9wc18uc2V0X3BhcnRpdGlvbl9kaXIodGVzdGRpcl8pOworICAgIG9wc18uc2V0X3N0b3JlZF9yb2xsYmFja19pbmRleGVzKHt7MCwgMH0sIHsxLCAwfSwgezIsIDB9LCB7MywgMH19KTsKKyAgICBvcHNfLnNldF9zdG9yZWRfaXNfZGV2aWNlX3VubG9ja2VkKGZhbHNlKTsKKyAgfQorCisgIHZvaWQgQ21kbGluZVdpdGhIYXNodHJlZVZlcmlmaWNhdGlvbihib29sIGhhc2h0cmVlX3ZlcmlmaWNhdGlvbl9vbik7CisKKyAgRmFrZUF2Yk9wcyBvcHNfOworfTsKKworVEVTVF9GKEF2YlNsb3RWZXJpZnlUZXN0LCBCYXNpYykgeworICBHZW5lcmF0ZVZCTWV0YUltYWdlKCJ2Ym1ldGFfYS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSk7CisKKyAgb3BzXy5zZXRfZXhwZWN0ZWRfcHVibGljX2tleSgKKyAgICAgIFB1YmxpY0tleUFWQihiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSkpOworCisgIEF2YlNsb3RWZXJpZnlEYXRhKiBzbG90X2RhdGEgPSBOVUxMOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5KG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbG90X2RhdGEpKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHNsb3RfZGF0YSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuZGV2aWNlPVBBUlRVVUlEPTEyMzQtZmFrZS1ndWlkLWZvcjp2Ym1ldGFfYSAiCisgICAgICAiYW5kcm9pZGJvb3Quc2xvdF9zdWZmaXg9X2EgYW5kcm9pZGJvb3QudmJtZXRhLmRldmljZV9zdGF0ZT1sb2NrZWQgIgorICAgICAgImFuZHJvaWRib290LnZibWV0YS5oYXNoX2FsZz1zaGEyNTYgYW5kcm9pZGJvb3QudmJtZXRhLnNpemU9MTE1MiAiCisgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmRpZ2VzdD0iCisgICAgICAiNDE2MWE3ZTY1NWVhYmUxNmMzZmU3MTRkZTVkNDM3MzZlN2MwYTE5MGNmMDhkMzZjOTQ2ZDI1MDljZTA3MWU0ZCIsCisgICAgICBzdGQ6OnN0cmluZyhzbG90X2RhdGEtPmNtZGxpbmUpKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShzbG90X2RhdGEpOworfQorCitURVNUX0YoQXZiU2xvdFZlcmlmeVRlc3QsIEJhc2ljU2hhNTEyKSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YV9hLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTUxMl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKworICBvcHNfLnNldF9leHBlY3RlZF9wdWJsaWNfa2V5KAorICAgICAgUHVibGljS2V5QVZCKGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKSk7CisKKyAgQXZiU2xvdFZlcmlmeURhdGEqIHNsb3RfZGF0YSA9IE5VTEw7CisgIGNvbnN0IGNoYXIqIHJlcXVlc3RlZF9wYXJ0aXRpb25zW10gPSB7ImJvb3QiLCBOVUxMfTsKKyAgRVhQRUNUX0VRKEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3RfZGF0YSkpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgc2xvdF9kYXRhKTsKKyAgRVhQRUNUX0VRKAorICAgICAgImFuZHJvaWRib290LnZibWV0YS5kZXZpY2U9UEFSVFVVSUQ9MTIzNC1mYWtlLWd1aWQtZm9yOnZibWV0YV9hICIKKyAgICAgICJhbmRyb2lkYm9vdC5zbG90X3N1ZmZpeD1fYSBhbmRyb2lkYm9vdC52Ym1ldGEuZGV2aWNlX3N0YXRlPWxvY2tlZCAiCisgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmhhc2hfYWxnPXNoYTUxMiBhbmRyb2lkYm9vdC52Ym1ldGEuc2l6ZT0xMTUyICIKKyAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuZGlnZXN0PSIKKyAgICAgICJjYjkxM2QyZjFhODg0ZjRlMDRjMWRiNWJiMTgxZjMxMzNmZDE2YWMwMmZiMzY3YTIwZWYwNzc2YzBiMDdiMzY1NmFkMWYwODEiCisgICAgICAiZTAxOTMyY2Y3MGYzOGI4OTYwODc3NDcwYjQ0OGYxNTg4ZGZmMDIyODA4Mzg3Y2M1MmZhNzdlNzciLAorICAgICAgc3RkOjpzdHJpbmcoc2xvdF9kYXRhLT5jbWRsaW5lKSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoc2xvdF9kYXRhKTsKK30KKworVEVTVF9GKEF2YlNsb3RWZXJpZnlUZXN0LCBCYXNpY1VubG9ja2VkKSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YV9hLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKworICBvcHNfLnNldF9leHBlY3RlZF9wdWJsaWNfa2V5KAorICAgICAgUHVibGljS2V5QVZCKGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKSk7CisKKyAgb3BzXy5zZXRfc3RvcmVkX2lzX2RldmljZV91bmxvY2tlZCh0cnVlKTsKKworICBBdmJTbG90VmVyaWZ5RGF0YSogc2xvdF9kYXRhID0gTlVMTDsKKyAgY29uc3QgY2hhciogcmVxdWVzdGVkX3BhcnRpdGlvbnNbXSA9IHsiYm9vdCIsIE5VTEx9OworICBFWFBFQ1RfRVEoQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9zbG90X3ZlcmlmeShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzbG90X2RhdGEpOworICBFWFBFQ1RfRVEoCisgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmRldmljZT1QQVJUVVVJRD0xMjM0LWZha2UtZ3VpZC1mb3I6dmJtZXRhX2EgIgorICAgICAgImFuZHJvaWRib290LnNsb3Rfc3VmZml4PV9hIGFuZHJvaWRib290LnZibWV0YS5kZXZpY2Vfc3RhdGU9dW5sb2NrZWQgIgorICAgICAgImFuZHJvaWRib290LnZibWV0YS5oYXNoX2FsZz1zaGEyNTYgYW5kcm9pZGJvb3QudmJtZXRhLnNpemU9MTE1MiAiCisgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmRpZ2VzdD0iCisgICAgICAiNDE2MWE3ZTY1NWVhYmUxNmMzZmU3MTRkZTVkNDM3MzZlN2MwYTE5MGNmMDhkMzZjOTQ2ZDI1MDljZTA3MWU0ZCIsCisgICAgICBzdGQ6OnN0cmluZyhzbG90X2RhdGEtPmNtZGxpbmUpKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShzbG90X2RhdGEpOworfQorCitURVNUX0YoQXZiU2xvdFZlcmlmeVRlc3QsIFNsb3REYXRhSXNDb3JyZWN0KSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YV9hLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKworICBvcHNfLnNldF9leHBlY3RlZF9wdWJsaWNfa2V5KAorICAgICAgUHVibGljS2V5QVZCKGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKSk7CisKKyAgQXZiU2xvdFZlcmlmeURhdGEqIHNsb3RfZGF0YSA9IE5VTEw7CisgIGNvbnN0IGNoYXIqIHJlcXVlc3RlZF9wYXJ0aXRpb25zW10gPSB7ImJvb3QiLCBOVUxMfTsKKyAgRVhQRUNUX0VRKEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3RfZGF0YSkpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgc2xvdF9kYXRhKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShzbG90X2RhdGEpOworfQorCitURVNUX0YoQXZiU2xvdFZlcmlmeVRlc3QsIFdyb25nUHVibGljS2V5KSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YV9hLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKworICBBdmJTbG90VmVyaWZ5RGF0YSogc2xvdF9kYXRhID0gTlVMTDsKKyAgY29uc3QgY2hhciogcmVxdWVzdGVkX3BhcnRpdGlvbnNbXSA9IHsiYm9vdCIsIE5VTEx9OworICBFWFBFQ1RfRVEoQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9QVUJMSUNfS0VZX1JFSkVDVEVELAorICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5KG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbG90X2RhdGEpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIHNsb3RfZGF0YSk7CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1BVQkxJQ19LRVlfUkVKRUNURUQsCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzbG90X2RhdGEpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKHNsb3RfZGF0YSk7Cit9CisKK1RFU1RfRihBdmJTbG90VmVyaWZ5VGVzdCwgTm9JbWFnZSkgeworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisgIEF2YlNsb3RWZXJpZnlEYXRhKiBzbG90X2RhdGEgPSBOVUxMOworICBFWFBFQ1RfRVEoQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9JTywKKyAgICAgICAgICAgIGF2Yl9zbG90X3ZlcmlmeShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBzbG90X2RhdGEpOworfQorCitURVNUX0YoQXZiU2xvdFZlcmlmeVRlc3QsIFVuc2lnbmVkVkJNZXRhKSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YV9hLmltZyIsICIiLCAwLCBiYXNlOjpGaWxlUGF0aCgiIikpOworCisgIEF2YlNsb3RWZXJpZnlEYXRhKiBzbG90X2RhdGEgPSBOVUxMOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1ZFUklGSUNBVElPTiwKKyAgICAgICAgICAgIGF2Yl9zbG90X3ZlcmlmeShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBzbG90X2RhdGEpOworICBFWFBFQ1RfRVEoQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9WRVJJRklDQVRJT04sCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzbG90X2RhdGEpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKHNsb3RfZGF0YSk7Cit9CisKK1RFU1RfRihBdmJTbG90VmVyaWZ5VGVzdCwgQ29ycnVwdGVkSW1hZ2UpIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhX2EuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU0hBMjU2X1JTQTIwNDgiLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIikpOworCisgIC8vIENvcnJ1cHQgZm91ciBieXRlcyBvZiBkYXRhIGluIHRoZSBlbmQgb2YgdGhlIGltYWdlLiBTaW5jZSB0aGUgYXV4CisgIC8vIGRhdGEgaXMgYXQgdGhlIGVuZCBhbmQgdGhpcyBkYXRhIGlzIHNpZ25lZCwgdGhpcyB3aWxsIGNoYW5nZSB0aGUKKyAgLy8gdmFsdWUgb2YgdGhlIGNvbXB1dGVkIGhhc2guCisgIHVpbnQ4X3QgY29ycnVwdF9kYXRhWzRdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywKKyAgICAgICAgICAgIG9wc18uYXZiX29wcygpLT53cml0ZV90b19wYXJ0aXRpb24ob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2Ym1ldGFfYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00LCAgLy8gb2Zmc2V0IGZyb20gZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBjb3JydXB0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJ1cHRfZGF0YSkpOworCisgIEF2YlNsb3RWZXJpZnlEYXRhKiBzbG90X2RhdGEgPSBOVUxMOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1ZFUklGSUNBVElPTiwKKyAgICAgICAgICAgIGF2Yl9zbG90X3ZlcmlmeShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBzbG90X2RhdGEpOworICBFWFBFQ1RfRVEoQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9WRVJJRklDQVRJT04sCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzbG90X2RhdGEpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKHNsb3RfZGF0YSk7Cit9CisKK1RFU1RfRihBdmJTbG90VmVyaWZ5VGVzdCwgQ29ycnVwdGVkTWV0YWRhdGEpIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhX2EuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU0hBMjU2X1JTQTIwNDgiLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIikpOworCisgIC8vIENvcnJ1cHQgZm91ciBieXRlcyBvZiBkYXRhIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGltYWdlLiBVbmxpa2UKKyAgLy8gdGhlIENvcnJ1cHRlZEltYWdlIHRlc3QtY2FzZSBhYm92ZSAod2hpY2ggaXMgdmFsaWQgbWV0YWRhdGEpIHRoaXMKKyAgLy8gd2lsbCBtYWtlIHRoZSBtZXRhZGF0YSBpbnZhbGlkIGFuZCByZW5kZXIgdGhlIHNsb3QgdW5ib290YWJsZQorICAvLyBldmVuIGlmIHRoZSBkZXZpY2UgaXMgdW5sb2NrZWQuIFNwZWNpZmljYWxseSBubyBBdmJTbG90VmVyaWZ5RGF0YQorICAvLyBpcyByZXR1cm5lZC4KKyAgdWludDhfdCBjb3JydXB0X2RhdGFbNF0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLAorICAgICAgICAgICAgb3BzXy5hdmJfb3BzKCktPndyaXRlX3RvX3BhcnRpdGlvbihvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZibWV0YV9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIG9mZnNldDogYmVnaW5uaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBjb3JydXB0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJ1cHRfZGF0YSkpOworCisgIEF2YlNsb3RWZXJpZnlEYXRhKiBzbG90X2RhdGEgPSBOVUxMOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lOVkFMSURfTUVUQURBVEEsCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3RfZGF0YSkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgc2xvdF9kYXRhKTsKK30KKworVEVTVF9GKEF2YlNsb3RWZXJpZnlUZXN0LCBSb2xsYmFja0luZGV4KSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YV9hLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICA0MiwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSk7CisKKyAgb3BzXy5zZXRfZXhwZWN0ZWRfcHVibGljX2tleSgKKyAgICAgIFB1YmxpY0tleUFWQihiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSkpOworCisgIEF2YlNsb3RWZXJpZnlEYXRhKiBzbG90X2RhdGEgPSBOVUxMOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisKKyAgLy8gRmlyc3QgdHJ5IHdpdGggNDIgYXMgdGhlIHN0b3JlZCByb2xsYmFjayBpbmRleCAtIHRoaXMgc2hvdWxkCisgIC8vIHN1Y2NlZWQgc2luY2UgdGhlIGltYWdlIHJvbGxiYWNrIGluZGV4IGlzIDQyIChhcyBzZXQgYWJvdmUpLgorICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcyh7ezAsIDQyfX0pOworICBFWFBFQ1RfRVEoQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9zbG90X3ZlcmlmeShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzbG90X2RhdGEpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKHNsb3RfZGF0YSk7CisKKyAgLy8gVGhlbiB0cnkgd2l0aCA0MyBmb3IgdGhlIHN0b3JlZCByb2xsYmFjayBpbmRleCAtIHRoaXMgc2hvdWxkIGZhaWwKKyAgLy8gYmVjYXVzZSB0aGUgaW1hZ2UgaGFzIHJvbGxiYWNrIGluZGV4IDQyIHdoaWNoIGlzIGxlc3MgdGhhbiA0My4KKyAgb3BzXy5zZXRfc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXMoe3swLCA0M319KTsKKyAgRVhQRUNUX0VRKEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfUk9MTEJBQ0tfSU5ERVgsCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3RfZGF0YSkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgc2xvdF9kYXRhKTsKKyAgRVhQRUNUX0VRKEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfUk9MTEJBQ0tfSU5ERVgsCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzbG90X2RhdGEpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKHNsb3RfZGF0YSk7Cit9CisKK1RFU1RfRihBdmJTbG90VmVyaWZ5VGVzdCwgSGFzaERlc2NyaXB0b3JJblZCTWV0YSkgeworICBjb25zdCBzaXplX3QgYm9vdF9wYXJ0aXRpb25fc2l6ZSA9IDE2ICogMTAyNCAqIDEwMjQ7CisgIGNvbnN0IHNpemVfdCBib290X2ltYWdlX3NpemUgPSA1ICogMTAyNCAqIDEwMjQ7CisgIGJhc2U6OkZpbGVQYXRoIGJvb3RfcGF0aCA9IEdlbmVyYXRlSW1hZ2UoImJvb3RfYS5pbWciLCBib290X2ltYWdlX3NpemUpOworCisgIEVYUEVDVF9DT01NQU5EKAorICAgICAgMCwKKyAgICAgICIuL2F2YnRvb2wgYWRkX2hhc2hfZm9vdGVyIgorICAgICAgIiAtLWltYWdlICVzIgorICAgICAgIiAtLXJvbGxiYWNrX2luZGV4IDAiCisgICAgICAiIC0tcGFydGl0aW9uX25hbWUgYm9vdCIKKyAgICAgICIgLS1wYXJ0aXRpb25fc2l6ZSAlemQiCisgICAgICAiIC0ta2VybmVsX2NtZGxpbmUgJ2NtZGxpbmUgaW4gaGFzaCBmb290ZXIgJChBTkRST0lEX1NZU1RFTV9QQVJUVVVJRCknIgorICAgICAgIiAtLXNhbHQgZGVhZGJlZWYiLAorICAgICAgYm9vdF9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgIGJvb3RfcGFydGl0aW9uX3NpemUpOworCisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoCisgICAgICAidmJtZXRhX2EuaW1nIiwKKyAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICA0LAorICAgICAgYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIiksCisgICAgICBiYXNlOjpTdHJpbmdQcmludGYoCisgICAgICAgICAgIi0taW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlICVzIgorICAgICAgICAgICIgLS1rZXJuZWxfY21kbGluZSAnY21kbGluZSBpbiB2Ym1ldGEgJChBTkRST0lEX0JPT1RfUEFSVFVVSUQpJyIsCisgICAgICAgICAgYm9vdF9wYXRoLnZhbHVlKCkuY19zdHIoKSkpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJWQk1ldGEgaW1hZ2UgdmVyc2lvbjogICAgIDEuMFxuIgorICAgICAgIkhlYWRlciBCbG9jazogICAgICAgICAgICAgMjU2IGJ5dGVzXG4iCisgICAgICAiQXV0aGVudGljYXRpb24gQmxvY2s6ICAgICAzMjAgYnl0ZXNcbiIKKyAgICAgICJBdXhpbGlhcnkgQmxvY2s6ICAgICAgICAgIDg5NiBieXRlc1xuIgorICAgICAgIkFsZ29yaXRobTogICAgICAgICAgICAgICAgU0hBMjU2X1JTQTIwNDhcbiIKKyAgICAgICJSb2xsYmFjayBJbmRleDogICAgICAgICAgIDRcbiIKKyAgICAgICJGbGFnczogICAgICAgICAgICAgICAgICAgIDBcbiIKKyAgICAgICJEZXNjcmlwdG9yczpcbiIKKyAgICAgICIgICAgS2VybmVsIENtZGxpbmUgZGVzY3JpcHRvcjpcbiIKKyAgICAgICIgICAgICBGbGFnczogICAgICAgICAgICAgICAgIDBcbiIKKyAgICAgICIgICAgICBLZXJuZWwgQ21kbGluZTogICAgICAgICdjbWRsaW5lIGluIHZibWV0YSAiCisgICAgICAiJChBTkRST0lEX0JPT1RfUEFSVFVVSUQpJ1xuIgorICAgICAgIiAgICBIYXNoIGRlc2NyaXB0b3I6XG4iCisgICAgICAiICAgICAgSW1hZ2UgU2l6ZTogICAgICAgICAgICA1MjQyODgwIGJ5dGVzXG4iCisgICAgICAiICAgICAgSGFzaCBBbGdvcml0aG06ICAgICAgICBzaGEyNTZcbiIKKyAgICAgICIgICAgICBQYXJ0aXRpb24gTmFtZTogICAgICAgIGJvb3RcbiIKKyAgICAgICIgICAgICBTYWx0OiAgICAgICAgICAgICAgICAgIGRlYWRiZWVmXG4iCisgICAgICAiICAgICAgRGlnZXN0OiAgICAgICAgICAgICAgICAiCisgICAgICAiMTg0Y2IzNjI0M2FkYjhiODdkMmQ4YzQ4MDJkZTMyMTI1ZmUyOTRlYzQ2NzUzZDczMjE0NGVlNjVkZjY4YTIzZFxuIgorICAgICAgIiAgICBLZXJuZWwgQ21kbGluZSBkZXNjcmlwdG9yOlxuIgorICAgICAgIiAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIiAgICAgIEtlcm5lbCBDbWRsaW5lOiAgICAgICAgJ2NtZGxpbmUgaW4gaGFzaCBmb290ZXIgIgorICAgICAgIiQoQU5EUk9JRF9TWVNURU1fUEFSVFVVSUQpJ1xuIiwKKyAgICAgIEluZm9JbWFnZSh2Ym1ldGFfaW1hZ2VfcGF0aF8pKTsKKworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIGVyYXNlX2Zvb3RlciIKKyAgICAgICAgICAgICAgICAgIiAtLWltYWdlICVzIiwKKyAgICAgICAgICAgICAgICAgYm9vdF9wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgLy8gV2l0aCBubyBmb290ZXIsICdhdmJ0b29sIGluZm9faW1hZ2UnIHNob3VsZCBmYWlsIChleGl0IHN0YXR1cyAxKS4KKyAgRVhQRUNUX0NPTU1BTkQoCisgICAgICAxLCAiLi9hdmJ0b29sIGluZm9faW1hZ2UgLS1pbWFnZSAlcyIsIGJvb3RfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworCisgIG9wc18uc2V0X2V4cGVjdGVkX3B1YmxpY19rZXkoCisgICAgICBQdWJsaWNLZXlBVkIoYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIikpKTsKKworICBBdmJTbG90VmVyaWZ5RGF0YSogc2xvdF9kYXRhID0gTlVMTDsKKyAgY29uc3QgY2hhciogcmVxdWVzdGVkX3BhcnRpdGlvbnNbXSA9IHsiYm9vdCIsIE5VTEx9OworICBFWFBFQ1RfRVEoQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9zbG90X3ZlcmlmeShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzbG90X2RhdGEpOworCisgIC8vIE5vdyB2ZXJpZnkgdGhlIHNsb3QgZGF0YS4gVGhlIHZibWV0YSBkYXRhIHNob3VsZCBtYXRjaCBvdXIKKyAgLy8gdmJtZXRhX2ltYWdlXyBtZW1iZXIuCisgIEVYUEVDVF9FUShzaXplX3QoMSksIHNsb3RfZGF0YS0+bnVtX3ZibWV0YV9pbWFnZXMpOworICBFWFBFQ1RfRVEoInZibWV0YSIsIHN0ZDo6c3RyaW5nKHNsb3RfZGF0YS0+dmJtZXRhX2ltYWdlc1swXS5wYXJ0aXRpb25fbmFtZSkpOworICBFWFBFQ1RfRVEoc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzWzBdLnZibWV0YV9zaXplLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgbWVtY21wKHZibWV0YV9pbWFnZV8uZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIHNsb3RfZGF0YS0+dmJtZXRhX2ltYWdlc1swXS52Ym1ldGFfZGF0YSwKKyAgICAgICAgICAgICAgICAgICBzbG90X2RhdGEtPnZibWV0YV9pbWFnZXNbMF0udmJtZXRhX3NpemUpKTsKKworICAvLyBUaGUgYm9vdCBpbWFnZSBkYXRhIHNob3VsZCBtYXRjaCB3aGF0IGlzIGdlbmVyYXRlZCBhYm92ZSB3aXRoCisgIC8vIEdlbmVyYXRlSW1hZ2UoKS4KKyAgRVhQRUNUX0VRKHNpemVfdCgxKSwgc2xvdF9kYXRhLT5udW1fbG9hZGVkX3BhcnRpdGlvbnMpOworICBFWFBFQ1RfRVEoImJvb3QiLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoc2xvdF9kYXRhLT5sb2FkZWRfcGFydGl0aW9uc1swXS5wYXJ0aXRpb25fbmFtZSkpOworICBFWFBFQ1RfRVEoYm9vdF9pbWFnZV9zaXplLCBzbG90X2RhdGEtPmxvYWRlZF9wYXJ0aXRpb25zWzBdLmRhdGFfc2l6ZSk7CisgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgc2xvdF9kYXRhLT5sb2FkZWRfcGFydGl0aW9uc1swXS5kYXRhX3NpemU7IG4rKykgeworICAgIEVYUEVDVF9FUShzbG90X2RhdGEtPmxvYWRlZF9wYXJ0aXRpb25zWzBdLmRhdGFbbl0sIHVpbnQ4X3QobikpOworICB9CisKKyAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIHR3byBjbWRsaW5lcyB3aXRoIGEgc3BhY2UgKFUrMDAyMCkgYmV0d2VlbgorICAvLyB0aGVtIGFuZCB0aGUgJChBTkRST0lEX1NZU1RFTV9QQVJUVVVJRCkgYW5kCisgIC8vICQoQU5EUk9JRF9CT09UX1BBUlRVVUlEKSB2YXJpYWJsZXMgcmVwbGFjZWQuCisgIEVYUEVDVF9FUSgKKyAgICAgICJjbWRsaW5lIGluIHZibWV0YSAxMjM0LWZha2UtZ3VpZC1mb3I6Ym9vdF9hIGNtZGxpbmUgaW4gaGFzaCBmb290ZXIgIgorICAgICAgIjEyMzQtZmFrZS1ndWlkLWZvcjpzeXN0ZW1fYSAiCisgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmRldmljZT1QQVJUVVVJRD0xMjM0LWZha2UtZ3VpZC1mb3I6dmJtZXRhX2EgIgorICAgICAgImFuZHJvaWRib290LnNsb3Rfc3VmZml4PV9hIGFuZHJvaWRib290LnZibWV0YS5kZXZpY2Vfc3RhdGU9bG9ja2VkICIKKyAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuaGFzaF9hbGc9c2hhMjU2IGFuZHJvaWRib290LnZibWV0YS5zaXplPTE0NzIgIgorICAgICAgImFuZHJvaWRib290LnZibWV0YS5kaWdlc3Q9IgorICAgICAgIjM0Y2RiNTliOTU1YWEzNWQ0ZGE5NzcwMWYzMDRmYWJmNzM5MmVlY2NhOGM1MGZmMWEwYjdiNmUxYzlhYWExYjgiLAorICAgICAgc3RkOjpzdHJpbmcoc2xvdF9kYXRhLT5jbWRsaW5lKSk7CisgIEVYUEVDVF9FUSg0VUwsIHNsb3RfZGF0YS0+cm9sbGJhY2tfaW5kZXhlc1swXSk7CisgIGZvciAoc2l6ZV90IG4gPSAxOyBuIDwgQVZCX01BWF9OVU1CRVJfT0ZfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT05TOyBuKyspIHsKKyAgICBFWFBFQ1RfRVEoMFVMLCBzbG90X2RhdGEtPnJvbGxiYWNrX2luZGV4ZXNbbl0pOworICB9CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoc2xvdF9kYXRhKTsKK30KKworVEVTVF9GKEF2YlNsb3RWZXJpZnlUZXN0LCBIYXNoRGVzY3JpcHRvckluVkJNZXRhQ29ycnVwdEJvb3QpIHsKKyAgc2l6ZV90IGJvb3RfcGFydGl0aW9uX3NpemUgPSAxNiAqIDEwMjQgKiAxMDI0OworICBiYXNlOjpGaWxlUGF0aCBib290X3BhdGggPSBHZW5lcmF0ZUltYWdlKCJib290X2EuaW1nIiwgNSAqIDEwMjQgKiAxMDI0KTsKKyAgY29uc3QgY2hhciogcmVxdWVzdGVkX3BhcnRpdGlvbnNbXSA9IHsiYm9vdCIsIE5VTEx9OworCisgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICIuL2F2YnRvb2wgYWRkX2hhc2hfZm9vdGVyIgorICAgICAgICAgICAgICAgICAiIC0taW1hZ2UgJXMiCisgICAgICAgICAgICAgICAgICIgLS1yb2xsYmFja19pbmRleCAwIgorICAgICAgICAgICAgICAgICAiIC0tcGFydGl0aW9uX25hbWUgYm9vdCIKKyAgICAgICAgICAgICAgICAgIiAtLXBhcnRpdGlvbl9zaXplICV6ZCIKKyAgICAgICAgICAgICAgICAgIiAtLXNhbHQgZGVhZGJlZWYiLAorICAgICAgICAgICAgICAgICBib290X3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBib290X3BhcnRpdGlvbl9zaXplKTsKKworICBHZW5lcmF0ZVZCTWV0YUltYWdlKCJ2Ym1ldGFfYS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoIi0taW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdF9wYXRoLnZhbHVlKCkuY19zdHIoKSkpOworCisgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICIuL2F2YnRvb2wgZXJhc2VfZm9vdGVyIgorICAgICAgICAgICAgICAgICAiIC0taW1hZ2UgJXMiLAorICAgICAgICAgICAgICAgICBib290X3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKworICBvcHNfLnNldF9leHBlY3RlZF9wdWJsaWNfa2V5KAorICAgICAgUHVibGljS2V5QVZCKGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKSk7CisKKyAgLy8gU28gZmFyLCBzbyBnb29kLgorICBBdmJTbG90VmVyaWZ5RGF0YSogc2xvdF9kYXRhID0gTlVMTDsKKyAgRVhQRUNUX0VRKEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3RfZGF0YSkpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgc2xvdF9kYXRhKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShzbG90X2RhdGEpOworCisgIC8vIE5vdyBjb3JydXB0IGJvb3RfYS5pbWcgYW5kIGV4cGVjdCB2ZXJpZmljYXRpb24gZXJyb3IuCisgIHVpbnQ4X3QgY29ycnVwdF9kYXRhWzRdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywKKyAgICAgICAgICAgIG9wc18uYXZiX29wcygpLT53cml0ZV90b19wYXJ0aXRpb24ob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJib290X2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCwgIC8vIG9mZnNldDogMSBNaUIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIGNvcnJ1cHRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycnVwdF9kYXRhKSk7CisKKyAgRVhQRUNUX0VRKEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfVkVSSUZJQ0FUSU9OLAorICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5KG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbG90X2RhdGEpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIHNsb3RfZGF0YSk7CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1ZFUklGSUNBVElPTiwKKyAgICAgICAgICAgIGF2Yl9zbG90X3ZlcmlmeShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbG90X2RhdGEpKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHNsb3RfZGF0YSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoc2xvdF9kYXRhKTsKK30KKworVEVTVF9GKEF2YlNsb3RWZXJpZnlUZXN0LCBIYXNoRGVzY3JpcHRvckluQ2hhaW5lZFBhcnRpdGlvbikgeworICBzaXplX3QgYm9vdF9wYXJ0aXRpb25fc2l6ZSA9IDE2ICogMTAyNCAqIDEwMjQ7CisgIGNvbnN0IHNpemVfdCBib290X2ltYWdlX3NpemUgPSA1ICogMTAyNCAqIDEwMjQ7CisgIGJhc2U6OkZpbGVQYXRoIGJvb3RfcGF0aCA9IEdlbmVyYXRlSW1hZ2UoImJvb3RfYS5pbWciLCBib290X2ltYWdlX3NpemUpOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBhZGRfaGFzaF9mb290ZXIiCisgICAgICAgICAgICAgICAgICIgLS1pbWFnZSAlcyIKKyAgICAgICAgICAgICAgICAgIiAtLWtlcm5lbF9jbWRsaW5lICdjbWRsaW5lMiBpbiBoYXNoIGZvb3RlciciCisgICAgICAgICAgICAgICAgICIgLS1yb2xsYmFja19pbmRleCAxMiIKKyAgICAgICAgICAgICAgICAgIiAtLXBhcnRpdGlvbl9uYW1lIGJvb3QiCisgICAgICAgICAgICAgICAgICIgLS1wYXJ0aXRpb25fc2l6ZSAlemQiCisgICAgICAgICAgICAgICAgICIgLS1hbGdvcml0aG0gU0hBMjU2X1JTQTQwOTYiCisgICAgICAgICAgICAgICAgICIgLS1rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhNDA5Ni5wZW0iCisgICAgICAgICAgICAgICAgICIgLS1zYWx0IGRlYWRiZWVmIiwKKyAgICAgICAgICAgICAgICAgYm9vdF9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgYm9vdF9wYXJ0aXRpb25fc2l6ZSk7CisKKyAgYmFzZTo6RmlsZVBhdGggcGtfcGF0aCA9IHRlc3RkaXJfLkFwcGVuZCgidGVzdGtleV9yc2E0MDk2LmF2YnB1YmtleSIpOworICBFWFBFQ1RfQ09NTUFORCgKKyAgICAgIDAsCisgICAgICAiLi9hdmJ0b29sIGV4dHJhY3RfcHVibGljX2tleSAtLWtleSB0ZXN0L2RhdGEvdGVzdGtleV9yc2E0MDk2LnBlbSIKKyAgICAgICIgLS1vdXRwdXQgJXMiLAorICAgICAgcGtfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworCisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoCisgICAgICAidmJtZXRhX2EuaW1nIiwKKyAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAxMSwKKyAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpLAorICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCItLWNoYWluX3BhcnRpdGlvbiBib290OjE6JXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAtLWtlcm5lbF9jbWRsaW5lICdjbWRsaW5lMiBpbiB2Ym1ldGEnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwa19wYXRoLnZhbHVlKCkuY19zdHIoKSkpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJWQk1ldGEgaW1hZ2UgdmVyc2lvbjogICAgIDEuMFxuIgorICAgICAgIkhlYWRlciBCbG9jazogICAgICAgICAgICAgMjU2IGJ5dGVzXG4iCisgICAgICAiQXV0aGVudGljYXRpb24gQmxvY2s6ICAgICAzMjAgYnl0ZXNcbiIKKyAgICAgICJBdXhpbGlhcnkgQmxvY2s6ICAgICAgICAgIDE3MjggYnl0ZXNcbiIKKyAgICAgICJBbGdvcml0aG06ICAgICAgICAgICAgICAgIFNIQTI1Nl9SU0EyMDQ4XG4iCisgICAgICAiUm9sbGJhY2sgSW5kZXg6ICAgICAgICAgICAxMVxuIgorICAgICAgIkZsYWdzOiAgICAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIkRlc2NyaXB0b3JzOlxuIgorICAgICAgIiAgICBDaGFpbiBQYXJ0aXRpb24gZGVzY3JpcHRvcjpcbiIKKyAgICAgICIgICAgICBQYXJ0aXRpb24gTmFtZTogICAgICAgICAgYm9vdFxuIgorICAgICAgIiAgICAgIFJvbGxiYWNrIEluZGV4IExvY2F0aW9uOiAxXG4iCisgICAgICAiICAgICAgUHVibGljIGtleSAoc2hhMSk6ICAgICAgICIKKyAgICAgICIyNTk3YzIxOGFhZTQ3MGExMzBmNjExNjJmZWFhZTcwYWZkOTdmMDExXG4iCisgICAgICAiICAgIEtlcm5lbCBDbWRsaW5lIGRlc2NyaXB0b3I6XG4iCisgICAgICAiICAgICAgRmxhZ3M6ICAgICAgICAgICAgICAgICAwXG4iCisgICAgICAiICAgICAgS2VybmVsIENtZGxpbmU6ICAgICAgICAnY21kbGluZTIgaW4gdmJtZXRhJ1xuIiwKKyAgICAgIEluZm9JbWFnZSh2Ym1ldGFfaW1hZ2VfcGF0aF8pKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAiRm9vdGVyIHZlcnNpb246ICAgICAgICAgICAxLjBcbiIKKyAgICAgICJJbWFnZSBzaXplOiAgICAgICAgICAgICAgIDE2Nzc3MjE2IGJ5dGVzXG4iCisgICAgICAiT3JpZ2luYWwgaW1hZ2Ugc2l6ZTogICAgICA1MjQyODgwIGJ5dGVzXG4iCisgICAgICAiVkJNZXRhIG9mZnNldDogICAgICAgICAgICA1MjQyODgwXG4iCisgICAgICAiVkJNZXRhIHNpemU6ICAgICAgICAgICAgICAyMTEyIGJ5dGVzXG4iCisgICAgICAiLS1cbiIKKyAgICAgICJWQk1ldGEgaW1hZ2UgdmVyc2lvbjogICAgIDEuMFxuIgorICAgICAgIkhlYWRlciBCbG9jazogICAgICAgICAgICAgMjU2IGJ5dGVzXG4iCisgICAgICAiQXV0aGVudGljYXRpb24gQmxvY2s6ICAgICA1NzYgYnl0ZXNcbiIKKyAgICAgICJBdXhpbGlhcnkgQmxvY2s6ICAgICAgICAgIDEyODAgYnl0ZXNcbiIKKyAgICAgICJBbGdvcml0aG06ICAgICAgICAgICAgICAgIFNIQTI1Nl9SU0E0MDk2XG4iCisgICAgICAiUm9sbGJhY2sgSW5kZXg6ICAgICAgICAgICAxMlxuIgorICAgICAgIkZsYWdzOiAgICAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIkRlc2NyaXB0b3JzOlxuIgorICAgICAgIiAgICBIYXNoIGRlc2NyaXB0b3I6XG4iCisgICAgICAiICAgICAgSW1hZ2UgU2l6ZTogICAgICAgICAgICA1MjQyODgwIGJ5dGVzXG4iCisgICAgICAiICAgICAgSGFzaCBBbGdvcml0aG06ICAgICAgICBzaGEyNTZcbiIKKyAgICAgICIgICAgICBQYXJ0aXRpb24gTmFtZTogICAgICAgIGJvb3RcbiIKKyAgICAgICIgICAgICBTYWx0OiAgICAgICAgICAgICAgICAgIGRlYWRiZWVmXG4iCisgICAgICAiICAgICAgRGlnZXN0OiAgICAgICAgICAgICAgICAiCisgICAgICAiMTg0Y2IzNjI0M2FkYjhiODdkMmQ4YzQ4MDJkZTMyMTI1ZmUyOTRlYzQ2NzUzZDczMjE0NGVlNjVkZjY4YTIzZFxuIgorICAgICAgIiAgICBLZXJuZWwgQ21kbGluZSBkZXNjcmlwdG9yOlxuIgorICAgICAgIiAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIiAgICAgIEtlcm5lbCBDbWRsaW5lOiAgICAgICAgJ2NtZGxpbmUyIGluIGhhc2ggZm9vdGVyJ1xuIiwKKyAgICAgIEluZm9JbWFnZShib290X3BhdGgpKTsKKworICBvcHNfLnNldF9leHBlY3RlZF9wdWJsaWNfa2V5KAorICAgICAgUHVibGljS2V5QVZCKGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKSk7CisKKyAgQXZiU2xvdFZlcmlmeURhdGEqIHNsb3RfZGF0YSA9IE5VTEw7CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5KG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbG90X2RhdGEpKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHNsb3RfZGF0YSk7CisKKyAgLy8gTm93IHZlcmlmeSB0aGUgc2xvdCBkYXRhLiBXZSBzaG91bGQgaGF2ZSB0d28gdmJtZXRhCisgIC8vIHN0cnVjdHMuIFZlcmlmeSBib3RoIG9mIHRoZW0uIE5vdGUgdGhhdCB0aGUgQS9CIHN1ZmZpeCBpc24ndAorICAvLyBhcHBlbmRlZC4KKyAgRVhQRUNUX0VRKHNpemVfdCgyKSwgc2xvdF9kYXRhLT5udW1fdmJtZXRhX2ltYWdlcyk7CisgIEVYUEVDVF9FUSgidmJtZXRhIiwgc3RkOjpzdHJpbmcoc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzWzBdLnBhcnRpdGlvbl9uYW1lKSk7CisgIEVYUEVDVF9FUShzbG90X2RhdGEtPnZibWV0YV9pbWFnZXNbMF0udmJtZXRhX3NpemUsIHZibWV0YV9pbWFnZV8uc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICBtZW1jbXAodmJtZXRhX2ltYWdlXy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzWzBdLnZibWV0YV9kYXRhLAorICAgICAgICAgICAgICAgICAgIHNsb3RfZGF0YS0+dmJtZXRhX2ltYWdlc1swXS52Ym1ldGFfc2l6ZSkpOworICAvLyBBbmQgZm9yIHRoZSBzZWNvbmQgdmJtZXRhIHN0cnVjdCB3ZSBjaGVjayB0aGF0IHRoZSBkZXNjcmlwdG9ycworICAvLyBtYXRjaCB0aGUgaW5mb19pbWFnZSBvdXRwdXQgZnJvbSBhYm92ZS4KKyAgRVhQRUNUX0VRKCJib290Iiwgc3RkOjpzdHJpbmcoc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzWzFdLnBhcnRpdGlvbl9uYW1lKSk7CisgIGNvbnN0IEF2YkRlc2NyaXB0b3IqKiBkZXNjcmlwdG9ycyA9CisgICAgICBhdmJfZGVzY3JpcHRvcl9nZXRfYWxsKHNsb3RfZGF0YS0+dmJtZXRhX2ltYWdlc1sxXS52Ym1ldGFfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzWzFdLnZibWV0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIGRlc2NyaXB0b3JzKTsKKyAgQXZiSGFzaERlc2NyaXB0b3IgaGFzaF9kZXNjOworICBFWFBFQ1RfRVEodHJ1ZSwKKyAgICAgICAgICAgIGF2Yl9oYXNoX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKAorICAgICAgICAgICAgICAgICgoQXZiSGFzaERlc2NyaXB0b3IqKWRlc2NyaXB0b3JzWzBdKSwgJmhhc2hfZGVzYykpOworICBjb25zdCB1aW50OF90KiBkZXNjX2VuZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRlc2NyaXB0b3JzWzBdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEF2Ykhhc2hEZXNjcmlwdG9yKTsKKyAgdWludDY0X3QgbyA9IDA7CisgIEVYUEVDVF9FUSgiYm9vdCIsCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkZXNjX2VuZCArIG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9kZXNjLnBhcnRpdGlvbl9uYW1lX2xlbikpOworICBvICs9IGhhc2hfZGVzYy5wYXJ0aXRpb25fbmFtZV9sZW47CisgIEVYUEVDVF9FUSgiZGVhZGJlZWYiLCBtZW1fdG9faGV4c3RyaW5nKGRlc2NfZW5kICsgbywgaGFzaF9kZXNjLnNhbHRfbGVuKSk7CisgIG8gKz0gaGFzaF9kZXNjLnNhbHRfbGVuOworICBFWFBFQ1RfRVEoIjE4NGNiMzYyNDNhZGI4Yjg3ZDJkOGM0ODAyZGUzMjEyNWZlMjk0ZWM0Njc1M2Q3MzIxNDRlZTY1ZGY2OGEyM2QiLAorICAgICAgICAgICAgbWVtX3RvX2hleHN0cmluZyhkZXNjX2VuZCArIG8sIGhhc2hfZGVzYy5kaWdlc3RfbGVuKSk7CisgIEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yIGNtZGxpbmVfZGVzYzsKKyAgRVhQRUNUX0VRKHRydWUsCisgICAgICAgICAgICBhdmJfa2VybmVsX2NtZGxpbmVfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoCisgICAgICAgICAgICAgICAgKChBdmJLZXJuZWxDbWRsaW5lRGVzY3JpcHRvciopZGVzY3JpcHRvcnNbMV0pLCAmY21kbGluZV9kZXNjKSk7CisgIGRlc2NfZW5kID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGVzY3JpcHRvcnNbMV0pICsKKyAgICAgICAgICAgICBzaXplb2YoQXZiS2VybmVsQ21kbGluZURlc2NyaXB0b3IpOworICBFWFBFQ1RfRVEoImNtZGxpbmUyIGluIGhhc2ggZm9vdGVyIiwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRlc2NfZW5kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZGxpbmVfZGVzYy5rZXJuZWxfY21kbGluZV9sZW5ndGgpKTsKKyAgYXZiX2ZyZWUoZGVzY3JpcHRvcnMpOworCisgIC8vIFRoZSBib290IGltYWdlIGRhdGEgc2hvdWxkIG1hdGNoIHdoYXQgaXMgZ2VuZXJhdGVkIGFib3ZlIHdpdGgKKyAgLy8gR2VuZXJhdGVJbWFnZSgpLgorICBFWFBFQ1RfRVEoc2l6ZV90KDEpLCBzbG90X2RhdGEtPm51bV9sb2FkZWRfcGFydGl0aW9ucyk7CisgIEVYUEVDVF9FUSgiYm9vdCIsCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhzbG90X2RhdGEtPmxvYWRlZF9wYXJ0aXRpb25zWzBdLnBhcnRpdGlvbl9uYW1lKSk7CisgIEVYUEVDVF9FUShib290X2ltYWdlX3NpemUsIHNsb3RfZGF0YS0+bG9hZGVkX3BhcnRpdGlvbnNbMF0uZGF0YV9zaXplKTsKKyAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBzbG90X2RhdGEtPmxvYWRlZF9wYXJ0aXRpb25zWzBdLmRhdGFfc2l6ZTsgbisrKSB7CisgICAgRVhQRUNUX0VRKHNsb3RfZGF0YS0+bG9hZGVkX3BhcnRpdGlvbnNbMF0uZGF0YVtuXSwgdWludDhfdChuKSk7CisgIH0KKworICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0aGUgdHdvIGNtZGxpbmVzIHdpdGggYSBzcGFjZSAoVSswMDIwKSBiZXR3ZWVuIHRoZW0uCisgIEVYUEVDVF9FUSgKKyAgICAgICJjbWRsaW5lMiBpbiBoYXNoIGZvb3RlciBjbWRsaW5lMiBpbiB2Ym1ldGEgIgorICAgICAgImFuZHJvaWRib290LnZibWV0YS5kZXZpY2U9UEFSVFVVSUQ9MTIzNC1mYWtlLWd1aWQtZm9yOnZibWV0YV9hICIKKyAgICAgICJhbmRyb2lkYm9vdC5zbG90X3N1ZmZpeD1fYSBhbmRyb2lkYm9vdC52Ym1ldGEuZGV2aWNlX3N0YXRlPWxvY2tlZCAiCisgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmhhc2hfYWxnPXNoYTI1NiBhbmRyb2lkYm9vdC52Ym1ldGEuc2l6ZT00NDE2ICIKKyAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuZGlnZXN0PSIKKyAgICAgICI0YTQ1ZmFhOWFkZmViOTRlOTE1NGZlNjgyYzExZmVmMWExYTNkODI5YjY3Y2JmMWExMmFjN2YwYWE0ZjhlMmU0IiwKKyAgICAgIHN0ZDo6c3RyaW5nKHNsb3RfZGF0YS0+Y21kbGluZSkpOworICBFWFBFQ1RfRVEoMTFVTCwgc2xvdF9kYXRhLT5yb2xsYmFja19pbmRleGVzWzBdKTsKKyAgRVhQRUNUX0VRKDEyVUwsIHNsb3RfZGF0YS0+cm9sbGJhY2tfaW5kZXhlc1sxXSk7CisgIGZvciAoc2l6ZV90IG4gPSAyOyBuIDwgQVZCX01BWF9OVU1CRVJfT0ZfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT05TOyBuKyspIHsKKyAgICBFWFBFQ1RfRVEoMFVMLCBzbG90X2RhdGEtPnJvbGxiYWNrX2luZGV4ZXNbbl0pOworICB9CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoc2xvdF9kYXRhKTsKK30KKworVEVTVF9GKEF2YlNsb3RWZXJpZnlUZXN0LCBIYXNoRGVzY3JpcHRvckluQ2hhaW5lZFBhcnRpdGlvbkNvcnJ1cHRCb290KSB7CisgIHNpemVfdCBib290X3BhcnRpdGlvbl9zaXplID0gMTYgKiAxMDI0ICogMTAyNDsKKyAgYmFzZTo6RmlsZVBhdGggYm9vdF9wYXRoID0gR2VuZXJhdGVJbWFnZSgiYm9vdF9hLmltZyIsIDUgKiAxMDI0ICogMTAyNCk7CisgIGNvbnN0IGNoYXIqIHJlcXVlc3RlZF9wYXJ0aXRpb25zW10gPSB7ImJvb3QiLCBOVUxMfTsKKworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIGFkZF9oYXNoX2Zvb3RlciIKKyAgICAgICAgICAgICAgICAgIiAtLWltYWdlICVzIgorICAgICAgICAgICAgICAgICAiIC0tcm9sbGJhY2tfaW5kZXggMCIKKyAgICAgICAgICAgICAgICAgIiAtLXBhcnRpdGlvbl9uYW1lIGJvb3QiCisgICAgICAgICAgICAgICAgICIgLS1wYXJ0aXRpb25fc2l6ZSAlemQiCisgICAgICAgICAgICAgICAgICIgLS1hbGdvcml0aG0gU0hBMjU2X1JTQTQwOTYiCisgICAgICAgICAgICAgICAgICIgLS1rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhNDA5Ni5wZW0iCisgICAgICAgICAgICAgICAgICIgLS1zYWx0IGRlYWRiZWVmIiwKKyAgICAgICAgICAgICAgICAgYm9vdF9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgYm9vdF9wYXJ0aXRpb25fc2l6ZSk7CisKKyAgYmFzZTo6RmlsZVBhdGggcGtfcGF0aCA9IHRlc3RkaXJfLkFwcGVuZCgidGVzdGtleV9yc2E0MDk2LmF2YnB1YmtleSIpOworICBFWFBFQ1RfQ09NTUFORCgKKyAgICAgIDAsCisgICAgICAiLi9hdmJ0b29sIGV4dHJhY3RfcHVibGljX2tleSAtLWtleSB0ZXN0L2RhdGEvdGVzdGtleV9yc2E0MDk2LnBlbSIKKyAgICAgICIgLS1vdXRwdXQgJXMiLAorICAgICAgcGtfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworCisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YV9hLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigiLS1jaGFpbl9wYXJ0aXRpb24gYm9vdDoxOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtfcGF0aC52YWx1ZSgpLmNfc3RyKCkpKTsKKworICBvcHNfLnNldF9leHBlY3RlZF9wdWJsaWNfa2V5KAorICAgICAgUHVibGljS2V5QVZCKGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKSk7CisKKyAgQXZiU2xvdFZlcmlmeURhdGEqIHNsb3RfZGF0YSA9IE5VTEw7CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5KG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbG90X2RhdGEpKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHNsb3RfZGF0YSk7CisgIGF2Yl9zbG90X3ZlcmlmeV9kYXRhX2ZyZWUoc2xvdF9kYXRhKTsKKworICAvLyBOb3cgY29ycnVwdCBib290X2EuaW1nIGFuZCBleHBlY3QgdmVyaWZpY2F0aW9uIGVycm9yLgorICB1aW50OF90IGNvcnJ1cHRfZGF0YVs0XSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssCisgICAgICAgICAgICBvcHNfLmF2Yl9vcHMoKS0+d3JpdGVfdG9fcGFydGl0aW9uKG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9vdF9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCAqIDEwMjQsICAvLyBvZmZzZXQ6IDEgTWlCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBjb3JydXB0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJ1cHRfZGF0YSkpOworCisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1ZFUklGSUNBVElPTiwKKyAgICAgICAgICAgIGF2Yl9zbG90X3ZlcmlmeShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBzbG90X2RhdGEpOworICBFWFBFQ1RfRVEoQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9WRVJJRklDQVRJT04sCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzbG90X2RhdGEpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKHNsb3RfZGF0YSk7Cit9CisKK1RFU1RfRihBdmJTbG90VmVyaWZ5VGVzdCwgSGFzaERlc2NyaXB0b3JJbkNoYWluZWRQYXJ0aXRpb25LZXlNaXNtYXRjaCkgeworICBzaXplX3QgYm9vdF9wYXJ0aXRpb25fc2l6ZSA9IDE2ICogMTAyNCAqIDEwMjQ7CisgIGJhc2U6OkZpbGVQYXRoIGJvb3RfcGF0aCA9IEdlbmVyYXRlSW1hZ2UoImJvb3RfYS5pbWciLCA1ICogMTAyNCAqIDEwMjQpOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJib290IiwgTlVMTH07CisKKyAgLy8gVXNlIGRpZmZlcmVudCBrZXkgdG8gc2lnbiB2Ym1ldGEgaW4gYm9vdF9hICh3ZSB1c2UgdGhlIDgxOTIgYml0CisgIC8vIGtleSkgdGhhbiB3aGF0J3MgaW4gdGhlIGNoYWluZWQgcGFydGl0aW9uIGRlc2NyaXB0b3IgKHdoaWNoIGlzCisgIC8vIHRoZSA0MDk2IGJpdCBrZXkpIGFuZCBleHBlY3QKKyAgLy8gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9QVUJMSUNfS0VZX1JFSkVDVEVELgorCisgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICIuL2F2YnRvb2wgYWRkX2hhc2hfZm9vdGVyIgorICAgICAgICAgICAgICAgICAiIC0taW1hZ2UgJXMiCisgICAgICAgICAgICAgICAgICIgLS1yb2xsYmFja19pbmRleCAwIgorICAgICAgICAgICAgICAgICAiIC0tcGFydGl0aW9uX25hbWUgYm9vdCIKKyAgICAgICAgICAgICAgICAgIiAtLXBhcnRpdGlvbl9zaXplICV6ZCIKKyAgICAgICAgICAgICAgICAgIiAtLWFsZ29yaXRobSBTSEEyNTZfUlNBODE5MiIKKyAgICAgICAgICAgICAgICAgIiAtLWtleSB0ZXN0L2RhdGEvdGVzdGtleV9yc2E4MTkyLnBlbSIKKyAgICAgICAgICAgICAgICAgIiAtLXNhbHQgZGVhZGJlZWYiLAorICAgICAgICAgICAgICAgICBib290X3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBib290X3BhcnRpdGlvbl9zaXplKTsKKworICBiYXNlOjpGaWxlUGF0aCBwa19wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJ0ZXN0a2V5X3JzYTQwOTYuYXZicHVia2V5Iik7CisgIEVYUEVDVF9DT01NQU5EKAorICAgICAgMCwKKyAgICAgICIuL2F2YnRvb2wgZXh0cmFjdF9wdWJsaWNfa2V5IC0ta2V5IHRlc3QvZGF0YS90ZXN0a2V5X3JzYTQwOTYucGVtIgorICAgICAgIiAtLW91dHB1dCAlcyIsCisgICAgICBwa19wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhX2EuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU0hBMjU2X1JTQTIwNDgiLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIiksCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCItLWNoYWluX3BhcnRpdGlvbiBib290OjE6JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa19wYXRoLnZhbHVlKCkuY19zdHIoKSkpOworCisgIG9wc18uc2V0X2V4cGVjdGVkX3B1YmxpY19rZXkoCisgICAgICBQdWJsaWNLZXlBVkIoYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIikpKTsKKworICBBdmJTbG90VmVyaWZ5RGF0YSogc2xvdF9kYXRhID0gTlVMTDsKKyAgRVhQRUNUX0VRKEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfRVJST1JfUFVCTElDX0tFWV9SRUpFQ1RFRCwKKyAgICAgICAgICAgIGF2Yl9zbG90X3ZlcmlmeShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBzbG90X2RhdGEpOworICBFWFBFQ1RfRVEoQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9FUlJPUl9QVUJMSUNfS0VZX1JFSkVDVEVELAorICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5KG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3RfZGF0YSkpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgc2xvdF9kYXRhKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShzbG90X2RhdGEpOworfQorCitURVNUX0YoQXZiU2xvdFZlcmlmeVRlc3QsIEhhc2hEZXNjcmlwdG9ySW5DaGFpbmVkUGFydGl0aW9uUm9sbGJhY2tJbmRleEZhaWwpIHsKKyAgc2l6ZV90IGJvb3RfcGFydGl0aW9uX3NpemUgPSAxNiAqIDEwMjQgKiAxMDI0OworICBiYXNlOjpGaWxlUGF0aCBib290X3BhdGggPSBHZW5lcmF0ZUltYWdlKCJib290X2EuaW1nIiwgNSAqIDEwMjQgKiAxMDI0KTsKKyAgY29uc3QgY2hhciogcmVxdWVzdGVkX3BhcnRpdGlvbnNbXSA9IHsiYm9vdCIsIE5VTEx9OworCisgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICIuL2F2YnRvb2wgYWRkX2hhc2hfZm9vdGVyIgorICAgICAgICAgICAgICAgICAiIC0taW1hZ2UgJXMiCisgICAgICAgICAgICAgICAgICIgLS1yb2xsYmFja19pbmRleCAxMCIKKyAgICAgICAgICAgICAgICAgIiAtLXBhcnRpdGlvbl9uYW1lIGJvb3QiCisgICAgICAgICAgICAgICAgICIgLS1wYXJ0aXRpb25fc2l6ZSAlemQiCisgICAgICAgICAgICAgICAgICIgLS1hbGdvcml0aG0gU0hBMjU2X1JTQTQwOTYiCisgICAgICAgICAgICAgICAgICIgLS1rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhNDA5Ni5wZW0iCisgICAgICAgICAgICAgICAgICIgLS1zYWx0IGRlYWRiZWVmIiwKKyAgICAgICAgICAgICAgICAgYm9vdF9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgYm9vdF9wYXJ0aXRpb25fc2l6ZSk7CisKKyAgYmFzZTo6RmlsZVBhdGggcGtfcGF0aCA9IHRlc3RkaXJfLkFwcGVuZCgidGVzdGtleV9yc2E0MDk2LmF2YnB1YmtleSIpOworICBFWFBFQ1RfQ09NTUFORCgKKyAgICAgIDAsCisgICAgICAiLi9hdmJ0b29sIGV4dHJhY3RfcHVibGljX2tleSAtLWtleSB0ZXN0L2RhdGEvdGVzdGtleV9yc2E0MDk2LnBlbSIKKyAgICAgICIgLS1vdXRwdXQgJXMiLAorICAgICAgcGtfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworCisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YV9hLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAxMTAsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIiksCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCItLWNoYWluX3BhcnRpdGlvbiBib290OjE6JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa19wYXRoLnZhbHVlKCkuY19zdHIoKSkpOworCisgIG9wc18uc2V0X2V4cGVjdGVkX3B1YmxpY19rZXkoCisgICAgICBQdWJsaWNLZXlBVkIoYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIikpKTsKKworICBBdmJTbG90VmVyaWZ5RGF0YSogc2xvdF9kYXRhID0gTlVMTDsKKworICAvLyBCb3RoIGltYWdlcyAodmJtZXRhX2EgYW5kIGJvb3RfYSkgaGF2ZSByb2xsYmFjayBpbmRleCAxMCBhbmQgMTEKKyAgLy8gc28gaXQgc2hvdWxkIHdvcmsgaWYgdGhlIHN0b3JlZCByb2xsYmFjayBpbmRleGVzIGFyZSAwIGFuZCAwLgorICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcyh7ezAsIDB9LCB7MSwgMH19KTsKKyAgRVhQRUNUX0VRKEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3RfZGF0YSkpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgc2xvdF9kYXRhKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShzbG90X2RhdGEpOworCisgIC8vIENoZWNrIGZhaWx1cmUgaWYgd2Ugc2V0IHRoZSBzdG9yZWQgcm9sbGJhY2sgaW5kZXggb2YgdGhlIGNoYWluZWQKKyAgLy8gcGFydGl0aW9uIHRvIDIwIChzZWUgQXZiU2xvdFZlcmlmeVRlc3QuUm9sbGJhY2tJbmRleCBhYm92ZQorICAvLyB3aGVyZSB3ZSB0ZXN0IHJvbGxiYWNrIGluZGV4IGNoZWNrcyBmb3IgdGhlIHZibWV0YSBwYXJ0aXRpb24pLgorICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcyh7ezAsIDB9LCB7MSwgMjB9fSk7CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1JPTExCQUNLX0lOREVYLAorICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5KG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbG90X2RhdGEpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIHNsb3RfZGF0YSk7CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX1JPTExCQUNLX0lOREVYLAorICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5KG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3RfZGF0YSkpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgc2xvdF9kYXRhKTsKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShzbG90X2RhdGEpOworCisgIC8vIENoZWNrIGZhaWx1cmUgaWYgdGhlcmUgaXMgbm8gcm9sbGJhY2sgaW5kZXggc2xvdCAxIC0gaW4gdGhhdCBjYXNlCisgIC8vIHdlIGV4cGVjdCBhbiBJL08gZXJyb3Igc2luY2Ugb3BzLT5yZWFkX3JvbGxiYWNrX2luZGV4KCkgd2lsbAorICAvLyBmYWlsLgorICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcyh7ezAsIDB9fSk7CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX0VSUk9SX0lPLAorICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5KG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbG90X2RhdGEpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIHNsb3RfZGF0YSk7Cit9CisKK1RFU1RfRihBdmJTbG90VmVyaWZ5VGVzdCwgQ2hhaW5lZFBhcnRpdGlvbk5vU2xvdHMpIHsKKyAgc2l6ZV90IGJvb3RfcGFydGl0aW9uX3NpemUgPSAxNiAqIDEwMjQgKiAxMDI0OworICBjb25zdCBzaXplX3QgYm9vdF9pbWFnZV9zaXplID0gNSAqIDEwMjQgKiAxMDI0OworICBiYXNlOjpGaWxlUGF0aCBib290X3BhdGggPSBHZW5lcmF0ZUltYWdlKCJib290LmltZyIsIGJvb3RfaW1hZ2Vfc2l6ZSk7CisgIGNvbnN0IGNoYXIqIHJlcXVlc3RlZF9wYXJ0aXRpb25zW10gPSB7ImJvb3QiLCBOVUxMfTsKKworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIGFkZF9oYXNoX2Zvb3RlciIKKyAgICAgICAgICAgICAgICAgIiAtLWltYWdlICVzIgorICAgICAgICAgICAgICAgICAiIC0ta2VybmVsX2NtZGxpbmUgJ2NtZGxpbmUyIGluIGhhc2ggZm9vdGVyJyIKKyAgICAgICAgICAgICAgICAgIiAtLXJvbGxiYWNrX2luZGV4IDEyIgorICAgICAgICAgICAgICAgICAiIC0tcGFydGl0aW9uX25hbWUgYm9vdCIKKyAgICAgICAgICAgICAgICAgIiAtLXBhcnRpdGlvbl9zaXplICV6ZCIKKyAgICAgICAgICAgICAgICAgIiAtLWFsZ29yaXRobSBTSEEyNTZfUlNBNDA5NiIKKyAgICAgICAgICAgICAgICAgIiAtLWtleSB0ZXN0L2RhdGEvdGVzdGtleV9yc2E0MDk2LnBlbSIKKyAgICAgICAgICAgICAgICAgIiAtLXNhbHQgZGVhZGJlZWYiLAorICAgICAgICAgICAgICAgICBib290X3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBib290X3BhcnRpdGlvbl9zaXplKTsKKworICBiYXNlOjpGaWxlUGF0aCBwa19wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJ0ZXN0a2V5X3JzYTQwOTYuYXZicHVia2V5Iik7CisgIEVYUEVDVF9DT01NQU5EKAorICAgICAgMCwKKyAgICAgICIuL2F2YnRvb2wgZXh0cmFjdF9wdWJsaWNfa2V5IC0ta2V5IHRlc3QvZGF0YS90ZXN0a2V5X3JzYTQwOTYucGVtIgorICAgICAgIiAtLW91dHB1dCAlcyIsCisgICAgICBwa19wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgKKyAgICAgICJ2Ym1ldGEuaW1nIiwKKyAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAxMSwKKyAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpLAorICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCItLWNoYWluX3BhcnRpdGlvbiBib290OjE6JXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAtLWtlcm5lbF9jbWRsaW5lICdjbWRsaW5lMiBpbiB2Ym1ldGEnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwa19wYXRoLnZhbHVlKCkuY19zdHIoKSkpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJWQk1ldGEgaW1hZ2UgdmVyc2lvbjogICAgIDEuMFxuIgorICAgICAgIkhlYWRlciBCbG9jazogICAgICAgICAgICAgMjU2IGJ5dGVzXG4iCisgICAgICAiQXV0aGVudGljYXRpb24gQmxvY2s6ICAgICAzMjAgYnl0ZXNcbiIKKyAgICAgICJBdXhpbGlhcnkgQmxvY2s6ICAgICAgICAgIDE3MjggYnl0ZXNcbiIKKyAgICAgICJBbGdvcml0aG06ICAgICAgICAgICAgICAgIFNIQTI1Nl9SU0EyMDQ4XG4iCisgICAgICAiUm9sbGJhY2sgSW5kZXg6ICAgICAgICAgICAxMVxuIgorICAgICAgIkZsYWdzOiAgICAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIkRlc2NyaXB0b3JzOlxuIgorICAgICAgIiAgICBDaGFpbiBQYXJ0aXRpb24gZGVzY3JpcHRvcjpcbiIKKyAgICAgICIgICAgICBQYXJ0aXRpb24gTmFtZTogICAgICAgICAgYm9vdFxuIgorICAgICAgIiAgICAgIFJvbGxiYWNrIEluZGV4IExvY2F0aW9uOiAxXG4iCisgICAgICAiICAgICAgUHVibGljIGtleSAoc2hhMSk6ICAgICAgICIKKyAgICAgICIyNTk3YzIxOGFhZTQ3MGExMzBmNjExNjJmZWFhZTcwYWZkOTdmMDExXG4iCisgICAgICAiICAgIEtlcm5lbCBDbWRsaW5lIGRlc2NyaXB0b3I6XG4iCisgICAgICAiICAgICAgRmxhZ3M6ICAgICAgICAgICAgICAgICAwXG4iCisgICAgICAiICAgICAgS2VybmVsIENtZGxpbmU6ICAgICAgICAnY21kbGluZTIgaW4gdmJtZXRhJ1xuIiwKKyAgICAgIEluZm9JbWFnZSh2Ym1ldGFfaW1hZ2VfcGF0aF8pKTsKKworICBvcHNfLnNldF9leHBlY3RlZF9wdWJsaWNfa2V5KAorICAgICAgUHVibGljS2V5QVZCKGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKSk7CisKKyAgQXZiU2xvdFZlcmlmeURhdGEqIHNsb3RfZGF0YSA9IE5VTEw7CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5KG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzbG90X2RhdGEpOworCisgIC8vIE5vdyB2ZXJpZnkgdGhlIHNsb3QgZGF0YS4gVGhlIGZpcnN0IHZibWV0YSBkYXRhIHNob3VsZCBtYXRjaCBvdXIKKyAgLy8gdmJtZXRhX2ltYWdlXyBtZW1iZXIgYW5kIHRoZSBzZWNvbmQgb25lIHNob3VsZCBiZSBmb3IgdGhlICdib290JworICAvLyBwYXJ0aXRpb24uCisgIEVYUEVDVF9FUShzaXplX3QoMiksIHNsb3RfZGF0YS0+bnVtX3ZibWV0YV9pbWFnZXMpOworICBFWFBFQ1RfRVEoInZibWV0YSIsIHN0ZDo6c3RyaW5nKHNsb3RfZGF0YS0+dmJtZXRhX2ltYWdlc1swXS5wYXJ0aXRpb25fbmFtZSkpOworICBFWFBFQ1RfRVEoc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzWzBdLnZibWV0YV9zaXplLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgbWVtY21wKHZibWV0YV9pbWFnZV8uZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIHNsb3RfZGF0YS0+dmJtZXRhX2ltYWdlc1swXS52Ym1ldGFfZGF0YSwKKyAgICAgICAgICAgICAgICAgICBzbG90X2RhdGEtPnZibWV0YV9pbWFnZXNbMF0udmJtZXRhX3NpemUpKTsKKyAgRVhQRUNUX0VRKCJib290Iiwgc3RkOjpzdHJpbmcoc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzWzFdLnBhcnRpdGlvbl9uYW1lKSk7CisKKyAgLy8gVGhlIGJvb3QgaW1hZ2UgZGF0YSBzaG91bGQgbWF0Y2ggd2hhdCBpcyBnZW5lcmF0ZWQgYWJvdmUgd2l0aAorICAvLyBHZW5lcmF0ZUltYWdlKCkuCisgIEVYUEVDVF9FUShzaXplX3QoMSksIHNsb3RfZGF0YS0+bnVtX2xvYWRlZF9wYXJ0aXRpb25zKTsKKyAgRVhQRUNUX0VRKCJib290IiwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKHNsb3RfZGF0YS0+bG9hZGVkX3BhcnRpdGlvbnNbMF0ucGFydGl0aW9uX25hbWUpKTsKKyAgRVhQRUNUX0VRKGJvb3RfaW1hZ2Vfc2l6ZSwgc2xvdF9kYXRhLT5sb2FkZWRfcGFydGl0aW9uc1swXS5kYXRhX3NpemUpOworICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IHNsb3RfZGF0YS0+bG9hZGVkX3BhcnRpdGlvbnNbMF0uZGF0YV9zaXplOyBuKyspIHsKKyAgICBFWFBFQ1RfRVEoc2xvdF9kYXRhLT5sb2FkZWRfcGFydGl0aW9uc1swXS5kYXRhW25dLCB1aW50OF90KG4pKTsKKyAgfQorCisgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSB0d28gY21kbGluZXMgd2l0aCBhIHNwYWNlIChVKzAwMjApIGJldHdlZW4KKyAgLy8gdGhlbSAtIG5vdGUgdGhhdCBhbmRyb2lkYm9vdC5zbG90X3N1ZmZpeCBpcyBub3Qgc2V0IHNpbmNlIHdlCisgIC8vIGRvbid0IGhhdmUgYW55IHNsb3RzIGluIHRoaXMgc2V0dXAuCisgIEVYUEVDVF9FUSgKKyAgICAgICJjbWRsaW5lMiBpbiBoYXNoIGZvb3RlciBjbWRsaW5lMiBpbiB2Ym1ldGEgIgorICAgICAgImFuZHJvaWRib290LnZibWV0YS5kZXZpY2U9UEFSVFVVSUQ9MTIzNC1mYWtlLWd1aWQtZm9yOnZibWV0YSAiCisgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmRldmljZV9zdGF0ZT1sb2NrZWQgIgorICAgICAgImFuZHJvaWRib290LnZibWV0YS5oYXNoX2FsZz1zaGEyNTYgYW5kcm9pZGJvb3QudmJtZXRhLnNpemU9NDQxNiAiCisgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmRpZ2VzdD0iCisgICAgICAiNGE0NWZhYTlhZGZlYjk0ZTkxNTRmZTY4MmMxMWZlZjFhMWEzZDgyOWI2N2NiZjFhMTJhYzdmMGFhNGY4ZTJlNCIsCisgICAgICBzdGQ6OnN0cmluZyhzbG90X2RhdGEtPmNtZGxpbmUpKTsKKyAgRVhQRUNUX0VRKDExVUwsIHNsb3RfZGF0YS0+cm9sbGJhY2tfaW5kZXhlc1swXSk7CisgIEVYUEVDVF9FUSgxMlVMLCBzbG90X2RhdGEtPnJvbGxiYWNrX2luZGV4ZXNbMV0pOworICBmb3IgKHNpemVfdCBuID0gMjsgbiA8IEFWQl9NQVhfTlVNQkVSX09GX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OUzsgbisrKSB7CisgICAgRVhQRUNUX0VRKDBVTCwgc2xvdF9kYXRhLT5yb2xsYmFja19pbmRleGVzW25dKTsKKyAgfQorICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKHNsb3RfZGF0YSk7Cit9CisKK1RFU1RfRihBdmJTbG90VmVyaWZ5VGVzdCwgUGFydGl0aW9uc090aGVyVGhhbkJvb3QpIHsKKyAgY29uc3Qgc2l6ZV90IGZvb19wYXJ0aXRpb25fc2l6ZSA9IDE2ICogMTAyNCAqIDEwMjQ7CisgIGNvbnN0IHNpemVfdCBiYXJfcGFydGl0aW9uX3NpemUgPSAzMiAqIDEwMjQgKiAxMDI0OworICBjb25zdCBzaXplX3QgZm9vX2ltYWdlX3NpemUgPSA1ICogMTAyNCAqIDEwMjQ7CisgIGNvbnN0IHNpemVfdCBiYXJfaW1hZ2Vfc2l6ZSA9IDEwICogMTAyNCAqIDEwMjQ7CisgIGJhc2U6OkZpbGVQYXRoIGZvb19wYXRoID0gR2VuZXJhdGVJbWFnZSgiZm9vX2EuaW1nIiwgZm9vX2ltYWdlX3NpemUpOworICBiYXNlOjpGaWxlUGF0aCBiYXJfcGF0aCA9IEdlbmVyYXRlSW1hZ2UoImJhcl9hLmltZyIsIGJhcl9pbWFnZV9zaXplKTsKKworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIGFkZF9oYXNoX2Zvb3RlciIKKyAgICAgICAgICAgICAgICAgIiAtLWltYWdlICVzIgorICAgICAgICAgICAgICAgICAiIC0tcGFydGl0aW9uX25hbWUgZm9vIgorICAgICAgICAgICAgICAgICAiIC0tcGFydGl0aW9uX3NpemUgJXpkIgorICAgICAgICAgICAgICAgICAiIC0tc2FsdCBkZWFkYmVlZiIsCisgICAgICAgICAgICAgICAgIGZvb19wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgZm9vX3BhcnRpdGlvbl9zaXplKTsKKworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIGFkZF9oYXNoX2Zvb3RlciIKKyAgICAgICAgICAgICAgICAgIiAtLWltYWdlICVzIgorICAgICAgICAgICAgICAgICAiIC0tcGFydGl0aW9uX25hbWUgYmFyIgorICAgICAgICAgICAgICAgICAiIC0tcGFydGl0aW9uX3NpemUgJXpkIgorICAgICAgICAgICAgICAgICAiIC0tc2FsdCBkZWFkYmVlZiIsCisgICAgICAgICAgICAgICAgIGJhcl9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgYmFyX3BhcnRpdGlvbl9zaXplKTsKKworICBHZW5lcmF0ZVZCTWV0YUltYWdlKCJ2Ym1ldGFfYS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgNCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoIi0taW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC0taW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vX3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJfcGF0aC52YWx1ZSgpLmNfc3RyKCkpKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAiVkJNZXRhIGltYWdlIHZlcnNpb246ICAgICAxLjBcbiIKKyAgICAgICJIZWFkZXIgQmxvY2s6ICAgICAgICAgICAgIDI1NiBieXRlc1xuIgorICAgICAgIkF1dGhlbnRpY2F0aW9uIEJsb2NrOiAgICAgMzIwIGJ5dGVzXG4iCisgICAgICAiQXV4aWxpYXJ5IEJsb2NrOiAgICAgICAgICA4OTYgYnl0ZXNcbiIKKyAgICAgICJBbGdvcml0aG06ICAgICAgICAgICAgICAgIFNIQTI1Nl9SU0EyMDQ4XG4iCisgICAgICAiUm9sbGJhY2sgSW5kZXg6ICAgICAgICAgICA0XG4iCisgICAgICAiRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAwXG4iCisgICAgICAiRGVzY3JpcHRvcnM6XG4iCisgICAgICAiICAgIEhhc2ggZGVzY3JpcHRvcjpcbiIKKyAgICAgICIgICAgICBJbWFnZSBTaXplOiAgICAgICAgICAgIDUyNDI4ODAgYnl0ZXNcbiIKKyAgICAgICIgICAgICBIYXNoIEFsZ29yaXRobTogICAgICAgIHNoYTI1NlxuIgorICAgICAgIiAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgZm9vXG4iCisgICAgICAiICAgICAgU2FsdDogICAgICAgICAgICAgICAgICBkZWFkYmVlZlxuIgorICAgICAgIiAgICAgIERpZ2VzdDogICAgICAgICAgICAgICAgIgorICAgICAgIjE4NGNiMzYyNDNhZGI4Yjg3ZDJkOGM0ODAyZGUzMjEyNWZlMjk0ZWM0Njc1M2Q3MzIxNDRlZTY1ZGY2OGEyM2RcbiIKKyAgICAgICIgICAgSGFzaCBkZXNjcmlwdG9yOlxuIgorICAgICAgIiAgICAgIEltYWdlIFNpemU6ICAgICAgICAgICAgMTA0ODU3NjAgYnl0ZXNcbiIKKyAgICAgICIgICAgICBIYXNoIEFsZ29yaXRobTogICAgICAgIHNoYTI1NlxuIgorICAgICAgIiAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgYmFyXG4iCisgICAgICAiICAgICAgU2FsdDogICAgICAgICAgICAgICAgICBkZWFkYmVlZlxuIgorICAgICAgIiAgICAgIERpZ2VzdDogICAgICAgICAgICAgICAgIgorICAgICAgImJhZWE0YmJkMjYxZDBlZGY0ZDFmZTVlNmU1YTM2OTc2YzI5MWVlYmE2NmI2YTQ2ZmE4MWRiYTY5MTMyN2E3MjdcbiIsCisgICAgICBJbmZvSW1hZ2UodmJtZXRhX2ltYWdlX3BhdGhfKSk7CisKKyAgb3BzXy5zZXRfZXhwZWN0ZWRfcHVibGljX2tleSgKKyAgICAgIFB1YmxpY0tleUFWQihiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSkpOworCisgIEF2YlNsb3RWZXJpZnlEYXRhKiBzbG90X2RhdGEgPSBOVUxMOworICBjb25zdCBjaGFyKiByZXF1ZXN0ZWRfcGFydGl0aW9uc1tdID0geyJmb28iLCAiYmFyIiwgTlVMTH07CisgIEVYUEVDVF9FUShBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX3Nsb3RfdmVyaWZ5KG9wc18uYXZiX29wcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbG90X2RhdGEpKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHNsb3RfZGF0YSk7CisKKyAgLy8gTm93IHZlcmlmeSB0aGUgc2xvdCBkYXRhLiBUaGUgdmJtZXRhIGRhdGEgc2hvdWxkIG1hdGNoIG91cgorICAvLyB2Ym1ldGFfaW1hZ2VfIG1lbWJlci4KKyAgRVhQRUNUX0VRKHNpemVfdCgxKSwgc2xvdF9kYXRhLT5udW1fdmJtZXRhX2ltYWdlcyk7CisgIEVYUEVDVF9FUSgidmJtZXRhIiwgc3RkOjpzdHJpbmcoc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzWzBdLnBhcnRpdGlvbl9uYW1lKSk7CisgIEVYUEVDVF9FUShzbG90X2RhdGEtPnZibWV0YV9pbWFnZXNbMF0udmJtZXRhX3NpemUsIHZibWV0YV9pbWFnZV8uc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICBtZW1jbXAodmJtZXRhX2ltYWdlXy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgc2xvdF9kYXRhLT52Ym1ldGFfaW1hZ2VzWzBdLnZibWV0YV9kYXRhLAorICAgICAgICAgICAgICAgICAgIHNsb3RfZGF0YS0+dmJtZXRhX2ltYWdlc1swXS52Ym1ldGFfc2l6ZSkpOworCisgIC8vIFRoZSAnZm9vJyBhbmQgJ2JhcicgaW1hZ2UgZGF0YSBzaG91bGQgbWF0Y2ggd2hhdCBpcyBnZW5lcmF0ZWQKKyAgLy8gYWJvdmUgd2l0aCBHZW5lcmF0ZUltYWdlKCkuCisgIEVYUEVDVF9FUShzaXplX3QoMiksIHNsb3RfZGF0YS0+bnVtX2xvYWRlZF9wYXJ0aXRpb25zKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBzdGQ6OnN0cmluZyhzbG90X2RhdGEtPmxvYWRlZF9wYXJ0aXRpb25zWzBdLnBhcnRpdGlvbl9uYW1lKSk7CisgIEVYUEVDVF9FUShmb29faW1hZ2Vfc2l6ZSwgc2xvdF9kYXRhLT5sb2FkZWRfcGFydGl0aW9uc1swXS5kYXRhX3NpemUpOworICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IHNsb3RfZGF0YS0+bG9hZGVkX3BhcnRpdGlvbnNbMF0uZGF0YV9zaXplOyBuKyspIHsKKyAgICBFWFBFQ1RfRVEoc2xvdF9kYXRhLT5sb2FkZWRfcGFydGl0aW9uc1swXS5kYXRhW25dLCB1aW50OF90KG4pKTsKKyAgfQorICBFWFBFQ1RfRVEoImJhciIsIHN0ZDo6c3RyaW5nKHNsb3RfZGF0YS0+bG9hZGVkX3BhcnRpdGlvbnNbMV0ucGFydGl0aW9uX25hbWUpKTsKKyAgRVhQRUNUX0VRKGJhcl9pbWFnZV9zaXplLCBzbG90X2RhdGEtPmxvYWRlZF9wYXJ0aXRpb25zWzFdLmRhdGFfc2l6ZSk7CisgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgc2xvdF9kYXRhLT5sb2FkZWRfcGFydGl0aW9uc1sxXS5kYXRhX3NpemU7IG4rKykgeworICAgIEVYUEVDVF9FUShzbG90X2RhdGEtPmxvYWRlZF9wYXJ0aXRpb25zWzFdLmRhdGFbbl0sIHVpbnQ4X3QobikpOworICB9CisKKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShzbG90X2RhdGEpOworfQorCitURVNUX0YoQXZiU2xvdFZlcmlmeVRlc3QsIFB1YmxpY0tleU1ldGFkYXRhKSB7CisgIGJhc2U6OkZpbGVQYXRoIG1kX3BhdGggPSBHZW5lcmF0ZUltYWdlKCJtZC5iaW4iLCAxNTM2KTsKKworICBHZW5lcmF0ZVZCTWV0YUltYWdlKAorICAgICAgInZibWV0YV9hLmltZyIsCisgICAgICAiU0hBMjU2X1JTQTIwNDgiLAorICAgICAgMCwKKyAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpLAorICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCItLXB1YmxpY19rZXlfbWV0YWRhdGEgJXMiLCBtZF9wYXRoLnZhbHVlKCkuY19zdHIoKSkpOworCisgIG9wc18uc2V0X2V4cGVjdGVkX3B1YmxpY19rZXkoCisgICAgICBQdWJsaWNLZXlBVkIoYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIikpKTsKKworICBzdGQ6OnN0cmluZyBtZF9kYXRhOworICBBU1NFUlRfVFJVRShiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKG1kX3BhdGgsICZtZF9kYXRhKSk7CisgIG9wc18uc2V0X2V4cGVjdGVkX3B1YmxpY19rZXlfbWV0YWRhdGEobWRfZGF0YSk7CisKKyAgQXZiU2xvdFZlcmlmeURhdGEqIHNsb3RfZGF0YSA9IE5VTEw7CisgIGNvbnN0IGNoYXIqIHJlcXVlc3RlZF9wYXJ0aXRpb25zW10gPSB7ImJvb3QiLCBOVUxMfTsKKyAgRVhQRUNUX0VRKEFWQl9TTE9UX1ZFUklGWV9SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfc2xvdF92ZXJpZnkob3BzXy5hdmJfb3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3RfZGF0YSkpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgc2xvdF9kYXRhKTsKKyAgRVhQRUNUX0VRKAorICAgICAgImFuZHJvaWRib290LnZibWV0YS5kZXZpY2U9UEFSVFVVSUQ9MTIzNC1mYWtlLWd1aWQtZm9yOnZibWV0YV9hICIKKyAgICAgICJhbmRyb2lkYm9vdC5zbG90X3N1ZmZpeD1fYSBhbmRyb2lkYm9vdC52Ym1ldGEuZGV2aWNlX3N0YXRlPWxvY2tlZCAiCisgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmhhc2hfYWxnPXNoYTI1NiBhbmRyb2lkYm9vdC52Ym1ldGEuc2l6ZT0yNjg4ICIKKyAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuZGlnZXN0PSIKKyAgICAgICI1ZWRjYWE1NGY0MDM4MmVlNmEyZmMzYjg2Y2RmMzgzMzQ4YjM1ZWQwNzk1NWU4M2VhMzJkODRiNjlhOTdlYWEwIiwKKyAgICAgIHN0ZDo6c3RyaW5nKHNsb3RfZGF0YS0+Y21kbGluZSkpOworICBhdmJfc2xvdF92ZXJpZnlfZGF0YV9mcmVlKHNsb3RfZGF0YSk7Cit9CisKK3ZvaWQgQXZiU2xvdFZlcmlmeVRlc3Q6OkNtZGxpbmVXaXRoSGFzaHRyZWVWZXJpZmljYXRpb24oCisgICAgYm9vbCBoYXNodHJlZV92ZXJpZmljYXRpb25fb24pIHsKKyAgY29uc3Qgc2l6ZV90IHJvb3Rmc19zaXplID0gMTAyOCAqIDEwMjQ7CisgIGNvbnN0IHNpemVfdCBwYXJ0aXRpb25fc2l6ZSA9IDE1MzYgKiAxMDI0OworCisgIC8vIEdlbmVyYXRlIGEgMTAyOCBLaUIgZmlsZSB3aXRoIGtub3duIGNvbnRlbnQuCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJvb3RmczsKKyAgcm9vdGZzLnJlc2l6ZShyb290ZnNfc2l6ZSk7CisgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgcm9vdGZzX3NpemU7IG4rKykKKyAgICByb290ZnNbbl0gPSB1aW50OF90KG4pOworICBiYXNlOjpGaWxlUGF0aCByb290ZnNfcGF0aCA9IHRlc3RkaXJfLkFwcGVuZCgicm9vdGZzLmJpbiIpOworICBFWFBFQ1RfRVEocm9vdGZzX3NpemUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBzaXplX3Q+KAorICAgICAgICAgICAgICAgIGJhc2U6OldyaXRlRmlsZShyb290ZnNfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocm9vdGZzLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Rmcy5zaXplKCkpKSk7CisKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBhZGRfaGFzaHRyZWVfZm9vdGVyIC0tc2FsdCBkMDBkZjAwZCAtLWltYWdlICVzICIKKyAgICAgICAgICAgICAgICAgIi0tcGFydGl0aW9uX3NpemUgJWQgLS1wYXJ0aXRpb25fbmFtZSBmb29iYXIgIgorICAgICAgICAgICAgICAgICAiLS1hbGdvcml0aG0gU0hBMjU2X1JTQTIwNDggIgorICAgICAgICAgICAgICAgICAiLS1rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iLAorICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIChpbnQpcGFydGl0aW9uX3NpemUpOworCisgIC8vIENoZWNrIHRoYXQgd2UgY29ycmVjdGx5IGdlbmVyYXRlIGRtLXZlcml0eSBrZXJuZWwgY21kbGluZQorICAvLyBzbmlwcGV0cywgaWYgcmVxdWVzdGVkLgorICBHZW5lcmF0ZVZCTWV0YUltYWdlKAorICAgICAgInZibWV0YV9hLmltZyIsCisgICAgICAiU0hBMjU2X1JTQTIwNDgiLAorICAgICAgNCwKKyAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpLAorICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCItLXNldHVwX3Jvb3Rmc19mcm9tX2tlcm5lbCAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIi0ta2VybmVsX2NtZGxpbmUgc2hvdWxkX2JlX2luX2JvdGg9MSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIi0tYWxnb3JpdGhtIFNIQTI1Nl9SU0EyMDQ4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiLS1mbGFncyAlZCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodHJlZV92ZXJpZmljYXRpb25fb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZCX1ZCTUVUQV9JTUFHRV9GTEFHU19IQVNIVFJFRV9ESVNBQkxFRCkpOworCisgIEVYUEVDVF9FUSgKKyAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICAgICAiVkJNZXRhIGltYWdlIHZlcnNpb246ICAgICAxLjBcbiIKKyAgICAgICAgICAiSGVhZGVyIEJsb2NrOiAgICAgICAgICAgICAyNTYgYnl0ZXNcbiIKKyAgICAgICAgICAiQXV0aGVudGljYXRpb24gQmxvY2s6ICAgICAzMjAgYnl0ZXNcbiIKKyAgICAgICAgICAiQXV4aWxpYXJ5IEJsb2NrOiAgICAgICAgICA4OTYgYnl0ZXNcbiIKKyAgICAgICAgICAiQWxnb3JpdGhtOiAgICAgICAgICAgICAgICBTSEEyNTZfUlNBMjA0OFxuIgorICAgICAgICAgICJSb2xsYmFjayBJbmRleDogICAgICAgICAgIDRcbiIKKyAgICAgICAgICAiRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAlZFxuIgorICAgICAgICAgICJEZXNjcmlwdG9yczpcbiIKKyAgICAgICAgICAiICAgIEtlcm5lbCBDbWRsaW5lIGRlc2NyaXB0b3I6XG4iCisgICAgICAgICAgIiAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAgMVxuIgorICAgICAgICAgICIgICAgICBLZXJuZWwgQ21kbGluZTogICAgICAgICdkbT1cIjEgdnJvb3Qgbm9uZSBybyAxLDAgMjA1NiB2ZXJpdHkgIgorICAgICAgICAgICIxIFBBUlRVVUlEPSQoQU5EUk9JRF9TWVNURU1fUEFSVFVVSUQpICIKKyAgICAgICAgICAiUEFSVFVVSUQ9JChBTkRST0lEX1NZU1RFTV9QQVJUVVVJRCkgNDA5NiA0MDk2IDI1NyAyNTcgc2hhMSAiCisgICAgICAgICAgImU4MTE2MTE0NjdkY2Q2ZThkYzQzMjRlNDVmNzA2YzJiZGQ1MWRiNjcgZDAwZGYwMGQgMiAiCisgICAgICAgICAgInJlc3RhcnRfb25fY29ycnVwdGlvbiBpZ25vcmVfemVyb19ibG9ja3NcIiByb290PTB4ZmQwMCdcbiIKKyAgICAgICAgICAiICAgIEtlcm5lbCBDbWRsaW5lIGRlc2NyaXB0b3I6XG4iCisgICAgICAgICAgIiAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAgMlxuIgorICAgICAgICAgICIgICAgICBLZXJuZWwgQ21kbGluZTogICAgICAgICIKKyAgICAgICAgICAiJ3Jvb3Q9UEFSVFVVSUQ9JChBTkRST0lEX1NZU1RFTV9QQVJUVVVJRCknXG4iCisgICAgICAgICAgIiAgICBLZXJuZWwgQ21kbGluZSBkZXNjcmlwdG9yOlxuIgorICAgICAgICAgICIgICAgICBGbGFnczogICAgICAgICAgICAgICAgIDBcbiIKKyAgICAgICAgICAiICAgICAgS2VybmVsIENtZGxpbmU6ICAgICAgICAnc2hvdWxkX2JlX2luX2JvdGg9MSdcbiIsCisgICAgICAgICAgaGFzaHRyZWVfdmVyaWZpY2F0aW9uX29uID8gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWQl9WQk1FVEFfSU1BR0VfRkxBR1NfSEFTSFRSRUVfRElTQUJMRUQpLAorICAgICAgSW5mb0ltYWdlKHZibWV0YV9pbWFnZV9wYXRoXykpOworCisgIG9wc18uc2V0X2V4cGVjdGVkX3B1YmxpY19rZXkoCisgICAgICBQdWJsaWNLZXlBVkIoYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIikpKTsKKworICAvLyBDaGVjayB0aGF0IGF2Yl9zbG90X3ZlcmlmeSgpIHBpY2tzIHRoZSBjbWRsaW5lIGRlY3NyaXB0b3JzIGJhc2VkCisgIC8vIG9uIHRoZWlyIGZsYWdzIHZhbHVlLgorICBBdmJTbG90VmVyaWZ5RGF0YSogc2xvdF9kYXRhID0gTlVMTDsKKyAgY29uc3QgY2hhciogcmVxdWVzdGVkX3BhcnRpdGlvbnNbXSA9IHsiYm9vdCIsIE5VTEx9OworICBFWFBFQ1RfRVEoQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9zbG90X3ZlcmlmeShvcHNfLmF2Yl9vcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdF9kYXRhKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzbG90X2RhdGEpOworICBpZiAoaGFzaHRyZWVfdmVyaWZpY2F0aW9uX29uKSB7CisgICAgRVhQRUNUX0VRKAorICAgICAgICAiZG09XCIxIHZyb290IG5vbmUgcm8gMSwwIDIwNTYgdmVyaXR5IDEgIgorICAgICAgICAiUEFSVFVVSUQ9MTIzNC1mYWtlLWd1aWQtZm9yOnN5c3RlbV9hICIKKyAgICAgICAgIlBBUlRVVUlEPTEyMzQtZmFrZS1ndWlkLWZvcjpzeXN0ZW1fYSA0MDk2IDQwOTYgMjU3IDI1NyBzaGExICIKKyAgICAgICAgImU4MTE2MTE0NjdkY2Q2ZThkYzQzMjRlNDVmNzA2YzJiZGQ1MWRiNjcgZDAwZGYwMGQgMiAiCisgICAgICAgICJyZXN0YXJ0X29uX2NvcnJ1cHRpb24gaWdub3JlX3plcm9fYmxvY2tzXCIgcm9vdD0weGZkMDAgIgorICAgICAgICAic2hvdWxkX2JlX2luX2JvdGg9MSAiCisgICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuZGV2aWNlPVBBUlRVVUlEPTEyMzQtZmFrZS1ndWlkLWZvcjp2Ym1ldGFfYSAiCisgICAgICAgICJhbmRyb2lkYm9vdC5zbG90X3N1ZmZpeD1fYSBhbmRyb2lkYm9vdC52Ym1ldGEuZGV2aWNlX3N0YXRlPWxvY2tlZCAiCisgICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuaGFzaF9hbGc9c2hhMjU2IGFuZHJvaWRib290LnZibWV0YS5zaXplPTE0NzIgIgorICAgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmRpZ2VzdD0iCisgICAgICAgICIzMjU3MmY3YTg5ZmI0NGNjNzZlOWUzYWRiYzBjYjUyNzJkMDYwNDU3OGIyMTc5NzI5YWE1MmQyYmJhNDA2MWMzIiwKKyAgICAgICAgc3RkOjpzdHJpbmcoc2xvdF9kYXRhLT5jbWRsaW5lKSk7CisgIH0gZWxzZSB7CisgICAgRVhQRUNUX0VRKAorICAgICAgICAicm9vdD1QQVJUVVVJRD0xMjM0LWZha2UtZ3VpZC1mb3I6c3lzdGVtX2Egc2hvdWxkX2JlX2luX2JvdGg9MSAiCisgICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuZGV2aWNlPVBBUlRVVUlEPTEyMzQtZmFrZS1ndWlkLWZvcjp2Ym1ldGFfYSAiCisgICAgICAgICJhbmRyb2lkYm9vdC5zbG90X3N1ZmZpeD1fYSBhbmRyb2lkYm9vdC52Ym1ldGEuZGV2aWNlX3N0YXRlPWxvY2tlZCAiCisgICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuaGFzaF9hbGc9c2hhMjU2IGFuZHJvaWRib290LnZibWV0YS5zaXplPTE0NzIgIgorICAgICAgICAiYW5kcm9pZGJvb3QudmJtZXRhLmRpZ2VzdD0iCisgICAgICAgICJiYjYzMGMyN2QwOWUxMDExNzA5MmQ0NDQ0ZWE1N2E5OWJmNDQxMDFjNDZjZjU0MjRjZmI4NjkyOGEwODczMjQ5IiwKKyAgICAgICAgc3RkOjpzdHJpbmcoc2xvdF9kYXRhLT5jbWRsaW5lKSk7CisgIH0KKyAgYXZiX3Nsb3RfdmVyaWZ5X2RhdGFfZnJlZShzbG90X2RhdGEpOworfQorCitURVNUX0YoQXZiU2xvdFZlcmlmeVRlc3QsIENtZGxpbmVXaXRoSGFzaHRyZWVWZXJpZmljYXRpb25PZmYpIHsKKyAgQ21kbGluZVdpdGhIYXNodHJlZVZlcmlmaWNhdGlvbihmYWxzZSk7Cit9CisKK1RFU1RfRihBdmJTbG90VmVyaWZ5VGVzdCwgQ21kbGluZVdpdGhIYXNodHJlZVZlcmlmaWNhdGlvbk9uKSB7CisgIENtZGxpbmVXaXRoSGFzaHRyZWVWZXJpZmljYXRpb24odHJ1ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhdmIKZGlmZiAtLWdpdCBhL2F2Yi90ZXN0L2F2Yl91bml0dGVzdF91dGlsLmNjIGIvYXZiL3Rlc3QvYXZiX3VuaXR0ZXN0X3V0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2NWRiOAotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi90ZXN0L2F2Yl91bml0dGVzdF91dGlsLmNjCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJhdmJfdW5pdHRlc3RfdXRpbC5oIgorCitzdGQ6OnN0cmluZyBtZW1fdG9faGV4c3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgc3RkOjpzdHJpbmcgcmV0OworICBjaGFyIGRpZ2l0c1sxN10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgbGVuOyBuKyspIHsKKyAgICByZXQucHVzaF9iYWNrKGRpZ2l0c1tkYXRhW25dID4+IDRdKTsKKyAgICByZXQucHVzaF9iYWNrKGRpZ2l0c1tkYXRhW25dICYgMHgwZl0pOworICB9CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hdmIvdGVzdC9hdmJfdW5pdHRlc3RfdXRpbC5oIGIvYXZiL3Rlc3QvYXZiX3VuaXR0ZXN0X3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTNlNjhjCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvYXZiX3VuaXR0ZXN0X3V0aWwuaApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBBVkJfVU5JVFRFU1RfVVRJTF9IXworI2RlZmluZSBBVkJfVU5JVFRFU1RfVVRJTF9IXworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxiYXNlL2ZpbGVzL2ZpbGVfdXRpbC5oPgorI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KKworLy8gRW5jb2RlcyB8bGVufCBieXRlcyBvZiB8ZGF0YXwgYXMgYSBsb3dlci1jYXNlIGhleC1zdHJpbmcuCitzdGQ6OnN0cmluZyBtZW1fdG9faGV4c3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pOworCisvKiBVdGlsaXR5IG1hY3JvIHRvIHJ1biB0aGUgY29tbWFuZCBleHByZXNzZWQgYnkgdGhlIHByaW50ZigpLXN0eWxlIHN0cmluZworICogfGNvbW1hbmRfZm9ybWF0fCB1c2luZyB0aGUgc3lzdGVtKDMpIHV0aWxpdHkgZnVuY3Rpb24uIFdpbGwgYXNzZXJ0IHVubGVzcworICogdGhlIGNvbW1hbmQgZXhpdHMgbm9ybWFsbHkgd2l0aCBleGl0IHN0YXR1cyB8ZXhwZWN0ZWRfZXhpdF9zdGF0dXN8LgorICovCisjZGVmaW5lIEVYUEVDVF9DT01NQU5EKGV4cGVjdGVkX2V4aXRfc3RhdHVzLCBjb21tYW5kX2Zvcm1hdCwgLi4uKSAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHJjID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN5c3RlbShiYXNlOjpTdHJpbmdQcmludGYoY29tbWFuZF9mb3JtYXQsICMjX19WQV9BUkdTX18pLmNfc3RyKCkpOyBcCisgICAgRVhQRUNUX1RSVUUoV0lGRVhJVEVEKHJjKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRVhQRUNUX0VRKFdFWElUU1RBVFVTKHJjKSwgZXhwZWN0ZWRfZXhpdF9zdGF0dXMpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApOworCituYW1lc3BhY2UgYXZiIHsKKworLyogQmFzZS1jbGFzcyB1c2VkIGZvciB1bml0IHRlc3QuICovCitjbGFzcyBCYXNlQXZiVG9vbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIEJhc2VBdmJUb29sVGVzdCgpIHt9CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfkJhc2VBdmJUb29sVGVzdCgpIHt9CisKKyAgLyogR2VuZXJhdGVzIGEgdmJtZXRhIGltYWdlLCB1c2luZyBhdmJ0b29vbCwgd2l0aCBmaWxlIG5hbWUKKyAgICogfGltYWdlX25hbWV8LiBUaGUgZ2VuZXJhdGVkIHZibWV0YSBpbWFnZSB3aWxsIHdyaXR0ZW4gdG8gZGlzaywKKyAgICogc2VlIHRoZSB8dmJtZXRhX2ltYWdlX3BhdGhffCB2YXJpYWJsZSBmb3IgaXRzIHBhdGggYW5kCisgICAqIHx2Ym1ldGFfaW1hZ2VffCBmb3IgdGhlIGNvbnRlbnQuCisgICAqLworICB2b2lkIEdlbmVyYXRlVkJNZXRhSW1hZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGltYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgcm9sbGJhY2tfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpGaWxlUGF0aCYga2V5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkaXRpb25hbF9vcHRpb25zID0gIiIpIHsKKyAgICBzdGQ6OnN0cmluZyBzaWduaW5nX29wdGlvbnM7CisgICAgaWYgKGFsZ29yaXRobSA9PSAiIikgeworICAgICAgc2lnbmluZ19vcHRpb25zID0gIiAtLWFsZ29yaXRobSBOT05FICI7CisgICAgfSBlbHNlIHsKKyAgICAgIHNpZ25pbmdfb3B0aW9ucyA9IHN0ZDo6c3RyaW5nKCIgLS1hbGdvcml0aG0gIikgKyBhbGdvcml0aG0gKyAiIC0ta2V5ICIgKworICAgICAgICAgICAgICAgICAgICAgICAga2V5X3BhdGgudmFsdWUoKSArICIgIjsKKyAgICB9CisgICAgdmJtZXRhX2ltYWdlX3BhdGhfID0gdGVzdGRpcl8uQXBwZW5kKGltYWdlX25hbWUpOworICAgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBtYWtlX3ZibWV0YV9pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAiIC0tcm9sbGJhY2tfaW5kZXggJSIgUFJJdTY0CisgICAgICAgICAgICAgICAgICAgIiAlcyAlcyAiCisgICAgICAgICAgICAgICAgICAgIiAtLW91dHB1dCAlcyIsCisgICAgICAgICAgICAgICAgICAgcm9sbGJhY2tfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9vcHRpb25zLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgc2lnbmluZ19vcHRpb25zLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgdmJtZXRhX2ltYWdlX3BhdGhfLnZhbHVlKCkuY19zdHIoKSk7CisgICAgaW50NjRfdCBmaWxlX3NpemU7CisgICAgQVNTRVJUX1RSVUUoYmFzZTo6R2V0RmlsZVNpemUodmJtZXRhX2ltYWdlX3BhdGhfLCAmZmlsZV9zaXplKSk7CisgICAgdmJtZXRhX2ltYWdlXy5yZXNpemUoZmlsZV9zaXplKTsKKyAgICBBU1NFUlRfVFJVRShiYXNlOjpSZWFkRmlsZSh2Ym1ldGFfaW1hZ2VfcGF0aF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4odmJtZXRhX2ltYWdlXy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uc2l6ZSgpKSk7CisgIH0KKworICAvKiBHZW5lcmF0ZSBhIGZpbGUgd2l0aCBuYW1lIHxmaWxlX25hbWV8IG9mIHNpemUgfGltYWdlX3NpemV8IHdpdGgKKyAgICoga25vd24gY29udGVudCAoMHgwMCAweDAxIDB4MDIgLi4gMHhmZiAweDAwIDB4MDEgLi4pLgorICAgKi8KKyAgYmFzZTo6RmlsZVBhdGggR2VuZXJhdGVJbWFnZShjb25zdCBzdGQ6OnN0cmluZyBmaWxlX25hbWUsIHNpemVfdCBpbWFnZV9zaXplKSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW1hZ2U7CisgICAgaW1hZ2UucmVzaXplKGltYWdlX3NpemUpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgaW1hZ2Vfc2l6ZTsgbisrKSB7CisgICAgICBpbWFnZVtuXSA9IHVpbnQ4X3Qobik7CisgICAgfQorICAgIGJhc2U6OkZpbGVQYXRoIGltYWdlX3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoZmlsZV9uYW1lKTsKKyAgICBFWFBFQ1RfRVEoaW1hZ2Vfc2l6ZSwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3Qgc2l6ZV90PigKKyAgICAgICAgICAgICAgICAgIGJhc2U6OldyaXRlRmlsZShpbWFnZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGltYWdlLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Uuc2l6ZSgpKSkpOworICAgIHJldHVybiBpbWFnZV9wYXRoOworICB9CisKKyAgLyogUmV0dXJucyB0aGUgb3V0cHV0IG9mICdhdmJ0b29sIGluZm9faW1hZ2UnIGZvciBhIGdpdmVuIGltYWdlLiAqLworICBzdGQ6OnN0cmluZyBJbmZvSW1hZ2UoY29uc3QgYmFzZTo6RmlsZVBhdGgmIGltYWdlX3BhdGgpIHsKKyAgICBiYXNlOjpGaWxlUGF0aCB0bXBfcGF0aCA9IHRlc3RkaXJfLkFwcGVuZCgiaW5mb19vdXRwdXQudHh0Iik7CisgICAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIGluZm9faW1hZ2UgLS1pbWFnZSAlcyAtLW91dHB1dCAlcyIsCisgICAgICAgICAgICAgICAgICAgaW1hZ2VfcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgdG1wX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBpbmZvX2RhdGE7CisgICAgRVhQRUNUX1RSVUUoYmFzZTo6UmVhZEZpbGVUb1N0cmluZyh0bXBfcGF0aCwgJmluZm9fZGF0YSkpOworICAgIHJldHVybiBpbmZvX2RhdGE7CisgIH0KKworICAvKiBSZXR1cm5zIHB1YmxpYyBrZXkgaW4gQVZCIGZvcm1hdCBmb3IgYSAucGVtIGtleSAqLworICBzdGQ6OnN0cmluZyBQdWJsaWNLZXlBVkIoY29uc3QgYmFzZTo6RmlsZVBhdGgmIGtleV9wYXRoKSB7CisgICAgYmFzZTo6RmlsZVBhdGggdG1wX3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInB1YmxpY19rZXkuYmluIik7CisgICAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIGV4dHJhY3RfcHVibGljX2tleSAtLWtleSAlcyIKKyAgICAgICAgICAgICAgICAgICAiIC0tb3V0cHV0ICVzIiwKKyAgICAgICAgICAgICAgICAgICBrZXlfcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgdG1wX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBrZXlfZGF0YTsKKyAgICBFWFBFQ1RfVFJVRShiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKHRtcF9wYXRoLCAma2V5X2RhdGEpKTsKKyAgICByZXR1cm4ga2V5X2RhdGE7CisgIH0KKworICAvKiBDcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byBzdGFzaCBpbWFnZXMgaW4uICovCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBiYXNlOjpGaWxlUGF0aCByZXQ7CisgICAgY2hhciogYnVmID0gc3RyZHVwKCIvdG1wL2xpYmF2Yi10ZXN0cy5YWFhYWFgiKTsKKyAgICBBU1NFUlRfVFJVRShta2R0ZW1wKGJ1ZikgIT0gbnVsbHB0cik7CisgICAgdGVzdGRpcl8gPSBiYXNlOjpGaWxlUGF0aChidWYpOworICAgIGZyZWUoYnVmKTsKKyAgfQorCisgIC8qIE51a2UgdGVtcG9yYXJ5IGRpcmVjdG9yeS4gKi8KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIEFTU0VSVF9FUSgwVSwgdGVzdGRpcl8udmFsdWUoKS5maW5kKCIvdG1wL2xpYmF2Yi10ZXN0cyIpKTsKKyAgICBBU1NFUlRfVFJVRShiYXNlOjpEZWxldGVGaWxlKHRlc3RkaXJfLCB0cnVlIC8qIHJlY3Vyc2l2ZSAqLykpOworICB9CisKKyAgLyogVGVtcG9yYXJ5IGRpcmVjdG9yeSBjcmVhdGVkIGluIFNldFVwKCkuICovCisgIGJhc2U6OkZpbGVQYXRoIHRlc3RkaXJfOworCisgIC8qIFBhdGggdG8gdmJtZXRhIGltYWdlIGdlbmVyYXRlZCB3aXRoIEdlbmVyYXRlVkJNZXRhSW1hZ2UoKS4gKi8KKyAgYmFzZTo6RmlsZVBhdGggdmJtZXRhX2ltYWdlX3BhdGhfOworCisgIC8qIENvbnRlbnRzIG9mIHRoZSBpbWFnZSBnZW5lcmF0ZWQgd2l0aCBHZW5lcmF0ZVZCTWV0YUltYWdlKCkuICovCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZibWV0YV9pbWFnZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYXZiCisKKyNlbmRpZiAvKiBBVkJfVU5JVFRFU1RfVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXZiL3Rlc3QvYXZiX3V0aWxfdW5pdHRlc3QuY2MgYi9hdmIvdGVzdC9hdmJfdXRpbF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzhjMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvYXZiX3V0aWxfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxsaWJhdmIvbGliYXZiLmg+CisKK1RFU1QoVXRpbFRlc3QsIFJTQVB1YmxpY0tleUhlYWRlckJ5dGVzd2FwKSB7CisgIEF2YlJTQVB1YmxpY0tleUhlYWRlciBoOworICBBdmJSU0FQdWJsaWNLZXlIZWFkZXIgczsKKyAgdWludDMyX3QgbjMyOworICB1aW50NjRfdCBuNjQ7CisKKyAgbjMyID0gMHgxMTIyMzM0NDsKKyAgbjY0ID0gMHgxMTIyMzM0NDU1NjY3Nzg4OworCisgIGgua2V5X251bV9iaXRzID0gaHRvYmUzMihuMzIpOworICBuMzIrKzsKKyAgaC5uMGludiA9IGh0b2JlMzIobjMyKTsKKyAgbjMyKys7CisKKyAgRVhQRUNUX05FKDAsIGF2Yl9yc2FfcHVibGljX2tleV9oZWFkZXJfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKCZoLCAmcykpOworCisgIG4zMiA9IDB4MTEyMjMzNDQ7CisgIG42NCA9IDB4MTEyMjMzNDQ1NTY2Nzc4ODsKKworICBFWFBFQ1RfRVEobjMyLCBzLmtleV9udW1fYml0cyk7CisgIG4zMisrOworICBFWFBFQ1RfRVEobjMyLCBzLm4waW52KTsKKyAgbjMyKys7Cit9CisKK1RFU1QoVXRpbFRlc3QsIEZvb3RlckJ5dGVzd2FwKSB7CisgIEF2YkZvb3RlciBoOworICBBdmJGb290ZXIgczsKKyAgQXZiRm9vdGVyIG90aGVyOworICBBdmJGb290ZXIgYmFkOworICB1aW50NjRfdCBuNjQ7CisKKyAgbjY0ID0gMHgxMTIyMzM0NDU1NjY3Nzg4OworCisgIG1lbWNweShoLm1hZ2ljLCBBVkJfRk9PVEVSX01BR0lDLCBBVkJfRk9PVEVSX01BR0lDX0xFTik7CisgIGgudmVyc2lvbl9tYWpvciA9IGh0b2JlMzIoQVZCX0ZPT1RFUl9NQUpPUl9WRVJTSU9OKTsKKyAgaC52ZXJzaW9uX21pbm9yID0gaHRvYmUzMihBVkJfRk9PVEVSX01JTk9SX1ZFUlNJT04pOworICBoLm9yaWdpbmFsX2ltYWdlX3NpemUgPSBodG9iZTY0KG42NCk7CisgIG42NCsrOworICBoLnZibWV0YV9vZmZzZXQgPSBodG9iZTY0KG42NCk7CisgIG42NCsrOworICBoLnZibWV0YV9zaXplID0gaHRvYmU2NChuNjQpOworICBuNjQrKzsKKworICBFWFBFQ1RfTkUoMCwgYXZiX2Zvb3Rlcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmgsICZzKSk7CisKKyAgbjY0ID0gMHgxMTIyMzM0NDU1NjY3Nzg4OworCisgIEVYUEVDVF9FUSgodWludDMyX3QpQVZCX0ZPT1RFUl9NQUpPUl9WRVJTSU9OLCBzLnZlcnNpb25fbWFqb3IpOworICBFWFBFQ1RfRVEoKHVpbnQzMl90KUFWQl9GT09URVJfTUlOT1JfVkVSU0lPTiwgcy52ZXJzaW9uX21pbm9yKTsKKyAgRVhQRUNUX0VRKG42NCwgcy5vcmlnaW5hbF9pbWFnZV9zaXplKTsKKyAgbjY0Kys7CisgIEVYUEVDVF9FUShuNjQsIHMudmJtZXRhX29mZnNldCk7CisgIG42NCsrOworICBFWFBFQ1RfRVEobjY0LCBzLnZibWV0YV9zaXplKTsKKyAgbjY0Kys7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgc3RydWN0IHN0aWxsIHZhbGlkYXRlcyBpZiBtaW5vciBpcyBiaWdnZXIgdGhhbgorICAvLyB3aGF0IHdlIGV4cGVjdC4KKyAgb3RoZXIgPSBoOworICBoLnZlcnNpb25fbWlub3IgPSBodG9iZTMyKEFWQl9GT09URVJfTUlOT1JfVkVSU0lPTiArIDEpOworICBFWFBFQ1RfTkUoMCwgYXZiX2Zvb3Rlcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJm90aGVyLCAmcykpOworCisgIC8vIENoZWNrIGZvciBiYWQgbWFnaWMuCisgIGJhZCA9IGg7CisgIGJhZC5tYWdpY1swXSA9ICd4JzsKKyAgRVhQRUNUX0VRKDAsIGF2Yl9mb290ZXJfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKCZiYWQsICZzKSk7CisKKyAgLy8gQ2hlY2sgZm9yIGJhZCBtYWpvciB2ZXJzaW9uLgorICBiYWQgPSBoOworICBiYWQudmVyc2lvbl9tYWpvciA9IGh0b2JlMzIoQVZCX0ZPT1RFUl9NQUpPUl9WRVJTSU9OICsgMSk7CisgIEVYUEVDVF9FUSgwLCBhdmJfZm9vdGVyX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgmYmFkLCAmcykpOworfQorCitURVNUKFV0aWxUZXN0LCBLZXJuZWxDbWRsaW5lRGVzY3JpcHRvckJ5dGVzd2FwKSB7CisgIEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yIGg7CisgIEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yIHM7CisgIEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yIGJhZDsKKyAgdWludDY0X3QgbmJmOworICB1aW50MzJfdCBuMzI7CisKKyAgLy8gU3BlY2lmeSA0MCBieXRlcyBvZiBkYXRhIHBhc3QgdGhlIGVuZCBvZiB0aGUgZGVzY3JpcHRvciBzdHJ1Y3QuCisgIG5iZiA9IDQwICsgc2l6ZW9mKEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yKSAtIHNpemVvZihBdmJEZXNjcmlwdG9yKTsKKyAgaC5wYXJlbnRfZGVzY3JpcHRvci5udW1fYnl0ZXNfZm9sbG93aW5nID0gaHRvYmU2NChuYmYpOworICBoLnBhcmVudF9kZXNjcmlwdG9yLnRhZyA9IGh0b2JlNjQoQVZCX0RFU0NSSVBUT1JfVEFHX0tFUk5FTF9DTURMSU5FKTsKKyAgaC5rZXJuZWxfY21kbGluZV9sZW5ndGggPSBodG9iZTMyKDQwKTsKKworICBuMzIgPSAweDExMjIzMzQ0OworICBoLmZsYWdzID0gaHRvYmUzMihuMzIpOworICBuMzIrKzsKKworICBFWFBFQ1RfTkUoMCwgYXZiX2tlcm5lbF9jbWRsaW5lX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKCZoLCAmcykpOworCisgIG4zMiA9IDB4MTEyMjMzNDQ7CisgIEVYUEVDVF9FUShuMzIsIHMuZmxhZ3MpOworICBuMzIrKzsKKworICBFWFBFQ1RfRVEoQVZCX0RFU0NSSVBUT1JfVEFHX0tFUk5FTF9DTURMSU5FLCBzLnBhcmVudF9kZXNjcmlwdG9yLnRhZyk7CisgIEVYUEVDVF9FUShuYmYsIHMucGFyZW50X2Rlc2NyaXB0b3IubnVtX2J5dGVzX2ZvbGxvd2luZyk7CisgIEVYUEVDVF9FUSg0MFVMLCBzLmtlcm5lbF9jbWRsaW5lX2xlbmd0aCk7CisKKyAgLy8gQ2hlY2sgZm9yIGJhZCB0YWcuCisgIGJhZCA9IGg7CisgIGJhZC5wYXJlbnRfZGVzY3JpcHRvci50YWcgPSBodG9iZTY0KDB4ZjAwZGQwMGQpOworICBFWFBFQ1RfRVEoMCwgYXZiX2tlcm5lbF9jbWRsaW5lX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKCZiYWQsICZzKSk7CisKKyAgLy8gRG9lc24ndCBmaXQgaW4gNDEgYnl0ZXMuCisgIGJhZCA9IGg7CisgIGJhZC5rZXJuZWxfY21kbGluZV9sZW5ndGggPSBodG9iZTMyKDQxKTsKKyAgRVhQRUNUX0VRKDAsIGF2Yl9rZXJuZWxfY21kbGluZV9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgmYmFkLCAmcykpOworfQorCitURVNUKFV0aWxUZXN0LCBIYXNodHJlZURlc2NyaXB0b3JCeXRlc3dhcCkgeworICBBdmJIYXNodHJlZURlc2NyaXB0b3IgaDsKKyAgQXZiSGFzaHRyZWVEZXNjcmlwdG9yIHM7CisgIEF2Ykhhc2h0cmVlRGVzY3JpcHRvciBiYWQ7CisgIHVpbnQ2NF90IG5iZjsKKyAgdWludDMyX3QgbjMyOworICB1aW50NjRfdCBuNjQ7CisKKyAgLy8gU3BlY2lmeSA0NCBieXRlcyBvZiBkYXRhIHBhc3QgdGhlIGVuZCBvZiB0aGUgZGVzY3JpcHRvciBzdHJ1Y3QuCisgIG5iZiA9IDQ0ICsgc2l6ZW9mKEF2Ykhhc2h0cmVlRGVzY3JpcHRvcikgLSBzaXplb2YoQXZiRGVzY3JpcHRvcik7CisgIGgucGFyZW50X2Rlc2NyaXB0b3IubnVtX2J5dGVzX2ZvbGxvd2luZyA9IGh0b2JlNjQobmJmKTsKKyAgaC5wYXJlbnRfZGVzY3JpcHRvci50YWcgPSBodG9iZTY0KEFWQl9ERVNDUklQVE9SX1RBR19IQVNIVFJFRSk7CisgIGgucGFydGl0aW9uX25hbWVfbGVuID0gaHRvYmUzMigxMCk7CisgIGguc2FsdF9sZW4gPSBodG9iZTMyKDEwKTsKKyAgaC5yb290X2RpZ2VzdF9sZW4gPSBodG9iZTMyKDEwKTsKKworICBuMzIgPSAweDExMjIzMzQ0OworICBuNjQgPSAweDExMjIzMzQ0NTU2Njc3ODg7CisKKyAgaC5kbV92ZXJpdHlfdmVyc2lvbiA9IGh0b2JlMzIobjMyKTsKKyAgbjMyKys7CisgIGguaW1hZ2Vfc2l6ZSA9IGh0b2JlNjQobjY0KTsKKyAgbjY0Kys7CisgIGgudHJlZV9vZmZzZXQgPSBodG9iZTY0KG42NCk7CisgIG42NCsrOworICBoLnRyZWVfc2l6ZSA9IGh0b2JlNjQobjY0KTsKKyAgbjY0Kys7CisgIGguZGF0YV9ibG9ja19zaXplID0gaHRvYmUzMihuMzIpOworICBuMzIrKzsKKyAgaC5oYXNoX2Jsb2NrX3NpemUgPSBodG9iZTMyKG4zMik7CisgIG4zMisrOworICBoLmZlY19udW1fcm9vdHMgPSBodG9iZTMyKG4zMik7CisgIG4zMisrOworICBoLmZlY19vZmZzZXQgPSBodG9iZTY0KG42NCk7CisgIG42NCsrOworICBoLmZlY19zaXplID0gaHRvYmU2NChuNjQpOworICBuNjQrKzsKKworICBFWFBFQ1RfVFJVRShhdmJfaGFzaHRyZWVfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmgsICZzKSk7CisKKyAgbjMyID0gMHgxMTIyMzM0NDsKKyAgbjY0ID0gMHgxMTIyMzM0NDU1NjY3Nzg4OworCisgIEVYUEVDVF9FUShuMzIsIHMuZG1fdmVyaXR5X3ZlcnNpb24pOworICBuMzIrKzsKKyAgRVhQRUNUX0VRKG42NCwgcy5pbWFnZV9zaXplKTsKKyAgbjY0Kys7CisgIEVYUEVDVF9FUShuNjQsIHMudHJlZV9vZmZzZXQpOworICBuNjQrKzsKKyAgRVhQRUNUX0VRKG42NCwgcy50cmVlX3NpemUpOworICBuNjQrKzsKKyAgRVhQRUNUX0VRKG4zMiwgcy5kYXRhX2Jsb2NrX3NpemUpOworICBuMzIrKzsKKyAgRVhQRUNUX0VRKG4zMiwgcy5oYXNoX2Jsb2NrX3NpemUpOworICBuMzIrKzsKKyAgRVhQRUNUX0VRKG4zMiwgcy5mZWNfbnVtX3Jvb3RzKTsKKyAgbjMyKys7CisgIEVYUEVDVF9FUShuNjQsIHMuZmVjX29mZnNldCk7CisgIG42NCsrOworICBFWFBFQ1RfRVEobjY0LCBzLmZlY19zaXplKTsKKyAgbjY0Kys7CisKKyAgRVhQRUNUX0VRKEFWQl9ERVNDUklQVE9SX1RBR19IQVNIVFJFRSwgcy5wYXJlbnRfZGVzY3JpcHRvci50YWcpOworICBFWFBFQ1RfRVEobmJmLCBzLnBhcmVudF9kZXNjcmlwdG9yLm51bV9ieXRlc19mb2xsb3dpbmcpOworICBFWFBFQ1RfRVEoMTBVTCwgcy5wYXJ0aXRpb25fbmFtZV9sZW4pOworICBFWFBFQ1RfRVEoMTBVTCwgcy5zYWx0X2xlbik7CisgIEVYUEVDVF9FUSgxMFVMLCBzLnJvb3RfZGlnZXN0X2xlbik7CisKKyAgLy8gQ2hlY2sgZm9yIGJhZCB0YWcuCisgIGJhZCA9IGg7CisgIGJhZC5wYXJlbnRfZGVzY3JpcHRvci50YWcgPSBodG9iZTY0KDB4ZjAwZGQwMGQpOworICBFWFBFQ1RfRkFMU0UoYXZiX2hhc2h0cmVlX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKCZiYWQsICZzKSk7CisKKyAgLy8gRG9lc24ndCBmaXQgaW4gNDQgYnl0ZXMgKDMwICsgMTAgKyAxMCA9IDUwKS4KKyAgYmFkID0gaDsKKyAgYmFkLnBhcnRpdGlvbl9uYW1lX2xlbiA9IGh0b2JlMzIoMzApOworICBFWFBFQ1RfRkFMU0UoYXZiX2hhc2h0cmVlX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKCZiYWQsICZzKSk7CisKKyAgLy8gRG9lc24ndCBmaXQgaW4gNDQgYnl0ZXMgKDEwICsgMzAgKyAxMCA9IDUwKS4KKyAgYmFkID0gaDsKKyAgYmFkLnNhbHRfbGVuID0gaHRvYmUzMigzMCk7CisgIEVYUEVDVF9GQUxTRShhdmJfaGFzaHRyZWVfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmJhZCwgJnMpKTsKKworICAvLyBEb2Vzbid0IGZpdCBpbiA0NCBieXRlcyAoMTAgKyAxMCArIDMwID0gNTApLgorICBiYWQgPSBoOworICBiYWQucm9vdF9kaWdlc3RfbGVuID0gaHRvYmUzMigzMCk7CisgIEVYUEVDVF9GQUxTRShhdmJfaGFzaHRyZWVfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmJhZCwgJnMpKTsKK30KKworVEVTVChVdGlsVGVzdCwgSGFzaERlc2NyaXB0b3JCeXRlc3dhcCkgeworICBBdmJIYXNoRGVzY3JpcHRvciBoOworICBBdmJIYXNoRGVzY3JpcHRvciBzOworICBBdmJIYXNoRGVzY3JpcHRvciBiYWQ7CisgIHVpbnQ2NF90IG5iZjsKKworICAvLyBTcGVjaWZ5IDQ0IGJ5dGVzIG9mIGRhdGEgcGFzdCB0aGUgZW5kIG9mIHRoZSBkZXNjcmlwdG9yIHN0cnVjdC4KKyAgbmJmID0gNDQgKyBzaXplb2YoQXZiSGFzaERlc2NyaXB0b3IpIC0gc2l6ZW9mKEF2YkRlc2NyaXB0b3IpOworICBoLnBhcmVudF9kZXNjcmlwdG9yLm51bV9ieXRlc19mb2xsb3dpbmcgPSBodG9iZTY0KG5iZik7CisgIGgucGFyZW50X2Rlc2NyaXB0b3IudGFnID0gaHRvYmU2NChBVkJfREVTQ1JJUFRPUl9UQUdfSEFTSCk7CisgIGgucGFydGl0aW9uX25hbWVfbGVuID0gaHRvYmUzMigxMCk7CisgIGguc2FsdF9sZW4gPSBodG9iZTMyKDEwKTsKKyAgaC5kaWdlc3RfbGVuID0gaHRvYmUzMigxMCk7CisKKyAgRVhQRUNUX05FKDAsIGF2Yl9oYXNoX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKCZoLCAmcykpOworCisgIEVYUEVDVF9FUShBVkJfREVTQ1JJUFRPUl9UQUdfSEFTSCwgcy5wYXJlbnRfZGVzY3JpcHRvci50YWcpOworICBFWFBFQ1RfRVEobmJmLCBzLnBhcmVudF9kZXNjcmlwdG9yLm51bV9ieXRlc19mb2xsb3dpbmcpOworICBFWFBFQ1RfRVEoMTBVTCwgcy5wYXJ0aXRpb25fbmFtZV9sZW4pOworICBFWFBFQ1RfRVEoMTBVTCwgcy5zYWx0X2xlbik7CisgIEVYUEVDVF9FUSgxMFVMLCBzLmRpZ2VzdF9sZW4pOworCisgIC8vIENoZWNrIGZvciBiYWQgdGFnLgorICBiYWQgPSBoOworICBiYWQucGFyZW50X2Rlc2NyaXB0b3IudGFnID0gaHRvYmU2NCgweGYwMGRkMDBkKTsKKyAgRVhQRUNUX0VRKDAsIGF2Yl9oYXNoX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKCZiYWQsICZzKSk7CisKKyAgLy8gRG9lc24ndCBmaXQgaW4gNDQgYnl0ZXMgKDMwICsgMTAgKyAxMCA9IDUwKS4KKyAgYmFkID0gaDsKKyAgYmFkLnBhcnRpdGlvbl9uYW1lX2xlbiA9IGh0b2JlMzIoMzApOworICBFWFBFQ1RfRVEoMCwgYXZiX2hhc2hfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmJhZCwgJnMpKTsKKworICAvLyBEb2Vzbid0IGZpdCBpbiA0NCBieXRlcyAoMTAgKyAzMCArIDEwID0gNTApLgorICBiYWQgPSBoOworICBiYWQuc2FsdF9sZW4gPSBodG9iZTMyKDMwKTsKKyAgRVhQRUNUX0VRKDAsIGF2Yl9oYXNoX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKCZiYWQsICZzKSk7CisKKyAgLy8gRG9lc24ndCBmaXQgaW4gNDQgYnl0ZXMgKDEwICsgMTAgKyAzMCA9IDUwKS4KKyAgYmFkID0gaDsKKyAgYmFkLmRpZ2VzdF9sZW4gPSBodG9iZTMyKDMwKTsKKyAgRVhQRUNUX0VRKDAsIGF2Yl9oYXNoX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKCZiYWQsICZzKSk7Cit9CisKK1RFU1QoVXRpbFRlc3QsIENoYWluUGFydGl0aW9uRGVzY3JpcHRvckJ5dGVzd2FwKSB7CisgIEF2YkNoYWluUGFydGl0aW9uRGVzY3JpcHRvciBoOworICBBdmJDaGFpblBhcnRpdGlvbkRlc2NyaXB0b3IgczsKKyAgQXZiQ2hhaW5QYXJ0aXRpb25EZXNjcmlwdG9yIGJhZDsKKyAgdWludDY0X3QgbmJmOworCisgIC8vIFNwZWNpZnkgMzYgYnl0ZXMgb2YgZGF0YSBwYXN0IHRoZSBlbmQgb2YgdGhlIGRlc2NyaXB0b3Igc3RydWN0LgorICBuYmYgPSAzNiArIHNpemVvZihBdmJDaGFpblBhcnRpdGlvbkRlc2NyaXB0b3IpIC0gc2l6ZW9mKEF2YkRlc2NyaXB0b3IpOworICBoLnBhcmVudF9kZXNjcmlwdG9yLm51bV9ieXRlc19mb2xsb3dpbmcgPSBodG9iZTY0KG5iZik7CisgIGgucGFyZW50X2Rlc2NyaXB0b3IudGFnID0gaHRvYmU2NChBVkJfREVTQ1JJUFRPUl9UQUdfQ0hBSU5fUEFSVElUSU9OKTsKKyAgaC5yb2xsYmFja19pbmRleF9sb2NhdGlvbiA9IGh0b2JlMzIoNDIpOworICBoLnBhcnRpdGlvbl9uYW1lX2xlbiA9IGh0b2JlMzIoMTYpOworICBoLnB1YmxpY19rZXlfbGVuID0gaHRvYmUzMigxNyk7CisKKyAgRVhQRUNUX05FKDAsIGF2Yl9jaGFpbl9wYXJ0aXRpb25fZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmgsICZzKSk7CisKKyAgRVhQRUNUX0VRKEFWQl9ERVNDUklQVE9SX1RBR19DSEFJTl9QQVJUSVRJT04sIHMucGFyZW50X2Rlc2NyaXB0b3IudGFnKTsKKyAgRVhQRUNUX0VRKG5iZiwgcy5wYXJlbnRfZGVzY3JpcHRvci5udW1fYnl0ZXNfZm9sbG93aW5nKTsKKyAgRVhQRUNUX0VRKDQyVUwsIHMucm9sbGJhY2tfaW5kZXhfbG9jYXRpb24pOworICBFWFBFQ1RfRVEoMTZVTCwgcy5wYXJ0aXRpb25fbmFtZV9sZW4pOworICBFWFBFQ1RfRVEoMTdVTCwgcy5wdWJsaWNfa2V5X2xlbik7CisKKyAgLy8gQ2hlY2sgZm9yIGJhZCB0YWcuCisgIGJhZCA9IGg7CisgIGJhZC5wYXJlbnRfZGVzY3JpcHRvci50YWcgPSBodG9iZTY0KDB4ZjAwZGQwMGQpOworICBFWFBFQ1RfRVEoMCwgYXZiX2NoYWluX3BhcnRpdGlvbl9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgmYmFkLCAmcykpOworCisgIC8vIENoZWNrIGZvciBiYWQgcm9sbGJhY2sgaW5kZXggc2xvdCAobXVzdCBiZSBhdCBsZWFzdCAxKS4KKyAgYmFkID0gaDsKKyAgYmFkLnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uID0gaHRvYmUzMigwKTsKKyAgRVhQRUNUX0VRKDAsIGF2Yl9jaGFpbl9wYXJ0aXRpb25fZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmJhZCwgJnMpKTsKKworICAvLyBEb2Vzbid0IGZpdCBpbiA0MCBieXRlcyAoMjQgKyAxNyA9IDQxKS4KKyAgYmFkID0gaDsKKyAgYmFkLnBhcnRpdGlvbl9uYW1lX2xlbiA9IGh0b2JlMzIoMjQpOworICBFWFBFQ1RfRVEoMCwgYXZiX2NoYWluX3BhcnRpdGlvbl9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgmYmFkLCAmcykpOworCisgIC8vIERvZXNuJ3QgZml0IGluIDQwIGJ5dGVzICgxNiArIDI1ID0gNDEpLgorICBiYWQgPSBoOworICBiYWQucHVibGljX2tleV9sZW4gPSBodG9iZTMyKDI1KTsKKyAgRVhQRUNUX0VRKDAsIGF2Yl9jaGFpbl9wYXJ0aXRpb25fZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmJhZCwgJnMpKTsKK30KKworVEVTVChVdGlsVGVzdCwgUHJvcGVydHlEZXNjcmlwdG9yQnl0ZXN3YXApIHsKKyAgQXZiUHJvcGVydHlEZXNjcmlwdG9yIGg7CisgIEF2YlByb3BlcnR5RGVzY3JpcHRvciBzOworICBBdmJQcm9wZXJ0eURlc2NyaXB0b3IgYmFkOworICB1aW50NjRfdCBuYmY7CisKKyAgLy8gU3BlY2lmeSA0MCBieXRlcyBvZiBkYXRhIHBhc3QgdGhlIGVuZCBvZiB0aGUgZGVzY3JpcHRvciBzdHJ1Y3QuCisgIG5iZiA9IDQwICsgc2l6ZW9mKEF2YlByb3BlcnR5RGVzY3JpcHRvcikgLSBzaXplb2YoQXZiRGVzY3JpcHRvcik7CisgIGgucGFyZW50X2Rlc2NyaXB0b3IubnVtX2J5dGVzX2ZvbGxvd2luZyA9IGh0b2JlNjQobmJmKTsKKyAgaC5wYXJlbnRfZGVzY3JpcHRvci50YWcgPSBodG9iZTY0KEFWQl9ERVNDUklQVE9SX1RBR19QUk9QRVJUWSk7CisgIGgua2V5X251bV9ieXRlcyA9IGh0b2JlNjQoMTYpOworICBoLnZhbHVlX251bV9ieXRlcyA9IGh0b2JlNjQoMTcpOworCisgIEVYUEVDVF9ORSgwLCBhdmJfcHJvcGVydHlfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmgsICZzKSk7CisKKyAgRVhQRUNUX0VRKEFWQl9ERVNDUklQVE9SX1RBR19QUk9QRVJUWSwgcy5wYXJlbnRfZGVzY3JpcHRvci50YWcpOworICBFWFBFQ1RfRVEobmJmLCBzLnBhcmVudF9kZXNjcmlwdG9yLm51bV9ieXRlc19mb2xsb3dpbmcpOworICBFWFBFQ1RfRVEoMTZVTCwgcy5rZXlfbnVtX2J5dGVzKTsKKyAgRVhQRUNUX0VRKDE3VUwsIHMudmFsdWVfbnVtX2J5dGVzKTsKKworICAvLyBDaGVjayBmb3IgYmFkIHRhZy4KKyAgYmFkID0gaDsKKyAgYmFkLnBhcmVudF9kZXNjcmlwdG9yLnRhZyA9IGh0b2JlNjQoMHhmMDBkZDAwZCk7CisgIEVYUEVDVF9FUSgwLCBhdmJfcHJvcGVydHlfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmJhZCwgJnMpKTsKKworICAvLyBEb2Vzbid0IGZpdCBpbiA0MCBieXRlcyAoMjIgKyAxNyArIDIgPSA0MSkuCisgIGJhZCA9IGg7CisgIGJhZC5rZXlfbnVtX2J5dGVzID0gaHRvYmU2NCgyMik7CisgIEVYUEVDVF9FUSgwLCBhdmJfcHJvcGVydHlfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmJhZCwgJnMpKTsKKworICAvLyBEb2Vzbid0IGZpdCBpbiA0MCBieXRlcyAoMTYgKyAyMyArIDIgPSA0MSkuCisgIGJhZCA9IGg7CisgIGJhZC52YWx1ZV9udW1fYnl0ZXMgPSBodG9iZTY0KDIzKTsKKyAgRVhQRUNUX0VRKDAsIGF2Yl9wcm9wZXJ0eV9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgmYmFkLCAmcykpOworfQorCitURVNUKFV0aWxUZXN0LCBEZXNjcmlwdG9yQnl0ZXN3YXApIHsKKyAgQXZiRGVzY3JpcHRvciBoOworICBBdmJEZXNjcmlwdG9yIHM7CisgIHVpbnQ2NF90IG42NDsKKworICBuNjQgPSAweDExMjIzMzQ0NTU2Njc3ODg7CisKKyAgaC5udW1fYnl0ZXNfZm9sbG93aW5nID0gaHRvYmU2NChuNjQpOworICBuNjQrKzsKKyAgaC50YWcgPSBodG9iZTY0KG42NCk7CisgIG42NCsrOworCisgIEVYUEVDVF9ORSgwLCBhdmJfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmgsICZzKSk7CisKKyAgbjY0ID0gMHgxMTIyMzM0NDU1NjY3Nzg4OworCisgIEVYUEVDVF9FUShuNjQsIHMubnVtX2J5dGVzX2ZvbGxvd2luZyk7CisgIG42NCsrOworICBFWFBFQ1RfRVEobjY0LCBzLnRhZyk7CisgIG42NCsrOworCisgIC8vIENoZWNrIHRoYXQgd2UgY2F0Y2ggaWYgfG51bV9ieXRlc19mb2xsb3dpbmd8IGlzbid0IGRpdmlzYmxlIGJ5IDguCisgIGgubnVtX2J5dGVzX2ZvbGxvd2luZyA9IGh0b2JlNjQoNyk7CisgIEVYUEVDVF9FUSgwLCBhdmJfZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoJmgsICZzKSk7Cit9CisKK1RFU1QoVXRpbFRlc3QsIFNhZmVBZGRpdGlvbikgeworICB1aW50NjRfdCB2YWx1ZTsKKyAgdWludDY0X3QgcG93Ml82MCA9IDFVTEwgPDwgNjA7CisKKyAgdmFsdWUgPSAyOworICBFWFBFQ1RfTkUoMCwgYXZiX3NhZmVfYWRkX3RvKCZ2YWx1ZSwgNSkpOworICBFWFBFQ1RfRVEoN1VMLCB2YWx1ZSk7CisKKyAgLyogVGhlc2Ugc2hvdWxkIG5vdCBvdmVyZmxvdyAqLworICB2YWx1ZSA9IDEgKiBwb3cyXzYwOworICBFWFBFQ1RfTkUoMCwgYXZiX3NhZmVfYWRkX3RvKCZ2YWx1ZSwgMiAqIHBvdzJfNjApKTsKKyAgRVhQRUNUX0VRKDMgKiBwb3cyXzYwLCB2YWx1ZSk7CisgIHZhbHVlID0gNyAqIHBvdzJfNjA7CisgIEVYUEVDVF9ORSgwLCBhdmJfc2FmZV9hZGRfdG8oJnZhbHVlLCA4ICogcG93Ml82MCkpOworICBFWFBFQ1RfRVEoMTUgKiBwb3cyXzYwLCB2YWx1ZSk7CisgIHZhbHVlID0gOSAqIHBvdzJfNjA7CisgIEVYUEVDVF9ORSgwLCBhdmJfc2FmZV9hZGRfdG8oJnZhbHVlLCAzICogcG93Ml82MCkpOworICBFWFBFQ1RfRVEoMTIgKiBwb3cyXzYwLCB2YWx1ZSk7CisgIHZhbHVlID0gMHhmZmZmZmZmZmZmZmZmZmZjVUw7CisgIEVYUEVDVF9ORSgwLCBhdmJfc2FmZV9hZGRfdG8oJnZhbHVlLCAyKSk7CisgIEVYUEVDVF9FUSgweGZmZmZmZmZmZmZmZmZmZmVVTCwgdmFsdWUpOworCisgIC8qIFRoZXNlIHNob3VsZCBvdmVyZmxvdy4gKi8KKyAgdmFsdWUgPSA4ICogcG93Ml82MDsKKyAgRVhQRUNUX0VRKDAsIGF2Yl9zYWZlX2FkZF90bygmdmFsdWUsIDggKiBwb3cyXzYwKSk7CisgIHZhbHVlID0gMHhmZmZmZmZmZmZmZmZmZmZjVUw7CisgIEVYUEVDVF9FUSgwLCBhdmJfc2FmZV9hZGRfdG8oJnZhbHVlLCA0KSk7Cit9CisKK3N0YXRpYyBpbnQgYXZiX3ZhbGlkYXRlX3V0Zjh6KGNvbnN0IGNoYXIqIGRhdGEpIHsKKyAgcmV0dXJuIGF2Yl92YWxpZGF0ZV91dGY4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGRhdGEpKTsKK30KKworVEVTVChVdGlsVGVzdCwgVVRGOFZhbGlkYXRpb24pIHsKKyAgLy8gVGhlc2Ugc2hvdWxkIHN1Y2NlZWQuCisgIEVYUEVDVF9ORSgwLCBhdmJfdmFsaWRhdGVfdXRmOHooImZvbyBiYXIiKSk7CisgIC8vIEVuY29kaW5nIG9mIFUrMDBFNiBMQVRJTiBTTUFMTCBMRVRURVIgQUU6IMOmCisgIEVYUEVDVF9ORSgwLCBhdmJfdmFsaWRhdGVfdXRmOHooImZvbyBceEMzXHhBNiBiYXIiKSk7CisgIC8vIEVuY29kaW5nIG9mIFUrMjBBQyBFVVJPIFNJR046IOKCrAorICBFWFBFQ1RfTkUoMCwgYXZiX3ZhbGlkYXRlX3V0Zjh6KCJmb28gXHhFMlx4ODJceEFDIGJhciIpKTsKKyAgLy8gRW5jb2Rpbmcgb2YgVSsxRjQ2NiBCT1k6IPCfkaYKKyAgRVhQRUNUX05FKDAsIGF2Yl92YWxpZGF0ZV91dGY4eigiZm9vIFx4RjBceDlGXHg5MVx4QTYgYmFyIikpOworICAvLyBBbGwgdGhyZWUgcnVuZXMgZm9sbG93aW5nIGVhY2ggb3RoZXIuCisgIEVYUEVDVF9ORSgwLCBhdmJfdmFsaWRhdGVfdXRmOHooIlx4QzNceEE2XHhFMlx4ODJceEFDXHhGMFx4OUZceDkxXHhBNiIpKTsKKworICAvLyBUaGVzZSBzaG91bGQgZmFpbC4KKyAgRVhQRUNUX0VRKDAsIGF2Yl92YWxpZGF0ZV91dGY4eigiZm9vIFx4RjggYmFyIikpOworICBFWFBFQ1RfRVEoMCwgYXZiX3ZhbGlkYXRlX3V0Zjh6KCJceEY4IikpOworICAvLyBTdG9wcyBpbiB0aGUgbWlkZGxlIG9mIFVuaWNvZGUgcnVuZS4KKyAgRVhQRUNUX0VRKDAsIGF2Yl92YWxpZGF0ZV91dGY4eigiZm9vIFx4QzMiKSk7Cit9CisKK1RFU1QoVXRpbFRlc3QsIFN0ckNvbmNhdCkgeworICBjaGFyIGJ1Zls4XTsKKworICAvLyBUaGVzZSBzaG91bGQgc3VjY2VlZC4KKyAgRVhQRUNUX05FKDAsIGF2Yl9zdHJfY29uY2F0KGJ1Ziwgc2l6ZW9mIGJ1ZiwgImZvbyIsIDMsICJiYXIxIiwgNCkpOworCisgIC8vIFRoaXMgc2hvdWxkIGZhaWw6IEluc3VmZmljaWVudCBzcGFjZS4KKyAgRVhQRUNUX0VRKDAsIGF2Yl9zdHJfY29uY2F0KGJ1Ziwgc2l6ZW9mIGJ1ZiwgImZvbzAiLCA0LCAiYmFyMSIsIDQpKTsKK30KKworVEVTVChVdGlsVGVzdCwgU3RyU3RyKSB7CisgIGNvbnN0IGNoYXIqIGhheXN0YWNrID0gImFiYyBkZWYgYWJjYWJjIjsKKworICBFWFBFQ1RfRVEobnVsbHB0ciwgYXZiX3N0cnN0cihoYXlzdGFjaywgIm5lZWRsZSIpKTsKKyAgRVhQRUNUX0VRKGhheXN0YWNrLCBhdmJfc3Ryc3RyKGhheXN0YWNrLCAiYWJjIikpOworICBFWFBFQ1RfRVEoaGF5c3RhY2sgKyA0LCBhdmJfc3Ryc3RyKGhheXN0YWNrLCAiZGVmIikpOworICBFWFBFQ1RfRVEoaGF5c3RhY2ssIGF2Yl9zdHJzdHIoaGF5c3RhY2ssIGhheXN0YWNrKSk7Cit9CisKK1RFU1QoVXRpbFRlc3QsIFN0cnZGaW5kU3RyKSB7CisgIGNvbnN0IGNoYXIqIHN0cmluZ3NbXSA9IHsiYWJjYWJjIiwgImFiYyIsICJkZWYiLCBudWxscHRyfTsKKworICBFWFBFQ1RfRVEobnVsbHB0ciwgYXZiX3N0cnZfZmluZF9zdHIoc3RyaW5ncywgIm5vdCB0aGVyZSIsIDkpKTsKKyAgRVhQRUNUX0VRKHN0cmluZ3NbMV0sIGF2Yl9zdHJ2X2ZpbmRfc3RyKHN0cmluZ3MsICJhYmMiLCAzKSk7CisgIEVYUEVDVF9FUShzdHJpbmdzWzJdLCBhdmJfc3Rydl9maW5kX3N0cihzdHJpbmdzLCAiZGVmIiwgMykpOworICBFWFBFQ1RfRVEoc3RyaW5nc1swXSwgYXZiX3N0cnZfZmluZF9zdHIoc3RyaW5ncywgImFiY2FiYyIsIDYpKTsKK30KKworVEVTVChVdGlsVGVzdCwgU3RyUmVwbGFjZSkgeworICAvLyBXZSBkb24ndCBjYXJlIGFib3V0IGxlYWtpbmcgc3RyaW5ncyBmcm9tIGF2Yl9yZXBsYWNlKCkuCisgIEVYUEVDVF9FUSgiT0sgYmxhaCBiYWggJChGT08gT0sgYmxhaCIsCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhhdmJfcmVwbGFjZSgKKyAgICAgICAgICAgICAgICAiJChGT08pIGJsYWggYmFoICQoRk9PICQoRk9PKSBibGFoIiwgIiQoRk9PKSIsICJPSyIpKSk7CisgIEVYUEVDVF9FUSgiT0siLCBzdGQ6OnN0cmluZyhhdmJfcmVwbGFjZSgiJChGT08pIiwgIiQoRk9PKSIsICJPSyIpKSk7CisgIEVYUEVDVF9FUSgiIE9LIiwgc3RkOjpzdHJpbmcoYXZiX3JlcGxhY2UoIiAkKEZPTykiLCAiJChGT08pIiwgIk9LIikpKTsKKyAgRVhQRUNUX0VRKCJPSyAiLCBzdGQ6OnN0cmluZyhhdmJfcmVwbGFjZSgiJChGT08pICIsICIkKEZPTykiLCAiT0siKSkpOworICBFWFBFQ1RfRVEoIkxPTkdTVFJJTkdMT05HU1RSSU5HIiwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGF2Yl9yZXBsYWNlKCIkKEZPTykkKEZPTykiLCAiJChGT08pIiwgIkxPTkdTVFJJTkciKSkpOworfQorCitURVNUKFV0aWxUZXN0LCBDcmMzMikgeworICAvKiBDb21wYXJlIHdpdGggb3V0cHV0IG9mIGNyYzMyKDEpOgorICAgKgorICAgKiAgJCAoZWNobyAtbiBmb29iYXIgPiAvdG1wL2NyYzMyX2lucHV0KTsgY3JjMzIgL3RtcC9jcmMzMl9pbnB1dAorICAgKiAgOWVmNjFmOTUKKyAgICovCisgIEVYUEVDVF9FUSh1aW50MzJfdCgweDllZjYxZjk1KSwgYXZiX2NyYzMyKChjb25zdCB1aW50OF90KikiZm9vYmFyIiwgNikpOworfQorCitURVNUKFV0aWxUZXN0LCBodG9iZTMyKSB7CisgIEVYUEVDVF9FUShhdmJfaHRvYmUzMigweDEyMzQ1Njc4KSwgaHRvYmUzMigweDEyMzQ1Njc4KSk7Cit9CisKK1RFU1QoVXRpbFRlc3QsIGJlMzJ0b2gpIHsKKyAgRVhQRUNUX0VRKGF2Yl9iZTMydG9oKDB4MTIzNDU2NzgpLCBiZTMydG9oKDB4MTIzNDU2NzgpKTsKK30KKworVEVTVChVdGlsVGVzdCwgaHRvYmU2NCkgeworICBFWFBFQ1RfRVEoYXZiX2h0b2JlNjQoMHgxMjM0NTY3ODlhYmNkZWYwKSwgaHRvYmU2NCgweDEyMzQ1Njc4OWFiY2RlZjApKTsKK30KKworVEVTVChVdGlsVGVzdCwgYmU2NHRvaCkgeworICBFWFBFQ1RfRVEoYXZiX2JlNjR0b2goMHgxMjM0NTY3ODlhYmNkZWYwKSwgYmU2NHRvaCgweDEyMzQ1Njc4OWFiY2RlZjApKTsKK30KZGlmZiAtLWdpdCBhL2F2Yi90ZXN0L2F2Yl92Ym1ldGFfaW1hZ2VfdW5pdHRlc3QuY2MgYi9hdmIvdGVzdC9hdmJfdmJtZXRhX2ltYWdlX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MGRkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvdGVzdC9hdmJfdmJtZXRhX2ltYWdlX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNTY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8YmFzZS9maWxlcy9maWxlX3V0aWwuaD4KKyNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX3V0aWwuaD4KKyNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+CisKKyNpbmNsdWRlIDxsaWJhdmIvbGliYXZiLmg+CisKKyNpbmNsdWRlICJhdmJfdW5pdHRlc3RfdXRpbC5oIgorCituYW1lc3BhY2UgYXZiIHsKKworY2xhc3MgVmVyaWZ5VGVzdCA6IHB1YmxpYyBCYXNlQXZiVG9vbFRlc3QgeworIHB1YmxpYzoKKyAgVmVyaWZ5VGVzdCgpIHt9CisKKyBwcm90ZWN0ZWQ6CisgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgTW9kaWZpY2F0aW9uRGV0ZWN0aW9uIHRlc3QuIE1vZGlmaWVzCisgIC8vIGJvb3RfaW1hZ2VfIGluIGEgbnVtYmVyIG9mIHBsYWNlcyBpbiB0aGUgc3ViLWFycmF5IGF0IHxvZmZzZXR8IG9mCisgIC8vIHNpemUgfGxlbmd0aHwgYW5kIGNoZWNrcyB0aGF0IGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KCkgcmV0dXJucworICAvLyB8ZXhwZWN0ZWRfcmVzdWx0fC4KKyAgYm9vbCB0ZXN0X21vZGlmaWNhdGlvbihBdmJWQk1ldGFWZXJpZnlSZXN1bHQgZXhwZWN0ZWRfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7Cit9OworCitURVNUX0YoVmVyaWZ5VGVzdCwgQm9vdEltYWdlU3RydWN0U2l6ZSkgeworICBFWFBFQ1RfRVEoMjU2VUwsIHNpemVvZihBdmJWQk1ldGFJbWFnZUhlYWRlcikpOworfQorCitURVNUX0YoVmVyaWZ5VGVzdCwgQ2hlY2tTSEEyNTZSU0EyMDQ4KSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSk7CisgIEVYUEVDVF9FUShBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksIE5VTEwsIE5VTEwpKTsKK30KKworVEVTVF9GKFZlcmlmeVRlc3QsIENoZWNrU0hBMjU2UlNBNDA5NikgeworICBHZW5lcmF0ZVZCTWV0YUltYWdlKCJ2Ym1ldGEuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU0hBMjU2X1JTQTQwOTYiLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTQwOTYucGVtIikpOworICBFWFBFQ1RfRVEoQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoCisgICAgICAgICAgICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCBOVUxMLCBOVUxMKSk7Cit9CisKK1RFU1RfRihWZXJpZnlUZXN0LCBDaGVja1NIQTI1NlJTQTgxOTIpIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0E4MTkyIiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2E4MTkyLnBlbSIpKTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSwgTlVMTCwgTlVMTCkpOworfQorCitURVNUX0YoVmVyaWZ5VGVzdCwgQ2hlY2tTSEE1MTJSU0EyMDQ4KSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEE1MTJfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSk7CisgIEVYUEVDVF9FUShBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksIE5VTEwsIE5VTEwpKTsKK30KKworVEVTVF9GKFZlcmlmeVRlc3QsIENoZWNrU0hBNTEyUlNBNDA5NikgeworICBHZW5lcmF0ZVZCTWV0YUltYWdlKCJ2Ym1ldGEuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU0hBNTEyX1JTQTQwOTYiLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTQwOTYucGVtIikpOworICBFWFBFQ1RfRVEoQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoCisgICAgICAgICAgICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCBOVUxMLCBOVUxMKSk7Cit9CisKK1RFU1RfRihWZXJpZnlUZXN0LCBDaGVja1NIQTUxMlJTQTgxOTIpIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTUxMl9SU0E4MTkyIiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2E4MTkyLnBlbSIpKTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSwgTlVMTCwgTlVMTCkpOworfQorCitURVNUX0YoVmVyaWZ5VGVzdCwgQ2hlY2tVbnNpZ25lZCkgeworICBHZW5lcmF0ZVZCTWV0YUltYWdlKCJ2Ym1ldGEuaW1nIiwgIiIsIDAsIGJhc2U6OkZpbGVQYXRoKCIiKSk7CisgIEVYUEVDVF9FUShBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfT0tfTk9UX1NJR05FRCwKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSwgTlVMTCwgTlVMTCkpOworfQorCitURVNUX0YoVmVyaWZ5VGVzdCwgQ2hlY2tCaWdnZXJMZW5ndGgpIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKyAgLy8gQ2hlY2sgdGhhdCBpdCdzIE9LIGlmIHdlIHBhc3MgYSBiaWdnZXIgbGVuZ3RoIHRoYW4gd2hhdCB0aGUKKyAgLy8gaGVhZGVyIGluZGljYXRlcy4KKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSArIDgxOTIsIE5VTEwsIE5VTEwpKTsKK30KKworVEVTVF9GKFZlcmlmeVRlc3QsIEJhZE1hZ2ljKSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSk7CisgIHZibWV0YV9pbWFnZV9bMF0gPSAnWic7CisgIEVYUEVDVF9FUShBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfSU5WQUxJRF9WQk1FVEFfSEVBREVSLAorICAgICAgICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoCisgICAgICAgICAgICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCBOVUxMLCBOVUxMKSk7Cit9CisKK1RFU1RfRihWZXJpZnlUZXN0LCBNYWpvclZlcnNpb25DaGVjaykgeworICBHZW5lcmF0ZVZCTWV0YUltYWdlKCJ2Ym1ldGEuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU0hBMjU2X1JTQTIwNDgiLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIikpOworCisgIEF2YlZCTWV0YUltYWdlSGVhZGVyKiBoID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXZiVkJNZXRhSW1hZ2VIZWFkZXIqPih2Ym1ldGFfaW1hZ2VfLmRhdGEoKSk7CisgIGgtPmhlYWRlcl92ZXJzaW9uX21ham9yID0gaHRvYmUzMigxICsgYmUzMnRvaChoLT5oZWFkZXJfdmVyc2lvbl9tYWpvcikpOworICBFWFBFQ1RfRVEoQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX0lOVkFMSURfVkJNRVRBX0hFQURFUiwKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSwgTlVMTCwgTlVMTCkpOworfQorCitURVNUX0YoVmVyaWZ5VGVzdCwgTWlub3JWZXJzaW9uQ2hlY2spIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhLmltZyIsICIiLCAwLCBiYXNlOjpGaWxlUGF0aCgiIikpOworCisgIEF2YlZCTWV0YUltYWdlSGVhZGVyKiBoID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXZiVkJNZXRhSW1hZ2VIZWFkZXIqPih2Ym1ldGFfaW1hZ2VfLmRhdGEoKSk7CisgIGgtPmhlYWRlcl92ZXJzaW9uX21pbm9yID0gaHRvYmUzMigxICsgYmUzMnRvaChoLT5oZWFkZXJfdmVyc2lvbl9taW5vcikpOworICBFWFBFQ1RfRVEoQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LX05PVF9TSUdORUQsCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksIE5VTEwsIE5VTEwpKTsKK30KKworVEVTVF9GKFZlcmlmeVRlc3QsIEJsb2NrU2l6ZXNBZGRVcFRvTGVzc1RoYW5MZW5ndGgpIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKworICBBdmJWQk1ldGFJbWFnZUhlYWRlciogaCA9CisgICAgICByZWludGVycHJldF9jYXN0PEF2YlZCTWV0YUltYWdlSGVhZGVyKj4odmJtZXRhX2ltYWdlXy5kYXRhKCkpOworICBBdmJWQk1ldGFJbWFnZUhlYWRlciBiYWNrdXAgPSAqaDsKKworICAvLyBDaGVjayB0aGF0IHRoZSBzdW0gb2YgdGhlIHR3byBibG9jayBsZW5ndGhzIGlzIGxlc3MgdGhhbiBwYXNzZWQKKyAgLy8gaW4gc2l6ZS4gVXNlIGEgc2l6ZSB0aGF0J3MgYSBtdWx0aXBsZSBvZiA2NCB0byBhdm9pZCBmYWlsdXJlIG9uCisgIC8vIGVhcmxpZXIgY2hlY2suCisgIHVpbnQ2NF90IHNpemUgPSB2Ym1ldGFfaW1hZ2VfLnNpemUoKSAmICh+MHgzZik7CisKKyAgaC0+YXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplID0gaHRvYmU2NChzaXplKTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9JTlZBTElEX1ZCTUVUQV9IRUFERVIsCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksIE5VTEwsIE5VTEwpKTsKKyAgKmggPSBiYWNrdXA7CisKKyAgaC0+YXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZSA9IGh0b2JlNjQoc2l6ZSk7CisgIEVYUEVDVF9FUShBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfSU5WQUxJRF9WQk1FVEFfSEVBREVSLAorICAgICAgICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoCisgICAgICAgICAgICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCBOVUxMLCBOVUxMKSk7CisgICpoID0gYmFja3VwOworCisgIC8vIE92ZXJmbG93IGNoZWNrcyAtIGNob29zZSBvdmVyZmxvdyBjYW5kaWRhdGUgc28gaXQncyBhIG11bHRpcGxlIG9mCisgIC8vIDY0IG90aGVyd2lzZSB3ZSdsbCBmYWlsIG9uIGFuIGVhcmxpZXIgY2hlY2suCisgIHNpemUgPSAweGZmZmZmZmZmZmZmZmZmYzBVTDsKKworICBoLT5hdXRoZW50aWNhdGlvbl9kYXRhX2Jsb2NrX3NpemUgPSBodG9iZTY0KHNpemUpOworICBFWFBFQ1RfRVEoQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX0lOVkFMSURfVkJNRVRBX0hFQURFUiwKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSwgTlVMTCwgTlVMTCkpOworICAqaCA9IGJhY2t1cDsKKworICBoLT5hdXhpbGlhcnlfZGF0YV9ibG9ja19zaXplID0gaHRvYmU2NChzaXplKTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9JTlZBTElEX1ZCTUVUQV9IRUFERVIsCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksIE5VTEwsIE5VTEwpKTsKKyAgKmggPSBiYWNrdXA7CisKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSwgTlVMTCwgTlVMTCkpOworfQorCitURVNUX0YoVmVyaWZ5VGVzdCwgQmxvY2tTaXplc011bHRpcGxlT2Y2NCkgeworICBHZW5lcmF0ZVZCTWV0YUltYWdlKCJ2Ym1ldGEuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU0hBMjU2X1JTQTIwNDgiLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIikpOworCisgIEF2YlZCTWV0YUltYWdlSGVhZGVyKiBoID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXZiVkJNZXRhSW1hZ2VIZWFkZXIqPih2Ym1ldGFfaW1hZ2VfLmRhdGEoKSk7CisgIEF2YlZCTWV0YUltYWdlSGVhZGVyIGJhY2t1cCA9ICpoOworCisgIGgtPmF1dGhlbnRpY2F0aW9uX2RhdGFfYmxvY2tfc2l6ZSA9CisgICAgICBodG9iZTMyKGJlMzJ0b2goaC0+YXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplKSAtIDMyKTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9JTlZBTElEX1ZCTUVUQV9IRUFERVIsCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCkgLSAzMiwgTlVMTCwgTlVMTCkpOworICAqaCA9IGJhY2t1cDsKKworICBoLT5hdXhpbGlhcnlfZGF0YV9ibG9ja19zaXplID0KKyAgICAgIGh0b2JlMzIoYmUzMnRvaChoLT5hdXhpbGlhcnlfZGF0YV9ibG9ja19zaXplKSAtIDMyKTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9JTlZBTElEX1ZCTUVUQV9IRUFERVIsCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCkgLSAzMiwgTlVMTCwgTlVMTCkpOworICAqaCA9IGJhY2t1cDsKKworICBFWFBFQ1RfRVEoQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoCisgICAgICAgICAgICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCBOVUxMLCBOVUxMKSk7Cit9CisKK1RFU1RfRihWZXJpZnlUZXN0LCBIYXNoT3V0T2ZCb3VuZHMpIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKworICBBdmJWQk1ldGFJbWFnZUhlYWRlciogaCA9CisgICAgICByZWludGVycHJldF9jYXN0PEF2YlZCTWV0YUltYWdlSGVhZGVyKj4odmJtZXRhX2ltYWdlXy5kYXRhKCkpOworCisgIC8vIENoZWNrIHdlIGNhdGNoIHdoZW4gaGFzaCBkYXRhIGdvZXMgb3V0IG9mIGJvdW5kcy4KKyAgaC0+aGFzaF9vZmZzZXQgPSBodG9iZTY0KDQpOworICBoLT5oYXNoX3NpemUgPSBodG9iZTY0KGJlNjR0b2goaC0+YXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplKSk7CisgIEVYUEVDVF9FUShBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfSU5WQUxJRF9WQk1FVEFfSEVBREVSLAorICAgICAgICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoCisgICAgICAgICAgICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCBOVUxMLCBOVUxMKSk7CisKKyAgLy8gT3ZlcmZsb3cgY2hlY2tzLgorICBoLT5oYXNoX29mZnNldCA9IGh0b2JlNjQoNCk7CisgIGgtPmhhc2hfc2l6ZSA9IGh0b2JlNjQoMHhmZmZmZmZmZmZmZmZmZmZlVUwpOworICBFWFBFQ1RfRVEoQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX0lOVkFMSURfVkJNRVRBX0hFQURFUiwKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSwgTlVMTCwgTlVMTCkpOworfQorCitURVNUX0YoVmVyaWZ5VGVzdCwgU2lnbmF0dXJlT3V0T2ZCb3VuZHMpIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKworICBBdmJWQk1ldGFJbWFnZUhlYWRlciogaCA9CisgICAgICByZWludGVycHJldF9jYXN0PEF2YlZCTWV0YUltYWdlSGVhZGVyKj4odmJtZXRhX2ltYWdlXy5kYXRhKCkpOworCisgIC8vIENoZWNrIHdlIGNhdGNoIHdoZW4gc2lnbmF0dXJlIGRhdGEgZ29lcyBvdXQgb2YgYm91bmRzLgorICBoLT5zaWduYXR1cmVfb2Zmc2V0ID0gaHRvYmU2NCg0KTsKKyAgaC0+c2lnbmF0dXJlX3NpemUgPSBodG9iZTY0KGJlNjR0b2goaC0+YXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplKSk7CisgIEVYUEVDVF9FUShBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfSU5WQUxJRF9WQk1FVEFfSEVBREVSLAorICAgICAgICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoCisgICAgICAgICAgICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCBOVUxMLCBOVUxMKSk7CisKKyAgLy8gT3ZlcmZsb3cgY2hlY2tzLgorICBoLT5zaWduYXR1cmVfb2Zmc2V0ID0gaHRvYmU2NCg0KTsKKyAgaC0+c2lnbmF0dXJlX3NpemUgPSBodG9iZTY0KDB4ZmZmZmZmZmZmZmZmZmZmZVVMKTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9JTlZBTElEX1ZCTUVUQV9IRUFERVIsCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksIE5VTEwsIE5VTEwpKTsKK30KKworVEVTVF9GKFZlcmlmeVRlc3QsIFB1YmxpY0tleU91dE9mQm91bmRzKSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSk7CisKKyAgQXZiVkJNZXRhSW1hZ2VIZWFkZXIqIGggPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxBdmJWQk1ldGFJbWFnZUhlYWRlcio+KHZibWV0YV9pbWFnZV8uZGF0YSgpKTsKKworICAvLyBDaGVjayB3ZSBjYXRjaCB3aGVuIHB1YmxpYyBrZXkgZGF0YSBnb2VzIG91dCBvZiBib3VuZHMuCisgIGgtPnB1YmxpY19rZXlfb2Zmc2V0ID0gaHRvYmU2NCg0KTsKKyAgaC0+cHVibGljX2tleV9zaXplID0gaHRvYmU2NChiZTY0dG9oKGgtPmF1eGlsaWFyeV9kYXRhX2Jsb2NrX3NpemUpKTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9JTlZBTElEX1ZCTUVUQV9IRUFERVIsCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksIE5VTEwsIE5VTEwpKTsKKworICAvLyBPdmVyZmxvdyBjaGVja3MuCisgIGgtPnB1YmxpY19rZXlfb2Zmc2V0ID0gaHRvYmU2NCg0KTsKKyAgaC0+cHVibGljX2tleV9zaXplID0gaHRvYmU2NCgweGZmZmZmZmZmZmZmZmZmZmVVTCk7CisgIEVYUEVDVF9FUShBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfSU5WQUxJRF9WQk1FVEFfSEVBREVSLAorICAgICAgICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoCisgICAgICAgICAgICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCBOVUxMLCBOVUxMKSk7Cit9CisKK1RFU1RfRihWZXJpZnlUZXN0LCBQdWJsaWNLZXlNZXRhZGF0YU91dE9mQm91bmRzKSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSk7CisKKyAgQXZiVkJNZXRhSW1hZ2VIZWFkZXIqIGggPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxBdmJWQk1ldGFJbWFnZUhlYWRlcio+KHZibWV0YV9pbWFnZV8uZGF0YSgpKTsKKworICAvLyBDaGVjayB3ZSBjYXRjaCB3aGVuIHB1YmxpYyBrZXkgbWV0YWRhdGEgZGF0YSBnb2VzIG91dCBvZiBib3VuZHMuCisgIGgtPnB1YmxpY19rZXlfbWV0YWRhdGFfb2Zmc2V0ID0gaHRvYmU2NCg0KTsKKyAgaC0+cHVibGljX2tleV9tZXRhZGF0YV9zaXplID0gaHRvYmU2NChiZTY0dG9oKGgtPmF1eGlsaWFyeV9kYXRhX2Jsb2NrX3NpemUpKTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9JTlZBTElEX1ZCTUVUQV9IRUFERVIsCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksIE5VTEwsIE5VTEwpKTsKKworICAvLyBPdmVyZmxvdyBjaGVja3MuCisgIGgtPnB1YmxpY19rZXlfbWV0YWRhdGFfb2Zmc2V0ID0gaHRvYmU2NCg0KTsKKyAgaC0+cHVibGljX2tleV9tZXRhZGF0YV9zaXplID0gaHRvYmU2NCgweGZmZmZmZmZmZmZmZmZmZmVVTCk7CisgIEVYUEVDVF9FUShBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfSU5WQUxJRF9WQk1FVEFfSEVBREVSLAorICAgICAgICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoCisgICAgICAgICAgICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCBOVUxMLCBOVUxMKSk7Cit9CisKK1RFU1RfRihWZXJpZnlUZXN0LCBJbnZhbGlkQWxnb3JpdGhtRmllbGQpIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKworICBBdmJWQk1ldGFJbWFnZUhlYWRlciogaCA9CisgICAgICByZWludGVycHJldF9jYXN0PEF2YlZCTWV0YUltYWdlSGVhZGVyKj4odmJtZXRhX2ltYWdlXy5kYXRhKCkpOworICBBdmJWQk1ldGFJbWFnZUhlYWRlciBiYWNrdXAgPSAqaDsKKworICAvLyBDaGVjayB3ZSBiYWlsIG9uIHVua25vd24gYWxnb3JpdGhtLgorICBoLT5hbGdvcml0aG1fdHlwZSA9IGh0b2JlMzIoX0FWQl9BTEdPUklUSE1fTlVNX1RZUEVTKTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9JTlZBTElEX1ZCTUVUQV9IRUFERVIsCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksIE5VTEwsIE5VTEwpKTsKKyAgKmggPSBiYWNrdXA7CisgIEVYUEVDVF9FUShBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksIE5VTEwsIE5VTEwpKTsKK30KKworVEVTVF9GKFZlcmlmeVRlc3QsIFB1YmxpY0tleUJsb2NrVG9vU21hbGwpIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKworICBBdmJWQk1ldGFJbWFnZUhlYWRlciogaCA9CisgICAgICByZWludGVycHJldF9jYXN0PEF2YlZCTWV0YUltYWdlSGVhZGVyKj4odmJtZXRhX2ltYWdlXy5kYXRhKCkpOworICBBdmJWQk1ldGFJbWFnZUhlYWRlciBiYWNrdXAgPSAqaDsKKworICAvLyBDaGVjayB3ZSBiYWlsIGlmIHRoZSBhdXhpbGlhcnkgZGF0YSBibG9jayBpcyB0b28gc21hbGwuCisgIHVpbnQ2NF90IGNoYW5nZSA9IGJlNjR0b2goaC0+YXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZSkgLSA2NDsKKyAgaC0+YXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZSA9IGh0b2JlNjQoY2hhbmdlKTsKKyAgRVhQRUNUX0VRKAorICAgICAgQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX0lOVkFMSURfVkJNRVRBX0hFQURFUiwKKyAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSAtIGNoYW5nZSwgTlVMTCwgTlVMTCkpOworICAqaCA9IGJhY2t1cDsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSwgTlVMTCwgTlVMTCkpOworfQorCitib29sIFZlcmlmeVRlc3Q6OnRlc3RfbW9kaWZpY2F0aW9uKEF2YlZCTWV0YVZlcmlmeVJlc3VsdCBleHBlY3RlZF9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKKyAgdWludDhfdCogZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHZibWV0YV9pbWFnZV8uZGF0YSgpKTsKKyAgY29uc3QgaW50IGtOdW1DaGVja3BvaW50cyA9IDE2OworCisgIC8vIFRlc3QgfGtOdW1DaGVja3BvaW50c3wgbW9kaWZpY2F0aW9ucyBpbiB0aGUgc3RhcnQsIG1pZGRsZSwgYW5kCisgIC8vIGVuZCBvZiBnaXZlbiBzdWItYXJyYXkuCisgIGZvciAoaW50IG4gPSAwOyBuIDw9IGtOdW1DaGVja3BvaW50czsgbisrKSB7CisgICAgc2l6ZV90IG8gPSBzdGQ6Om1pbihsZW5ndGggKiBuIC8ga051bUNoZWNrcG9pbnRzLCBsZW5ndGggLSAxKSArIG9mZnNldDsKKyAgICBkW29dIF49IDB4ODA7CisgICAgQXZiVkJNZXRhVmVyaWZ5UmVzdWx0IHJlc3VsdCA9IGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksIE5VTEwsIE5VTEwpOworICAgIGRbb10gXj0gMHg4MDsKKyAgICBpZiAocmVzdWx0ICE9IGV4cGVjdGVkX3Jlc3VsdCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitURVNUX0YoVmVyaWZ5VGVzdCwgTW9kaWZpY2F0aW9uRGV0ZWN0aW9uKSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSk7CisKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSwgTlVMTCwgTlVMTCkpOworCisgIEF2YlZCTWV0YUltYWdlSGVhZGVyIGg7CisgIGF2Yl92Ym1ldGFfaW1hZ2VfaGVhZGVyX3RvX2hvc3RfYnl0ZV9vcmRlcigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXZiVkJNZXRhSW1hZ2VIZWFkZXIqPih2Ym1ldGFfaW1hZ2VfLmRhdGEoKSksICZoKTsKKworICBzaXplX3QgaGVhZGVyX2Jsb2NrX29mZnNldCA9IDA7CisgIHNpemVfdCBhdXRoZW50aWNhdGlvbl9ibG9ja19vZmZzZXQgPQorICAgICAgaGVhZGVyX2Jsb2NrX29mZnNldCArIHNpemVvZihBdmJWQk1ldGFJbWFnZUhlYWRlcik7CisgIHNpemVfdCBhdXhpbGlhcnlfYmxvY2tfb2Zmc2V0ID0KKyAgICAgIGF1dGhlbnRpY2F0aW9uX2Jsb2NrX29mZnNldCArIGguYXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplOworCisgIC8vIEVuc3VyZSB3ZSBkZXRlY3QgbW9kaWZpY2F0aW9uIG9mIHRoZSBoZWFkZXIgZGF0YSBibG9jay4gRG8gdGhpcworICAvLyBpbiBhIGZpZWxkIHRoYXQncyBub3QgdmFsaWRhdGVkIHNvIElOVkFMSURfVkJNRVRBX0hFQURFUgorICAvLyBpc24ndCByZXR1cm5lZC4KKyAgRVhQRUNUX1RSVUUodGVzdF9tb2RpZmljYXRpb24oCisgICAgICBBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfSEFTSF9NSVNNQVRDSCwKKyAgICAgIG9mZnNldG9mKEF2YlZCTWV0YUltYWdlSGVhZGVyLCByZXNlcnZlZCksCisgICAgICBzaXplb2YoQXZiVkJNZXRhSW1hZ2VIZWFkZXIpIC0gb2Zmc2V0b2YoQXZiVkJNZXRhSW1hZ2VIZWFkZXIsIHJlc2VydmVkKSkpOworICAvLyBBbHNvIGNoZWNrIHRoZSB8cmVzZXJ2ZWR8IGZpZWxkLgorICBFWFBFQ1RfVFJVRSh0ZXN0X21vZGlmaWNhdGlvbihBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfSEFTSF9NSVNNQVRDSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQXZiVkJNZXRhSW1hZ2VIZWFkZXIsIHJlc2VydmVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEF2YlZCTWV0YUltYWdlSGVhZGVyKCkucmVzZXJ2ZWQpKSk7CisKKyAgLy8gRW5zdXJlIHdlIGRldGVjdCBtb2RpZmljYXRpb25zIGluIHRoZSBhdXhpbGlhcnkgZGF0YSBibG9jay4KKyAgRVhQRUNUX1RSVUUodGVzdF9tb2RpZmljYXRpb24oQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX0hBU0hfTUlTTUFUQ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eGlsaWFyeV9ibG9ja19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguYXV4aWxpYXJ5X2RhdGFfYmxvY2tfc2l6ZSkpOworCisgIC8vIE1vZGlmaWNhdGlvbnMgaW4gdGhlIGhhc2ggcGFydCBvZiB0aGUgQXV0aGVudGljYXRpb24gZGF0YSBibG9jaworICAvLyBzaG91bGQgYWxzbyB5aWVsZCBIQVNIX01JU01BVENILiBUaGlzIGlzIGJlY2F1c2UgdGhlIGhhc2ggY2hlY2sKKyAgLy8gY29tcGFyZXMgdGhlIGNhbGN1bGF0ZWQgaGFzaCBhZ2FpbnN0IHRoZSBzdG9yZWQgaGFzaC4KKyAgRVhQRUNUX1RSVUUodGVzdF9tb2RpZmljYXRpb24oQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX0hBU0hfTUlTTUFUQ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uX2Jsb2NrX29mZnNldCArIGguaGFzaF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguaGFzaF9zaXplKSk7CisKKyAgLy8gTW9kaWZpY2F0aW9ucyBpbiB0aGUgc2lnbmF0dXJlIHBhcnQgb2YgdGhlIEF1dGhlbnRpY2F0aW9uIGRhdGEKKyAgLy8gYmxvY2ssIHNob3VsZCBub3QgY2F1c2UgYSBoYXNoIG1pc21hdGNoIC4uLiBidXQgd2lsbCBjYXVzZSBhCisgIC8vIHNpZ25hdHVyZSBtaXNtYXRjaC4KKyAgRVhQRUNUX1RSVUUoCisgICAgICB0ZXN0X21vZGlmaWNhdGlvbihBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfU0lHTkFUVVJFX01JU01BVENILAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb25fYmxvY2tfb2Zmc2V0ICsgaC5zaWduYXR1cmVfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaC5zaWduYXR1cmVfc2l6ZSkpOworCisgIC8vIE1vZmljYXRpb25zIG91dHNpZGUgdGhlIGhhc2ggYW5kIHNpZ25hdHVyZSBwYXJ0cyBvZiB0aGUKKyAgLy8gQXV0aGVudGljYXRpb24gZGF0YSBibG9jayBhcmUgbm90IGRldGVjdGVkLiBUaGlzIGlzIGJlY2F1c2UgaXQncworICAvLyBub3QgcGFydCBvZiB0aGUgaGFzaCBjYWxjdWxhdGlvbi4KKyAgdWludDY0X3Qgb2Zmc2V0ID0gaC5zaWduYXR1cmVfb2Zmc2V0ICsgaC5zaWduYXR1cmVfc2l6ZTsKKyAgQVNTRVJUX0xUKGguaGFzaF9vZmZzZXQsIGguc2lnbmF0dXJlX29mZnNldCk7CisgIEFTU0VSVF9MVChvZmZzZXQgKyAxLCBoLmF1dGhlbnRpY2F0aW9uX2RhdGFfYmxvY2tfc2l6ZSk7CisgIEVYUEVDVF9UUlVFKHRlc3RfbW9kaWZpY2F0aW9uKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb25fYmxvY2tfb2Zmc2V0ICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmF1dGhlbnRpY2F0aW9uX2RhdGFfYmxvY2tfc2l6ZSAtIG9mZnNldCkpOworfQorCitURVNUX0YoVmVyaWZ5VGVzdCwgVkJNZXRhSGVhZGVyQnl0ZXN3YXApIHsKKyAgQXZiVkJNZXRhSW1hZ2VIZWFkZXIgaDsKKyAgQXZiVkJNZXRhSW1hZ2VIZWFkZXIgczsKKyAgdWludDMyX3QgbjMyOworICB1aW50NjRfdCBuNjQ7CisKKyAgbjMyID0gMHgxMTIyMzM0NDsKKyAgbjY0ID0gMHgxMTIyMzM0NDU1NjY3Nzg4OworCisgIGguaGVhZGVyX3ZlcnNpb25fbWFqb3IgPSBodG9iZTMyKG4zMik7CisgIG4zMisrOworICBoLmhlYWRlcl92ZXJzaW9uX21pbm9yID0gaHRvYmUzMihuMzIpOworICBuMzIrKzsKKyAgaC5hdXRoZW50aWNhdGlvbl9kYXRhX2Jsb2NrX3NpemUgPSBodG9iZTY0KG42NCk7CisgIG42NCsrOworICBoLmF1eGlsaWFyeV9kYXRhX2Jsb2NrX3NpemUgPSBodG9iZTY0KG42NCk7CisgIG42NCsrOworICBoLmFsZ29yaXRobV90eXBlID0gaHRvYmUzMihuMzIpOworICBuMzIrKzsKKyAgaC5oYXNoX29mZnNldCA9IGh0b2JlNjQobjY0KTsKKyAgbjY0Kys7CisgIGguaGFzaF9zaXplID0gaHRvYmU2NChuNjQpOworICBuNjQrKzsKKyAgaC5zaWduYXR1cmVfb2Zmc2V0ID0gaHRvYmU2NChuNjQpOworICBuNjQrKzsKKyAgaC5zaWduYXR1cmVfc2l6ZSA9IGh0b2JlNjQobjY0KTsKKyAgbjY0Kys7CisgIGgucHVibGljX2tleV9vZmZzZXQgPSBodG9iZTY0KG42NCk7CisgIG42NCsrOworICBoLnB1YmxpY19rZXlfc2l6ZSA9IGh0b2JlNjQobjY0KTsKKyAgbjY0Kys7CisgIGgucHVibGljX2tleV9tZXRhZGF0YV9vZmZzZXQgPSBodG9iZTY0KG42NCk7CisgIG42NCsrOworICBoLnB1YmxpY19rZXlfbWV0YWRhdGFfc2l6ZSA9IGh0b2JlNjQobjY0KTsKKyAgbjY0Kys7CisgIGguZGVzY3JpcHRvcnNfb2Zmc2V0ID0gaHRvYmU2NChuNjQpOworICBuNjQrKzsKKyAgaC5kZXNjcmlwdG9yc19zaXplID0gaHRvYmU2NChuNjQpOworICBuNjQrKzsKKyAgaC5yb2xsYmFja19pbmRleCA9IGh0b2JlNjQobjY0KTsKKyAgbjY0Kys7CisgIGguZmxhZ3MgPSBodG9iZTMyKG4zMik7CisgIG4zMisrOworCisgIGF2Yl92Ym1ldGFfaW1hZ2VfaGVhZGVyX3RvX2hvc3RfYnl0ZV9vcmRlcigmaCwgJnMpOworCisgIG4zMiA9IDB4MTEyMjMzNDQ7CisgIG42NCA9IDB4MTEyMjMzNDQ1NTY2Nzc4ODsKKworICBFWFBFQ1RfRVEobjMyLCBzLmhlYWRlcl92ZXJzaW9uX21ham9yKTsKKyAgbjMyKys7CisgIEVYUEVDVF9FUShuMzIsIHMuaGVhZGVyX3ZlcnNpb25fbWlub3IpOworICBuMzIrKzsKKyAgRVhQRUNUX0VRKG42NCwgcy5hdXRoZW50aWNhdGlvbl9kYXRhX2Jsb2NrX3NpemUpOworICBuNjQrKzsKKyAgRVhQRUNUX0VRKG42NCwgcy5hdXhpbGlhcnlfZGF0YV9ibG9ja19zaXplKTsKKyAgbjY0Kys7CisgIEVYUEVDVF9FUShuMzIsIHMuYWxnb3JpdGhtX3R5cGUpOworICBuMzIrKzsKKyAgRVhQRUNUX0VRKG42NCwgcy5oYXNoX29mZnNldCk7CisgIG42NCsrOworICBFWFBFQ1RfRVEobjY0LCBzLmhhc2hfc2l6ZSk7CisgIG42NCsrOworICBFWFBFQ1RfRVEobjY0LCBzLnNpZ25hdHVyZV9vZmZzZXQpOworICBuNjQrKzsKKyAgRVhQRUNUX0VRKG42NCwgcy5zaWduYXR1cmVfc2l6ZSk7CisgIG42NCsrOworICBFWFBFQ1RfRVEobjY0LCBzLnB1YmxpY19rZXlfb2Zmc2V0KTsKKyAgbjY0Kys7CisgIEVYUEVDVF9FUShuNjQsIHMucHVibGljX2tleV9zaXplKTsKKyAgbjY0Kys7CisgIEVYUEVDVF9FUShuNjQsIHMucHVibGljX2tleV9tZXRhZGF0YV9vZmZzZXQpOworICBuNjQrKzsKKyAgRVhQRUNUX0VRKG42NCwgcy5wdWJsaWNfa2V5X21ldGFkYXRhX3NpemUpOworICBuNjQrKzsKKyAgRVhQRUNUX0VRKG42NCwgcy5kZXNjcmlwdG9yc19vZmZzZXQpOworICBuNjQrKzsKKyAgRVhQRUNUX0VRKG42NCwgcy5kZXNjcmlwdG9yc19zaXplKTsKKyAgbjY0Kys7CisgIEVYUEVDVF9FUShuNjQsIHMucm9sbGJhY2tfaW5kZXgpOworICBuNjQrKzsKKyAgRVhQRUNUX0VRKG4zMiwgcy5mbGFncyk7CisgIG4zMisrOworCisgIC8vIElmIG5ldyBmaWVsZHMgYXJlIGFkZGVkLCB0aGUgZm9sbG93aW5nIHdpbGwgZmFpbC4gVGhpcyBpcyB0bworICAvLyByZW1pbmQgdGhhdCBieXRlc3dhcHBpbmcgY29kZSAoaW4gYXZiX3V0aWwuYykgYW5kIHVuaXR0ZXN0cyBmb3IKKyAgLy8gdGhpcyBzaG91bGQgYmUgdXBkYXRlZC4KKyAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihBdmJWQk1ldGFJbWFnZUhlYWRlciwgcmVzZXJ2ZWQpID09IDEyNCwKKyAgICAgICAgICAgICAgICAiUmVtZW1iZXIgdG8gdW5pdHRlc3QgYnl0ZXN3YXBwaW5nIG9mIG5ld2x5IGFkZGVkIGZpZWxkcyIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYXZiCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9hdmJ0b29sX3NpZ25pbmdfaGVscGVyX3Rlc3QucHkgYi9hdmIvdGVzdC9hdmJ0b29sX3NpZ25pbmdfaGVscGVyX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzI5MTc5NwotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi90ZXN0L2F2YnRvb2xfc2lnbmluZ19oZWxwZXJfdGVzdC5weQpAQCAtMCwwICsxLDcxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorIyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorIyBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisjIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorIyBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworIyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyMgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyMgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorIyBTT0ZUV0FSRS4KKyMKKworIyBUaGlzIHNoZWxsLXNjcmlwdCBjaGVja3MgdGhlIHN5bWJvbHMgaW4gbGliYXZiX2hvc3QuYSBhbmQgZmFpbHMKKyMgaWYgYSByZWZlcmVuY2Ugbm90IHN0YXJ0aW5nIHdpdGggYXZiXyBpcyByZWZlcmVuY2VkLiBJdCdzIGludGVuZGVkCisjIHRvIGNhdGNoIG1pc3Rha2VzIHdoZXJlIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgaXMgaW5hZHZlcnRlbnRseQorIyB1c2VkLgorCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IGVycm5vCitpbXBvcnQgb3MKKworZGVmIHJzYV9zaWduZXIoYXJndik6CisgIGlmIGxlbihhcmd2KSAhPSAzOgorICAgIHN5cy5zdGRlcnIud3JpdGUoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHM6IHt9IDxhbGc+IDxwdWIga2V5PlxuIi5mb3JtYXQoYXJndlswXSkpCisgICAgcmV0dXJuIGVycm5vLkVJTlZBTAorCisgIGRhdGEgPSBzeXMuc3RkaW4ucmVhZCgpCisgIGlmIGxlbihkYXRhKSA9PSAwOgorICAgIHN5cy5zdGRlcnIud3JpdGUoIlRoZXJlIGlzIG5vdCBpbnB1dCBkYXRhXG4iKQorICAgIHJldHVybiBlcnJuby5FSU5WQUwKKworICBpZiAnU0lHTklOR19IRUxQRVJfVEVTVCcgbm90IGluIG9zLmVudmlyb24gb3Igb3MuZW52aXJvblsnU0lHTklOR19IRUxQRVJfVEVTVCddID09ICIiOgorICAgIHN5cy5zdGRlcnIud3JpdGUoImVudiBTSUdOSU5HX0hFTFBFUl9URVNUIGlzIG5vdCBzZXQgb3IgZW1wdHlcbiIpCisgICAgcmV0dXJuIGVycm5vLkVJTlZBTAorCisgIHRlc3RfZmlsZV9uYW1lID0gb3MuZW52aXJvblsnU0lHTklOR19IRUxQRVJfVEVTVCddCisgIGlmIG9zLnBhdGguaXNmaWxlKHRlc3RfZmlsZV9uYW1lKSBhbmQgbm90IG9zLmFjY2Vzcyh0ZXN0X2ZpbGVfbmFtZSwgb3MuV19PSyk6CisgICAgc3lzLnN0ZGVyci53cml0ZSgibm8gcGVybWlzc2lvbiB0byB3cml0ZSBpbnRvIHt9IGZpbGVcbiIuZm9ybWF0KHRlc3RfZmlsZV9uYW1lKSkKKyAgICByZXR1cm4gZXJybm8uRUFDQ0VTUworCisgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgWydvcGVuc3NsJywgJ3JzYXV0bCcsICctc2lnbicsICctaW5rZXknLCBhcmd2WzJdLCAnLXJhdyddLAorICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFKQorCisgIHAuY29tbXVuaWNhdGUoZGF0YSkKKyAgcmV0Y29kZSA9IHAud2FpdCgpCisgIGlmIHJldGNvZGUgIT0gMDoKKyAgICByZXR1cm4gcmV0Y29kZQorCisgIHdpdGggb3Blbih0ZXN0X2ZpbGVfbmFtZSwgInciKSBhcyBmOgorICAgIGYud3JpdGUoIkRPTkUiKQorCisgIHJldHVybiAwCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQocnNhX3NpZ25lcihzeXMuYXJndikpCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9hdmJ0b29sX3VuaXR0ZXN0LmNjIGIvYXZiL3Rlc3QvYXZidG9vbF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDg5ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvYXZidG9vbF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDEzMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxiYXNlL2ZpbGVzL2ZpbGVfdXRpbC5oPgorI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfc3BsaXQuaD4KKyNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX3V0aWwuaD4KKyNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+CisKKyNpbmNsdWRlIDxsaWJhdmIvYXZiX3NoYS5oPgorI2luY2x1ZGUgPGxpYmF2Yi9saWJhdmIuaD4KKworI2luY2x1ZGUgImF2Yl91bml0dGVzdF91dGlsLmgiCisKK25hbWVzcGFjZSBhdmIgeworCitjbGFzcyBBdmJUb29sVGVzdCA6IHB1YmxpYyBCYXNlQXZiVG9vbFRlc3QgeworIHB1YmxpYzoKKyAgQXZiVG9vbFRlc3QoKSB7fQorCisgIHZvaWQgQWRkSGFzaEZvb3RlclRlc3QoYm9vbCBzcGFyc2VfaW1hZ2UpOworICB2b2lkIEFkZEhhc2h0cmVlRm9vdGVyVGVzdChib29sIHNwYXJzZV9pbWFnZSk7CisgIHZvaWQgQWRkSGFzaHRyZWVGb290ZXJGRUNUZXN0KGJvb2wgc3BhcnNlX2ltYWdlKTsKK307CisKKy8vIFRoaXMgdGVzdCBlbnN1cmUgdGhhdCB0aGUgdmVyc2lvbiBpcyBpbmNyZWFzZWQgaW4gYm90aAorLy8gYXZiX2Jvb3RfaW1hZ2UuaCBhbmQgdGhlIGF2YiB0b29sLgorVEVTVF9GKEF2YlRvb2xUZXN0LCBBdmJWZXJzaW9uSW5TeW5jKSB7CisgIGJhc2U6OkZpbGVQYXRoIHBhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInZlcnNpb24udHh0Iik7CisgIEVYUEVDVF9DT01NQU5EKDAsICIuL2F2YnRvb2wgdmVyc2lvbiA+ICVzIiwgcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworICBzdGQ6OnN0cmluZyBwcmludGVkX3ZlcnNpb247CisgIEFTU0VSVF9UUlVFKGJhc2U6OlJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnByaW50ZWRfdmVyc2lvbikpOworICBiYXNlOjpUcmltV2hpdGVzcGFjZUFTQ0lJKHByaW50ZWRfdmVyc2lvbiwgYmFzZTo6VFJJTV9BTEwsICZwcmludGVkX3ZlcnNpb24pOworICBzdGQ6OnN0cmluZyBleHBlY3RlZF92ZXJzaW9uID0KKyAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigiJWQuJWQiLCBBVkJfTUFKT1JfVkVSU0lPTiwgQVZCX01JTk9SX1ZFUlNJT04pOworICBFWFBFQ1RfRVEocHJpbnRlZF92ZXJzaW9uLCBleHBlY3RlZF92ZXJzaW9uKTsKK30KKworVEVTVF9GKEF2YlRvb2xUZXN0LCBFeHRyYWN0UHVibGljS2V5KSB7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGaWxlUGF0aCgidGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iKSk7CisKKyAgc3RkOjpzdHJpbmcga2V5X2RhdGEgPQorICAgICAgUHVibGljS2V5QVZCKGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKworICBBdmJWQk1ldGFJbWFnZUhlYWRlciBoOworICBhdmJfdmJtZXRhX2ltYWdlX2hlYWRlcl90b19ob3N0X2J5dGVfb3JkZXIoCisgICAgICByZWludGVycHJldF9jYXN0PEF2YlZCTWV0YUltYWdlSGVhZGVyKj4odmJtZXRhX2ltYWdlXy5kYXRhKCkpLCAmaCk7CisgIHVpbnQ4X3QqIGQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPih2Ym1ldGFfaW1hZ2VfLmRhdGEoKSk7CisgIHNpemVfdCBhdXhpbGlhcnlfZGF0YV9ibG9ja19vZmZzZXQgPQorICAgICAgc2l6ZW9mKEF2YlZCTWV0YUltYWdlSGVhZGVyKSArIGguYXV0aGVudGljYXRpb25fZGF0YV9ibG9ja19zaXplOworICBFWFBFQ1RfR1QoaC5hdXhpbGlhcnlfZGF0YV9ibG9ja19zaXplLCBrZXlfZGF0YS5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgIG1lbWNtcChrZXlfZGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgZCArIGF1eGlsaWFyeV9kYXRhX2Jsb2NrX29mZnNldCArIGgucHVibGljX2tleV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAga2V5X2RhdGEuc2l6ZSgpKSk7Cit9CisKK1RFU1RfRihBdmJUb29sVGVzdCwgQ2hlY2tEZXNjcmlwdG9ycykgeworICBHZW5lcmF0ZVZCTWV0YUltYWdlKCJ2Ym1ldGEuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU0hBMjU2X1JTQTIwNDgiLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIiksCisgICAgICAgICAgICAgICAgICAgICAgIi0tcHJvcCBmb286YnJpbGxvICIKKyAgICAgICAgICAgICAgICAgICAgICAiLS1wcm9wIGJhcjpjaHJvbWVvcyAiCisgICAgICAgICAgICAgICAgICAgICAgIi0tcHJvcCBwcmlzb25lcjoyNDYwMSAiCisgICAgICAgICAgICAgICAgICAgICAgIi0tcHJvcCBoZXhudW1iZXI6MHhjYWZlICIKKyAgICAgICAgICAgICAgICAgICAgICAiLS1wcm9wIGhleG51bWJlcl9jYXBpdGFsOjB4Q0FGRSAiCisgICAgICAgICAgICAgICAgICAgICAgIi0tcHJvcCBsYXJnZV9oZXhudW1iZXI6MHhmZWRjYmE5ODc2NTQzMjEwICIKKyAgICAgICAgICAgICAgICAgICAgICAiLS1wcm9wIGxhcmdlcl90aGFuX3VpbnQ2NDoweGZlZGNiYTk4NzY1NDMyMTAxICIKKyAgICAgICAgICAgICAgICAgICAgICAiLS1wcm9wIGFsbW9zdF9hX251bWJlcjo0MjN4ICIKKyAgICAgICAgICAgICAgICAgICAgICAiLS1wcm9wX2Zyb21fZmlsZSBibG9iOnRlc3QvZGF0YS9zbWFsbF9ibG9iLmJpbiAiKTsKKworICBBdmJWQk1ldGFJbWFnZUhlYWRlciBoOworICBhdmJfdmJtZXRhX2ltYWdlX2hlYWRlcl90b19ob3N0X2J5dGVfb3JkZXIoCisgICAgICByZWludGVycHJldF9jYXN0PEF2YlZCTWV0YUltYWdlSGVhZGVyKj4odmJtZXRhX2ltYWdlXy5kYXRhKCkpLCAmaCk7CisKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KAorICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uZGF0YSgpLCB2Ym1ldGFfaW1hZ2VfLnNpemUoKSwgbnVsbHB0ciwgbnVsbHB0cikpOworCisgIGNvbnN0IGNoYXIqIHM7CisgIHNpemVfdCBsZW47CisgIHVpbnQ2NF90IHZhbDsKKworICAvLyBCYXNpYy4KKyAgcyA9IGF2Yl9wcm9wZXJ0eV9sb29rdXAoCisgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksICJmb28iLCAwLCAmbGVuKTsKKyAgRVhQRUNUX0VRKDAsIHN0cmNtcChzLCAiYnJpbGxvIikpOworICBFWFBFQ1RfRVEoNlUsIGxlbik7CisgIHMgPSBhdmJfcHJvcGVydHlfbG9va3VwKAorICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCAiYmFyIiwgMCwgJmxlbik7CisgIEVYUEVDVF9FUSgwLCBzdHJjbXAocywgImNocm9tZW9zIikpOworICBFWFBFQ1RfRVEoOFUsIGxlbik7CisgIHMgPSBhdmJfcHJvcGVydHlfbG9va3VwKAorICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCAibm9uLWV4aXN0YW50IiwgMCwgJmxlbik7CisgIEVYUEVDVF9FUSgwVSwgbGVuKTsKKyAgRVhQRUNUX0VRKE5VTEwsIHMpOworCisgIC8vIE51bWJlcnMuCisgIEVYUEVDVF9ORSgKKyAgICAgIDAsCisgICAgICBhdmJfcHJvcGVydHlfbG9va3VwX3VpbnQ2NCgKKyAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksICJwcmlzb25lciIsIDAsICZ2YWwpKTsKKyAgRVhQRUNUX0VRKDI0NjAxVSwgdmFsKTsKKworICBFWFBFQ1RfTkUoCisgICAgICAwLAorICAgICAgYXZiX3Byb3BlcnR5X2xvb2t1cF91aW50NjQoCisgICAgICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCAiaGV4bnVtYmVyIiwgMCwgJnZhbCkpOworICBFWFBFQ1RfRVEoMHhjYWZlVSwgdmFsKTsKKworICBFWFBFQ1RfTkUoMCwKKyAgICAgICAgICAgIGF2Yl9wcm9wZXJ0eV9sb29rdXBfdWludDY0KHZibWV0YV9pbWFnZV8uZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmJtZXRhX2ltYWdlXy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGV4bnVtYmVyX2NhcGl0YWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWwpKTsKKyAgRVhQRUNUX0VRKDB4Y2FmZVUsIHZhbCk7CisKKyAgRVhQRUNUX05FKDAsCisgICAgICAgICAgICBhdmJfcHJvcGVydHlfbG9va3VwX3VpbnQ2NCh2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhcmdlX2hleG51bWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbCkpOworICBFWFBFQ1RfRVEoMHhmZWRjYmE5ODc2NTQzMjEwVSwgdmFsKTsKKworICAvLyBXZSBjb3VsZCBjYXRjaCBvdmVyZmxvd3MgYW5kIHJldHVybiBhbiBlcnJvciAuLi4gYnV0IHdlIGN1cnJlbnRseSBkb24ndC4KKyAgRVhQRUNUX05FKDAsCisgICAgICAgICAgICBhdmJfcHJvcGVydHlfbG9va3VwX3VpbnQ2NCh2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhcmdlcl90aGFuX3VpbnQ2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbCkpOworICBFWFBFQ1RfRVEoMHhlZGNiYTk4NzY1NDMyMTAxVSwgdmFsKTsKKworICAvLyBOdW1iZXItcGFyc2luZyBmYWlsdXJlcy4KKyAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICBhdmJfcHJvcGVydHlfbG9va3VwX3VpbnQ2NCgKKyAgICAgICAgICAgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksICJmb28iLCAwLCAmdmFsKSk7CisKKyAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICBhdmJfcHJvcGVydHlfbG9va3VwX3VpbnQ2NCh2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZibWV0YV9pbWFnZV8uc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsbW9zdF9hX251bWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbCkpOworCisgIC8vIEJsb2JzLgorICAvLworICAvLyB0ZXN0L2RhdGEvc21hbGxfYmxvYi5iaW4gaXMgMjEgYnl0ZSBmaWxlIGZ1bGwgb2YgTlVMLWJ5dGVzIGV4Y2VwdAorICAvLyBmb3IgdGhlIHN0cmluZyAiYnJpbGxvIGZ0dyEiIGF0IGluZGV4IDIgYW5kICdcbicgYXQgdGhlIGxhc3QKKyAgLy8gYnl0ZS4KKyAgcyA9IGF2Yl9wcm9wZXJ0eV9sb29rdXAoCisgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSwgdmJtZXRhX2ltYWdlXy5zaXplKCksICJibG9iIiwgMCwgJmxlbik7CisgIEVYUEVDVF9FUSgyMVUsIGxlbik7CisgIEVYUEVDVF9FUSgwLCBtZW1jbXAocywgIlwwXDAiLCAyKSk7CisgIEVYUEVDVF9FUSgwLCBtZW1jbXAocyArIDIsICJicmlsbG8gZnR3ISIsIDExKSk7CisgIEVYUEVDVF9FUSgwLCBtZW1jbXAocyArIDEzLCAiXDBcMFwwXDBcMFwwXDAiLCA3KSk7CisgIEVYUEVDVF9FUSgnXG4nLCBzWzIwXSk7Cit9CisKK1RFU1RfRihBdmJUb29sVGVzdCwgQ2hlY2tSb2xsYmFja0luZGV4KSB7CisgIHVpbnQ2NF90IHJvbGxiYWNrX2luZGV4ID0gNDI7CisgIEdlbmVyYXRlVkJNZXRhSW1hZ2UoInZibWV0YS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICJTSEEyNTZfUlNBMjA0OCIsCisgICAgICAgICAgICAgICAgICAgICAgcm9sbGJhY2tfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RmlsZVBhdGgoInRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIikpOworCisgIEF2YlZCTWV0YUltYWdlSGVhZGVyIGg7CisgIGF2Yl92Ym1ldGFfaW1hZ2VfaGVhZGVyX3RvX2hvc3RfYnl0ZV9vcmRlcigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXZiVkJNZXRhSW1hZ2VIZWFkZXIqPih2Ym1ldGFfaW1hZ2VfLmRhdGEoKSksICZoKTsKKworICBFWFBFQ1RfRVEocm9sbGJhY2tfaW5kZXgsIGgucm9sbGJhY2tfaW5kZXgpOworfQorCitURVNUX0YoQXZiVG9vbFRlc3QsIENoZWNrUHVia2V5UmV0dXJuZWQpIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpKTsKKworICBjb25zdCB1aW50OF90KiBwdWJrZXkgPSBOVUxMOworICBzaXplX3QgcHVia2V5X2xlbmd0aCA9IDA7CisKKyAgRVhQRUNUX0VRKAorICAgICAgQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LLAorICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkoCisgICAgICAgICAgdmJtZXRhX2ltYWdlXy5kYXRhKCksIHZibWV0YV9pbWFnZV8uc2l6ZSgpLCAmcHVia2V5LCAmcHVia2V5X2xlbmd0aCkpOworCisgIEF2YlZCTWV0YUltYWdlSGVhZGVyIGg7CisgIGF2Yl92Ym1ldGFfaW1hZ2VfaGVhZGVyX3RvX2hvc3RfYnl0ZV9vcmRlcigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXZiVkJNZXRhSW1hZ2VIZWFkZXIqPih2Ym1ldGFfaW1hZ2VfLmRhdGEoKSksICZoKTsKKworICBFWFBFQ1RfRVEocHVia2V5X2xlbmd0aCwgaC5wdWJsaWNfa2V5X3NpemUpOworCisgIGNvbnN0IHVpbnQ4X3QqIGV4cGVjdGVkX3B1YmtleSA9CisgICAgICB2Ym1ldGFfaW1hZ2VfLmRhdGEoKSArIHNpemVvZihBdmJWQk1ldGFJbWFnZUhlYWRlcikgKworICAgICAgaC5hdXRoZW50aWNhdGlvbl9kYXRhX2Jsb2NrX3NpemUgKyBoLnB1YmxpY19rZXlfb2Zmc2V0OworICBFWFBFQ1RfRVEocHVia2V5LCBleHBlY3RlZF9wdWJrZXkpOworfQorCitURVNUX0YoQXZiVG9vbFRlc3QsIEluZm8pIHsKKyAgR2VuZXJhdGVWQk1ldGFJbWFnZSgidmJtZXRhLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgIlNIQTI1Nl9SU0EyMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZpbGVQYXRoKCJ0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIpLAorICAgICAgICAgICAgICAgICAgICAgICItLXByb3AgZm9vOmJyaWxsbyAiCisgICAgICAgICAgICAgICAgICAgICAgIi0tcHJvcCBiYXI6Y2hyb21lb3MgIgorICAgICAgICAgICAgICAgICAgICAgICItLXByb3AgcHJpc29uZXI6MjQ2MDEgIgorICAgICAgICAgICAgICAgICAgICAgICItLXByb3AgaGV4bnVtYmVyOjB4Y2FmZSAiCisgICAgICAgICAgICAgICAgICAgICAgIi0tcHJvcCBoZXhudW1iZXJfY2FwaXRhbDoweENBRkUgIgorICAgICAgICAgICAgICAgICAgICAgICItLXByb3AgbGFyZ2VfaGV4bnVtYmVyOjB4ZmVkY2JhOTg3NjU0MzIxMCAiCisgICAgICAgICAgICAgICAgICAgICAgIi0tcHJvcCBsYXJnZXJfdGhhbl91aW50NjQ6MHhmZWRjYmE5ODc2NTQzMjEwMSAiCisgICAgICAgICAgICAgICAgICAgICAgIi0tcHJvcCBhbG1vc3RfYV9udW1iZXI6NDIzeCAiCisgICAgICAgICAgICAgICAgICAgICAgIi0tcHJvcF9mcm9tX2ZpbGUgYmxvYjp0ZXN0L2RhdGEvc21hbGxfYmxvYi5iaW4gIgorICAgICAgICAgICAgICAgICAgICAgICItLXByb3BfZnJvbV9maWxlIGxhcmdlX2Jsb2I6dGVzdC9kYXRhL2xhcmdlX2Jsb2IuYmluIik7CisKKyAgQVNTRVJUX0VRKAorICAgICAgIlZCTWV0YSBpbWFnZSB2ZXJzaW9uOiAgICAgMS4wXG4iCisgICAgICAiSGVhZGVyIEJsb2NrOiAgICAgICAgICAgICAyNTYgYnl0ZXNcbiIKKyAgICAgICJBdXRoZW50aWNhdGlvbiBCbG9jazogICAgIDMyMCBieXRlc1xuIgorICAgICAgIkF1eGlsaWFyeSBCbG9jazogICAgICAgICAgMzIwMCBieXRlc1xuIgorICAgICAgIkFsZ29yaXRobTogICAgICAgICAgICAgICAgU0hBMjU2X1JTQTIwNDhcbiIKKyAgICAgICJSb2xsYmFjayBJbmRleDogICAgICAgICAgIDBcbiIKKyAgICAgICJGbGFnczogICAgICAgICAgICAgICAgICAgIDBcbiIKKyAgICAgICJEZXNjcmlwdG9yczpcbiIKKyAgICAgICIgICAgUHJvcDogZm9vIC0+ICdicmlsbG8nXG4iCisgICAgICAiICAgIFByb3A6IGJhciAtPiAnY2hyb21lb3MnXG4iCisgICAgICAiICAgIFByb3A6IHByaXNvbmVyIC0+ICcyNDYwMSdcbiIKKyAgICAgICIgICAgUHJvcDogaGV4bnVtYmVyIC0+ICcweGNhZmUnXG4iCisgICAgICAiICAgIFByb3A6IGhleG51bWJlcl9jYXBpdGFsIC0+ICcweENBRkUnXG4iCisgICAgICAiICAgIFByb3A6IGxhcmdlX2hleG51bWJlciAtPiAnMHhmZWRjYmE5ODc2NTQzMjEwJ1xuIgorICAgICAgIiAgICBQcm9wOiBsYXJnZXJfdGhhbl91aW50NjQgLT4gJzB4ZmVkY2JhOTg3NjU0MzIxMDEnXG4iCisgICAgICAiICAgIFByb3A6IGFsbW9zdF9hX251bWJlciAtPiAnNDIzeCdcbiIKKyAgICAgICIgICAgUHJvcDogYmxvYiAtPiAnXFx4MDBcXHgwMGJyaWxsbyAiCisgICAgICAiZnR3IVxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFxuJ1xuIgorICAgICAgIiAgICBQcm9wOiBsYXJnZV9ibG9iIC0+ICgyMDQ4IGJ5dGVzKVxuIiwKKyAgICAgIEluZm9JbWFnZSh2Ym1ldGFfaW1hZ2VfcGF0aF8pKTsKK30KKworc3RhdGljIGJvb2wgY29sbGVjdF9kZXNjcmlwdG9ycyhjb25zdCBBdmJEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpIHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgQXZiRGVzY3JpcHRvcio+KiBkZXNjcmlwdG9ycyA9CisgICAgICByZWludGVycHJldF9jYXN0PHN0ZDo6dmVjdG9yPGNvbnN0IEF2YkRlc2NyaXB0b3IqPio+KHVzZXJfZGF0YSk7CisgIGRlc2NyaXB0b3JzLT5wdXNoX2JhY2soZGVzY3JpcHRvcik7CisgIHJldHVybiB0cnVlOyAgLy8gS2VlcCBpdGVyYXRpbmcuCit9CisKK3ZvaWQgQXZiVG9vbFRlc3Q6OkFkZEhhc2hGb290ZXJUZXN0KGJvb2wgc3BhcnNlX2ltYWdlKSB7CisgIGNvbnN0IHNpemVfdCByb290ZnNfc2l6ZSA9IDEwMjggKiAxMDI0OworICBjb25zdCBzaXplX3QgcGFydGl0aW9uX3NpemUgPSAxNTM2ICogMTAyNDsKKworICAvLyBHZW5lcmF0ZSBhIDEwMjggS2lCIGZpbGUgd2l0aCBrbm93biBjb250ZW50LiBTb21lIGNvbnRlbnQgaGF2ZQorICAvLyBiZWVuIGFycmFuZ2VkIHRvIGVuc3VyZSBGSUxMX0RBVEEgc2VnbWVudHMgaW4gdGhlIHNwYXJzZSBmaWxlLgorICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByb290ZnM7CisgIHJvb3Rmcy5yZXNpemUocm9vdGZzX3NpemUpOworICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IHJvb3Rmc19zaXplOyBuKyspIHsKKyAgICBpZiAoKG4gPj0gNSAqIDEwMDAgJiYgbiA8IDEwNSAqIDEwMDApIHx8CisgICAgICAgIChuID49IDIwNSAqIDEwMDAgJiYgbiA8IDMwNSAqIDEwMDApIHx8CisgICAgICAgIChuID49IDUwNSAqIDEwMDAgJiYgbiA8IDYwNSAqIDEwMDApKSB7CisgICAgICByb290ZnNbbl0gPSB1aW50OF90KG4pICYgMHgwMzsKKyAgICB9IGVsc2UgeworICAgICAgcm9vdGZzW25dID0gdWludDhfdChuKTsKKyAgICB9CisgIH0KKyAgYmFzZTo6RmlsZVBhdGggcm9vdGZzX3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInJvb3Rmcy5iaW4iKTsKKyAgRVhQRUNUX0VRKHJvb3Rmc19zaXplLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3Qgc2l6ZV90PigKKyAgICAgICAgICAgICAgICBiYXNlOjpXcml0ZUZpbGUocm9vdGZzX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJvb3Rmcy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290ZnMuc2l6ZSgpKSkpOworCisgIGlmIChzcGFyc2VfaW1hZ2UpIHsKKyAgICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAgICJtdiAlcyAlcy51bnNwYXJzZSIsCisgICAgICAgICAgICAgICAgICAgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisgICAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgICAiaW1nMnNpbWcgJXMudW5zcGFyc2UgJXMiLAorICAgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworICAgIEVYUEVDVF9DT01NQU5EKDAsICJybSAtZiAlcy51bnNwYXJzZSIsIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisgIH0KKworICAvKiBEbyB0aGlzIHR3aWNlIHRvIGNoZWNrIHRoYXQgJ2FkZF9oYXNoX2Zvb3RlcicgaXMgaWRlbXBvdGVudC4gKi8KKyAgZm9yIChpbnQgbiA9IDA7IG4gPCAyOyBuKyspIHsKKyAgICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAgICIuL2F2YnRvb2wgYWRkX2hhc2hfZm9vdGVyIC0tc2FsdCBkMDBkZjAwZCAiCisgICAgICAgICAgICAgICAgICAgIi0taGFzaF9hbGdvcml0aG0gc2hhMjU2IC0taW1hZ2UgJXMgIgorICAgICAgICAgICAgICAgICAgICItLXBhcnRpdGlvbl9zaXplICVkIC0tcGFydGl0aW9uX25hbWUgZm9vYmFyICIKKyAgICAgICAgICAgICAgICAgICAiLS1hbGdvcml0aG0gU0hBMjU2X1JTQTIwNDggIgorICAgICAgICAgICAgICAgICAgICItLWtleSB0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIsCisgICAgICAgICAgICAgICAgICAgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIChpbnQpcGFydGl0aW9uX3NpemUpOworCisgICAgQVNTRVJUX0VRKGJhc2U6OlN0cmluZ1ByaW50ZigiRm9vdGVyIHZlcnNpb246ICAgICAgICAgICAxLjBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbWFnZSBzaXplOiAgICAgICAgICAgICAgIDE1NzI4NjQgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmlnaW5hbCBpbWFnZSBzaXplOiAgICAgIDEwNTI2NzIgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWQk1ldGEgb2Zmc2V0OiAgICAgICAgICAgIDEwNTI2NzJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWQk1ldGEgc2l6ZTogICAgICAgICAgICAgIDEyODAgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZCTWV0YSBpbWFnZSB2ZXJzaW9uOiAgICAgMS4wJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgQmxvY2s6ICAgICAgICAgICAgIDI1NiBieXRlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIEJsb2NrOiAgICAgMzIwIGJ5dGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXV4aWxpYXJ5IEJsb2NrOiAgICAgICAgICA3MDQgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGdvcml0aG06ICAgICAgICAgICAgICAgIFNIQTI1Nl9SU0EyMDQ4XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUm9sbGJhY2sgSW5kZXg6ICAgICAgICAgICAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVzY3JpcHRvcnM6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEhhc2ggZGVzY3JpcHRvcjpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBJbWFnZSBTaXplOiAgICAgICAgICAgIDEwNTI2NzIgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBIYXNoIEFsZ29yaXRobTogICAgICAgIHNoYTI1NlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgZm9vYmFyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgU2FsdDogICAgICAgICAgICAgICAgICBkMDBkZjAwZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIERpZ2VzdDogICAgICAgICAgICAgICAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjlhNThjYzk5NmQ0MDVlMDhhMWUwMGY5NmRiZmU5MTA0ZmVkZjQxY2I4M2IxZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1ZTRlZDM1N2ZiY2Y1OGQ4OGQ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhcnNlX2ltYWdlID8gIiAoU3BhcnNlKSIgOiAiIiksCisgICAgICAgICAgICAgIEluZm9JbWFnZShyb290ZnNfcGF0aCkpOworICB9CisKKyAgaWYgKHNwYXJzZV9pbWFnZSkgeworICAgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICAgIm12ICVzICVzLnNwYXJzZSIsCisgICAgICAgICAgICAgICAgICAgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisgICAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgICAic2ltZzJpbWcgJXMuc3BhcnNlICVzIiwKKyAgICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfQ09NTUFORCgwLCAicm0gLWYgJXMuc3BhcnNlIiwgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKyAgfQorCisgIC8vIE1hbnVhbGx5IGNhbGN1bGF0ZSB0aGUgaGFzaCB0byBjaGVjayB0aGF0IGl0IGFncmVlcyB3aXRoIGF2YnRvb2wuCisgIEF2YlNIQTI1NkN0eCBoYXNoZXJfY3R4OworICBjb25zdCB1aW50OF90IGhhc2hlcl9zYWx0WzRdID0gezB4ZDAsIDB4MGQsIDB4ZjAsIDB4MGR9OworICBhdmJfc2hhMjU2X2luaXQoJmhhc2hlcl9jdHgpOworICBhdmJfc2hhMjU2X3VwZGF0ZSgmaGFzaGVyX2N0eCwgaGFzaGVyX3NhbHQsIDQpOworICBhdmJfc2hhMjU2X3VwZGF0ZSgmaGFzaGVyX2N0eCwgcm9vdGZzLmRhdGEoKSwgcm9vdGZzX3NpemUpOworICB1aW50OF90KiBoYXNoZXJfZGlnZXN0ID0gYXZiX3NoYTI1Nl9maW5hbCgmaGFzaGVyX2N0eCk7CisgIEVYUEVDVF9FUSgiOWE1OGNjOTk2ZDQwNWUwOGExZTAwZjk2ZGJmZTkxMDRmZWRmNDFjYjgzYjFmNWU0ZWQzNTdmYmNmNThkODhkOSIsCisgICAgICAgICAgICBtZW1fdG9faGV4c3RyaW5nKGhhc2hlcl9kaWdlc3QsIEFWQl9TSEEyNTZfRElHRVNUX1NJWkUpKTsKKworICAvLyBOb3cgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCB0aGUgVkJNZXRhIGJsb2NrIGFnYWluIGZyb20gdGhlIGZvb3Rlci4KKyAgc3RkOjpzdHJpbmcgcGFydF9kYXRhOworICBBU1NFUlRfVFJVRShiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKHJvb3Rmc19wYXRoLCAmcGFydF9kYXRhKSk7CisKKyAgLy8gQ2hlY2sgZm9vdGVyIGNvbnRhaW5zIGNvcnJlY3QgZGF0YS4KKyAgQXZiRm9vdGVyIGY7CisgIEVYUEVDVF9ORSgwLAorICAgICAgICAgICAgYXZiX2Zvb3Rlcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBdmJGb290ZXIqPigKKyAgICAgICAgICAgICAgICAgICAgcGFydF9kYXRhLmRhdGEoKSArIHBhcnRfZGF0YS5zaXplKCkgLSBBVkJfRk9PVEVSX1NJWkUpLAorICAgICAgICAgICAgICAgICZmKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGYubWFnaWMpLCBBVkJfRk9PVEVSX01BR0lDX0xFTiksCisgICAgICBBVkJfRk9PVEVSX01BR0lDKTsKKyAgRVhQRUNUX0VRKEFWQl9GT09URVJfTUFKT1JfVkVSU0lPTiwgKGludClmLnZlcnNpb25fbWFqb3IpOworICBFWFBFQ1RfRVEoQVZCX0ZPT1RFUl9NSU5PUl9WRVJTSU9OLCAoaW50KWYudmVyc2lvbl9taW5vcik7CisgIEVYUEVDVF9FUSgxMDUyNjcyVUwsIGYub3JpZ2luYWxfaW1hZ2Vfc2l6ZSk7CisgIEVYUEVDVF9FUSgxMDUyNjcyVUwsIGYudmJtZXRhX29mZnNldCk7CisgIEVYUEVDVF9FUSgxMjgwVUwsIGYudmJtZXRhX3NpemUpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHZibWV0YSBpbWFnZSBhdCB8Zi52Ym1ldGFfb2Zmc2V0fCBjaGVja3Mgb3V0LgorICBjb25zdCB1aW50OF90KiB2Ym1ldGFfZGF0YSA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihwYXJ0X2RhdGEuZGF0YSgpICsgZi52Ym1ldGFfb2Zmc2V0KTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KHZibWV0YV9kYXRhLCBmLnZibWV0YV9zaXplLCBOVUxMLCBOVUxMKSk7CisKKyAgLy8gQ29sbGVjdCBhbGwgZGVzY3JpcHRvcnMuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEF2YkRlc2NyaXB0b3IqPiBkZXNjcmlwdG9yczsKKyAgYXZiX2Rlc2NyaXB0b3JfZm9yZWFjaCgKKyAgICAgIHZibWV0YV9kYXRhLCBmLnZibWV0YV9zaXplLCBjb2xsZWN0X2Rlc2NyaXB0b3JzLCAmZGVzY3JpcHRvcnMpOworCisgIC8vIFdlIHNob3VsZCBvbmx5IGhhdmUgYSBzaW5nbGUgZGVzY3JpcHRvciBhbmQgaXQgc2hvdWxkIGJlIGEKKyAgLy8gaGFzaCBkZXNjcmlwdG9yLgorICBFWFBFQ1RfRVEoMVVMLCBkZXNjcmlwdG9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoQVZCX0RFU0NSSVBUT1JfVEFHX0hBU0gsIGF2Yl9iZTY0dG9oKGRlc2NyaXB0b3JzWzBdLT50YWcpKTsKKyAgQXZiSGFzaERlc2NyaXB0b3IgZDsKKyAgRVhQRUNUX05FKAorICAgICAgMCwKKyAgICAgIGF2Yl9oYXNoX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQXZiSGFzaERlc2NyaXB0b3IqPihkZXNjcmlwdG9yc1swXSksICZkKSk7CisgIEVYUEVDVF9FUSgxMDUyNjcyVUwsIGQuaW1hZ2Vfc2l6ZSk7CisgIEVYUEVDVF9FUSg2VUwsIGQucGFydGl0aW9uX25hbWVfbGVuKTsKKyAgRVhQRUNUX0VRKDRVTCwgZC5zYWx0X2xlbik7CisgIEVYUEVDVF9FUSgzMlVMLCBkLmRpZ2VzdF9sZW4pOworICBjb25zdCB1aW50OF90KiBkZXNjX2VuZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRlc2NyaXB0b3JzWzBdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEF2Ykhhc2hEZXNjcmlwdG9yKTsKKyAgdWludDY0X3QgbyA9IDA7CisgIEVYUEVDVF9FUSgiZm9vYmFyIiwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRlc2NfZW5kICsgbyksCisgICAgICAgICAgICAgICAgICAgICAgICBkLnBhcnRpdGlvbl9uYW1lX2xlbikpOworICBvICs9IGQucGFydGl0aW9uX25hbWVfbGVuOworICBFWFBFQ1RfRVEoImQwMGRmMDBkIiwgbWVtX3RvX2hleHN0cmluZyhkZXNjX2VuZCArIG8sIGQuc2FsdF9sZW4pKTsKKyAgbyArPSBkLnNhbHRfbGVuOworICBFWFBFQ1RfRVEoIjlhNThjYzk5NmQ0MDVlMDhhMWUwMGY5NmRiZmU5MTA0ZmVkZjQxY2I4M2IxZjVlNGVkMzU3ZmJjZjU4ZDg4ZDkiLAorICAgICAgICAgICAgbWVtX3RvX2hleHN0cmluZyhkZXNjX2VuZCArIG8sIGQuZGlnZXN0X2xlbikpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIGZvb3RlciBpcyBjb3JyZWN0bHkgZXJhc2VkLgorICBFWFBFQ1RfQ09NTUFORCgKKyAgICAgIDAsICIuL2F2YnRvb2wgZXJhc2VfZm9vdGVyIC0taW1hZ2UgJXMiLCByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworICBpbnQ2NF90IGVyYXNlZF9mb290ZXJfZmlsZV9zaXplOworICBBU1NFUlRfVFJVRShiYXNlOjpHZXRGaWxlU2l6ZShyb290ZnNfcGF0aCwgJmVyYXNlZF9mb290ZXJfZmlsZV9zaXplKSk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KGVyYXNlZF9mb290ZXJfZmlsZV9zaXplKSwgcm9vdGZzX3NpemUpOworfQorCitURVNUX0YoQXZiVG9vbFRlc3QsIEFkZEhhc2hGb290ZXIpIHsKKyAgQWRkSGFzaEZvb3RlclRlc3QoZmFsc2UpOworfQorCitURVNUX0YoQXZiVG9vbFRlc3QsIEFkZEhhc2hGb290ZXJTcGFyc2UpIHsKKyAgQWRkSGFzaEZvb3RlclRlc3QodHJ1ZSk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBSZW1vdmVMaW5lc1N0YXJ0aW5nV2l0aChjb25zdCBzdGQ6OnN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzOworICBzdGQ6OnN0cmluZyByZXQ7CisKKyAgbGluZXMgPSBiYXNlOjpTcGxpdFN0cmluZygKKyAgICAgIHN0ciwgIlxuIiwgYmFzZTo6S0VFUF9XSElURVNQQUNFLCBiYXNlOjpTUExJVF9XQU5UX05PTkVNUFRZKTsKKyAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgbGluZSA6IGxpbmVzKSB7CisgICAgaWYgKCFiYXNlOjpTdGFydHNXaXRoKGxpbmUsIHByZWZpeCwgYmFzZTo6Q29tcGFyZUNhc2U6OlNFTlNJVElWRSkpIHsKKyAgICAgIHJldCArPSBsaW5lOworICAgICAgcmV0ICs9ICdcbic7CisgICAgfQorICB9CisgIHJldHVybiByZXQ7Cit9CisKK1RFU1RfRihBdmJUb29sVGVzdCwgQWRkSGFzaEZvb3RlclNwYXJzZVdpdGhIb2xlQXRUaGVFbmQpIHsKKyAgY29uc3Qgc2l6ZV90IHBhcnRpdGlvbl9zaXplID0gMTAgKiAxMDI0ICogMTAyNDsKKyAgY29uc3Qgc2l6ZV90IG1ldGFkYXRhX3NpemUgPSAxMjggKiAxMDI0OworCisgIC8vIEl0J3Mgbm90IGVub3VnaCB0byBydW4gaW1nMnNpbWcgb24gYSBmaWxlIHdpdGggYSBsb3Qgb2YgemVyb2VzIGF0CisgIC8vIHRoZSBlbmQgc2luY2UgdGhhdCB3aWxsIHR1cm4gdXAgYXMgIkZpbGwgd2l0aCB2YWx1ZSAoZm9yIHZhbHVlID0KKyAgLy8gMHgwMDAwMDAwMCkiIGFuZCBub3QgIkRvbid0IGNhcmUiLiBJbnN0ZWFkLCB1c2UgbWFrZV9leHQ0ZnMgZm9yCisgIC8vIHRoaXMgc2luY2UgaXQgd2lsbCBwdXQgYSBiaWcgaG9sZSAoZS5nLiAiRG9uJ3QgY2FyZSIgY2h1bmspIGF0CisgIC8vIHRoZSBlbmQuCisgIGJhc2U6OkZpbGVQYXRoIHBhcnRpdGlvbl9wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJwYXJ0aXRpb24uYmluIik7CisgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICJtYWtlX2V4dDRmcyAtcyAtTCB0ZXN0IC1sICV6ZCAlcyIsCisgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplIC0gbWV0YWRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIGFkZF9oYXNoX2Zvb3RlciAtLXNhbHQgZDAwZGYwMGQgIgorICAgICAgICAgICAgICAgICAiLS1oYXNoX2FsZ29yaXRobSBzaGEyNTYgLS1pbWFnZSAlcyAiCisgICAgICAgICAgICAgICAgICItLXBhcnRpdGlvbl9zaXplICVkIC0tcGFydGl0aW9uX25hbWUgZm9vYmFyICIKKyAgICAgICAgICAgICAgICAgIi0tYWxnb3JpdGhtIFNIQTI1Nl9SU0EyMDQ4ICIKKyAgICAgICAgICAgICAgICAgIi0ta2V5IHRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIiwKKyAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAoaW50KXBhcnRpdGlvbl9zaXplKTsKKworICAvLyBTaW5jZSB3ZSBtYXkgYmUgdXNpbmcgYW4gYXJicml0YXJ5IHZlcnNpb24gb2YgbWFrZV9leHQ0ZnMKKyAgLy8gKGJlY2F1c2Ugb2YgZGlmZmVyZW50IGJyYW5jaGVzKSB0aGUgY29udGVudHMgb2YgdGhlIHJlc3VsdGluZworICAvLyBkaXNrIGltYWdlIG1heSBzbGlnaHRseSBjaGFuZ2UuIEl0J3MgZW5vdWdoIHRvIGp1c3QgcmVtb3ZlIHRoZQorICAvLyAiRGlnZXN0OiIgbGluZSBmcm9tIHRoZSBvdXRwdXQgdG8gd29yayBhcm91bmQgdGhpcy4KKyAgc3RkOjpzdHJpbmcgaW5mbyA9CisgICAgICBSZW1vdmVMaW5lc1N0YXJ0aW5nV2l0aChJbmZvSW1hZ2UocGFydGl0aW9uX3BhdGgpLCAiICAgICAgRGlnZXN0OiIpOworICBBU1NFUlRfRVEoCisgICAgICAiRm9vdGVyIHZlcnNpb246ICAgICAgICAgICAxLjBcbiIKKyAgICAgICJJbWFnZSBzaXplOiAgICAgICAgICAgICAgIDEwNDg1NzYwIGJ5dGVzXG4iCisgICAgICAiT3JpZ2luYWwgaW1hZ2Ugc2l6ZTogICAgICAxMDM1NDY4OCBieXRlc1xuIgorICAgICAgIlZCTWV0YSBvZmZzZXQ6ICAgICAgICAgICAgMTAzNTQ2ODhcbiIKKyAgICAgICJWQk1ldGEgc2l6ZTogICAgICAgICAgICAgIDEyODAgYnl0ZXNcbiIKKyAgICAgICItLVxuIgorICAgICAgIlZCTWV0YSBpbWFnZSB2ZXJzaW9uOiAgICAgMS4wIChTcGFyc2UpXG4iCisgICAgICAiSGVhZGVyIEJsb2NrOiAgICAgICAgICAgICAyNTYgYnl0ZXNcbiIKKyAgICAgICJBdXRoZW50aWNhdGlvbiBCbG9jazogICAgIDMyMCBieXRlc1xuIgorICAgICAgIkF1eGlsaWFyeSBCbG9jazogICAgICAgICAgNzA0IGJ5dGVzXG4iCisgICAgICAiQWxnb3JpdGhtOiAgICAgICAgICAgICAgICBTSEEyNTZfUlNBMjA0OFxuIgorICAgICAgIlJvbGxiYWNrIEluZGV4OiAgICAgICAgICAgMFxuIgorICAgICAgIkZsYWdzOiAgICAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIkRlc2NyaXB0b3JzOlxuIgorICAgICAgIiAgICBIYXNoIGRlc2NyaXB0b3I6XG4iCisgICAgICAiICAgICAgSW1hZ2UgU2l6ZTogICAgICAgICAgICAxMDM1NDY4OCBieXRlc1xuIgorICAgICAgIiAgICAgIEhhc2ggQWxnb3JpdGhtOiAgICAgICAgc2hhMjU2XG4iCisgICAgICAiICAgICAgUGFydGl0aW9uIE5hbWU6ICAgICAgICBmb29iYXJcbiIKKyAgICAgICIgICAgICBTYWx0OiAgICAgICAgICAgICAgICAgIGQwMGRmMDBkXG4iLAorICAgICAgaW5mbyk7CisKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgIm12ICVzICVzLnNwYXJzZSIsCisgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgInNpbWcyaW1nICVzLnNwYXJzZSAlcyIsCisgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKyAgRVhQRUNUX0NPTU1BTkQoMCwgInJtIC1mICVzLnNwYXJzZSIsIHBhcnRpdGlvbl9wYXRoLnZhbHVlKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgQXZiVG9vbFRlc3Q6OkFkZEhhc2h0cmVlRm9vdGVyVGVzdChib29sIHNwYXJzZV9pbWFnZSkgeworICBjb25zdCBzaXplX3Qgcm9vdGZzX3NpemUgPSAxMDI4ICogMTAyNDsKKyAgY29uc3Qgc2l6ZV90IHBhcnRpdGlvbl9zaXplID0gMTUzNiAqIDEwMjQ7CisKKyAgLy8gR2VuZXJhdGUgYSAxMDI4IEtpQiBmaWxlIHdpdGgga25vd24gY29udGVudC4KKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcm9vdGZzOworICByb290ZnMucmVzaXplKHJvb3Rmc19zaXplKTsKKyAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCByb290ZnNfc2l6ZTsgbisrKQorICAgIHJvb3Rmc1tuXSA9IHVpbnQ4X3Qobik7CisgIGJhc2U6OkZpbGVQYXRoIHJvb3Rmc19wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJyb290ZnMuYmluIik7CisgIEVYUEVDVF9FUShyb290ZnNfc2l6ZSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IHNpemVfdD4oCisgICAgICAgICAgICAgICAgYmFzZTo6V3JpdGVGaWxlKHJvb3Rmc19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyb290ZnMuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdGZzLnNpemUoKSkpKTsKKworICBpZiAoc3BhcnNlX2ltYWdlKSB7CisgICAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgICAibXYgJXMgJXMudW5zcGFyc2UiLAorICAgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworICAgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICAgImltZzJzaW1nICVzLnVuc3BhcnNlICVzIiwKKyAgICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfQ09NTUFORCgwLCAicm0gLWYgJXMudW5zcGFyc2UiLCByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworICB9CisKKyAgLyogRG8gdGhpcyB0d2ljZSB0byBjaGVjayB0aGF0ICdhZGRfaGFzaHRyZWVfZm9vdGVyJyBpcyBpZGVtcG90ZW50LiAqLworICBmb3IgKGludCBuID0gMDsgbiA8IDI7IG4rKykgeworICAgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBhZGRfaGFzaHRyZWVfZm9vdGVyIC0tc2FsdCBkMDBkZjAwZCAtLWltYWdlICVzICIKKyAgICAgICAgICAgICAgICAgICAiLS1wYXJ0aXRpb25fc2l6ZSAlZCAtLXBhcnRpdGlvbl9uYW1lIGZvb2JhciAiCisgICAgICAgICAgICAgICAgICAgIi0tYWxnb3JpdGhtIFNIQTI1Nl9SU0EyMDQ4ICIKKyAgICAgICAgICAgICAgICAgICAiLS1rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iLAorICAgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAoaW50KXBhcnRpdGlvbl9zaXplKTsKKworICAgIEFTU0VSVF9FUShiYXNlOjpTdHJpbmdQcmludGYoIkZvb3RlciB2ZXJzaW9uOiAgICAgICAgICAgMS4wXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1hZ2Ugc2l6ZTogICAgICAgICAgICAgICAxNTcyODY0IGJ5dGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JpZ2luYWwgaW1hZ2Ugc2l6ZTogICAgICAxMDUyNjcyIGJ5dGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVkJNZXRhIG9mZnNldDogICAgICAgICAgICAxMDY5MDU2XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVkJNZXRhIHNpemU6ICAgICAgICAgICAgICAxMzQ0IGJ5dGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWQk1ldGEgaW1hZ2UgdmVyc2lvbjogICAgIDEuMCVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIEJsb2NrOiAgICAgICAgICAgICAyNTYgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiBCbG9jazogICAgIDMyMCBieXRlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1eGlsaWFyeSBCbG9jazogICAgICAgICAgNzY4IGJ5dGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxnb3JpdGhtOiAgICAgICAgICAgICAgICBTSEEyNTZfUlNBMjA0OFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvbGxiYWNrIEluZGV4OiAgICAgICAgICAgMFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZsYWdzOiAgICAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlc2NyaXB0b3JzOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBIYXNodHJlZSBkZXNjcmlwdG9yOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIFZlcnNpb24gb2YgZG0tdmVyaXR5OiAgMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIEltYWdlIFNpemU6ICAgICAgICAgICAgMTA1MjY3MiBieXRlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIFRyZWUgT2Zmc2V0OiAgICAgICAgICAgMTA1MjY3MlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIFRyZWUgU2l6ZTogICAgICAgICAgICAgMTYzODQgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBEYXRhIEJsb2NrIFNpemU6ICAgICAgIDQwOTYgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBIYXNoIEJsb2NrIFNpemU6ICAgICAgIDQwOTYgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBGRUMgbnVtIHJvb3RzOiAgICAgICAgIDBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBGRUMgb2Zmc2V0OiAgICAgICAgICAgIDBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBGRUMgc2l6ZTogICAgICAgICAgICAgIDAgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBIYXNoIEFsZ29yaXRobTogICAgICAgIHNoYTFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBQYXJ0aXRpb24gTmFtZTogICAgICAgIGZvb2JhclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIFNhbHQ6ICAgICAgICAgICAgICAgICAgZDAwZGYwMGRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBSb290IERpZ2VzdDogICAgICAgICAgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlODExNjExNDY3ZGNkNmU4ZGM0MzI0ZTQ1ZjcwNmMyYmRkNTFkYjY3XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhcnNlX2ltYWdlID8gIiAoU3BhcnNlKSIgOiAiIiksCisgICAgICAgICAgICAgIEluZm9JbWFnZShyb290ZnNfcGF0aCkpOworICB9CisKKyAgaWYgKHNwYXJzZV9pbWFnZSkgeworICAgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICAgIm12ICVzICVzLnNwYXJzZSIsCisgICAgICAgICAgICAgICAgICAgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisgICAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgICAic2ltZzJpbWcgJXMuc3BhcnNlICVzIiwKKyAgICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfQ09NTUFORCgwLCAicm0gLWYgJXMuc3BhcnNlIiwgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKyAgfQorCisgIC8vIFRvIGNoZWNrIHRoYXQgd2UgZ2VuZXJhdGUgdGhlIGNvcnJlY3QgaGFzaHRyZWUgd2UgY2FuIHVzZQorICAvLyB2ZXJpdHlzZXR1cCgxKSAtIGFub3RoZXIgY29kZWJhc2UgZm9yIHdvcmtpbmcgd2l0aCBkbS12ZXJpdHkKKyAgLy8gaGFzaHRyZWVzIC0gdG8gdmVyaWZ5IGl0LgorICAvLworICAvLyBJZiB3ZSBkb24ndCB3YW50IHRvIGltcG9zZSB0aGUgcmVxdWlyZW1lbnQgb2YgaGF2aW5nIHRoZQorICAvLyB2ZXJpdHlzZXR1cCgxKSBjb21tYW5kIGF2YWlsYWJsZSBvbiBidWlsZGVycyB3ZSBjYW4gY29tbWVudCB0aGlzCisgIC8vIG91dC4KKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgInZlcml0eXNldHVwIC0tbm8tc3VwZXJibG9jayAtLWZvcm1hdD0xIC0taGFzaD1zaGExICIKKyAgICAgICAgICAgICAgICAgIi0tZGF0YS1ibG9jay1zaXplPTQwOTYgLS1oYXNoLWJsb2NrLXNpemU9NDA5NiAiCisgICAgICAgICAgICAgICAgICItLXNhbHQ9ZDAwZGYwMGQgIgorICAgICAgICAgICAgICAgICAiLS1kYXRhLWJsb2Nrcz0yNTcgIgorICAgICAgICAgICAgICAgICAiLS1oYXNoLW9mZnNldD0xMDUyNjcyICIKKyAgICAgICAgICAgICAgICAgInZlcmlmeSAiCisgICAgICAgICAgICAgICAgICIlcyAlcyAiCisgICAgICAgICAgICAgICAgICJlODExNjExNDY3ZGNkNmU4ZGM0MzI0ZTQ1ZjcwNmMyYmRkNTFkYjY3IiwKKyAgICAgICAgICAgICAgICAgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworCisgIC8vIE5vdyBjaGVjayB0aGF0IHdlIGNhbiBmaW5kIHRoZSBWQk1ldGEgYmxvY2sgYWdhaW4gZnJvbSB0aGUgZm9vdGVyLgorICBzdGQ6OnN0cmluZyBwYXJ0X2RhdGE7CisgIEFTU0VSVF9UUlVFKGJhc2U6OlJlYWRGaWxlVG9TdHJpbmcocm9vdGZzX3BhdGgsICZwYXJ0X2RhdGEpKTsKKworICAvLyBDaGVjayBmb290ZXIgY29udGFpbnMgY29ycmVjdCBkYXRhLgorICBBdmJGb290ZXIgZjsKKyAgRVhQRUNUX05FKDAsCisgICAgICAgICAgICBhdmJfZm9vdGVyX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEF2YkZvb3Rlcio+KAorICAgICAgICAgICAgICAgICAgICBwYXJ0X2RhdGEuZGF0YSgpICsgcGFydF9kYXRhLnNpemUoKSAtIEFWQl9GT09URVJfU0laRSksCisgICAgICAgICAgICAgICAgJmYpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZi5tYWdpYyksIEFWQl9GT09URVJfTUFHSUNfTEVOKSwKKyAgICAgIEFWQl9GT09URVJfTUFHSUMpOworICBFWFBFQ1RfRVEoQVZCX0ZPT1RFUl9NQUpPUl9WRVJTSU9OLCAoaW50KWYudmVyc2lvbl9tYWpvcik7CisgIEVYUEVDVF9FUShBVkJfRk9PVEVSX01JTk9SX1ZFUlNJT04sIChpbnQpZi52ZXJzaW9uX21pbm9yKTsKKyAgRVhQRUNUX0VRKDEwNTI2NzJVTCwgZi5vcmlnaW5hbF9pbWFnZV9zaXplKTsKKyAgRVhQRUNUX0VRKDEwNjkwNTZVTCwgZi52Ym1ldGFfb2Zmc2V0KTsKKyAgRVhQRUNUX0VRKDEzNDRVTCwgZi52Ym1ldGFfc2l6ZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgdmJtZXRhIGltYWdlIGF0IHxmLnZibWV0YV9vZmZzZXR8IGNoZWNrcyBvdXQuCisgIGNvbnN0IHVpbnQ4X3QqIHZibWV0YV9kYXRhID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHBhcnRfZGF0YS5kYXRhKCkgKyBmLnZibWV0YV9vZmZzZXQpOworICBFWFBFQ1RfRVEoQVZCX1ZCTUVUQV9WRVJJRllfUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX3ZibWV0YV9pbWFnZV92ZXJpZnkodmJtZXRhX2RhdGEsIGYudmJtZXRhX3NpemUsIE5VTEwsIE5VTEwpKTsKKworICAvLyBDb2xsZWN0IGFsbCBkZXNjcmlwdG9ycy4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgQXZiRGVzY3JpcHRvcio+IGRlc2NyaXB0b3JzOworICBhdmJfZGVzY3JpcHRvcl9mb3JlYWNoKAorICAgICAgdmJtZXRhX2RhdGEsIGYudmJtZXRhX3NpemUsIGNvbGxlY3RfZGVzY3JpcHRvcnMsICZkZXNjcmlwdG9ycyk7CisKKyAgLy8gV2Ugc2hvdWxkIG9ubHkgaGF2ZSBhIHNpbmdsZSBkZXNjcmlwdG9yIGFuZCBpdCBzaG91bGQgYmUgYQorICAvLyBoYXNodHJlZSBkZXNjcmlwdG9yLgorICBFWFBFQ1RfRVEoMVVMLCBkZXNjcmlwdG9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoQVZCX0RFU0NSSVBUT1JfVEFHX0hBU0hUUkVFLCBhdmJfYmU2NHRvaChkZXNjcmlwdG9yc1swXS0+dGFnKSk7CisgIEF2Ykhhc2h0cmVlRGVzY3JpcHRvciBkOworICBFWFBFQ1RfTkUoCisgICAgICAwLAorICAgICAgYXZiX2hhc2h0cmVlX2Rlc2NyaXB0b3JfdmFsaWRhdGVfYW5kX2J5dGVzd2FwKAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQXZiSGFzaHRyZWVEZXNjcmlwdG9yKj4oZGVzY3JpcHRvcnNbMF0pLCAmZCkpOworICBFWFBFQ1RfRVEoMVVMLCBkLmRtX3Zlcml0eV92ZXJzaW9uKTsKKyAgRVhQRUNUX0VRKDEwNTI2NzJVTCwgZC5pbWFnZV9zaXplKTsKKyAgRVhQRUNUX0VRKDEwNTI2NzJVTCwgZC50cmVlX29mZnNldCk7CisgIEVYUEVDVF9FUSgxNjM4NFVMLCBkLnRyZWVfc2l6ZSk7CisgIEVYUEVDVF9FUSg0MDk2VUwsIGQuZGF0YV9ibG9ja19zaXplKTsKKyAgRVhQRUNUX0VRKDQwOTZVTCwgZC5oYXNoX2Jsb2NrX3NpemUpOworICBFWFBFQ1RfRVEoNlVMLCBkLnBhcnRpdGlvbl9uYW1lX2xlbik7CisgIEVYUEVDVF9FUSg0VUwsIGQuc2FsdF9sZW4pOworICBFWFBFQ1RfRVEoMjBVTCwgZC5yb290X2RpZ2VzdF9sZW4pOworICBjb25zdCB1aW50OF90KiBkZXNjX2VuZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRlc2NyaXB0b3JzWzBdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEF2Ykhhc2h0cmVlRGVzY3JpcHRvcik7CisgIHVpbnQ2NF90IG8gPSAwOworICBFWFBFQ1RfRVEoImZvb2JhciIsCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkZXNjX2VuZCArIG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgZC5wYXJ0aXRpb25fbmFtZV9sZW4pKTsKKyAgbyArPSBkLnBhcnRpdGlvbl9uYW1lX2xlbjsKKyAgRVhQRUNUX0VRKCJkMDBkZjAwZCIsIG1lbV90b19oZXhzdHJpbmcoZGVzY19lbmQgKyBvLCBkLnNhbHRfbGVuKSk7CisgIG8gKz0gZC5zYWx0X2xlbjsKKyAgRVhQRUNUX0VRKCJlODExNjExNDY3ZGNkNmU4ZGM0MzI0ZTQ1ZjcwNmMyYmRkNTFkYjY3IiwKKyAgICAgICAgICAgIG1lbV90b19oZXhzdHJpbmcoZGVzY19lbmQgKyBvLCBkLnJvb3RfZGlnZXN0X2xlbikpOworCisgIC8vIENoZWNrIHRoYXQgd2UgY29ycmVjdGx5IGdlbmVyYXRlIGRtLXZlcml0eSBrZXJuZWwgY21kbGluZQorICAvLyBzbmlwcGV0cywgaWYgcmVxdWVzdGVkLgorICBiYXNlOjpGaWxlUGF0aCB2Ym1ldGFfZG12X3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInZibWV0YV9kbV92ZXJpdHlfZGVzYy5iaW4iKTsKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBtYWtlX3ZibWV0YV9pbWFnZSAiCisgICAgICAgICAgICAgICAgICItLW91dHB1dCAlcyAiCisgICAgICAgICAgICAgICAgICItLXNldHVwX3Jvb3Rmc19mcm9tX2tlcm5lbCAlcyAiCisgICAgICAgICAgICAgICAgICItLWFsZ29yaXRobSBTSEEyNTZfUlNBMjA0OCAiCisgICAgICAgICAgICAgICAgICItLWtleSB0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIsCisgICAgICAgICAgICAgICAgIHZibWV0YV9kbXZfcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgQVNTRVJUX0VRKAorICAgICAgIlZCTWV0YSBpbWFnZSB2ZXJzaW9uOiAgICAgMS4wXG4iCisgICAgICAiSGVhZGVyIEJsb2NrOiAgICAgICAgICAgICAyNTYgYnl0ZXNcbiIKKyAgICAgICJBdXRoZW50aWNhdGlvbiBCbG9jazogICAgIDMyMCBieXRlc1xuIgorICAgICAgIkF1eGlsaWFyeSBCbG9jazogICAgICAgICAgODk2IGJ5dGVzXG4iCisgICAgICAiQWxnb3JpdGhtOiAgICAgICAgICAgICAgICBTSEEyNTZfUlNBMjA0OFxuIgorICAgICAgIlJvbGxiYWNrIEluZGV4OiAgICAgICAgICAgMFxuIgorICAgICAgIkZsYWdzOiAgICAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIkRlc2NyaXB0b3JzOlxuIgorICAgICAgIiAgICBLZXJuZWwgQ21kbGluZSBkZXNjcmlwdG9yOlxuIgorICAgICAgIiAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAgMVxuIgorICAgICAgIiAgICAgIEtlcm5lbCBDbWRsaW5lOiAgICAgICAgJ2RtPVwiMSB2cm9vdCBub25lIHJvIDEsMCAyMDU2IHZlcml0eSAxICIKKyAgICAgICJQQVJUVVVJRD0kKEFORFJPSURfU1lTVEVNX1BBUlRVVUlEKSBQQVJUVVVJRD0kKEFORFJPSURfU1lTVEVNX1BBUlRVVUlEKSAiCisgICAgICAiNDA5NiA0MDk2IDI1NyAyNTcgc2hhMSBlODExNjExNDY3ZGNkNmU4ZGM0MzI0ZTQ1ZjcwNmMyYmRkNTFkYjY3ICIKKyAgICAgICJkMDBkZjAwZCAyIHJlc3RhcnRfb25fY29ycnVwdGlvbiBpZ25vcmVfemVyb19ibG9ja3NcIiByb290PTB4ZmQwMCdcbiIKKyAgICAgICIgICAgS2VybmVsIENtZGxpbmUgZGVzY3JpcHRvcjpcbiIKKyAgICAgICIgICAgICBGbGFnczogICAgICAgICAgICAgICAgIDJcbiIKKyAgICAgICIgICAgICBLZXJuZWwgQ21kbGluZTogICAgICAgICIKKyAgICAgICIncm9vdD1QQVJUVVVJRD0kKEFORFJPSURfU1lTVEVNX1BBUlRVVUlEKSdcbiIsCisgICAgICBJbmZvSW1hZ2UodmJtZXRhX2Rtdl9wYXRoKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgZm9vdGVyIGlzIGNvcnJlY3RseSBlcmFzZWQgYW5kIHRoZSBoYXNodHJlZQorICAvLyByZW1haW5zIC0gc2VlIGFib3ZlIGZvciB3aHkgdGhlIGNvbnN0YW50IDEwNjkwNTYgaXMgdXNlZC4KKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBlcmFzZV9mb290ZXIgLS1pbWFnZSAlcyAtLWtlZXBfaGFzaHRyZWUiLAorICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworICBpbnQ2NF90IGVyYXNlZF9mb290ZXJfZmlsZV9zaXplOworICBBU1NFUlRfVFJVRShiYXNlOjpHZXRGaWxlU2l6ZShyb290ZnNfcGF0aCwgJmVyYXNlZF9mb290ZXJfZmlsZV9zaXplKSk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KGVyYXNlZF9mb290ZXJfZmlsZV9zaXplKSwgMTA2OTA1NlVMKTsKK30KKworVEVTVF9GKEF2YlRvb2xUZXN0LCBBZGRIYXNodHJlZUZvb3RlcikgeworICBBZGRIYXNodHJlZUZvb3RlclRlc3QoZmFsc2UpOworfQorCitURVNUX0YoQXZiVG9vbFRlc3QsIEFkZEhhc2h0cmVlRm9vdGVyU3BhcnNlKSB7CisgIEFkZEhhc2h0cmVlRm9vdGVyVGVzdCh0cnVlKTsKK30KKwordm9pZCBBdmJUb29sVGVzdDo6QWRkSGFzaHRyZWVGb290ZXJGRUNUZXN0KGJvb2wgc3BhcnNlX2ltYWdlKSB7CisgIGNvbnN0IHNpemVfdCByb290ZnNfc2l6ZSA9IDEwMjggKiAxMDI0OworICBjb25zdCBzaXplX3QgcGFydGl0aW9uX3NpemUgPSAxNTM2ICogMTAyNDsKKworICAvLyBHZW5lcmF0ZSBhIDEwMjggS2lCIGZpbGUgd2l0aCBrbm93biBjb250ZW50LgorICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByb290ZnM7CisgIHJvb3Rmcy5yZXNpemUocm9vdGZzX3NpemUpOworICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IHJvb3Rmc19zaXplOyBuKyspCisgICAgcm9vdGZzW25dID0gdWludDhfdChuKTsKKyAgYmFzZTo6RmlsZVBhdGggcm9vdGZzX3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInJvb3Rmcy5iaW4iKTsKKyAgRVhQRUNUX0VRKHJvb3Rmc19zaXplLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3Qgc2l6ZV90PigKKyAgICAgICAgICAgICAgICBiYXNlOjpXcml0ZUZpbGUocm9vdGZzX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJvb3Rmcy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290ZnMuc2l6ZSgpKSkpOworCisgIGlmIChzcGFyc2VfaW1hZ2UpIHsKKyAgICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAgICJtdiAlcyAlcy51bnNwYXJzZSIsCisgICAgICAgICAgICAgICAgICAgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisgICAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgICAiaW1nMnNpbWcgJXMudW5zcGFyc2UgJXMiLAorICAgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworICAgIEVYUEVDVF9DT01NQU5EKDAsICJybSAtZiAlcy51bnNwYXJzZSIsIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisgIH0KKworICAvKiBEbyB0aGlzIHR3aWNlIHRvIGNoZWNrIHRoYXQgJ2FkZF9oYXNodHJlZV9mb290ZXInIGlzIGlkZW1wb3RlbnQuICovCisgIGZvciAoaW50IG4gPSAwOyBuIDwgMjsgbisrKSB7CisgICAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIGFkZF9oYXNodHJlZV9mb290ZXIgLS1zYWx0IGQwMGRmMDBkIC0taW1hZ2UgJXMgIgorICAgICAgICAgICAgICAgICAgICItLXBhcnRpdGlvbl9zaXplICVkIC0tcGFydGl0aW9uX25hbWUgZm9vYmFyICIKKyAgICAgICAgICAgICAgICAgICAiLS1nZW5lcmF0ZV9mZWMgIgorICAgICAgICAgICAgICAgICAgICItLWFsZ29yaXRobSBTSEEyNTZfUlNBMjA0OCAiCisgICAgICAgICAgICAgICAgICAgIi0ta2V5IHRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIiwKKyAgICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgKGludClwYXJ0aXRpb25fc2l6ZSk7CisKKyAgICBBU1NFUlRfRVEoYmFzZTo6U3RyaW5nUHJpbnRmKCJGb290ZXIgdmVyc2lvbjogICAgICAgICAgIDEuMFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkltYWdlIHNpemU6ICAgICAgICAgICAgICAgMTU3Mjg2NCBieXRlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yaWdpbmFsIGltYWdlIHNpemU6ICAgICAgMTA1MjY3MiBieXRlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZCTWV0YSBvZmZzZXQ6ICAgICAgICAgICAgMTA4NTQ0MFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZCTWV0YSBzaXplOiAgICAgICAgICAgICAgMTM0NCBieXRlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVkJNZXRhIGltYWdlIHZlcnNpb246ICAgICAxLjAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciBCbG9jazogICAgICAgICAgICAgMjU2IGJ5dGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXV0aGVudGljYXRpb24gQmxvY2s6ICAgICAzMjAgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXhpbGlhcnkgQmxvY2s6ICAgICAgICAgIDc2OCBieXRlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsZ29yaXRobTogICAgICAgICAgICAgICAgU0hBMjU2X1JTQTIwNDhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb2xsYmFjayBJbmRleDogICAgICAgICAgIDBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGbGFnczogICAgICAgICAgICAgICAgICAgIDBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXNjcmlwdG9yczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgSGFzaHRyZWUgZGVzY3JpcHRvcjpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBWZXJzaW9uIG9mIGRtLXZlcml0eTogIDFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBJbWFnZSBTaXplOiAgICAgICAgICAgIDEwNTI2NzIgYnl0ZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBUcmVlIE9mZnNldDogICAgICAgICAgIDEwNTI2NzJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBUcmVlIFNpemU6ICAgICAgICAgICAgIDE2Mzg0IGJ5dGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgRGF0YSBCbG9jayBTaXplOiAgICAgICA0MDk2IGJ5dGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgSGFzaCBCbG9jayBTaXplOiAgICAgICA0MDk2IGJ5dGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgRkVDIG51bSByb290czogICAgICAgICAyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgRkVDIG9mZnNldDogICAgICAgICAgICAxMDY5MDU2XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgRkVDIHNpemU6ICAgICAgICAgICAgICAxNjM4NCBieXRlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIEhhc2ggQWxnb3JpdGhtOiAgICAgICAgc2hhMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgZm9vYmFyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgU2FsdDogICAgICAgICAgICAgICAgICBkMDBkZjAwZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIFJvb3QgRGlnZXN0OiAgICAgICAgICAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImU4MTE2MTE0NjdkY2Q2ZThkYzQzMjRlNDVmNzA2YzJiZGQ1MWRiNjdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFyc2VfaW1hZ2UgPyAiIChTcGFyc2UpIiA6ICIiKSwKKyAgICAgICAgICAgICAgSW5mb0ltYWdlKHJvb3Rmc19wYXRoKSk7CisgIH0KKworICBpZiAoc3BhcnNlX2ltYWdlKSB7CisgICAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgICAibXYgJXMgJXMuc3BhcnNlIiwKKyAgICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgcm9vdGZzX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAgICJzaW1nMmltZyAlcy5zcGFyc2UgJXMiLAorICAgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworICAgIEVYUEVDVF9DT01NQU5EKDAsICJybSAtZiAlcy5zcGFyc2UiLCByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworICB9CisKKyAgLyogVE9ETzogd291bGQgYmUgbmljZSB0byB2ZXJpZnkgdGhhdCB0aGUgRkVDIGRhdGEgaXMgY29ycmVjdC4gKi8KKworICAvLyBOb3cgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCB0aGUgVkJNZXRhIGJsb2NrIGFnYWluIGZyb20gdGhlIGZvb3Rlci4KKyAgc3RkOjpzdHJpbmcgcGFydF9kYXRhOworICBBU1NFUlRfVFJVRShiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKHJvb3Rmc19wYXRoLCAmcGFydF9kYXRhKSk7CisKKyAgLy8gQ2hlY2sgZm9vdGVyIGNvbnRhaW5zIGNvcnJlY3QgZGF0YS4KKyAgQXZiRm9vdGVyIGY7CisgIEVYUEVDVF9ORSgwLAorICAgICAgICAgICAgYXZiX2Zvb3Rlcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBdmJGb290ZXIqPigKKyAgICAgICAgICAgICAgICAgICAgcGFydF9kYXRhLmRhdGEoKSArIHBhcnRfZGF0YS5zaXplKCkgLSBBVkJfRk9PVEVSX1NJWkUpLAorICAgICAgICAgICAgICAgICZmKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGYubWFnaWMpLCBBVkJfRk9PVEVSX01BR0lDX0xFTiksCisgICAgICBBVkJfRk9PVEVSX01BR0lDKTsKKyAgRVhQRUNUX0VRKEFWQl9GT09URVJfTUFKT1JfVkVSU0lPTiwgKGludClmLnZlcnNpb25fbWFqb3IpOworICBFWFBFQ1RfRVEoQVZCX0ZPT1RFUl9NSU5PUl9WRVJTSU9OLCAoaW50KWYudmVyc2lvbl9taW5vcik7CisgIEVYUEVDVF9FUSgxMDUyNjcyVUwsIGYub3JpZ2luYWxfaW1hZ2Vfc2l6ZSk7CisgIEVYUEVDVF9FUSgxMDg1NDQwVUwsIGYudmJtZXRhX29mZnNldCk7CisgIEVYUEVDVF9FUSgxMzQ0VUwsIGYudmJtZXRhX3NpemUpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHZibWV0YSBpbWFnZSBhdCB8Zi52Ym1ldGFfb2Zmc2V0fCBjaGVja3Mgb3V0LgorICBjb25zdCB1aW50OF90KiB2Ym1ldGFfZGF0YSA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihwYXJ0X2RhdGEuZGF0YSgpICsgZi52Ym1ldGFfb2Zmc2V0KTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KHZibWV0YV9kYXRhLCBmLnZibWV0YV9zaXplLCBOVUxMLCBOVUxMKSk7CisKKyAgLy8gQ29sbGVjdCBhbGwgZGVzY3JpcHRvcnMuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEF2YkRlc2NyaXB0b3IqPiBkZXNjcmlwdG9yczsKKyAgYXZiX2Rlc2NyaXB0b3JfZm9yZWFjaCgKKyAgICAgIHZibWV0YV9kYXRhLCBmLnZibWV0YV9zaXplLCBjb2xsZWN0X2Rlc2NyaXB0b3JzLCAmZGVzY3JpcHRvcnMpOworCisgIC8vIFdlIHNob3VsZCBvbmx5IGhhdmUgYSBzaW5nbGUgZGVzY3JpcHRvciBhbmQgaXQgc2hvdWxkIGJlIGEKKyAgLy8gaGFzaHRyZWUgZGVzY3JpcHRvci4KKyAgRVhQRUNUX0VRKDFVTCwgZGVzY3JpcHRvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKEFWQl9ERVNDUklQVE9SX1RBR19IQVNIVFJFRSwgYXZiX2JlNjR0b2goZGVzY3JpcHRvcnNbMF0tPnRhZykpOworICBBdmJIYXNodHJlZURlc2NyaXB0b3IgZDsKKyAgRVhQRUNUX05FKAorICAgICAgMCwKKyAgICAgIGF2Yl9oYXNodHJlZV9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEF2Ykhhc2h0cmVlRGVzY3JpcHRvcio+KGRlc2NyaXB0b3JzWzBdKSwgJmQpKTsKKyAgRVhQRUNUX0VRKDFVTCwgZC5kbV92ZXJpdHlfdmVyc2lvbik7CisgIEVYUEVDVF9FUSgxMDUyNjcyVUwsIGQuaW1hZ2Vfc2l6ZSk7CisgIEVYUEVDVF9FUSgxMDUyNjcyVUwsIGQudHJlZV9vZmZzZXQpOworICBFWFBFQ1RfRVEoMTYzODRVTCwgZC50cmVlX3NpemUpOworICBFWFBFQ1RfRVEoNDA5NlVMLCBkLmRhdGFfYmxvY2tfc2l6ZSk7CisgIEVYUEVDVF9FUSgyVUwsIGQuZmVjX251bV9yb290cyk7CisgIEVYUEVDVF9FUSgxMDY5MDU2VUwsIGQuZmVjX29mZnNldCk7CisgIEVYUEVDVF9FUSgxNjM4NFVMLCBkLmZlY19zaXplKTsKKyAgRVhQRUNUX0VRKDZVTCwgZC5wYXJ0aXRpb25fbmFtZV9sZW4pOworICBFWFBFQ1RfRVEoNFVMLCBkLnNhbHRfbGVuKTsKKyAgRVhQRUNUX0VRKDIwVUwsIGQucm9vdF9kaWdlc3RfbGVuKTsKKyAgY29uc3QgdWludDhfdCogZGVzY19lbmQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkZXNjcmlwdG9yc1swXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBdmJIYXNodHJlZURlc2NyaXB0b3IpOworICB1aW50NjRfdCBvID0gMDsKKyAgRVhQRUNUX0VRKCJmb29iYXIiLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVzY19lbmQgKyBvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGQucGFydGl0aW9uX25hbWVfbGVuKSk7CisgIG8gKz0gZC5wYXJ0aXRpb25fbmFtZV9sZW47CisgIEVYUEVDVF9FUSgiZDAwZGYwMGQiLCBtZW1fdG9faGV4c3RyaW5nKGRlc2NfZW5kICsgbywgZC5zYWx0X2xlbikpOworICBvICs9IGQuc2FsdF9sZW47CisgIEVYUEVDVF9FUSgiZTgxMTYxMTQ2N2RjZDZlOGRjNDMyNGU0NWY3MDZjMmJkZDUxZGI2NyIsCisgICAgICAgICAgICBtZW1fdG9faGV4c3RyaW5nKGRlc2NfZW5kICsgbywgZC5yb290X2RpZ2VzdF9sZW4pKTsKKworICAvLyBDaGVjayB0aGF0IHdlIGNvcnJlY3RseSBnZW5lcmF0ZSBkbS12ZXJpdHkga2VybmVsIGNtZGxpbmUKKyAgLy8gc25pcHBldHMsIGlmIHJlcXVlc3RlZC4KKyAgYmFzZTo6RmlsZVBhdGggdmJtZXRhX2Rtdl9wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJ2Ym1ldGFfZG1fdmVyaXR5X2Rlc2MuYmluIik7CisgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICIuL2F2YnRvb2wgbWFrZV92Ym1ldGFfaW1hZ2UgIgorICAgICAgICAgICAgICAgICAiLS1vdXRwdXQgJXMgIgorICAgICAgICAgICAgICAgICAiLS1zZXR1cF9yb290ZnNfZnJvbV9rZXJuZWwgJXMgIgorICAgICAgICAgICAgICAgICAiLS1hbGdvcml0aG0gU0hBMjU2X1JTQTIwNDggIgorICAgICAgICAgICAgICAgICAiLS1rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iLAorICAgICAgICAgICAgICAgICB2Ym1ldGFfZG12X3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICByb290ZnNfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworCisgIEFTU0VSVF9FUSgKKyAgICAgICJWQk1ldGEgaW1hZ2UgdmVyc2lvbjogICAgIDEuMFxuIgorICAgICAgIkhlYWRlciBCbG9jazogICAgICAgICAgICAgMjU2IGJ5dGVzXG4iCisgICAgICAiQXV0aGVudGljYXRpb24gQmxvY2s6ICAgICAzMjAgYnl0ZXNcbiIKKyAgICAgICJBdXhpbGlhcnkgQmxvY2s6ICAgICAgICAgIDk2MCBieXRlc1xuIgorICAgICAgIkFsZ29yaXRobTogICAgICAgICAgICAgICAgU0hBMjU2X1JTQTIwNDhcbiIKKyAgICAgICJSb2xsYmFjayBJbmRleDogICAgICAgICAgIDBcbiIKKyAgICAgICJGbGFnczogICAgICAgICAgICAgICAgICAgIDBcbiIKKyAgICAgICJEZXNjcmlwdG9yczpcbiIKKyAgICAgICIgICAgS2VybmVsIENtZGxpbmUgZGVzY3JpcHRvcjpcbiIKKyAgICAgICIgICAgICBGbGFnczogICAgICAgICAgICAgICAgIDFcbiIKKyAgICAgICIgICAgICBLZXJuZWwgQ21kbGluZTogICAgICAgICdkbT1cIjEgdnJvb3Qgbm9uZSBybyAxLDAgMjA1NiB2ZXJpdHkgMSAiCisgICAgICAiUEFSVFVVSUQ9JChBTkRST0lEX1NZU1RFTV9QQVJUVVVJRCkgUEFSVFVVSUQ9JChBTkRST0lEX1NZU1RFTV9QQVJUVVVJRCkgIgorICAgICAgIjQwOTYgNDA5NiAyNTcgMjU3IHNoYTEgZTgxMTYxMTQ2N2RjZDZlOGRjNDMyNGU0NWY3MDZjMmJkZDUxZGI2NyAiCisgICAgICAiZDAwZGYwMGQgMTAgcmVzdGFydF9vbl9jb3JydXB0aW9uIGlnbm9yZV96ZXJvX2Jsb2NrcyAiCisgICAgICAidXNlX2ZlY19mcm9tX2RldmljZSAiCisgICAgICAiUEFSVFVVSUQ9JChBTkRST0lEX1NZU1RFTV9QQVJUVVVJRCkgZmVjX3Jvb3RzIDIgZmVjX2Jsb2NrcyAyNjEgIgorICAgICAgImZlY19zdGFydCAyNjFcIiByb290PTB4ZmQwMCdcbiIKKyAgICAgICIgICAgS2VybmVsIENtZGxpbmUgZGVzY3JpcHRvcjpcbiIKKyAgICAgICIgICAgICBGbGFnczogICAgICAgICAgICAgICAgIDJcbiIKKyAgICAgICIgICAgICBLZXJuZWwgQ21kbGluZTogICAgICAgICIKKyAgICAgICIncm9vdD1QQVJUVVVJRD0kKEFORFJPSURfU1lTVEVNX1BBUlRVVUlEKSdcbiIsCisgICAgICBJbmZvSW1hZ2UodmJtZXRhX2Rtdl9wYXRoKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgZm9vdGVyIGlzIGNvcnJlY3RseSBlcmFzZWQgYW5kIHRoZSBoYXNodHJlZSBhbmQKKyAgLy8gRkVDIGRhdGEgcmVtYWlucy4gVGhlIGNvbnN0YW50IDEwODU0NDAgaXMgdXNlZCBiZWNhdXNlIGl0J3Mgd2hlcmUKKyAgLy8gdGhlIEZFQyBkYXRhIGVuZHMgKGl0J3MgYXQgb2Zmc2V0IDEwNjkwNTYgYW5kIHNpemUgMTYzODQpLgorICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIGVyYXNlX2Zvb3RlciAtLWltYWdlICVzIC0ta2VlcF9oYXNodHJlZSIsCisgICAgICAgICAgICAgICAgIHJvb3Rmc19wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisgIGludDY0X3QgZXJhc2VkX2Zvb3Rlcl9maWxlX3NpemU7CisgIEFTU0VSVF9UUlVFKGJhc2U6OkdldEZpbGVTaXplKHJvb3Rmc19wYXRoLCAmZXJhc2VkX2Zvb3Rlcl9maWxlX3NpemUpKTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4oZXJhc2VkX2Zvb3Rlcl9maWxlX3NpemUpLCAxMDg1NDQwVUwpOworfQorCitURVNUX0YoQXZiVG9vbFRlc3QsIEFkZEhhc2h0cmVlRm9vdGVyRkVDKSB7CisgIEFkZEhhc2h0cmVlRm9vdGVyRkVDVGVzdChmYWxzZSk7Cit9CisKK1RFU1RfRihBdmJUb29sVGVzdCwgQWRkSGFzaHRyZWVGb290ZXJGRUNTcGFyc2UpIHsKKyAgQWRkSGFzaHRyZWVGb290ZXJGRUNUZXN0KHRydWUpOworfQorCitURVNUX0YoQXZiVG9vbFRlc3QsIEFkZEhhc2h0cmVlRm9vdGVyQ2FsY01heEltYWdlU2l6ZSkgeworICBjb25zdCBzaXplX3QgcGFydGl0aW9uX3NpemUgPSAxMCAqIDEwMjQgKiAxMDI0OworICBiYXNlOjpGaWxlUGF0aCBvdXRwdXRfcGF0aCA9IHRlc3RkaXJfLkFwcGVuZCgibWF4X3NpemUudHh0Iik7CisKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBhZGRfaGFzaHRyZWVfZm9vdGVyICIKKyAgICAgICAgICAgICAgICAgIi0tcGFydGl0aW9uX3NpemUgJXpkIC0tY2FsY19tYXhfaW1hZ2Vfc2l6ZSA+ICVzIiwKKyAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3NpemUsCisgICAgICAgICAgICAgICAgIG91dHB1dF9wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisgIHN0ZDo6c3RyaW5nIG1heF9pbWFnZV9zaXplX2RhdGE7CisgIEVYUEVDVF9UUlVFKGJhc2U6OlJlYWRGaWxlVG9TdHJpbmcob3V0cHV0X3BhdGgsICZtYXhfaW1hZ2Vfc2l6ZV9kYXRhKSk7CisgIEVYUEVDVF9FUSgiMTAzMzAxMTJcbiIsIG1heF9pbWFnZV9zaXplX2RhdGEpOworICBzaXplX3QgbWF4X2ltYWdlX3NpemUgPSBhdG9sbChtYXhfaW1hZ2Vfc2l6ZV9kYXRhLmNfc3RyKCkpOworCisgIC8vIEhhc2h0cmVlIGFuZCBtZXRhZGF0YSB0YWtlcyB1cCAxNTIgS2lCIC0gY29tcGFyZSB0byBiZWxvdyB3aXRoCisgIC8vIEZFQyB3aGljaCBpcyAyNDQgS2lCLgorICBFWFBFQ1RfRVEoMTUyICogMTAyNFVMTCwgcGFydGl0aW9uX3NpemUgLSBtYXhfaW1hZ2Vfc2l6ZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gYWRkIGEgaGFzaHRyZWUgd2l0aCBhbiBpbWFnZSB0aGlzIHNpemUgZm9yIHN1Y2gKKyAgLy8gYSBwYXJ0aXRpb24gc2l6ZS4KKyAgYmFzZTo6RmlsZVBhdGggc3lzdGVtX3BhdGggPSBHZW5lcmF0ZUltYWdlKCJzeXN0ZW0iLCBtYXhfaW1hZ2Vfc2l6ZSk7CisgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICIuL2F2YnRvb2wgYWRkX2hhc2h0cmVlX2Zvb3RlciIKKyAgICAgICAgICAgICAgICAgIiAtLWltYWdlICVzIgorICAgICAgICAgICAgICAgICAiIC0tcGFydGl0aW9uX25hbWUgc3lzdGVtIgorICAgICAgICAgICAgICAgICAiIC0tcGFydGl0aW9uX3NpemUgJXpkIgorICAgICAgICAgICAgICAgICAiIC0tc2FsdCBkZWFkYmVlZiIKKyAgICAgICAgICAgICAgICAgIiAtLWFsZ29yaXRobSBTSEE1MTJfUlNBNDA5NiAiCisgICAgICAgICAgICAgICAgICIgLS1rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhNDA5Ni5wZW0iLAorICAgICAgICAgICAgICAgICBzeXN0ZW1fcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplKTsKK30KKworVEVTVF9GKEF2YlRvb2xUZXN0LCBBZGRIYXNodHJlZUZvb3RlckNhbGNNYXhJbWFnZVNpemVXaXRoRkVDKSB7CisgIGNvbnN0IHNpemVfdCBwYXJ0aXRpb25fc2l6ZSA9IDEwICogMTAyNCAqIDEwMjQ7CisgIGJhc2U6OkZpbGVQYXRoIG91dHB1dF9wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJtYXhfc2l6ZS50eHQiKTsKKworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIGFkZF9oYXNodHJlZV9mb290ZXIgIgorICAgICAgICAgICAgICAgICAiLS1wYXJ0aXRpb25fc2l6ZSAlemQgLS1nZW5lcmF0ZV9mZWMgIgorICAgICAgICAgICAgICAgICAiLS1jYWxjX21heF9pbWFnZV9zaXplID4gJXMiLAorICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fc2l6ZSwKKyAgICAgICAgICAgICAgICAgb3V0cHV0X3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKyAgc3RkOjpzdHJpbmcgbWF4X2ltYWdlX3NpemVfZGF0YTsKKyAgRVhQRUNUX1RSVUUoYmFzZTo6UmVhZEZpbGVUb1N0cmluZyhvdXRwdXRfcGF0aCwgJm1heF9pbWFnZV9zaXplX2RhdGEpKTsKKyAgRVhQRUNUX0VRKCIxMDIzNTkwNFxuIiwgbWF4X2ltYWdlX3NpemVfZGF0YSk7CisgIHNpemVfdCBtYXhfaW1hZ2Vfc2l6ZSA9IGF0b2xsKG1heF9pbWFnZV9zaXplX2RhdGEuY19zdHIoKSk7CisKKyAgLy8gSGFzaHRyZWUsIEZFQyBjb2RlcywgYW5kIG1ldGFkYXRhIHRha2VzIHVwIDI0NCBLaUIgLSBjb21wYXJlIHRvCisgIC8vIGFib3ZlIHdpaHRvdXQgRkVDIHdoaWNoIGlzIDE1MiBLaUIuCisgIEVYUEVDVF9FUSgyNDQgKiAxMDI0VUxMLCBwYXJ0aXRpb25fc2l6ZSAtIG1heF9pbWFnZV9zaXplKTsKKworICAvLyBDaGVjayB0aGF0IHdlIGNhbiBhZGQgYSBoYXNodHJlZSB3aXRoIGFuIGltYWdlIHRoaXMgc2l6ZSBmb3Igc3VjaAorICAvLyBhIHBhcnRpdGlvbiBzaXplLgorICBiYXNlOjpGaWxlUGF0aCBzeXN0ZW1fcGF0aCA9IEdlbmVyYXRlSW1hZ2UoInN5c3RlbSIsIG1heF9pbWFnZV9zaXplKTsKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBhZGRfaGFzaHRyZWVfZm9vdGVyIgorICAgICAgICAgICAgICAgICAiIC0taW1hZ2UgJXMiCisgICAgICAgICAgICAgICAgICIgLS1wYXJ0aXRpb25fbmFtZSBzeXN0ZW0iCisgICAgICAgICAgICAgICAgICIgLS1wYXJ0aXRpb25fc2l6ZSAlemQiCisgICAgICAgICAgICAgICAgICIgLS1zYWx0IGRlYWRiZWVmIgorICAgICAgICAgICAgICAgICAiIC0tZ2VuZXJhdGVfZmVjICIKKyAgICAgICAgICAgICAgICAgIiAtLWFsZ29yaXRobSBTSEE1MTJfUlNBNDA5NiAiCisgICAgICAgICAgICAgICAgICIgLS1rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhNDA5Ni5wZW0iLAorICAgICAgICAgICAgICAgICBzeXN0ZW1fcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplKTsKK30KKworVEVTVF9GKEF2YlRvb2xUZXN0LCBLZXJuZWxDbWRsaW5lRGVzY3JpcHRvcikgeworICBiYXNlOjpGaWxlUGF0aCB2Ym1ldGFfcGF0aCA9CisgICAgICB0ZXN0ZGlyXy5BcHBlbmQoInZibWV0YV9rZXJuZWxfY21kbGluZV9kZXNjLmJpbiIpOworCisgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICIuL2F2YnRvb2wgbWFrZV92Ym1ldGFfaW1hZ2UgIgorICAgICAgICAgICAgICAgICAiLS1vdXRwdXQgJXMgIgorICAgICAgICAgICAgICAgICAiLS1rZXJuZWxfY21kbGluZSAnZm9vIGJhciBiYXonICIKKyAgICAgICAgICAgICAgICAgIi0ta2VybmVsX2NtZGxpbmUgJ3NlY29uZCBjbWRsaW5lJyAiCisgICAgICAgICAgICAgICAgICItLWFsZ29yaXRobSBTSEEyNTZfUlNBMjA0OCAiCisgICAgICAgICAgICAgICAgICItLWtleSB0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSIsCisgICAgICAgICAgICAgICAgIHZibWV0YV9wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgQVNTRVJUX0VRKAorICAgICAgIlZCTWV0YSBpbWFnZSB2ZXJzaW9uOiAgICAgMS4wXG4iCisgICAgICAiSGVhZGVyIEJsb2NrOiAgICAgICAgICAgICAyNTYgYnl0ZXNcbiIKKyAgICAgICJBdXRoZW50aWNhdGlvbiBCbG9jazogICAgIDMyMCBieXRlc1xuIgorICAgICAgIkF1eGlsaWFyeSBCbG9jazogICAgICAgICAgNjQwIGJ5dGVzXG4iCisgICAgICAiQWxnb3JpdGhtOiAgICAgICAgICAgICAgICBTSEEyNTZfUlNBMjA0OFxuIgorICAgICAgIlJvbGxiYWNrIEluZGV4OiAgICAgICAgICAgMFxuIgorICAgICAgIkZsYWdzOiAgICAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIkRlc2NyaXB0b3JzOlxuIgorICAgICAgIiAgICBLZXJuZWwgQ21kbGluZSBkZXNjcmlwdG9yOlxuIgorICAgICAgIiAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIiAgICAgIEtlcm5lbCBDbWRsaW5lOiAgICAgICAgJ2ZvbyBiYXIgYmF6J1xuIgorICAgICAgIiAgICBLZXJuZWwgQ21kbGluZSBkZXNjcmlwdG9yOlxuIgorICAgICAgIiAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIiAgICAgIEtlcm5lbCBDbWRsaW5lOiAgICAgICAgJ3NlY29uZCBjbWRsaW5lJ1xuIiwKKyAgICAgIEluZm9JbWFnZSh2Ym1ldGFfcGF0aCkpOworCisgIC8vIE5vdyBjaGVjayB0aGUgVkJNZXRhIGltYWdlLgorICBzdGQ6OnN0cmluZyBpbWFnZV9kYXRhOworICBBU1NFUlRfVFJVRShiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKHZibWV0YV9wYXRoLCAmaW1hZ2VfZGF0YSkpOworCisgIGNvbnN0IHVpbnQ4X3QqIHZibWV0YV9kYXRhID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGltYWdlX2RhdGEuZGF0YSgpKTsKKyAgY29uc3Qgc2l6ZV90IHZibWV0YV9zaXplID0gaW1hZ2VfZGF0YS5sZW5ndGgoKTsKKyAgRVhQRUNUX0VRKEFWQl9WQk1FVEFfVkVSSUZZX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl92Ym1ldGFfaW1hZ2VfdmVyaWZ5KHZibWV0YV9kYXRhLCB2Ym1ldGFfc2l6ZSwgTlVMTCwgTlVMTCkpOworCisgIC8vIENvbGxlY3QgYWxsIGRlc2NyaXB0b3JzLgorICBzdGQ6OnZlY3Rvcjxjb25zdCBBdmJEZXNjcmlwdG9yKj4gZGVzY3JpcHRvcnM7CisgIGF2Yl9kZXNjcmlwdG9yX2ZvcmVhY2goCisgICAgICB2Ym1ldGFfZGF0YSwgdmJtZXRhX3NpemUsIGNvbGxlY3RfZGVzY3JpcHRvcnMsICZkZXNjcmlwdG9ycyk7CisKKyAgLy8gV2Ugc2hvdWxkIGhhdmUgdHdvIGRlc2NyaXB0b3JzIC0gY2hlY2sgdGhlbS4KKyAgRVhQRUNUX0VRKDJVTCwgZGVzY3JpcHRvcnMuc2l6ZSgpKTsKKyAgQXZiS2VybmVsQ21kbGluZURlc2NyaXB0b3IgZDsKKyAgRVhQRUNUX0VRKEFWQl9ERVNDUklQVE9SX1RBR19LRVJORUxfQ01ETElORSwKKyAgICAgICAgICAgIGF2Yl9iZTY0dG9oKGRlc2NyaXB0b3JzWzBdLT50YWcpKTsKKyAgRVhQRUNUX05FKAorICAgICAgMCwKKyAgICAgIGF2Yl9rZXJuZWxfY21kbGluZV9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yKj4oZGVzY3JpcHRvcnNbMF0pLAorICAgICAgICAgICZkKSk7CisgIEVYUEVDVF9FUSgiZm9vIGJhciBiYXoiLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVzY3JpcHRvcnNbMF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQXZiS2VybmVsQ21kbGluZURlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgZC5rZXJuZWxfY21kbGluZV9sZW5ndGgpKTsKKyAgRVhQRUNUX0VRKEFWQl9ERVNDUklQVE9SX1RBR19LRVJORUxfQ01ETElORSwKKyAgICAgICAgICAgIGF2Yl9iZTY0dG9oKGRlc2NyaXB0b3JzWzFdLT50YWcpKTsKKyAgRVhQRUNUX05FKAorICAgICAgMCwKKyAgICAgIGF2Yl9rZXJuZWxfY21kbGluZV9kZXNjcmlwdG9yX3ZhbGlkYXRlX2FuZF9ieXRlc3dhcCgKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEF2Yktlcm5lbENtZGxpbmVEZXNjcmlwdG9yKj4oZGVzY3JpcHRvcnNbMV0pLAorICAgICAgICAgICZkKSk7CisgIEVYUEVDVF9FUSgic2Vjb25kIGNtZGxpbmUiLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVzY3JpcHRvcnNbMV0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQXZiS2VybmVsQ21kbGluZURlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgZC5rZXJuZWxfY21kbGluZV9sZW5ndGgpKTsKK30KKworVEVTVF9GKEF2YlRvb2xUZXN0LCBJbmNsdWRlRGVzY3JpcHRvcikgeworICBiYXNlOjpGaWxlUGF0aCB2Ym1ldGExX3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInZibWV0YV9pZDEuYmluIik7CisgIGJhc2U6OkZpbGVQYXRoIHZibWV0YTJfcGF0aCA9IHRlc3RkaXJfLkFwcGVuZCgidmJtZXRhX2lkMi5iaW4iKTsKKyAgYmFzZTo6RmlsZVBhdGggdmJtZXRhM19wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJ2Ym1ldGFfaWQzLmJpbiIpOworCisgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICIuL2F2YnRvb2wgbWFrZV92Ym1ldGFfaW1hZ2UgIgorICAgICAgICAgICAgICAgICAiLS1vdXRwdXQgJXMgIgorICAgICAgICAgICAgICAgICAiLS1rZXJuZWxfY21kbGluZSAnc29tZXRoaW5nJyAiCisgICAgICAgICAgICAgICAgICItLXByb3AgbmFtZTp2YWx1ZSAiLAorICAgICAgICAgICAgICAgICB2Ym1ldGExX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIG1ha2VfdmJtZXRhX2ltYWdlICIKKyAgICAgICAgICAgICAgICAgIi0tb3V0cHV0ICVzICIKKyAgICAgICAgICAgICAgICAgIi0tcHJvcCBuYW1lMjp2YWx1ZTIgIgorICAgICAgICAgICAgICAgICAiLS1wcm9wIG5hbWUzOnZhbHVlMyAiLAorICAgICAgICAgICAgICAgICB2Ym1ldGEyX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIG1ha2VfdmJtZXRhX2ltYWdlICIKKyAgICAgICAgICAgICAgICAgIi0tb3V0cHV0ICVzICIKKyAgICAgICAgICAgICAgICAgIi0tcHJvcCBuYW1lNDp2YWx1ZTQgIgorICAgICAgICAgICAgICAgICAiLS1pbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2UgJXMgIgorICAgICAgICAgICAgICAgICAiLS1pbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2UgJXMgIiwKKyAgICAgICAgICAgICAgICAgdmJtZXRhM19wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgdmJtZXRhMV9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgdmJtZXRhMl9wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgQVNTRVJUX0VRKAorICAgICAgIlZCTWV0YSBpbWFnZSB2ZXJzaW9uOiAgICAgMS4wXG4iCisgICAgICAiSGVhZGVyIEJsb2NrOiAgICAgICAgICAgICAyNTYgYnl0ZXNcbiIKKyAgICAgICJBdXRoZW50aWNhdGlvbiBCbG9jazogICAgIDAgYnl0ZXNcbiIKKyAgICAgICJBdXhpbGlhcnkgQmxvY2s6ICAgICAgICAgIDI1NiBieXRlc1xuIgorICAgICAgIkFsZ29yaXRobTogICAgICAgICAgICAgICAgTk9ORVxuIgorICAgICAgIlJvbGxiYWNrIEluZGV4OiAgICAgICAgICAgMFxuIgorICAgICAgIkZsYWdzOiAgICAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIkRlc2NyaXB0b3JzOlxuIgorICAgICAgIiAgICBQcm9wOiBuYW1lNCAtPiAndmFsdWU0J1xuIgorICAgICAgIiAgICBQcm9wOiBuYW1lIC0+ICd2YWx1ZSdcbiIKKyAgICAgICIgICAgS2VybmVsIENtZGxpbmUgZGVzY3JpcHRvcjpcbiIKKyAgICAgICIgICAgICBGbGFnczogICAgICAgICAgICAgICAgIDBcbiIKKyAgICAgICIgICAgICBLZXJuZWwgQ21kbGluZTogICAgICAgICdzb21ldGhpbmcnXG4iCisgICAgICAiICAgIFByb3A6IG5hbWUyIC0+ICd2YWx1ZTInXG4iCisgICAgICAiICAgIFByb3A6IG5hbWUzIC0+ICd2YWx1ZTMnXG4iLAorICAgICAgSW5mb0ltYWdlKHZibWV0YTNfcGF0aCkpOworfQorCitURVNUX0YoQXZiVG9vbFRlc3QsIENoYWluZWRQYXJ0aXRpb24pIHsKKyAgYmFzZTo6RmlsZVBhdGggdmJtZXRhX3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInZibWV0YV9jcC5iaW4iKTsKKworICBiYXNlOjpGaWxlUGF0aCBwa19wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJ0ZXN0a2V5X3JzYTIwNDguYXZicHVia2V5Iik7CisKKyAgRVhQRUNUX0NPTU1BTkQoCisgICAgICAwLAorICAgICAgIi4vYXZidG9vbCBleHRyYWN0X3B1YmxpY19rZXkgLS1rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iCisgICAgICAiIC0tb3V0cHV0ICVzIiwKKyAgICAgIHBrX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKworICBFWFBFQ1RfQ09NTUFORCgKKyAgICAgIDAsCisgICAgICAiLi9hdmJ0b29sIG1ha2VfdmJtZXRhX2ltYWdlICIKKyAgICAgICItLW91dHB1dCAlcyAiCisgICAgICAiLS1jaGFpbl9wYXJ0aXRpb24gc3lzdGVtOjE6JXMgIgorICAgICAgIi0tYWxnb3JpdGhtIFNIQTI1Nl9SU0EyMDQ4IC0ta2V5IHRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtIiwKKyAgICAgIHZibWV0YV9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgIHBrX3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKworICBBU1NFUlRfRVEoCisgICAgICAiVkJNZXRhIGltYWdlIHZlcnNpb246ICAgICAxLjBcbiIKKyAgICAgICJIZWFkZXIgQmxvY2s6ICAgICAgICAgICAgIDI1NiBieXRlc1xuIgorICAgICAgIkF1dGhlbnRpY2F0aW9uIEJsb2NrOiAgICAgMzIwIGJ5dGVzXG4iCisgICAgICAiQXV4aWxpYXJ5IEJsb2NrOiAgICAgICAgICAxMTUyIGJ5dGVzXG4iCisgICAgICAiQWxnb3JpdGhtOiAgICAgICAgICAgICAgICBTSEEyNTZfUlNBMjA0OFxuIgorICAgICAgIlJvbGxiYWNrIEluZGV4OiAgICAgICAgICAgMFxuIgorICAgICAgIkZsYWdzOiAgICAgICAgICAgICAgICAgICAgMFxuIgorICAgICAgIkRlc2NyaXB0b3JzOlxuIgorICAgICAgIiAgICBDaGFpbiBQYXJ0aXRpb24gZGVzY3JpcHRvcjpcbiIKKyAgICAgICIgICAgICBQYXJ0aXRpb24gTmFtZTogICAgICAgICAgc3lzdGVtXG4iCisgICAgICAiICAgICAgUm9sbGJhY2sgSW5kZXggTG9jYXRpb246IDFcbiIKKyAgICAgICIgICAgICBQdWJsaWMga2V5IChzaGExKTogICAgICAgIgorICAgICAgImNkYmI3NzE3N2Y3MzE5MjBiYmUwYTBmOTRmODRkOTAzOGFlMDYxN2RcbiIsCisgICAgICBJbmZvSW1hZ2UodmJtZXRhX3BhdGgpKTsKKworICAvLyBOb3cgY2hlY2sgdGhlIFZCTWV0YSBpbWFnZS4KKyAgc3RkOjpzdHJpbmcgaW1hZ2VfZGF0YTsKKyAgQVNTRVJUX1RSVUUoYmFzZTo6UmVhZEZpbGVUb1N0cmluZyh2Ym1ldGFfcGF0aCwgJmltYWdlX2RhdGEpKTsKKworICBjb25zdCB1aW50OF90KiB2Ym1ldGFfZGF0YSA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihpbWFnZV9kYXRhLmRhdGEoKSk7CisgIGNvbnN0IHNpemVfdCB2Ym1ldGFfc2l6ZSA9IGltYWdlX2RhdGEubGVuZ3RoKCk7CisgIEVYUEVDVF9FUShBVkJfVkJNRVRBX1ZFUklGWV9SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfdmJtZXRhX2ltYWdlX3ZlcmlmeSh2Ym1ldGFfZGF0YSwgdmJtZXRhX3NpemUsIE5VTEwsIE5VTEwpKTsKKworICAvLyBDb2xsZWN0IGFsbCBkZXNjcmlwdG9ycy4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgQXZiRGVzY3JpcHRvcio+IGRlc2NyaXB0b3JzOworICBhdmJfZGVzY3JpcHRvcl9mb3JlYWNoKAorICAgICAgdmJtZXRhX2RhdGEsIHZibWV0YV9zaXplLCBjb2xsZWN0X2Rlc2NyaXB0b3JzLCAmZGVzY3JpcHRvcnMpOworCisgIC8vIFdlIHNob3VsZCBoYXZlIG9uZSBkZXNjcmlwdG9yIC0gY2hlY2sgaXQuCisgIEVYUEVDVF9FUSgxVUwsIGRlc2NyaXB0b3JzLnNpemUoKSk7CisKKyAgc3RkOjpzdHJpbmcgcGtfZGF0YTsKKyAgQVNTRVJUX1RSVUUoYmFzZTo6UmVhZEZpbGVUb1N0cmluZyhwa19wYXRoLCAmcGtfZGF0YSkpOworCisgIEF2YkNoYWluUGFydGl0aW9uRGVzY3JpcHRvciBkOworICBFWFBFQ1RfRVEoQVZCX0RFU0NSSVBUT1JfVEFHX0NIQUlOX1BBUlRJVElPTiwKKyAgICAgICAgICAgIGF2Yl9iZTY0dG9oKGRlc2NyaXB0b3JzWzBdLT50YWcpKTsKKyAgRVhQRUNUX05FKAorICAgICAgMCwKKyAgICAgIGF2Yl9jaGFpbl9wYXJ0aXRpb25fZGVzY3JpcHRvcl92YWxpZGF0ZV9hbmRfYnl0ZXN3YXAoCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBdmJDaGFpblBhcnRpdGlvbkRlc2NyaXB0b3IqPihkZXNjcmlwdG9yc1swXSksCisgICAgICAgICAgJmQpKTsKKyAgY29uc3QgdWludDhfdCogZGVzY19lbmQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkZXNjcmlwdG9yc1swXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBdmJDaGFpblBhcnRpdGlvbkRlc2NyaXB0b3IpOworICB1aW50NjRfdCBvID0gMDsKKyAgRVhQRUNUX0VRKCJzeXN0ZW0iLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVzY19lbmQgKyBvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGQucGFydGl0aW9uX25hbWVfbGVuKSk7CisgIG8gKz0gZC5wYXJ0aXRpb25fbmFtZV9sZW47CisgIEVYUEVDVF9FUShwa19kYXRhLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVzY3JpcHRvcnNbMF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQXZiQ2hhaW5QYXJ0aXRpb25EZXNjcmlwdG9yKSArIG8sCisgICAgICAgICAgICAgICAgICAgICAgICBkLnB1YmxpY19rZXlfbGVuKSk7Cit9CisKK1RFU1RfRihBdmJUb29sVGVzdCwgU2lnbmluZ0hlbHBlckJhc2ljKSB7CisgIGJhc2U6OkZpbGVQYXRoIHZibWV0YV9wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJ2Ym1ldGEuYmluIik7CisgIGJhc2U6OkZpbGVQYXRoIHNpZ25pbmdfaGVscGVyX3Rlc3RfcGF0aCA9CisgICAgICB0ZXN0ZGlyXy5BcHBlbmQoInNpZ25pbmdfaGVscGVyX3Rlc3QiKTsKKyAgRVhQRUNUX0NPTU1BTkQoCisgICAgICAwLAorICAgICAgIlNJR05JTkdfSEVMUEVSX1RFU1Q9XCIlc1wiIC4vYXZidG9vbCBtYWtlX3ZibWV0YV9pbWFnZSAiCisgICAgICAiLS1vdXRwdXQgJXMgIgorICAgICAgIi0tYWxnb3JpdGhtIFNIQTI1Nl9SU0EyMDQ4IC0ta2V5IHRlc3QvZGF0YS90ZXN0a2V5X3JzYTIwNDgucGVtICIKKyAgICAgICItLXNpZ25pbmdfaGVscGVyIHRlc3QvYXZidG9vbF9zaWduaW5nX2hlbHBlcl90ZXN0LnB5IiwKKyAgICAgIHNpZ25pbmdfaGVscGVyX3Rlc3RfcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICB2Ym1ldGFfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworCisgIC8vIE5vdyBjaGVjayB0aGUgdmFsdWUgaW4gdGVzdCBmaWxlLgorICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgQVNTRVJUX1RSVUUoYmFzZTo6UmVhZEZpbGVUb1N0cmluZyhzaWduaW5nX2hlbHBlcl90ZXN0X3BhdGgsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoIkRPTkUiLCB2YWx1ZSk7Cit9CisKK1RFU1RfRihBdmJUb29sVGVzdCwgU2lnbmluZ0hlbHBlclJldHVybkVycm9yKSB7CisgIGJhc2U6OkZpbGVQYXRoIHZibWV0YV9wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJ2Ym1ldGEuYmluIik7CisgIEVYUEVDVF9DT01NQU5EKAorICAgICAgMSwKKyAgICAgICIuL2F2YnRvb2wgbWFrZV92Ym1ldGFfaW1hZ2UgIgorICAgICAgIi0tb3V0cHV0ICVzICIKKyAgICAgICItLWFsZ29yaXRobSBTSEEyNTZfUlNBMjA0OCAtLWtleSB0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSAiCisgICAgICAiLS1zaWduaW5nX2hlbHBlciB0ZXN0L2F2YnRvb2xfc2lnbmluZ19oZWxwZXJfdGVzdC5weSIsCisgICAgICB2Ym1ldGFfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQXZiVG9vbFRlc3QsIE1ha2VBdHhQaWtDZXJ0aWZpY2F0ZSkgeworICBiYXNlOjpGaWxlUGF0aCBwdWJrZXlfcGF0aCA9IHRlc3RkaXJfLkFwcGVuZCgidG1wX3B1YmtleS5wZW0iKTsKKyAgRVhQRUNUX0NPTU1BTkQoCisgICAgICAwLAorICAgICAgIm9wZW5zc2wgcGtleSAtcHVib3V0IC1pbiB0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSAtb3V0ICVzIiwKKyAgICAgIHB1YmtleV9wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgYmFzZTo6RmlsZVBhdGggb3V0cHV0X3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInRtcF9jZXJ0aWZpY2F0ZS5iaW4iKTsKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBtYWtlX2F0eF9jZXJ0aWZpY2F0ZSIKKyAgICAgICAgICAgICAgICAgIiAtLXN1YmplY3QgdGVzdC9kYXRhL3NtYWxsX2Jsb2IuYmluIgorICAgICAgICAgICAgICAgICAiIC0tc3ViamVjdF9rZXkgJXMiCisgICAgICAgICAgICAgICAgICIgLS1zdWJqZWN0X2tleV92ZXJzaW9uIDQyIgorICAgICAgICAgICAgICAgICAiIC0tc3ViamVjdF9pc19pbnRlcm1lZGlhdGVfYXV0aG9yaXR5IgorICAgICAgICAgICAgICAgICAiIC0tYXV0aG9yaXR5X2tleSB0ZXN0L2RhdGEvdGVzdGtleV9yc2E0MDk2LnBlbSIKKyAgICAgICAgICAgICAgICAgIiAtLW91dHB1dCAlcyIsCisgICAgICAgICAgICAgICAgIHB1YmtleV9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgb3V0cHV0X3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiZGlmZiB0ZXN0L2RhdGEvYXR4X3Bpa19jZXJ0aWZpY2F0ZS5iaW4gJXMiLAorICAgICAgICAgICAgICAgICBvdXRwdXRfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQXZiVG9vbFRlc3QsIE1ha2VBdHhQc2tDZXJ0aWZpY2F0ZSkgeworICBiYXNlOjpGaWxlUGF0aCBwdWJrZXlfcGF0aCA9IHRlc3RkaXJfLkFwcGVuZCgidG1wX3B1YmtleS5wZW0iKTsKKyAgRVhQRUNUX0NPTU1BTkQoCisgICAgICAwLAorICAgICAgIm9wZW5zc2wgcGtleSAtcHVib3V0IC1pbiB0ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbSAtb3V0ICVzIiwKKyAgICAgIHB1YmtleV9wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgYmFzZTo6RmlsZVBhdGggb3V0cHV0X3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInRtcF9jZXJ0aWZpY2F0ZS5iaW4iKTsKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBtYWtlX2F0eF9jZXJ0aWZpY2F0ZSIKKyAgICAgICAgICAgICAgICAgIiAtLXN1YmplY3QgdGVzdC9kYXRhL2F0eF9wcm9kdWN0X2lkLmJpbiIKKyAgICAgICAgICAgICAgICAgIiAtLXN1YmplY3Rfa2V5ICVzIgorICAgICAgICAgICAgICAgICAiIC0tc3ViamVjdF9rZXlfdmVyc2lvbiA0MiIKKyAgICAgICAgICAgICAgICAgIiAtLWF1dGhvcml0eV9rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0iCisgICAgICAgICAgICAgICAgICIgLS1vdXRwdXQgJXMiLAorICAgICAgICAgICAgICAgICBwdWJrZXlfcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIG91dHB1dF9wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgImRpZmYgdGVzdC9kYXRhL2F0eF9wc2tfY2VydGlmaWNhdGUuYmluICVzIiwKKyAgICAgICAgICAgICAgICAgb3V0cHV0X3BhdGgudmFsdWUoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKEF2YlRvb2xUZXN0LCBNYWtlQXR4UGVybWFuZW50QXR0cmlidXRlcykgeworICBiYXNlOjpGaWxlUGF0aCBwdWJrZXlfcGF0aCA9IHRlc3RkaXJfLkFwcGVuZCgidG1wX3B1YmtleS5wZW0iKTsKKyAgRVhQRUNUX0NPTU1BTkQoCisgICAgICAwLAorICAgICAgIm9wZW5zc2wgcGtleSAtcHVib3V0IC1pbiB0ZXN0L2RhdGEvdGVzdGtleV9yc2E0MDk2LnBlbSAtb3V0ICVzIiwKKyAgICAgIHB1YmtleV9wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgYmFzZTo6RmlsZVBhdGggb3V0cHV0X3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInRtcF9hdHRyaWJ1dGVzLmJpbiIpOworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiLi9hdmJ0b29sIG1ha2VfYXR4X3Blcm1hbmVudF9hdHRyaWJ1dGVzIgorICAgICAgICAgICAgICAgICAiIC0tcm9vdF9hdXRob3JpdHlfa2V5ICVzIgorICAgICAgICAgICAgICAgICAiIC0tcHJvZHVjdF9pZCB0ZXN0L2RhdGEvYXR4X3Byb2R1Y3RfaWQuYmluIgorICAgICAgICAgICAgICAgICAiIC0tb3V0cHV0ICVzIiwKKyAgICAgICAgICAgICAgICAgcHVia2V5X3BhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBvdXRwdXRfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworCisgIEVYUEVDVF9DT01NQU5EKDAsCisgICAgICAgICAgICAgICAgICJkaWZmIHRlc3QvZGF0YS9hdHhfcGVybWFuZW50X2F0dHJpYnV0ZXMuYmluICVzIiwKKyAgICAgICAgICAgICAgICAgb3V0cHV0X3BhdGgudmFsdWUoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKEF2YlRvb2xUZXN0LCBNYWtlQXR4TWV0YWRhdGEpIHsKKyAgYmFzZTo6RmlsZVBhdGggb3V0cHV0X3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInRtcF9tZXRhZGF0YS5iaW4iKTsKKworICBFWFBFQ1RfQ09NTUFORCgKKyAgICAgIDAsCisgICAgICAiLi9hdmJ0b29sIG1ha2VfYXR4X21ldGFkYXRhIgorICAgICAgIiAtLWludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUgdGVzdC9kYXRhL2F0eF9waWtfY2VydGlmaWNhdGUuYmluIgorICAgICAgIiAtLXByb2R1Y3Rfa2V5X2NlcnRpZmljYXRlIHRlc3QvZGF0YS9hdHhfcHNrX2NlcnRpZmljYXRlLmJpbiIKKyAgICAgICIgLS1nb29nbGVfa2V5X3ZlcnNpb24gNDIiCisgICAgICAiIC0tb3V0cHV0ICVzIiwKKyAgICAgIG91dHB1dF9wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgRVhQRUNUX0NPTU1BTkQoCisgICAgICAwLCAiZGlmZiB0ZXN0L2RhdGEvYXR4X21ldGFkYXRhLmJpbiAlcyIsIG91dHB1dF9wYXRoLnZhbHVlKCkuY19zdHIoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhdmIKZGlmZiAtLWdpdCBhL2F2Yi90ZXN0L2RhdGEvYXR4X21ldGFkYXRhLmJpbiBiL2F2Yi90ZXN0L2RhdGEvYXR4X21ldGFkYXRhLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjUzYmJjCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvZGF0YS9hdHhfbWV0YWRhdGEuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2F2Yi90ZXN0L2RhdGEvYXR4X3Blcm1hbmVudF9hdHRyaWJ1dGVzLmJpbiBiL2F2Yi90ZXN0L2RhdGEvYXR4X3Blcm1hbmVudF9hdHRyaWJ1dGVzLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTYzYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvZGF0YS9hdHhfcGVybWFuZW50X2F0dHJpYnV0ZXMuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2F2Yi90ZXN0L2RhdGEvYXR4X3Bpa19jZXJ0aWZpY2F0ZS5iaW4gYi9hdmIvdGVzdC9kYXRhL2F0eF9waWtfY2VydGlmaWNhdGUuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjRhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvdGVzdC9kYXRhL2F0eF9waWtfY2VydGlmaWNhdGUuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2F2Yi90ZXN0L2RhdGEvYXR4X3Byb2R1Y3RfaWQuYmluIGIvYXZiL3Rlc3QvZGF0YS9hdHhfcHJvZHVjdF9pZC5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2NDhmYQotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi90ZXN0L2RhdGEvYXR4X3Byb2R1Y3RfaWQuYmluCkBAIC0wLDAgKzEgQEAKKxV0i/lB9q4OG/eg7O09sV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9kYXRhL2F0eF9wc2tfY2VydGlmaWNhdGUuYmluIGIvYXZiL3Rlc3QvZGF0YS9hdHhfcHNrX2NlcnRpZmljYXRlLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmVjM2NlCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvZGF0YS9hdHhfcHNrX2NlcnRpZmljYXRlLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9kYXRhL2xhcmdlX2Jsb2IuYmluIGIvYXZiL3Rlc3QvZGF0YS9sYXJnZV9ibG9iLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmZlZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvZGF0YS9sYXJnZV9ibG9iLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9kYXRhL3NtYWxsX2Jsb2IuYmluIGIvYXZiL3Rlc3QvZGF0YS9zbWFsbF9ibG9iLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzEyZGU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvZGF0YS9zbWFsbF9ibG9iLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9kYXRhL3Rlc3RfZmlsZS5iaW4gYi9hdmIvdGVzdC9kYXRhL3Rlc3RfZmlsZS5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmYzdmYgotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi90ZXN0L2RhdGEvdGVzdF9maWxlLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9kYXRhL3Rlc3RfZmlsZS5iaW4uc3BhcnNlIGIvYXZiL3Rlc3QvZGF0YS90ZXN0X2ZpbGUuYmluLnNwYXJzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDk2MmIyCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvZGF0YS90ZXN0X2ZpbGUuYmluLnNwYXJzZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0gYi9hdmIvdGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3ZGNmZgotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi90ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbQpAQCAtMCwwICsxLDI3IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlFb3dJQkFBS0NBUUVBeGxWUjNUSWtvdUFPdkg3OXZhSlRnRmhwZnZWS1FJZVZrRlJaUFZYSy96WTBHdnJoCis0SkFxR2pKb1cvUGZyUXY1c2REMzZxdEhIM2ErRzVoTFo2TmkrdC9tdGZqdWN4WmZ1TEdDM2ttSjFUM1hxRUtaCitnWFhJMklSN3ZWU29JbVJFdkRRR0VEeUp3dEh6TEFObGtiR2cwY2doVmhXWlNDQW5kTzhCZW5hbEMydjk0L3J0CitEZmtQZWtINmRnVTNTZjQwVDBzQlNlU1k5NG1PelRhcU9SMnBmVjFyV2xMUmRXbW8zM3plSEJ2NTJSbGJ0MGRNCit1WEF1cmVYV2lIenRrbTVHQ0JDMWRnTStDYXhOdGl6TkVnQzkxS2NEMHh1UkNDTTJXeEgrcjFscHN6eUlKRGN0CitZYnJGbVZFWWwva2pRcGFmaHk3TnNrMWZxU1R5UmRyaVpTWW1UUUlEQVFBQkFvSUJBUUMra0pnYUN1WDh3WUFuCitTWFdRMGZtZFpsWG5NTlJwY0YwYTBwRDBTQXpHYjFSZFlCWE1hWGlxdHloaXdjNTNQUHhzQ0RkTmVjamF5SU1kCitqSlZYUFR3TGhUcnVPZ01TL2JwM2djZ1d3VjM0VUhWNExKWEdPR0FFK2piUzBoYkRCTWl1ZE9ZbWo2Um1Wc2hwCit6OUcxelpDU1FOTVhIYVdzRVlrWDU5WHB6em9CMzg0blJ1bDJRZ0V0d3pVTlI5WGxwemd0SkJMazNTQUNrdnNOCittUS9EVzhJV0hYTGc4dkxuMUx6VkoyZTNCMTZINE1vRTJUQ0h4cWZNZ3IwM0lEUlJKb2drZW5RdVFzRmhldllUCitvL21KeUhTV2F2Vmd6TUhHOUk1bStlZXBGNFd5aGoxWTRXeUtBdU1JKzlkSEFYL2g3THQ4WEZDUUNoNURia1ZHCit6R3IzNHNXQkFvR0JBT3M3bjdZWnFOYWFndW92ZklkUlJzeHhacjF5SkF5RHNyNnczeUdJbURaWWp1NGM0V1k5Cis1ZXNPMmtQM0ZBNHAwYzdGaFFGNW9PYjFyQnVIRVBwMzZjcEw0YUdlSzg3Y2FxVGZxNjNXWkF1am9UWnByOUxwCitCUmJrTDd3L3hHN2pwUS9jbHBBOHNIekhHUXMvbmVseG9PdEM3RTExOEZpUmd2RC9qZGhsTXlMOUFvR0JBTmZYCit2eW9OMXBwbGZUMnhSOFFPalNaK1EzNVMvK1NBdE11Qm5IeDNsMHFIMmJiQmpjdk0xTU5EV2puUkR5YVloaVJ1CitpK0tBN3RxZmliMDkrWHBCM2c1RDZPdjdscy9MZHgwUy9WY21WV3RpYTJISzh5OGlMR3Rva29CWktRNUFhRlgyCitpUVU4K3RDNGg2OUduSllRS3FOd2dDVXpoOCtnSFg1WTQ2b0RpVG1SQW9HQVlwT3g4bFgrY3pCOC9EYTZNTnJXCittSVpOVDhhdFpMRXNEczJBTkVWUnhEU0ljVENaSklkNyttMVcrblJvYXljTFRXTm93WjErMkVyTHZSMTArQUdZCitiN1lzNzlXZzlpZFlhWTl5R245bG5ac016QWl1TGV5SXZYY1NxZ2p2QUtsVldyaE9RRk91Z2h2Tld2Rmw4NVl5CitvV1NDTWxQaVRMdHQ3Q0NzQ0tzZ0t1RUNnWUJnZElwNkdac0lma2djbEtlMGhxZ3ZSb2VVNFRSM2djakpsTTlBCitsQlRvK3BLaGFCZWN0cGx4OVJ4UjhBbnNQb2JicXdjYUhuSWZBdUtEemprNW1FdktaakNsbkZYRjRIQUhieUFGCituUnpaRXk5WGtXRmhjODBUNXJScFpPN0M3cWR4bXUyYWlLaXhNM1YzTDMvMFU1OHFVTEVEYnViSE13OWJFaEFUCitQdWRJOFFLQmdIRUVpTW0vaHI5VDQxaGJRaS9MWWFuV25sRncxdWUrb3NLdUY4YlhRdXhubkhOdUZUL2MrOS9BCit2V2hncUc2Yk9FSHUrcC9JUHJZbTR0Qk1ZbHdzeWg0blhDeUdnREpMYkxJZnpLd0tBV0N0SDlMd255RFZoT293CitHSDlzaGRSK3NXM0V3OTd4ZWYwMktBSDRWbE5BTkVtQlY0c1FOcVdXdnNZcmNGbTJyT2RMCistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvYXZiL3Rlc3QvZGF0YS90ZXN0a2V5X3JzYTQwOTYucGVtIGIvYXZiL3Rlc3QvZGF0YS90ZXN0a2V5X3JzYTQwOTYucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGI1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvdGVzdC9kYXRhL3Rlc3RrZXlfcnNhNDA5Ni5wZW0KQEAgLTAsMCArMSw1MSBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJSktRSUJBQUtDQWdFQTJBU3Y0OU9FYkg0TmlUM0NqTk1TVmVsaXlmRVBYc3dXY3F0RWZDeGxTcFMxRmlzQQordXdidkV3ZFRUUGxrdVNoNkc0U1lpTmhucENQNXAwdmNTZy8zT2hpdVZLZ1YvckN0ckRYYU82MG52Sy9vMHk4MworTk5aUksyeGFKOWVXQnE5cnVJREsrakMwc1lXelRhcXF3eFkwR3JqbngvcjVDWGVybDVQclJLN1BJTHp3Z0JIYgorSXd4SGNibHQxbnRnUjRjV1ZwTzN3aXFhc0V3QkRERFlrNGZ3N1c2THZqQmI5cWF2M1lCOFJWNlBrWk5lUlA2NAorZ2dmdWVjcS9NWE5pV09QTnhMekNFUjJoU3IvK0ozMmg5aldqWHNyY1Z5OCs4TWxkaG1yNHIyYW43YzI0N2FGZgordXB1Rkd0VUpycFJPTzgvTFhNbDVnUGZNcGtxb2F0alRNUkg1OWdKaktob3QwUnBtR3haQnZiMzNUY0JLNVNkSgorWDM5WTR5Y3Q1Y2xtRGxJNEZqajdGdXRUUCtiOTZhSmVKVm5ZZVVYL0Ewd21vZ0JhanNKUm9SWDVlL1JjZ1pzWQorUnpYWUxRWHByUTgxZEJXampvdk1KOXA4WGVUNkJOTUZDN282c2tsRkwwZkhEVUUvbDRCTlA4RzF1M0JmcHpldgorU0NJU1JTNzFENGVTNG9RQitSSVBGQlVrem9tWjdybkVGM0J3RmVxK3htd2ZZclAwTFJhSCsxWWVSYXV1TXVSZQora2UxVFpsNjk3YTNtRWprTmc4bm9hMnd0cGU3RVdtYXVqSmZYRFd4SngvWEVrakdMQ2U0ejJxazN0a2tZK0E1ZworUmNnemtlOGdWeEMrZUMyREp0YktZZmt2NEw4Rk1GSmFFaHdBcDEzTWZDN0ZsWXVqTy9CRExsN2RBTnNDQXdFQQorQVFLQ0FnQVdvTDhQL1dza3RqdVN3YjVzWS92S3RnemNISDFBcjk0MkdzeXN1VFhQRHk2ODZMcEYzUjhUL2pOeQorbjdrMlVCQWlhOHhTb1dDUjZCYlJ1SGVWNW9BK1BMR2VPcEU3UWFTZm9uQit5YytjeTB4M09yM3NzZnFFc3UvcQordG9HSHA3NS84RFhTNldFMEswNHg5NHUxcmRDOWI5c1ByckdCbFdDTEd6cU0wa2J1SmZ5SFhkZDNuMlNvZkFVTworYjVRUlNneEQrMnRIVXBFcm9IcUhuV0pDYWY0SjBRZWdYNDV5a3RsZk9ZTksvUEhMRFFYVjhseS9lamMzMk00WQorVHY3aFV0T09KVHVxOFZDZzlPV1ptMlpvMVF1TTlYRUpUUENwNWwzK281dnpPNnloazJnb3REdkQzMkNkQSszawordExKUlA1NE0xU24rSVhiMWdHS045cktBdEdKYmVuV0lQbE5PYmhRZ2tid0c4OVFkKzVyZk1Yc2lQdjFIbDF0SworK3Rxd2pEODIvSDMvRWxhYU1ud0hDcGVvR1NwOTVPYmxBb0JqempNUDJLc2J2S1NkTDhPL3JmMWMzdU93OStERgorY3RoMFNBOHkzWnpJMTFnSnRiMlFNR1VyQ255NW40c1BHR2JjM3gzOE5kTGh3YmtQS1p5NjBPaVQ0ZzJrTnBkWQorZElpdG1BTUwyb3R0dGlGNEFKTTZBcmFQazhZVnprUExUa3NvTDNhelBCeWE1bElvREkySDNRdlR0U3ZwWGtYUAoreUtjaHNEU1dZYmRxZnBscUMvWDBEanAyL1pkOGpwTjVJNisxYVNtcFRtYnd4L0pUbGxZMU44OUZSWkxJZHhvaAorMms4MUxQaVhoRTZ1UmJqaW9KVWxibkVXSXBZMnkyTjJDbG14cGpoMC9JY1hkMVhJbVFLQ0FRRUE3WmFpK3lqagorOHhpdDI0YU85VGYzbVpCWEJqU2FEb2RqQzJLUzF5Q2NBSVhwNlM3YUgwd1ppcHlacFFqeXMzemFCUXlNUllGRworYlFxSWZWQWE2aW5XeURvb2ZiQUpITXU1QlZjSEZCUFp2U1M1WWhEamM4WFo1ZHFTQ3h6SXo5b3BJcUFibStiNAorYUVWLzNBM0praTVEeTh5LzVqMjFHQUs0WTRtcVFPWXpuZTdiREdpM0h5dTA0MU1HTTRxZkljSWtTNU4xZUhXNAorc0RaSmg2K0s1dHV4TjVUWDNuRFpTcG05bHVOSDhtTEdnS0FaMTViMUxxWEF0TTV5Y29CWTlIdjA4MnN1UFBvbQorTytyMHliZFJYNm5EU0g4KzExeTJLaVAya2RWSVVIQ0drd2xxZ3J1eDVZWnlqQ1pQd092RVBoelNvT1MrdkJpRgorVVZYQThpZG54TkxrMVFLQ0FRRUE2TUlpaERTWHgrMzUwZldxaFEvM1FjNmdBL3QyQzE1SndKOSt1RldBK2dqZAorYy9objVIY21ubUJKTjRSMDRuTEcvYVU5U1F1cjg3YTRtbkMvTXA5SklBUmpIbFovV05UNFUwc0p5UEVWUmc1VQorWjlWYWpBdWNXd2kwSnlKWUNPMUVNTXk2OEpwOHFsVHJpSy9MN25iRDg2Sko1QVN4am9qaU4vMHBzSy9QazYwRgorUnIrc2hLUGkzalJRMUJEakR0QXhPZm80Y3RmL25GYlVNNGJZMEZOUFFNUDdXZXNvU0tVME5CQ1JSNmQwZDJ0cQorWWZsTWpJUUh4K043NFA1akVkU0NIVFZHUW0rZGo0N3BVdDNsTFBMV2MwYlgxRy9HZWt3WFA0TlVzUi83MEhzaQorYnd4a05uSzJUU0d6a3QycmNPbnV0UDEyNXJKdTZXcFY3U05ycTlybTd3S0NBUUFmTVJPY25iV3ZpS0hxbkRQUQoraGRSLzJLOVVKVHZFaEluQVNPUzJVWldwaStzMXJlejlCdVNqaWdPeDR3YmFBWjR0NDRQVzdDM3V5dDg0ZEhmVQorSGtJUWIzSTViZzhFTk1ySnBLOU5OMzN5a3d1emtEd01Td0ZjWitHY2k5N2hTdWJ6b01sL0lrZWlpTjFNYXBMNAorR2hMVWdzRCszVU1WTCtZOVN5bUs4NjM3SWd5b0NHZGlORDYvU1hzYThTd0xKbzNWVGpxeDRlS3BYN2N2bFNCTAorUnJSeGM1MFRtd1VzQWhzZDRDRGw5WW5TQVRMalZ2SkJlWWxmTTJ0YkZQYVl3bDFhUjh2K1BXa2ZuSzBlZm02MAorZkhraTMzSEVuR3RlQlBLdUdxNHZ3VllwbjZiWUd3UXorZjYzMzUvQTJETWZaSEZTcGpWVVJIUGNSY0hiQ01sYQorMGNVeEFvSUJBUUMyNWVZTmtPNDc4bW8rYkJiRVhKbGtvcUxtdmpBeUdyTkZvNDhGOWxwVkg2WTB2TnVXa1hKTgorUFVnTFVoQXU2UllvdGpHRU5xRzE3cno4enQvUFBZOU9rMlAzc094OHQwMHkxbUluL2hsRFpYczU1Rk0wZk9NdQorUFphaXNjQVBzN0hEenZ5T21EYWgrZnppK1pEOEgyTTNEUzJXK1lFMGlhZUphMnZaSlMydDAyVzBCR1hpREkzMworSVpEcU15TFl2d3dQak9uU2hKeWRFelhJRDR4TGwwdE5qekx4bzNHU05BN2pZcWxtYnRWOENYSWM3ck1TTDZXVgora3RJREtLSmNubXBuM1RjS2VYNk1FamFTSVQ4MnBOT1MzZlkzUG1YdUwrQ016Znc4K3U3N0VlY3E3OGZIYVRpTAorUDVKR005M0Y2bXppMTlFWTB0bUluVUJNQ1d0UUxjRU5Bb0lCQVFDZzBLYU9rYjhUMzZxelBydGdiZm91MEUyRAordWZkcEwxdWdtRDRlZE9GS1FCNWZERlFoTG5TRVZTSnEzS1VnNGtXc1hhcFFkc0JkNmtMZHhTK0s2TVFyTEJ6cgorNHRmMGM3VUNGMUF6V2s2d1hNRXhaOG1SYjJSa0daWVFCMkRkeWhGQjNUUG1ucTlDVzhKQ3ErNmt4Zy93a1U0cwordk00Slh6Z2NxVm9TZjQyUUpsK0I5d2FlV2hnMEJUV3gwMWxhbDRkczg4SHZFS21FMGlrNUd3aURicjdFdkREdworRTZVYlp0UWNJb1NUSUlaRGdZcVZGZlIyREFobzN3WEpSc09YaDQzM2xFSjhYN2NDRHpybmdGYlFubEtycHdNTAorWGdtMFNJVWMrTmY1cG9NTTNyZkxGSzc3dC9vYjR3KzVQd1JLY29Tbml5QXhySGQ2Ynd5a1lBOFZ1eWR2CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvYXZiL3Rlc3QvZGF0YS90ZXN0a2V5X3JzYTgxOTIucGVtIGIvYXZiL3Rlc3QvZGF0YS90ZXN0a2V5X3JzYTgxOTIucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODM0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvdGVzdC9kYXRhL3Rlc3RrZXlfcnNhODE5Mi5wZW0KQEAgLTAsMCArMSw5OSBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJU0tnSUJBQUtDQkFFQTBEM1QrZElTc21DSG03OTd3c1gwdlZmcVVXREovM212RFlvemxDYWJEaG5HTGxTRQorcEFRYmYxWjhUcytPTTRwVlJIT0pVSkwwV2ViTmRtUFBHanN5V1F6NnpaRTk2bFFaTDNhdkNFWHFZVlFSNjZWNQorM3dkSy9vaGFNU1JuR3lFTUJycWtWVmJGM2dDcisvaXJ4RDNZSytWb3dPMldLcy82R3JNZHFUQThZNUNURi9KZQorcHR3c1NnNU1NanI2VWFLNHFEY3JlajNoa2dCVkd2UlYzY2oxc25LNkJyOEh1WWRGbnBHR1RTMGQ3VUpsSEZnbAordHJHSFUvQ0JPOTIzaGtIZ0phV0VqQzBnaVNHamhLS3RMenJWY3BEVjJ5L2xXUVA5VC9UNGRqRUFJYUhxUSsrUAorU2RPU1I2cHNJR1I2aFZnU2lndDdIQ25FN25XNzExL3JmVjVVcjlFaVZwQjA0MG1ESW1LWmN5OC8vVE1uWHlkTgorMUtZVFZkLzM0ZmRwek1wU3c1aWJsRXJid09MWFZUVW1PenRZbnBsNDFmZUhTdi9qUGVzSHN0UGxma2xJRjJ2bworR1pFb2hmOXNjUXZjdU03d0VCZkMvYVRBOUszOXpNbWtCYmN2U1pqTHlobWNTWldNUFBPWnlJY2wzelk1M1FoVworUUMvYWJtSWNCZkkxUzQrcjdtQzRpMkpuKytvRXZ1R05WR3IyU1kyWjBaWnhYR0wxSEkvMDhELzMrVGN1bXJjbgorNFlqUEsvRE1GaTBGK2UrMXg0MWxpcHVmK2N4LzJxUk5RWC9tMDJTVHJMWWRNNmUwZzMzS3ZsbkZkaTJiNzUyeQorL09JYU13eERhSnZ1bk1oNkVNRFdLTTFBSGJZL2lvQW9LN2VTMjZIZUpMRURsbHFPNCtTV1AzN2M4bE12U0VXeQorMUdpRXJSMEhjc09qL1F3V0dQRnNlb1Zyb01pQTJzVVEwSWMvdGdWakNUbFhnKzEyWHBVbm91SXdlQ2k4S2NMLworYWQyekpranU5aEJoSkxCUS8yR25pdkppM2xGZ0Y0R2QvL1RTSjZyZ1d1WEZmTUt0Lzl6MlN6MzVvaEVYNHlBMAorZmxxbENlTEluRkVvZXZieitYVDlhUmZEZTY1TVo3OXl3M1RmUDlDclY3NGhmMVJSenZlRDR6cGkzRitoY1kyaQorSldzSDdnUk9aZUNtNmZBWDVUcmVjZDNoT3hKT2ZBNE40cnZTU0NxNkJ3Q3ZlYlQ4RlkyNVovVkY3Y1FySFlEUworaWo1dzZscWhNelhIZVVFWTkwR2E5QUs0WHphV3dHZ2V6cStSN1pzMDBZU0txRnY5cVlOS2RSN3R6M2NqaWpXZgorOXEvM1IxdWg2RVFLVE1aS280U0VDbEppR3lqT0J2bVBLMDlqTUZaVEp2MDBoRHhhZ0RQWkJsN1hwTERKNS9MbgorMXVwcHZMQ05XV1kxemVKZmFFbE15cTMvUHFLWkxpZEY5clZvQTFTSXdrMmxwZFV2UG90ZTJvRml3Q1pvWGx3WgorSjJuY2ptWGdRTnM3Ni84dW5ESkEwcmo0SlBxY2N3NE01R3hRN29rYmdtM0Y0cm16cmlDdXY4QmVNU0NrcjJyeQorMG1ZM1VocG9oWDR3Q01xMEc0eDVzRVVBejlGVlZQWktqeG5ZQm1MRHpySkFSKzQrRzdnWnNjdDAxWERKWWdEZAorSlZZSW5GUDIyL2NJcmU4VnJGV1l0SGJnT0ZkTnFVaVZxNThkZTZQZFpHL0UrdWFXbUVUaFNsUnJnRWpUeHVwaQorT1hmZ2RLVy8yMGoxcUF0ak9scUZ3c1kwOTRRNXJxVUxRNndQeFFJREFRQUJBb0lFQVFDaG1rbWxoclJCdjQyZAorZllVaXl4SzUyYjhhdGgwc2FKZER6NnRsWG14WURnSnhNOS9YbE9SdDlvVHplRGtub0VPNW9sdStycng0QkJnUQordHpZaWFpd1JWWFJSRVZUV1E3dGp6UnZhTkwvR0ZrTHQ5M1hUY2NwdUt3eXJORS9iaXRMVmFnUmJ3Y0krSFpGYQorTWtuQ09paEhNSG9SdG84aDNGS0FZOTR4elNBZ09ETWVrMVdHOGpoZ3BDWFhtVk5uQlB0K2Q0b0RESURBR0FmegorcWdmMDNKNW5oSWIrODBLZ1pPelBPS25idkphTDZFbWxMSGJnQjNjNDJkekF3N2hIdFZtb2ZZR1djdkxiMk1JWQorRFZLTzQzNS9zUXgxVS84TkRINkpqVmRBQ1pqTGdPYlhIOUszL1R0NDZEV1BFY3JQTG1EOHhob2M2Z0ZNK1FyMAorQWhrektvQllETmswQ2xqYmhkSUJYamt0WFU2d1JRRlo0NXVQMmU0Slo0enJ6R0JMci90NGxUYXZaMFNRdExsZAorQTZrT3NHaCtkQ1dGRHRuc2h4WW5sL3hhZC95UiszYTV6bURKYm8vZkpUQlhybGYxQjRyZlFrRnRLMjBldE9QUQorQisrRkMvcmpoM01tL0tiL3A5R3ovMnVwWmRBckg5N1p2RDJMQkZmajc3bEZtQWhxQWkzd0NSbE4rZWt1WXhhWgordDFwQlY5eVhpZzhEeWxkZzFkN1g4cE9uMmt5ckYzclFVRERmNHBhN3g5dnBuYmtVbEVVaWZvVjlnbllzbWRuaQorcUR6WUJ0VHYyZzZNS3F3UXlTWGFJVVcwWU9CUGJPZWxsV0V3eEpxR1lRN3k0SWZWSGZNMGl5SG5laGsydFpjcgorK1hhekxud0dlK0J6NHZjZ3VGaEpYTHlJdS8vbEFPaFp0Yms2cjFRSkVVdXhhT09RWDN3enljZUU2bmtEc2dtcgorUDVkajNacGQ3ZlMyVlYydnlHSElGbkJKODhMUnhyZVZ2Z3I2UTI4VVQyN1NCODJ6TWI3bVJaVFZFMnpldXViVAorNUQyRDFYYlowd0JvNldpSzZlUlJyRFEySGFlZXRrai91b1J5NlBXWHduQWFUbW1JcnJYd0xxYW9KaC9VMWUrRAordGZzRExXZDZJeExqZlh2R2dsckhzcnRBejBvcHJwaXhVVGVWaGdUckdrOUlRUmQ1cnZ4dUdVWWhGdWpWYVlJNgorK1FVZiszM0FGZHRuY2I4eTlDOWpabWd4OEFLYkprK2U3M1NMaEI1SlZvcytXdGVVN2I4ZC9NaW01bUFMam5PNgorWjFuL3VpbXNUNzlzU0RxeTNYU3ltdEtXWG8vMjJVbHJ2R0Nwb0V1RUxQTWI2ZFNGV1I3dndyc3ZoRm5nWTQvSworVW5pdG52eGJvRWZsUW5hSVE0SWZSTFJ6WnNYK3NDNUVzcXc5VTV0SHQ0b0krOTFEdjNLYmRiY0VSZ1Y3M0s2QgorWlFnQzRsa0FRcXVGWGlaNUFJQ2t4amlNeVp3VHRVOUtKN3h2MTdYdTZveXdGLzNBdGJWR0VUVzFEKzNtYUhzRAoreTNEQVNXb2p5cVpkTGorV0d6S1FSYStzd2dDREFZS2VlazJmSUFYRlNkRjYzenhKMlJ4T0o0R2lqU2FvaCttcgorNEhWdmNwRGFUaitBOFQxK1FkQnlNNHM5OGd1NEdEN2tWdFZRR0JaZFdqdXR5SHZoMGhXdjFndFZtYmhRLzQxMworZ0RNRkZEekhJakxUWUdZZXM0aEhMMjIxNjlqVlI5c1oxZVF4d3ZUSWczTjRwRDVjRm0wclJ1WlpUUytvSlRvRgorRzI3YUJGaWhBb0lDQVFEeVZCNjJaRG5ieFF0aGsreklUS0l6UlVySmJMb1hyVWNBTmNTSGZhTjdpbkY4N092YQoremU3ZWpUOUROU0VoYnRmWkZKMUc2ZGlPWW9TdysyTXpGWHYwZ0VrTEtZMGRFVHlkS2dIRXU2blZxNWVpdk1ndgorRDRoYzlZa0pNSERTbG12MkZEa3BMM0FYQ0Ftblc5cktwK2RkdHRCWkVDbm1sUEVwSExvajZ4Z0J3M3BOYTFYcworSWNMVmZkdWdIODZIZXhqNm8wb0tnWWZjcXJYOFVVSHRVSTIvWFFxZ0ZySWo4a3NqZjFmRlZXSlJKRldtQlhxcAorbk1Fc1lhcnpBVGVNMWtRL2tEZVQxWlVwb0dQUXQwMi9YcVhUNEI1QTNBVGlFdHBNMnUrbDQ4eHRvZ1dXZzJSeQorRzlsOTM4U3RBbWhVaVcxbTdHbktFNkVJRnZRWTg1V3ZienhPUjBKWVZVU3I3TXJhc0Y2bm5RbGhZeEZ1SUpvSgorMmgvS0pRYW81R0NUdkc0K0d0YkpKbTRjMm55Wmd3eWhpek1zZGdzZGNsczc5YVhpTWtyWlprYW1MVlVaV090RQorM3BBL29CdXoycW5POUh3amJIMUhHT2NjcTBUWGZtcEZTY0VWM0NRR1lKZG5vNkZ5N2NibXVwYUw0VTlhZ1E0ZQordyt5Z0wxOG5xNUhWKytMU3RGblZyZ3M1WWlqanNrZlJkRTlHVU1WRGg1cENzZDlZMjNGeW1hYWQ0Ty8yU1JDQworWWtTc3lINU92eURPTHBveVVKNmc2USs0NUhxbS8zbEc0WWpOcHpGVWlNY25wNyszeFUzNXFDMExLOHhFZmVlaQorTXMxbVRWRWlITklwNnhIL1RxUmRYNzNXRDcrWXVLWlNMSWZSRzdkZ3JpclU2dyttaGh2eEQ1MXVIUUtDQWdFQQorMi8xbUJDUjVxbTMvMEx0KytSUWJleUUzdGl3NDBVZXlRcXVjRy8rVnZZNzdzU0xrSS9MeDhpd1JseXdYY0xCbgorK0E0VHZndWttQWRXekNzOG5kZ0tOeFBBK2dmb2h2QnNNT0dOOUtPQjFVZzV2dmcySjJraUk2NHZ3WUN3emhkWgorTlRVVW1MK0dNRkhVcVNzV1lnNmk3aUJGY1ptem5yNFcyVDNiQnh5VE1aa2k3SlN0Qjg2ZTM1S1hyemMyL1cvYgorKy9wNVUySENTYXpESEk1bU15dUNsSGM2R21VU1ZKN2Y3TEhqTDk0anZpTnFvYnAwVmo2MDN0U2NISVNtTnJadworVEJhdmt2WkdZWHNvV0t2cWF2azdqQkI5UXphQkwrdW5hRlJzbGc1alRhaUtuSVNqNDRVczFmakZLdTg0eGlmTAorbkphRXpqRFB0N1BCeGtvN0xQZ0VZN3dGMzluTTlWcG9ldEk3YndSNk53RExTWDhVVTk3TUdkK0hZK01PMVdpMQorcGQyTGFwd3J4L0VLN094ejMzNVZSSzRKZTBhWm5hNGoyVHlRZE1KYWM5ZnNHUFh2NFpzTGZETGovd0Q2bDFqKworbExMYkJ2M0ltZFNqMzJMQmJoc2dGNGlDR2VYTzhIcFBPK1EvaDlYVnNuWTUyVW0yWGROTW4wM1BDR202WnZ0TQorN0RYaVMrbFBGOTBIam9sSlZIWlRCTnRkVlJyTHI1M3pMdVdFZnFUNEZlS3JEYXhkdGlYa3hManJCKzUvVll1NworbnR5azAxWlE2M1ZOZkV3UzFpcm1LbDkrcVprVEhrM0hIVjlqTlY1UnpXVml3bUpJN1dwcjFZekJ3bWNLQ0IxTworb0dVQUREczhRcG5rQ3oweGtNVnRZd0hqOXFLWmxxZmJIenJGRFVVY0Y4a0NnZ0lBZFl2VWNnamYvL2p1OG1BOAorNVZRM0FjUEU2VHZ5Y1BXK2tSMkR2VzEyVmNEc0Yvc2MxVUE3ZEh6emlQaEduOThTbU54bEJqYjhzdVNiRlBaOAorUWhWVDBXQkJEa2NUaWx3SUdQeDlheDdVM1M2bEdXMlZkUzZGcVFINWZSbWdRS1p5ckNWWExPRXo4QmdZQnJTSgoreHUvM1RRQVd4SDBRdGliZGJHSGc4UGRpNThnWWxXRlJobjlCOFNsaDFhUllIR1BiMUFoTkxCZDAvZGRZKzVHMgorOXhTeURYZG1aZzFjVUErQjN6QXdOU3FiekZ4aHAyelUrVjF1WHNicGs0S3RuWVY2Q1pNOVFsckNSalRrOWlOVQorZFZYRi9xYWlSamZ6cm00U3NtRXBDa0Vic3JwN0YyMlkxYmtvb09SZ2xNT3NOQVdOcWZWWHc0d04rc3lYajFybworNnZaOFBFUllyRnlBT1IxZHNRTUloeW1ubVRQakNwYUo0ZW1LcmhXVHkyMHNZNzF0aEhha1pXSmMyMllvTnBiWgorRTZ0Z0lWc0pQVGx4Zy80K2Z5Q0NLajV3V3I5Mm5oc0IxS0JaUEdPL3pGaHZNbEpwdlEwdEg4VzJwYk4yYTBtSQorNXg5RnFBTG0vcWp3Q0hmWkl0U3dQTStab3pTaHQzY09rR0hkY0Q1S1hBWGZjZnNESmM0U0haS1ZJenE0TnVzTgorNTA0Ui9qdkQxR1A4c2dseUc3b21wNzVja2d6QW1ha0xkeE9QMkhoUXZJWDl0Y1hwU2lyTko2U2wyYndLdXVNRgord3hvM3Ivby85WTk3ZTRMbGZwRVlwOWVxTWRjRytOcFI5OTNJd0swVWhBV1M5SDV3ZG5XQlNVSGQ1ZTR4dERVdAoraUlMTlJ1TzQ2ZzdSL0FJaHoxY1NTcmFXV1FrQ2dnSUJBTWhoUFA1Qzl5dDlQSW0xYjBlVHdDQmN0bkZTUUlLbworS3NBOXJsbDJhYitiTUxrOWpjOE02TUxzenkwQ3RXc28wOXNIZjRZWTl0aWZ2cmtFSFJldGhFaDh6c2N3VXVZdQorc20ybjFmVGl4azB1bDZMU1ZnbDU0dVhiTUpheUVObjRQSUtSa2V3OGNBOHRTbWE0MzQ5N3czN2htRCtNZ0NiMQorQUx6cWNjbzloZm1rZ2tJNmZvMWc4Q2UzVUVFQ0t5MllLU21SRWRnWWNLOUpGUU82MVc2QWtGV0pjRHhBbWZ6SQorSmpGa0t3c2I3VFN3Nzl6V2lFZFNvTTlqbTdzQ1BLQVRkNkJtL1pBQWtVVVR1RUZrZm9ibjlBeDFySk4vWHhiMgorTUt1QVV0UXYwTllZMGdFVmRHNjJqSXR1S0xJZDZubmNIOFBHK3JzUmpQTElZcFdxWWRKcEt4NXBVblIrNEFrUQorUzZDc1JBU3djRjRQZEJ2RERCSUZHNlhwakZvNHBQZFFoRHpMMnNURjhiOFNXU0JMbEpRYmI3RzZVTnFnQ1NhdQorU3VzQ0ZwYXp2VTVOZkRtVU11Y3RvYjJFWVZhU1hxOWpHYWo2YlRVbUR3WEh3V2lsZklrOVhmTHhuWWZYWXJKNgoreGhkSXBYR21IaHVMUXRBZ0syTzFKdExvUGM5czlxUDgvU2tmUDd4ampHNnhIc1AvV3ZMN1FFMXBQczlaTS9VSQorQzAxSk5IRmk5TEtDbjhvNW1iWmpOOGpVb3dpN2ZmSys3NndaVUcxTDd6TTV5dFdRT1l3bzBUUUJmYzhmcG1GdworK1JCUkpYMmtKeURPMjdFeGN6b0dPS2p3cUVEYU9ESUI5Kzl6Y0NLMEJnU29SaWJTbTRaQnZveHpXV0Q2NUtscworeGRQaFpVSGNGR1c1QW9JQ0FRQzhpRzI3YUQ4YVJVdDk0T2VrNjZnRk9KeDg0UVZaZWhXUHF0WmpXeVZlbkR1YworVDhkaW5rOG9lakdqY0syVUp1UURhODNhenY5MG9jVnFFMG4wcm9uWXlzenQ5SWIxamxZQytDSzFBcjlUWUdGZworV1U1T1dFRHlDekNwcVcvdy9hRzY4VThxaEttME12a0xKUitHNmV2YW45VHdFaEZFVkFtM2lXbGxOWHM5eDI5cworQnVjd3lNTUMyM3pzaW14WWxTN2RBNER0eXZWQSt6TDFvbUxwU1dIYlUvcXR1STNIVjFOZUp6c3krZ0M0bXdQaAorajUydGRsNjY5ZnlXTHpIekJSTGVxNmRWT2Vkam5DbytqbFUzZEwyMERFazlTYVcwOEQxQ1B1WmVrVjFqVlBNdworSm9hRGNJUmg0S0x0UTBCWVo3VUplRlVUc3gxQ1MvK1VxenFZU1BPaTU3YTVrdnIwWThZd1JuU0I4ZEhWRnR0WAorSlR2ODN3VFFYSFBGU0JnZm5ITmU3bHNSVGZJUWZ1SWtyMmJwaVU3aDg1VVE3THNxY0k2WUhhQzA3VVJjc0dGRgorRnJMV0doOTFxekFkMWRpU0hsYTJSblkzbjhQUHVNbkNrZ3VOaExVcllkbXlNb2w3RmZXRmE5bHdwbHN1VHpCcQorQjZ5ajhpYWlFM0xMK1EvZXVsSjdTNlFQZkFJMmJVMFVKTzIzWTRrb2VvSWliRUVETVNDUTZLWVoyTkNsUlJSVAorZ2E1ZlMxWWZrREZFY0hVUTEvS0lrZFlIR0JLQmpvS0dFeHppOCtDZ2lTeVNWU1lEWmw2d0lPaExqSDJPWjNvbAorbGRQTjdpTkFIaXJyeGc5djhRTzZPUWxwTFVrNUxocC8xZFNsWjZzeTNVakZxdmF4M3R3Nlpqckw4OFlQNWc9PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2F2Yi90ZXN0L2Zha2VfYXZiX29wcy5jYyBiL2F2Yi90ZXN0L2Zha2VfYXZiX29wcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQwODUwCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvZmFrZV9hdmJfb3BzLmNjCkBAIC0wLDAgKzEsMzQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxiYXNlL2ZpbGVzL2ZpbGVfdXRpbC5oPgorI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorCisjaW5jbHVkZSAiZmFrZV9hdmJfb3BzLmgiCisKK25hbWVzcGFjZSBhdmIgeworCitBdmJJT1Jlc3VsdCBGYWtlQXZiT3BzOjpyZWFkX2Zyb21fcGFydGl0aW9uKGNvbnN0IGNoYXIqIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBvdXRfbnVtX3JlYWQpIHsKKyAgYmFzZTo6RmlsZVBhdGggcGF0aCA9CisgICAgICBwYXJ0aXRpb25fZGlyXy5BcHBlbmQoc3RkOjpzdHJpbmcocGFydGl0aW9uKSkuQWRkRXh0ZW5zaW9uKCJpbWciKTsKKworICBpZiAob2Zmc2V0IDwgMCkgeworICAgIGludDY0X3QgZmlsZV9zaXplOworICAgIGlmICghYmFzZTo6R2V0RmlsZVNpemUocGF0aCwgJmZpbGVfc2l6ZSkpIHsKKyAgICAgIGZwcmludGYoCisgICAgICAgICAgc3RkZXJyLCAiRXJyb3IgZ2V0dGluZyBzaXplIG9mIGZpbGUgJyVzJ1xuIiwgcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworICAgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCA9IGZpbGVfc2l6ZSAtICgtb2Zmc2V0KTsKKyAgfQorCisgIGludCBmZCA9IG9wZW4ocGF0aC52YWx1ZSgpLmNfc3RyKCksIE9fUkRPTkxZKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIkVycm9yIG9wZW5pbmcgZmlsZSAnJXMnOiAlc1xuIiwKKyAgICAgICAgICAgIHBhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9JTzsKKyAgfQorICBpZiAobHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIkVycm9yIHNlZWtpbmcgdG8gcG9zICV6ZCBpbiBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgIHBhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfSU87CisgIH0KKyAgc3NpemVfdCBudW1fcmVhZCA9IHJlYWQoZmQsIGJ1ZmZlciwgbnVtX2J5dGVzKTsKKyAgaWYgKG51bV9yZWFkIDwgMCkgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgJXpkIGJ5dGVzIGZyb20gcG9zICUiIFBSSWQ2NCAiIGluIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgbnVtX2J5dGVzLAorICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgcGF0aC52YWx1ZSgpLmNfc3RyKCksCisgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9JTzsKKyAgfQorICBjbG9zZShmZCk7CisKKyAgaWYgKG91dF9udW1fcmVhZCAhPSBOVUxMKSB7CisgICAgKm91dF9udW1fcmVhZCA9IG51bV9yZWFkOworICB9CisKKyAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7Cit9CisKK0F2YklPUmVzdWx0IEZha2VBdmJPcHM6OndyaXRlX3RvX3BhcnRpdGlvbihjb25zdCBjaGFyKiBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWZmZXIpIHsKKyAgYmFzZTo6RmlsZVBhdGggcGF0aCA9CisgICAgICBwYXJ0aXRpb25fZGlyXy5BcHBlbmQoc3RkOjpzdHJpbmcocGFydGl0aW9uKSkuQWRkRXh0ZW5zaW9uKCJpbWciKTsKKworICBpZiAob2Zmc2V0IDwgMCkgeworICAgIGludDY0X3QgZmlsZV9zaXplOworICAgIGlmICghYmFzZTo6R2V0RmlsZVNpemUocGF0aCwgJmZpbGVfc2l6ZSkpIHsKKyAgICAgIGZwcmludGYoCisgICAgICAgICAgc3RkZXJyLCAiRXJyb3IgZ2V0dGluZyBzaXplIG9mIGZpbGUgJyVzJ1xuIiwgcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworICAgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCA9IGZpbGVfc2l6ZSAtICgtb2Zmc2V0KTsKKyAgfQorCisgIGludCBmZCA9IG9wZW4ocGF0aC52YWx1ZSgpLmNfc3RyKCksIE9fV1JPTkxZKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIkVycm9yIG9wZW5pbmcgZmlsZSAnJXMnOiAlc1xuIiwKKyAgICAgICAgICAgIHBhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9JTzsKKyAgfQorICBpZiAobHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIkVycm9yIHNlZWtpbmcgdG8gcG9zICV6ZCBpbiBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgIHBhdGgudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfSU87CisgIH0KKyAgc3NpemVfdCBudW1fd3JpdHRlbiA9IHdyaXRlKGZkLCBidWZmZXIsIG51bV9ieXRlcyk7CisgIGlmIChudW1fd3JpdHRlbiA8IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJFcnJvciB3cml0aW5nICV6ZCBieXRlcyBhdCBwb3MgJSIgUFJJZDY0ICIgaW4gZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICBudW1fYnl0ZXMsCisgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICBwYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX0VSUk9SX0lPOworICB9CisgIGNsb3NlKGZkKTsKKworICByZXR1cm4gQVZCX0lPX1JFU1VMVF9PSzsKK30KKworQXZiSU9SZXN1bHQgRmFrZUF2Yk9wczo6dmFsaWRhdGVfdmJtZXRhX3B1YmxpY19rZXkoCisgICAgQXZiT3BzKiBvcHMsCisgICAgY29uc3QgdWludDhfdCogcHVibGljX2tleV9kYXRhLAorICAgIHNpemVfdCBwdWJsaWNfa2V5X2xlbmd0aCwKKyAgICBjb25zdCB1aW50OF90KiBwdWJsaWNfa2V5X21ldGFkYXRhLAorICAgIHNpemVfdCBwdWJsaWNfa2V5X21ldGFkYXRhX2xlbmd0aCwKKyAgICBib29sKiBvdXRfa2V5X2lzX3RydXN0ZWQpIHsKKyAgaWYgKG91dF9rZXlfaXNfdHJ1c3RlZCAhPSBOVUxMKSB7CisgICAgYm9vbCBwa19tYXRjaGVzID0gKHB1YmxpY19rZXlfbGVuZ3RoID09IGV4cGVjdGVkX3B1YmxpY19rZXlfLnNpemUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAobWVtY21wKGV4cGVjdGVkX3B1YmxpY19rZXlfLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljX2tleV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY19rZXlfbGVuZ3RoKSA9PSAwKSk7CisgICAgYm9vbCBwa21kX21hdGNoZXMgPQorICAgICAgICAocHVibGljX2tleV9tZXRhZGF0YV9sZW5ndGggPT0gZXhwZWN0ZWRfcHVibGljX2tleV9tZXRhZGF0YV8uc2l6ZSgpICYmCisgICAgICAgICAobWVtY21wKGV4cGVjdGVkX3B1YmxpY19rZXlfbWV0YWRhdGFfLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHB1YmxpY19rZXlfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgIHB1YmxpY19rZXlfbWV0YWRhdGFfbGVuZ3RoKSA9PSAwKSk7CisgICAgKm91dF9rZXlfaXNfdHJ1c3RlZCA9IHBrX21hdGNoZXMgJiYgcGttZF9tYXRjaGVzOworICB9CisgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworfQorCitBdmJJT1Jlc3VsdCBGYWtlQXZiT3BzOjpyZWFkX3JvbGxiYWNrX2luZGV4KEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBvdXRfcm9sbGJhY2tfaW5kZXgpIHsKKyAgaWYgKHN0b3JlZF9yb2xsYmFja19pbmRleGVzXy5jb3VudChyb2xsYmFja19pbmRleF9sb2NhdGlvbikgPT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIk5vIHJvbGxiYWNrIGluZGV4IGZvciBsb2NhdGlvbiAlemQgKGhhcyAlemQgbG9jYXRpb25zKS5cbiIsCisgICAgICAgICAgICByb2xsYmFja19pbmRleF9sb2NhdGlvbiwKKyAgICAgICAgICAgIHN0b3JlZF9yb2xsYmFja19pbmRleGVzXy5zaXplKCkpOworICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX0VSUk9SX0lPOworICB9CisgICpvdXRfcm9sbGJhY2tfaW5kZXggPSBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlc19bcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25dOworICByZXR1cm4gQVZCX0lPX1JFU1VMVF9PSzsKK30KKworQXZiSU9SZXN1bHQgRmFrZUF2Yk9wczo6d3JpdGVfcm9sbGJhY2tfaW5kZXgoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCByb2xsYmFja19pbmRleCkgeworICBpZiAoc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXNfLmNvdW50KHJvbGxiYWNrX2luZGV4X2xvY2F0aW9uKSA9PSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiTm8gcm9sbGJhY2sgaW5kZXggZm9yIGxvY2F0aW9uICV6ZCAoaGFzICV6ZCBsb2NhdGlvbnMpLlxuIiwKKyAgICAgICAgICAgIHJvbGxiYWNrX2luZGV4X2xvY2F0aW9uLAorICAgICAgICAgICAgc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXNfLnNpemUoKSk7CisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfRVJST1JfSU87CisgIH0KKyAgc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXNfW3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uXSA9IHJvbGxiYWNrX2luZGV4OworICByZXR1cm4gQVZCX0lPX1JFU1VMVF9PSzsKK30KKworQXZiSU9SZXN1bHQgRmFrZUF2Yk9wczo6cmVhZF9pc19kZXZpY2VfdW5sb2NrZWQoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBvdXRfaXNfZGV2aWNlX3VubG9ja2VkKSB7CisgICpvdXRfaXNfZGV2aWNlX3VubG9ja2VkID0gc3RvcmVkX2lzX2RldmljZV91bmxvY2tlZF8gPyAxIDogMDsKKyAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7Cit9CisKK0F2YklPUmVzdWx0IEZha2VBdmJPcHM6OmdldF91bmlxdWVfZ3VpZF9mb3JfcGFydGl0aW9uKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZ3VpZF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZ3VpZF9idWZfc2l6ZSkgeworICAvLyBUaGlzIGlzIGZha2luZyBpdCBhIGJpdCBidXQgbWFrZXMgdGVzdGluZyBlYXN5LiBJdCB3b3JrcworICAvLyBiZWNhdXNlIGF2Yl9zbG90X3ZlcmlmeS5jIGRvZXNuJ3QgY2hlY2sgdGhhdCB0aGUgcmV0dXJuZWQgR1VJRAorICAvLyBpcyB3ZWxsZm9ybWVkLgorICBzbnByaW50ZihndWlkX2J1ZiwgZ3VpZF9idWZfc2l6ZSwgIjEyMzQtZmFrZS1ndWlkLWZvcjolcyIsIHBhcnRpdGlvbik7CisgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworfQorCitBdmJJT1Jlc3VsdCBGYWtlQXZiT3BzOjpyZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzKAorICAgIEF2YkF0eFBlcm1hbmVudEF0dHJpYnV0ZXMqIGF0dHJpYnV0ZXMpIHsKKyAgKmF0dHJpYnV0ZXMgPSBwZXJtYW5lbnRfYXR0cmlidXRlc187CisgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworfQorCitBdmJJT1Jlc3VsdCBGYWtlQXZiT3BzOjpyZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2goCisgICAgdWludDhfdCBoYXNoW0FWQl9TSEEyNTZfRElHRVNUX1NJWkVdKSB7CisgIGlmIChwZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoXy5lbXB0eSgpKSB7CisgICAgU0hBMjU2KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KCZwZXJtYW5lbnRfYXR0cmlidXRlc18pLAorICAgICAgICAgICBzaXplb2YoQXZiQXR4UGVybWFuZW50QXR0cmlidXRlcyksCisgICAgICAgICAgIGhhc2gpOworICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworICB9CisgIG1lbXNldChoYXNoLCAwLCBBVkJfU0hBMjU2X0RJR0VTVF9TSVpFKTsKKyAgcGVybWFuZW50X2F0dHJpYnV0ZXNfaGFzaF8uY29weShyZWludGVycHJldF9jYXN0PGNoYXIqPihoYXNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJfU0hBMjU2X0RJR0VTVF9TSVpFKTsKKyAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7Cit9CisKK3N0YXRpYyBBdmJJT1Jlc3VsdCBteV9vcHNfcmVhZF9mcm9tX3BhcnRpdGlvbihBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBvdXRfbnVtX3JlYWQpIHsKKyAgcmV0dXJuIEZha2VBdmJPcHM6OkdldEluc3RhbmNlRnJvbUF2Yk9wcyhvcHMpCisgICAgICAtPmRlbGVnYXRlKCkKKyAgICAgIC0+cmVhZF9mcm9tX3BhcnRpdGlvbihwYXJ0aXRpb24sIG9mZnNldCwgbnVtX2J5dGVzLCBidWZmZXIsIG91dF9udW1fcmVhZCk7Cit9CisKK3N0YXRpYyBBdmJJT1Jlc3VsdCBteV9vcHNfd3JpdGVfdG9fcGFydGl0aW9uKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyKSB7CisgIHJldHVybiBGYWtlQXZiT3BzOjpHZXRJbnN0YW5jZUZyb21BdmJPcHMob3BzKS0+ZGVsZWdhdGUoKS0+d3JpdGVfdG9fcGFydGl0aW9uKAorICAgICAgcGFydGl0aW9uLCBvZmZzZXQsIG51bV9ieXRlcywgYnVmZmVyKTsKK30KKworc3RhdGljIEF2YklPUmVzdWx0IG15X29wc192YWxpZGF0ZV92Ym1ldGFfcHVibGljX2tleSgKKyAgICBBdmJPcHMqIG9wcywKKyAgICBjb25zdCB1aW50OF90KiBwdWJsaWNfa2V5X2RhdGEsCisgICAgc2l6ZV90IHB1YmxpY19rZXlfbGVuZ3RoLAorICAgIGNvbnN0IHVpbnQ4X3QqIHB1YmxpY19rZXlfbWV0YWRhdGEsCisgICAgc2l6ZV90IHB1YmxpY19rZXlfbWV0YWRhdGFfbGVuZ3RoLAorICAgIGJvb2wqIG91dF9rZXlfaXNfdHJ1c3RlZCkgeworICByZXR1cm4gRmFrZUF2Yk9wczo6R2V0SW5zdGFuY2VGcm9tQXZiT3BzKG9wcykKKyAgICAgIC0+ZGVsZWdhdGUoKQorICAgICAgLT52YWxpZGF0ZV92Ym1ldGFfcHVibGljX2tleShvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY19rZXlfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljX2tleV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY19rZXlfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY19rZXlfbWV0YWRhdGFfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfa2V5X2lzX3RydXN0ZWQpOworfQorCitzdGF0aWMgQXZiSU9SZXN1bHQgbXlfb3BzX3JlYWRfcm9sbGJhY2tfaW5kZXgoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJvbGxiYWNrX2luZGV4X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBvdXRfcm9sbGJhY2tfaW5kZXgpIHsKKyAgcmV0dXJuIEZha2VBdmJPcHM6OkdldEluc3RhbmNlRnJvbUF2Yk9wcyhvcHMpCisgICAgICAtPmRlbGVnYXRlKCkKKyAgICAgIC0+cmVhZF9yb2xsYmFja19pbmRleChvcHMsIHJvbGxiYWNrX2luZGV4X2xvY2F0aW9uLCBvdXRfcm9sbGJhY2tfaW5kZXgpOworfQorCitzdGF0aWMgQXZiSU9SZXN1bHQgbXlfb3BzX3dyaXRlX3JvbGxiYWNrX2luZGV4KEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHJvbGxiYWNrX2luZGV4KSB7CisgIHJldHVybiBGYWtlQXZiT3BzOjpHZXRJbnN0YW5jZUZyb21BdmJPcHMob3BzKQorICAgICAgLT5kZWxlZ2F0ZSgpCisgICAgICAtPndyaXRlX3JvbGxiYWNrX2luZGV4KG9wcywgcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24sIHJvbGxiYWNrX2luZGV4KTsKK30KKworc3RhdGljIEF2YklPUmVzdWx0IG15X29wc19yZWFkX2lzX2RldmljZV91bmxvY2tlZCgKKyAgICBBdmJPcHMqIG9wcywgYm9vbCogb3V0X2lzX2RldmljZV91bmxvY2tlZCkgeworICByZXR1cm4gRmFrZUF2Yk9wczo6R2V0SW5zdGFuY2VGcm9tQXZiT3BzKG9wcykKKyAgICAgIC0+ZGVsZWdhdGUoKQorICAgICAgLT5yZWFkX2lzX2RldmljZV91bmxvY2tlZChvcHMsIG91dF9pc19kZXZpY2VfdW5sb2NrZWQpOworfQorCitzdGF0aWMgQXZiSU9SZXN1bHQgbXlfb3BzX2dldF91bmlxdWVfZ3VpZF9mb3JfcGFydGl0aW9uKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGd1aWRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZ3VpZF9idWZfc2l6ZSkgeworICByZXR1cm4gRmFrZUF2Yk9wczo6R2V0SW5zdGFuY2VGcm9tQXZiT3BzKG9wcykKKyAgICAgIC0+ZGVsZWdhdGUoKQorICAgICAgLT5nZXRfdW5pcXVlX2d1aWRfZm9yX3BhcnRpdGlvbihvcHMsIHBhcnRpdGlvbiwgZ3VpZF9idWYsIGd1aWRfYnVmX3NpemUpOworfQorCitzdGF0aWMgQXZiSU9SZXN1bHQgbXlfb3BzX3JlYWRfcGVybWFuZW50X2F0dHJpYnV0ZXMoCisgICAgQXZiQXR4T3BzKiBhdHhfb3BzLCBBdmJBdHhQZXJtYW5lbnRBdHRyaWJ1dGVzKiBhdHRyaWJ1dGVzKSB7CisgIHJldHVybiBGYWtlQXZiT3BzOjpHZXRJbnN0YW5jZUZyb21BdmJPcHMoYXR4X29wcy0+b3BzKQorICAgICAgLT5kZWxlZ2F0ZSgpCisgICAgICAtPnJlYWRfcGVybWFuZW50X2F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Cit9CisKK3N0YXRpYyBBdmJJT1Jlc3VsdCBteV9vcHNfcmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoKAorICAgIEF2YkF0eE9wcyogYXR4X29wcywgdWludDhfdCBoYXNoW0FWQl9TSEEyNTZfRElHRVNUX1NJWkVdKSB7CisgIHJldHVybiBGYWtlQXZiT3BzOjpHZXRJbnN0YW5jZUZyb21BdmJPcHMoYXR4X29wcy0+b3BzKQorICAgICAgLT5kZWxlZ2F0ZSgpCisgICAgICAtPnJlYWRfcGVybWFuZW50X2F0dHJpYnV0ZXNfaGFzaChoYXNoKTsKK30KKworRmFrZUF2Yk9wczo6RmFrZUF2Yk9wcygpIHsKKyAgYXZiX29wc18uYWJfb3BzID0gJmF2Yl9hYl9vcHNfOworICBhdmJfb3BzXy5hdHhfb3BzID0gJmF2Yl9hdHhfb3BzXzsKKyAgYXZiX29wc18udXNlcl9kYXRhID0gdGhpczsKKyAgYXZiX29wc18ucmVhZF9mcm9tX3BhcnRpdGlvbiA9IG15X29wc19yZWFkX2Zyb21fcGFydGl0aW9uOworICBhdmJfb3BzXy53cml0ZV90b19wYXJ0aXRpb24gPSBteV9vcHNfd3JpdGVfdG9fcGFydGl0aW9uOworICBhdmJfb3BzXy52YWxpZGF0ZV92Ym1ldGFfcHVibGljX2tleSA9IG15X29wc192YWxpZGF0ZV92Ym1ldGFfcHVibGljX2tleTsKKyAgYXZiX29wc18ucmVhZF9yb2xsYmFja19pbmRleCA9IG15X29wc19yZWFkX3JvbGxiYWNrX2luZGV4OworICBhdmJfb3BzXy53cml0ZV9yb2xsYmFja19pbmRleCA9IG15X29wc193cml0ZV9yb2xsYmFja19pbmRleDsKKyAgYXZiX29wc18ucmVhZF9pc19kZXZpY2VfdW5sb2NrZWQgPSBteV9vcHNfcmVhZF9pc19kZXZpY2VfdW5sb2NrZWQ7CisgIGF2Yl9vcHNfLmdldF91bmlxdWVfZ3VpZF9mb3JfcGFydGl0aW9uID0gbXlfb3BzX2dldF91bmlxdWVfZ3VpZF9mb3JfcGFydGl0aW9uOworCisgIC8vIEp1c3QgdXNlIHRoZSBidWlsdC1pbiBBL0IgbWV0YWRhdGEgcmVhZC93cml0ZSByb3V0aW5lcy4KKyAgYXZiX2FiX29wc18ub3BzID0gJmF2Yl9vcHNfOworICBhdmJfYWJfb3BzXy5yZWFkX2FiX21ldGFkYXRhID0gYXZiX2FiX2RhdGFfcmVhZDsKKyAgYXZiX2FiX29wc18ud3JpdGVfYWJfbWV0YWRhdGEgPSBhdmJfYWJfZGF0YV93cml0ZTsKKworICBhdmJfYXR4X29wc18ub3BzID0gJmF2Yl9vcHNfOworICBhdmJfYXR4X29wc18ucmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlcyA9IG15X29wc19yZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzOworICBhdmJfYXR4X29wc18ucmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoID0KKyAgICAgIG15X29wc19yZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2g7CisKKyAgZGVsZWdhdGVfID0gdGhpczsKK30KKworRmFrZUF2Yk9wczo6fkZha2VBdmJPcHMoKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgYXZiCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9mYWtlX2F2Yl9vcHMuaCBiL2F2Yi90ZXN0L2Zha2VfYXZiX29wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNzI0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9hdmIvdGVzdC9mYWtlX2F2Yl9vcHMuaApAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBGQUtFX0FWQl9PUFNfSF8KKyNkZWZpbmUgRkFLRV9BVkJfT1BTX0hfCisKKyNpbmNsdWRlIDxiYXNlL2ZpbGVzL2ZpbGVfdXRpbC5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxsaWJhdmJfYWIvbGliYXZiX2FiLmg+CisjaW5jbHVkZSA8bGliYXZiX2F0eC9saWJhdmJfYXR4Lmg+CisKK25hbWVzcGFjZSBhdmIgeworCisvLyBBIGRlbGVnYXRlIGludGVyZmFjZSBmb3Igb3BzIGNhbGxiYWNrcy4gVGhpcyBhbGxvd3MgdGVzdHMgdG8gb3ZlcnJpZGUgZGVmYXVsdAorLy8gZmFrZSBpbXBsZW1lbnRhdGlvbnMuCitjbGFzcyBGYWtlQXZiT3BzRGVsZWdhdGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+RmFrZUF2Yk9wc0RlbGVnYXRlKCkge30KKyAgdmlydHVhbCBBdmJJT1Jlc3VsdCByZWFkX2Zyb21fcGFydGl0aW9uKGNvbnN0IGNoYXIqIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogb3V0X251bV9yZWFkKSA9IDA7CisKKyAgdmlydHVhbCBBdmJJT1Jlc3VsdCB3cml0ZV90b19wYXJ0aXRpb24oY29uc3QgY2hhciogcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyKSA9IDA7CisKKyAgdmlydHVhbCBBdmJJT1Jlc3VsdCB2YWxpZGF0ZV92Ym1ldGFfcHVibGljX2tleSgKKyAgICAgIEF2Yk9wcyogb3BzLAorICAgICAgY29uc3QgdWludDhfdCogcHVibGljX2tleV9kYXRhLAorICAgICAgc2l6ZV90IHB1YmxpY19rZXlfbGVuZ3RoLAorICAgICAgY29uc3QgdWludDhfdCogcHVibGljX2tleV9tZXRhZGF0YSwKKyAgICAgIHNpemVfdCBwdWJsaWNfa2V5X21ldGFkYXRhX2xlbmd0aCwKKyAgICAgIGJvb2wqIG91dF9rZXlfaXNfdHJ1c3RlZCkgPSAwOworCisgIHZpcnR1YWwgQXZiSU9SZXN1bHQgcmVhZF9yb2xsYmFja19pbmRleChBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByb2xsYmFja19pbmRleF9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIG91dF9yb2xsYmFja19pbmRleCkgPSAwOworCisgIHZpcnR1YWwgQXZiSU9SZXN1bHQgd3JpdGVfcm9sbGJhY2tfaW5kZXgoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJvbGxiYWNrX2luZGV4X3Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgcm9sbGJhY2tfaW5kZXgpID0gMDsKKworICB2aXJ0dWFsIEF2YklPUmVzdWx0IHJlYWRfaXNfZGV2aWNlX3VubG9ja2VkKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIG91dF9pc19kZXZpY2VfdW5sb2NrZWQpID0gMDsKKworICB2aXJ0dWFsIEF2YklPUmVzdWx0IGdldF91bmlxdWVfZ3VpZF9mb3JfcGFydGl0aW9uKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBndWlkX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZ3VpZF9idWZfc2l6ZSkgPSAwOworCisgIHZpcnR1YWwgQXZiSU9SZXN1bHQgcmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlcygKKyAgICAgIEF2YkF0eFBlcm1hbmVudEF0dHJpYnV0ZXMqIGF0dHJpYnV0ZXMpID0gMDsKKworICB2aXJ0dWFsIEF2YklPUmVzdWx0IHJlYWRfcGVybWFuZW50X2F0dHJpYnV0ZXNfaGFzaCgKKyAgICAgIHVpbnQ4X3QgaGFzaFtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXSkgPSAwOworfTsKKworLy8gUHJvdmlkZXMgZmFrZSBpbXBsZW1lbnRhdGlvbnMgb2YgQVZCIG9wcy4gQWxsIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIG11c3QgYmUKKy8vIGNyZWF0ZWQgb24gdGhlIHNhbWUgdGhyZWFkLgorY2xhc3MgRmFrZUF2Yk9wcyA6IHB1YmxpYyBGYWtlQXZiT3BzRGVsZWdhdGUgeworIHB1YmxpYzoKKyAgRmFrZUF2Yk9wcygpOworICB2aXJ0dWFsIH5GYWtlQXZiT3BzKCk7CisKKyAgc3RhdGljIEZha2VBdmJPcHMqIEdldEluc3RhbmNlRnJvbUF2Yk9wcyhBdmJPcHMqIG9wcykgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZha2VBdmJPcHMqPihvcHMtPnVzZXJfZGF0YSk7CisgIH0KKyAgc3RhdGljIEZha2VBdmJPcHMqIEdldEluc3RhbmNlRnJvbUF2YkFCT3BzKEF2YkFCT3BzKiBhYl9vcHMpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGYWtlQXZiT3BzKj4oYWJfb3BzLT5vcHMtPnVzZXJfZGF0YSk7CisgIH0KKworICBBdmJPcHMqIGF2Yl9vcHMoKSB7CisgICAgcmV0dXJuICZhdmJfb3BzXzsKKyAgfQorCisgIEF2YkFCT3BzKiBhdmJfYWJfb3BzKCkgeworICAgIHJldHVybiAmYXZiX2FiX29wc187CisgIH0KKworICBBdmJBdHhPcHMqIGF2Yl9hdHhfb3BzKCkgeworICAgIHJldHVybiAmYXZiX2F0eF9vcHNfOworICB9CisKKyAgRmFrZUF2Yk9wc0RlbGVnYXRlKiBkZWxlZ2F0ZSgpIHsKKyAgICByZXR1cm4gZGVsZWdhdGVfOworICB9CisKKyAgLy8gRG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgfGRlbGVnYXRlfC4KKyAgdm9pZCBzZXRfZGVsZWdhdGUoRmFrZUF2Yk9wc0RlbGVnYXRlKiBkZWxlZ2F0ZSkgeworICAgIGRlbGVnYXRlXyA9IGRlbGVnYXRlOworICB9CisKKyAgdm9pZCBzZXRfcGFydGl0aW9uX2Rpcihjb25zdCBiYXNlOjpGaWxlUGF0aCYgcGFydGl0aW9uX2RpcikgeworICAgIHBhcnRpdGlvbl9kaXJfID0gcGFydGl0aW9uX2RpcjsKKyAgfQorCisgIHZvaWQgc2V0X2V4cGVjdGVkX3B1YmxpY19rZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3B1YmxpY19rZXkpIHsKKyAgICBleHBlY3RlZF9wdWJsaWNfa2V5XyA9IGV4cGVjdGVkX3B1YmxpY19rZXk7CisgIH0KKworICB2b2lkIHNldF9leHBlY3RlZF9wdWJsaWNfa2V5X21ldGFkYXRhKAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3B1YmxpY19rZXlfbWV0YWRhdGEpIHsKKyAgICBleHBlY3RlZF9wdWJsaWNfa2V5X21ldGFkYXRhXyA9IGV4cGVjdGVkX3B1YmxpY19rZXlfbWV0YWRhdGE7CisgIH0KKworICB2b2lkIHNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcygKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHNpemVfdCwgdWludDY0X3Q+JiBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlcykgeworICAgIHN0b3JlZF9yb2xsYmFja19pbmRleGVzXyA9IHN0b3JlZF9yb2xsYmFja19pbmRleGVzOworICB9CisKKyAgc3RkOjptYXA8c2l6ZV90LCB1aW50NjRfdD4gZ2V0X3N0b3JlZF9yb2xsYmFja19pbmRleGVzKCkgeworICAgIHJldHVybiBzdG9yZWRfcm9sbGJhY2tfaW5kZXhlc187CisgIH0KKworICB2b2lkIHNldF9zdG9yZWRfaXNfZGV2aWNlX3VubG9ja2VkKGJvb2wgc3RvcmVkX2lzX2RldmljZV91bmxvY2tlZCkgeworICAgIHN0b3JlZF9pc19kZXZpY2VfdW5sb2NrZWRfID0gc3RvcmVkX2lzX2RldmljZV91bmxvY2tlZDsKKyAgfQorCisgIHZvaWQgc2V0X3Blcm1hbmVudF9hdHRyaWJ1dGVzKGNvbnN0IEF2YkF0eFBlcm1hbmVudEF0dHJpYnV0ZXMmIGF0dHJpYnV0ZXMpIHsKKyAgICBwZXJtYW5lbnRfYXR0cmlidXRlc18gPSBhdHRyaWJ1dGVzOworICB9CisKKyAgdm9pZCBzZXRfcGVybWFuZW50X2F0dHJpYnV0ZXNfaGFzaChjb25zdCBzdGQ6OnN0cmluZyYgaGFzaCkgeworICAgIHBlcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2hfID0gaGFzaDsKKyAgfQorCisgIC8vIEZha2VBdmJPcHNEZWxlZ2F0ZSBtZXRob2RzLgorICBBdmJJT1Jlc3VsdCByZWFkX2Zyb21fcGFydGl0aW9uKGNvbnN0IGNoYXIqIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIG91dF9udW1fcmVhZCkgb3ZlcnJpZGU7CisKKyAgQXZiSU9SZXN1bHQgd3JpdGVfdG9fcGFydGl0aW9uKGNvbnN0IGNoYXIqIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgQXZiSU9SZXN1bHQgdmFsaWRhdGVfdmJtZXRhX3B1YmxpY19rZXkoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHB1YmxpY19rZXlfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHB1YmxpY19rZXlfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwdWJsaWNfa2V5X21ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHVibGljX2tleV9tZXRhZGF0YV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIG91dF9rZXlfaXNfdHJ1c3RlZCkgb3ZlcnJpZGU7CisKKyAgQXZiSU9SZXN1bHQgcmVhZF9yb2xsYmFja19pbmRleChBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIG91dF9yb2xsYmFja19pbmRleCkgb3ZlcnJpZGU7CisKKyAgQXZiSU9SZXN1bHQgd3JpdGVfcm9sbGJhY2tfaW5kZXgoQXZiT3BzKiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByb2xsYmFja19pbmRleF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgcm9sbGJhY2tfaW5kZXgpIG92ZXJyaWRlOworCisgIEF2YklPUmVzdWx0IHJlYWRfaXNfZGV2aWNlX3VubG9ja2VkKEF2Yk9wcyogb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBvdXRfaXNfZGV2aWNlX3VubG9ja2VkKSBvdmVycmlkZTsKKworICBBdmJJT1Jlc3VsdCBnZXRfdW5pcXVlX2d1aWRfZm9yX3BhcnRpdGlvbihBdmJPcHMqIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBndWlkX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGd1aWRfYnVmX3NpemUpIG92ZXJyaWRlOworCisgIEF2YklPUmVzdWx0IHJlYWRfcGVybWFuZW50X2F0dHJpYnV0ZXMoCisgICAgICBBdmJBdHhQZXJtYW5lbnRBdHRyaWJ1dGVzKiBhdHRyaWJ1dGVzKSBvdmVycmlkZTsKKworICBBdmJJT1Jlc3VsdCByZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2goCisgICAgICB1aW50OF90IGhhc2hbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV0pIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgQXZiT3BzIGF2Yl9vcHNfOworICBBdmJBQk9wcyBhdmJfYWJfb3BzXzsKKyAgQXZiQXR4T3BzIGF2Yl9hdHhfb3BzXzsKKworICBGYWtlQXZiT3BzRGVsZWdhdGUqIGRlbGVnYXRlXzsKKworICBiYXNlOjpGaWxlUGF0aCBwYXJ0aXRpb25fZGlyXzsKKworICBzdGQ6OnN0cmluZyBleHBlY3RlZF9wdWJsaWNfa2V5XzsKKyAgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcHVibGljX2tleV9tZXRhZGF0YV87CisKKyAgc3RkOjptYXA8c2l6ZV90LCB1aW50NjRfdD4gc3RvcmVkX3JvbGxiYWNrX2luZGV4ZXNfOworCisgIGJvb2wgc3RvcmVkX2lzX2RldmljZV91bmxvY2tlZF87CisKKyAgQXZiQXR4UGVybWFuZW50QXR0cmlidXRlcyBwZXJtYW5lbnRfYXR0cmlidXRlc187CisgIHN0ZDo6c3RyaW5nIHBlcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2hfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGF2YgorCisjZW5kaWYgLyogRkFLRV9BVkJfT1BTX0hfICovCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9pbWFnZV9oYW5kbGVyX3VuaXR0ZXN0LnB5IGIvYXZiL3Rlc3QvaW1hZ2VfaGFuZGxlcl91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZWFjYWMwCi0tLSAvZGV2L251bGwKKysrIGIvYXZiL3Rlc3QvaW1hZ2VfaGFuZGxlcl91bml0dGVzdC5weQpAQCAtMCwwICsxLDIxMSBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIyBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorIyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorIyBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisjIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorIyBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworIyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyMgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyMgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorIyBTT0ZUV0FSRS4KKworCisiIiJVbml0LXRlc3QgZm9yIEltYWdlSGFuZGxlci4iIiIKKworCitpbXBvcnQgaW1wCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0CisKK3N5cy5kb250X3dyaXRlX2J5dGVjb2RlID0gVHJ1ZQorYXZidG9vbCA9IGltcC5sb2FkX3NvdXJjZSgnYXZidG9vbCcsICcuL2F2YnRvb2wnKQorCisjIFRoZSBmaWxlIHRlc3RfZmlsZS5iaW4gYW5kIHRlc3RfZmlsZS5iaW4uc3BhcnNlIGFyZSBnZW5lcmF0ZWQgdXNpbmcKKyMgdGhlIGZvbGxvd2luZyBweXRob24gY29kZToKKyMKKyMgIHdpdGggb3BlbigndGVzdF9maWxlLmJpbicsICd3K2InKSBhcyBmOgorIyAgICBmLndyaXRlKCdCYXJmb280MycqMTI4KjEyKQorIyAgb3Muc3lzdGVtKCdpbWcyc2ltZyB0ZXN0X2ZpbGUuYmluIHRlc3RfZmlsZS5iaW4uc3BhcnNlJykKKyMgIGltYWdlID0gYXZidG9vbC5JbWFnZUhhbmRsZXIoJ3Rlc3RfZmlsZS5iaW4uc3BhcnNlJykKKyMgIGltYWdlLmFwcGVuZF9kb250X2NhcmUoMTIqMTAyNCkKKyMgIGltYWdlLmFwcGVuZF9maWxsKCdceDAxXHgwMlx4MDNceDA0JywgMTIqMTAyNCkKKyMgIGltYWdlLmFwcGVuZF9yYXcoJ0Zvb2JhcjQyJyoxMjgqMTIpCisjICBpbWFnZS5hcHBlbmRfZG9udF9jYXJlKDEyKjEwMjQpCisjICBkZWwgaW1hZ2UKKyMgIG9zLnN5c3RlbSgncm0gLWYgdGVzdF9maWxlLmJpbicpCisjICBvcy5zeXN0ZW0oJ3NpbWcyaW1nIHRlc3RfZmlsZS5iaW4uc3BhcnNlIHRlc3RfZmlsZS5iaW4nKQorIworIyBhbmQgbWFudWFsbHkgdmVyaWZpZWQgdG8gYmUgY29ycmVjdC4gVGhlIGNvbnRlbnQgb2YgdGhlIHJhdyBhbmQKKyMgc3BhcnNlIGZpbGVzIGFyZSBhcyBmb2xsb3dzICh0aGUgbGluZSB3aXRoICJGaWxsIHdpdGggMHgwNDAzMDIwMSIgaXMKKyMgYSBzaW1nX2R1bXAucHkgYnVnKToKKyMKKyMgJCBoZXhkdW1wIC1DIHRlc3RfZmlsZS5iaW4KKyMgMDAwMDAwMDAgIDQyIDYxIDcyIDY2IDZmIDZmIDM0IDMzICA0MiA2MSA3MiA2NiA2ZiA2ZiAzNCAzMyAgfEJhcmZvbzQzQmFyZm9vNDN8CisjICoKKyMgMDAwMDMwMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CisjICoKKyMgMDAwMDYwMDAgIDAxIDAyIDAzIDA0IDAxIDAyIDAzIDA0ICAwMSAwMiAwMyAwNCAwMSAwMiAwMyAwNCAgfC4uLi4uLi4uLi4uLi4uLi58CisjICoKKyMgMDAwMDkwMDAgIDQ2IDZmIDZmIDYyIDYxIDcyIDM0IDMyICA0NiA2ZiA2ZiA2MiA2MSA3MiAzNCAzMiAgfEZvb2JhcjQyRm9vYmFyNDJ8CisjICoKKyMgMDAwMGMwMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CisjICoKKyMgMDAwMGYwMDAKKyMKKyMgJCBzeXN0ZW0vY29yZS9saWJzcGFyc2Uvc2ltZ19kdW1wLnB5IC12IHRlc3RfZmlsZS5iaW4uc3BhcnNlCisjIHRlc3RfZmlsZS5iaW4uc3BhcnNlOiBUb3RhbCBvZiAxNSA0MDk2LWJ5dGUgb3V0cHV0IGJsb2NrcyBpbiA1IGlucHV0IGNodW5rcy4KKyMgICAgICAgICAgICAgaW5wdXRfYnl0ZXMgICAgICBvdXRwdXRfYmxvY2tzCisjIGNodW5rICAgIG9mZnNldCAgICAgbnVtYmVyICBvZmZzZXQgIG51bWJlcgorIyAgICAxICAgICAgICAgNDAgICAgICAxMjI4OCAgICAgICAwICAgICAgIDMgUmF3IGRhdGEKKyMgICAgMiAgICAgIDEyMzQwICAgICAgICAgIDAgICAgICAgMyAgICAgICAzIERvbid0IGNhcmUKKyMgICAgMyAgICAgIDEyMzUyICAgICAgICAgIDQgICAgICAgNiAgICAgICAzIEZpbGwgd2l0aCAweDA0MDMwMjAxCisjICAgIDQgICAgICAxMjM2OCAgICAgIDEyMjg4ICAgICAgIDkgICAgICAgMyBSYXcgZGF0YQorIyAgICA1ICAgICAgMjQ2NjggICAgICAgICAgMCAgICAgIDEyICAgICAgIDMgRG9uJ3QgY2FyZQorIyAgICAgICAgICAgMjQ2NjggICAgICAgICAgICAgICAgIDE1ICAgICAgICAgRW5kCisjCisKKworY2xhc3MgSW1hZ2VIYW5kbGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBURVNUX0ZJTEVfU1BBUlNFX1BBVEggPSAndGVzdC9kYXRhL3Rlc3RfZmlsZS5iaW4uc3BhcnNlJworICBURVNUX0ZJTEVfUEFUSCA9ICd0ZXN0L2RhdGEvdGVzdF9maWxlLmJpbicKKyAgVEVTVF9GSUxFX1NJWkUgPSA2MTQ0MAorICBURVNUX0ZJTEVfQkxPQ0tfU0laRSA9IDQwOTYKKworICBkZWYgX2ZpbGVfY29udGVudHNfZXF1YWwoc2VsZiwgcGF0aDEsIHBhdGgyLCBzaXplKToKKyAgICBmMSA9IG9wZW4ocGF0aDEsICdyJykKKyAgICBmMiA9IG9wZW4ocGF0aDIsICdyJykKKyAgICBpZiBmMS5yZWFkKHNpemUpICE9IGYyLnJlYWQoc2l6ZSk6CisgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCisgIGRlZiBfZmlsZV9zaXplKHNlbGYsIGYpOgorICAgIG9sZF9wb3MgPSBmLnRlbGwoKQorICAgIGYuc2VlaygwLCBvcy5TRUVLX0VORCkKKyAgICBzaXplID0gZi50ZWxsKCkKKyAgICBmLnNlZWsob2xkX3BvcykKKyAgICByZXR1cm4gc2l6ZQorCisgIGRlZiBfY2xvbmVfc3BhcnNlX2ZpbGUoc2VsZik6CisgICAgZiA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCisgICAgZi53cml0ZShvcGVuKHNlbGYuVEVTVF9GSUxFX1NQQVJTRV9QQVRIKS5yZWFkKCkpCisgICAgZi5mbHVzaCgpCisgICAgcmV0dXJuIGYKKworICBkZWYgX3Vuc3BhcnNpZnkoc2VsZiwgcGF0aCk6CisgICAgZiA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCisgICAgb3Muc3lzdGVtKCdzaW1nMmltZyB7fSB7fScuZm9ybWF0KHBhdGgsIGYubmFtZSkpCisgICAgcmV0dXJuIGYKKworICBkZWYgdGVzdFJlYWQoc2VsZik6CisgICAgIiIiQ2hlY2tzIHRoYXQgcmVhZGluZyBmcm9tIGEgc3BhcnNlIGZpbGUgd29ya3MgYXMgaW50ZW5kZWQuIiIiCisgICAgaWggPSBhdmJ0b29sLkltYWdlSGFuZGxlcihzZWxmLlRFU1RfRklMRV9TUEFSU0VfUEFUSCkKKworICAgICMgQ2hlY2sgdGhhdCB3ZSBzdGFydCBhdCBvZmZzZXQgMC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKGloLnRlbGwoKSwgMCkKKworICAgICMgQ2hlY2sgdGhhdCByZWFkaW5nIGFkdmFuY2VzIHRoZSBjdXJzb3IuCisgICAgc2VsZi5hc3NlcnRFcXVhbChpaC5yZWFkKDE0KSwgYnl0ZWFycmF5KCdCYXJmb280M0JhcmZvbycpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWgudGVsbCgpLCAxNCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGloLnJlYWQoMiksIGJ5dGVhcnJheSgnNDMnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGloLnRlbGwoKSwgMTYpCisKKyAgICAjIENoZWNrIHJlYWRpbmcgaW4gdGhlIG1pZGRsZSBvZiBhIGZpbGwgY2h1bmsgZ2V0cyB0aGUgcmlnaHQgZGF0YS4KKyAgICBpaC5zZWVrKDB4NjAwMCArIDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbChpaC5yZWFkKDQpLCBieXRlYXJyYXkoJ1x4MDJceDAzXHgwNFx4MDEnKSkKKworICAgICMgQ2hlY2sgd2UgY2FuIGNyb3NzIHRoZSBjaHVuayBib3VuZGFyeSBjb3JyZWN0bHkuCisgICAgaWguc2VlaygweDMwMDAgLSAxMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGloLnJlYWQoMTIpLCBieXRlYXJyYXkoJzQzQmFyZm9vNDNceDAwXHgwMCcpKQorICAgIGloLnNlZWsoMHg5MDAwIC0gMykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGloLnJlYWQoNSksIGJ5dGVhcnJheSgnXHgwMlx4MDNceDA0Rm8nKSkKKworICAgICMgQ2hlY2sgcmVhZGluZyBhdCBlbmQgb2YgZmlsZSBpcyBhIHBhcnRpYWwgcmVhZC4KKyAgICBpaC5zZWVrKDB4ZjAwMCAtIDIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChpaC5yZWFkKDE2KSwgYnl0ZWFycmF5KCdceDAwXHgwMCcpKQorCisgIGRlZiB0ZXN0VHJ1bmNhdGUoc2VsZik6CisgICAgIiIiQ2hlY2tzIHRoYXQgd2UgY2FuIHRydW5jYXRlIGEgc3BhcnNlIGZpbGUgY29ycmVjdGx5LiIiIgorICAgICMgQ2hlY2sgdHJ1bmNhdGlvbiBhdCBhbGwgcG9zc2libGUgYm91bmRhcmllcyAoaW5jbHVkaW5nIHN0YXJ0IGFuZCBlbmQpLgorICAgIGZvciBzaXplIGluIHJhbmdlKDAsIHNlbGYuVEVTVF9GSUxFX1NJWkUgKyBzZWxmLlRFU1RfRklMRV9CTE9DS19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVEVTVF9GSUxFX0JMT0NLX1NJWkUpOgorICAgICAgc3BhcnNlX2ZpbGUgPSBzZWxmLl9jbG9uZV9zcGFyc2VfZmlsZSgpCisgICAgICBpaCA9IGF2YnRvb2wuSW1hZ2VIYW5kbGVyKHNwYXJzZV9maWxlLm5hbWUpCisgICAgICBpaC50cnVuY2F0ZShzaXplKQorICAgICAgdW5zcGFyc2VfZmlsZSA9IHNlbGYuX3Vuc3BhcnNpZnkoc3BhcnNlX2ZpbGUubmFtZSkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZmlsZV9zaXplKHVuc3BhcnNlX2ZpbGUpLCBzaXplKQorICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2ZpbGVfY29udGVudHNfZXF1YWwodW5zcGFyc2VfZmlsZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5URVNUX0ZJTEVfUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpKQorCisgICAgIyBDaGVjayB0cnVuY2F0aW9uIHRvIGdyb3cgdGhlIGZpbGUuCisgICAgZ3Jvd19zaXplID0gODE5MgorICAgIHNwYXJzZV9maWxlID0gc2VsZi5fY2xvbmVfc3BhcnNlX2ZpbGUoKQorICAgIGloID0gYXZidG9vbC5JbWFnZUhhbmRsZXIoc3BhcnNlX2ZpbGUubmFtZSkKKyAgICBpaC50cnVuY2F0ZShzZWxmLlRFU1RfRklMRV9TSVpFICsgZ3Jvd19zaXplKQorICAgIHVuc3BhcnNlX2ZpbGUgPSBzZWxmLl91bnNwYXJzaWZ5KHNwYXJzZV9maWxlLm5hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9maWxlX3NpemUodW5zcGFyc2VfZmlsZSksCisgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfRklMRV9TSVpFICsgZ3Jvd19zaXplKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9maWxlX2NvbnRlbnRzX2VxdWFsKHVuc3BhcnNlX2ZpbGUubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfRklMRV9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVEVTVF9GSUxFX1NJWkUpKQorICAgIHVuc3BhcnNlX2ZpbGUuc2VlayhzZWxmLlRFU1RfRklMRV9TSVpFKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5zcGFyc2VfZmlsZS5yZWFkKCksICdcMCcqZ3Jvd19zaXplKQorCisgIGRlZiB0ZXN0QXBwZW5kUmF3KHNlbGYpOgorICAgICIiIkNoZWNrcyB0aGF0IHdlIGNhbiBhcHBlbmQgcmF3IGRhdGEgY29ycmVjdGx5LiIiIgorICAgIHNwYXJzZV9maWxlID0gc2VsZi5fY2xvbmVfc3BhcnNlX2ZpbGUoKQorICAgIGloID0gYXZidG9vbC5JbWFnZUhhbmRsZXIoc3BhcnNlX2ZpbGUubmFtZSkKKyAgICBkYXRhID0gJ1NvbWVEYXRhJyo0MDk2CisgICAgaWguYXBwZW5kX3JhdyhkYXRhKQorICAgIHVuc3BhcnNlX2ZpbGUgPSBzZWxmLl91bnNwYXJzaWZ5KHNwYXJzZV9maWxlLm5hbWUpCisgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2ZpbGVfY29udGVudHNfZXF1YWwodW5zcGFyc2VfZmlsZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVEVTVF9GSUxFX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5URVNUX0ZJTEVfU0laRSkpCisgICAgdW5zcGFyc2VfZmlsZS5zZWVrKHNlbGYuVEVTVF9GSUxFX1NJWkUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bnNwYXJzZV9maWxlLnJlYWQoKSwgZGF0YSkKKworICBkZWYgdGVzdEFwcGVuZEZpbGwoc2VsZik6CisgICAgIiIiQ2hlY2tzIHRoYXQgd2UgY2FuIGFwcGVuZCBmaWxsIGRhdGEgY29ycmVjdGx5LiIiIgorICAgIHNwYXJzZV9maWxlID0gc2VsZi5fY2xvbmVfc3BhcnNlX2ZpbGUoKQorICAgIGloID0gYXZidG9vbC5JbWFnZUhhbmRsZXIoc3BhcnNlX2ZpbGUubmFtZSkKKyAgICBkYXRhID0gJ0FCQ0QnKjQwOTYKKyAgICBpaC5hcHBlbmRfZmlsbCgnQUJDRCcsIGxlbihkYXRhKSkKKyAgICB1bnNwYXJzZV9maWxlID0gc2VsZi5fdW5zcGFyc2lmeShzcGFyc2VfZmlsZS5uYW1lKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9maWxlX2NvbnRlbnRzX2VxdWFsKHVuc3BhcnNlX2ZpbGUubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfRklMRV9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVEVTVF9GSUxFX1NJWkUpKQorICAgIHVuc3BhcnNlX2ZpbGUuc2VlayhzZWxmLlRFU1RfRklMRV9TSVpFKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5zcGFyc2VfZmlsZS5yZWFkKCksIGRhdGEpCisKKyAgZGVmIHRlc3REb250Q2FyZShzZWxmKToKKyAgICAiIiJDaGVja3MgdGhhdCB3ZSBjYW4gYXBwZW5kIERPTlRfQ0FSRSBkYXRhIGNvcnJlY3RseS4iIiIKKyAgICBzcGFyc2VfZmlsZSA9IHNlbGYuX2Nsb25lX3NwYXJzZV9maWxlKCkKKyAgICBpaCA9IGF2YnRvb2wuSW1hZ2VIYW5kbGVyKHNwYXJzZV9maWxlLm5hbWUpCisgICAgZGF0YSA9ICdcMCcqNDA5NjAKKyAgICBpaC5hcHBlbmRfZG9udF9jYXJlKGxlbihkYXRhKSkKKyAgICB1bnNwYXJzZV9maWxlID0gc2VsZi5fdW5zcGFyc2lmeShzcGFyc2VfZmlsZS5uYW1lKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9maWxlX2NvbnRlbnRzX2VxdWFsKHVuc3BhcnNlX2ZpbGUubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfRklMRV9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVEVTVF9GSUxFX1NJWkUpKQorICAgIHVuc3BhcnNlX2ZpbGUuc2VlayhzZWxmLlRFU1RfRklMRV9TSVpFKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5zcGFyc2VfZmlsZS5yZWFkKCksIGRhdGEpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hdmIvdGVzdC9saWJhdmJfaG9zdF9zeW1ib2xzX3Rlc3QgYi9hdmIvdGVzdC9saWJhdmJfaG9zdF9zeW1ib2xzX3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGIwZGNiMAotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi90ZXN0L2xpYmF2Yl9ob3N0X3N5bWJvbHNfdGVzdApAQCAtMCwwICsxLDQ5IEBACisjIS9iaW4vYmFzaAorCisjCisjIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisjIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisjIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyMgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisjIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworIyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisjIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisjIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorIyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisjIFNPRlRXQVJFLgorIworCisjIFRoaXMgc2hlbGwtc2NyaXB0IGNoZWNrcyB0aGUgc3ltYm9scyBpbiBsaWJhdmJfaG9zdC5hIGFuZCBmYWlscworIyBpZiBhIHJlZmVyZW5jZSBub3Qgc3RhcnRpbmcgd2l0aCBhdmJfIGlzIHJlZmVyZW5jZWQuIEl0J3MgaW50ZW5kZWQKKyMgdG8gY2F0Y2ggbWlzdGFrZXMgd2hlcmUgdGhlIHN0YW5kYXJkIEMgbGlicmFyeSBpcyBpbmFkdmVydGVudGx5CisjIHVzZWQuCisKK3NldCAtZQorCitTWU1CT0xTX0ZJTEU9JChta3RlbXAgL3RtcC9saWJhdmJfaG9zdF9zeW1ib2xzLlhYWFhYWFhYWFgpCisKK3RyYXAgInJtIC1mICcke1NZTUJPTFNfRklMRX0nIiBFWElUCisKK3JlYWRlbGYgLS1zeW1ib2xzIC0td2lkZSAiJHtBTkRST0lEX0hPU1RfT1VUfS9vYmovU1RBVElDX0xJQlJBUklFUy9saWJhdmJfaG9zdF9pbnRlcm1lZGlhdGVzL2xpYmF2Yl9ob3N0LmEiIHwgXAorICBhd2sgJyQ3ID09ICJVTkQiICYmICQ4ICE9ICIiIHtwcmludCAkOH0nIHwgXAorICBncmVwIC12IF5hdmJfIHwgXAorICBzb3J0IC11ID4gIiR7U1lNQk9MU19GSUxFfSIKKworIyBJZiB0aGlzIGZpbGUgaXMgbm9uLWVtcHR5LCBpdCBtZWFucyB0aGF0IHRoZSBsaWJyYXJ5IGlzIHVzaW5nCisjIHN5bWJvbHMgbm90IHN0YXJ0aW5nIHdpdGggImF2Yl8iLgoraWYgWyAtcyAiJHtTWU1CT0xTX0ZJTEV9IiBdIDsgdGhlbgorICBlY2hvICJFUlJPUjogJDA6IFVuZXhwZWN0ZWQgc3ltYm9scyBpbiBsaWJhdmJfaG9zdDoiID4mMgorICBjYXQgIiR7U1lNQk9MU19GSUxFfSIgPiYyCisgIGV4aXQgMQorZmkKZGlmZiAtLWdpdCBhL2F2Yi90ZXN0L3VzZXJfY29kZV90ZXN0LmNjIGIvYXZiL3Rlc3QvdXNlcl9jb2RlX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4NTFmMwotLS0gL2Rldi9udWxsCisrKyBiL2F2Yi90ZXN0L3VzZXJfY29kZV90ZXN0LmNjCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKy8vIFRoaXMgdGVzdCBlbnN1cmVzIHRoYXQgdXNlciBjb2RlIGNhbiBpbmNsdWRlIGxpYmF2YiouaCBhbmQgY29tcGlsZSB3aXRob3V0CisvLyBkZWZpbmluZyBBVkJfQ09NUElMQVRJT04gKHdoaWNoIHVzZXIgY29kZSBtdXN0IG5vdCkuCisjaW5jbHVkZSAibGliYXZiL2xpYmF2Yi5oIgorI2luY2x1ZGUgImxpYmF2Yl9hYi9saWJhdmJfYWIuaCIKKyNpbmNsdWRlICJsaWJhdmJfYXR4L2xpYmF2Yl9hdHguaCIK