ZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2c3MjIxL2NvbW1vbi9jb21tb24uYyBiL3RoaXJkX3BhcnR5L2c3MjIxL2NvbW1vbi9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmUzMmFkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZzcyMjEvY29tbW9uL2NvbW1vbi5jCkBAIC0wLDAgKzEsNDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICAgSVRVLVQgRy43MjIuMSAoMjAwNS0wNSkgLSBGaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiBmb3IgbWFpbiBib2R5IGFuZCBBbm5leCBDCisqKiAgID4gU29mdHdhcmUgUmVsZWFzZSAyLjEgKDIwMDgtMDYpCisqKiAgICAgKFNpbXBsZSByZXBhY2thZ2luZzsgbm8gY2hhbmdlIGZyb20gMjAwNS0wNSBSZWxlYXNlIDIuMCBjb2RlKQorKioKKyoqICAgqSAyMDA0IFBvbHljb20sIEluYy4KKyoqCisqKgkgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBGaWxlbmFtZTogICAgY29tbW9uLmMgICAgCisKKyAgUHVycG9zZTogICAgIENvbnRhaW5zIHRoZSBmdW5jdGlvbnMgdXNlZCBmb3IgYm90aCBHLjcyMi4xIEFubmV4IEMgZW5jb2RlciBhbmQgZGVjb2RlcgorCQkKKyAgRGVzaWduIE5vdGVzOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBJbmNsdWRlIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImh1ZmZfZGVmLmgiCisjaW5jbHVkZSAiaHVmZl90YWIuaCIKKyNpbmNsdWRlICJ0YWJsZXMuaCIKKyNpbmNsdWRlICJjb3VudC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uOiAgICBjYXRlZ29yaXplCisKKyBTeW50YXg6ICAgICAgdm9pZCBjYXRlZ29yaXplKFdvcmQxNiBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBybXNfaW5kZXgsICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgcG93ZXJfY2F0ZWdvcmllcywgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNhdGVnb3J5X2JhbGFuY2VzKSAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgaW5wdXRzOiAgIG51bWJlcl9vZl9yZWdpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9hdmFpbGFibGVfYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtc19pbmRleFtNQVhfTlVNQkVSX09GX1JFR0lPTlNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIG91dHB1dHM6ICBwb3dlcl9jYXRlZ29yaWVzW01BWF9OVU1CRVJfT0ZfUkVHSU9OU10gICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2JhbGFuY2VzW01BWF9OVU1fQ0FURUdPUklaQVRJT05fQ09OVFJPTF9QT1NTSUJJTElUSUVTLTFdCisKKyBEZXNjcmlwdGlvbjogQ29tcHV0ZXMgYSBzZXJpZXMgb2YgY2F0ZWdvcml6YXRpb25zIAorCisgV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuMTQgICAgICB8ICAgICAwLjE0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjE1ICAgICAgfCAgICAgMC4xNQorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKKyAgIAkJCQorICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQgICAgIHwgICAgIDQ4a2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC40MiAgICAgIHwgICAgIDAuNDUgICAgICAgfCAgICAgMC40OCAgIAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBNQVggIHwgICAgMC40NyAgICAgIHwgICAgIDAuNTIgICAgICAgfCAgICAgMC41MiAgIAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNhdGVnb3JpemUoV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywKKwkJICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCisJCSAgICAgICAgV29yZDE2IG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsCisJCSAgICAgICAgV29yZDE2ICpybXNfaW5kZXgsCisJCSAgICAgICAgV29yZDE2ICpwb3dlcl9jYXRlZ29yaWVzLAorCQkgICAgICAgIFdvcmQxNiAqY2F0ZWdvcnlfYmFsYW5jZXMpCit7CisgICAgCisgICAgV29yZDE2IG9mZnNldDsKKyAgICBXb3JkMTYgdGVtcDsKKyAgICBXb3JkMTYgZnJhbWVfc2l6ZTsKKworICAgIC8qIEF0IGhpZ2hlciBiaXQgcmF0ZXMsIHRoZXJlIGlzIGFuIGluY3JlYXNlIGZvciBtb3N0IGNhdGVnb3JpZXMgaW4gYXZlcmFnZSBiaXQKKyAgICAgICBjb25zdW1wdGlvbiBwZXIgcmVnaW9uLiBXZSBjb21wZW5zYXRlIGZvciB0aGlzIGJ5IHByZXRlbmRpbmcgd2UgaGF2ZSBmZXdlcgorICAgICAgIGF2YWlsYWJsZSBiaXRzLiAqLworICAgIHRlc3QoKTsKKyAgICBpZiAobnVtYmVyX29mX3JlZ2lvbnMgPT0gTlVNQkVSX09GX1JFR0lPTlMpCisgICAgeworICAgICAgICBmcmFtZV9zaXplID0gRENUX0xFTkdUSDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZnJhbWVfc2l6ZSA9IE1BWF9EQ1RfTEVOR1RIOworICAgIH0KKworICAgIHRlbXAgPSBzdWIobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLGZyYW1lX3NpemUpOworICAgIAorICAgIHRlc3QoKTsKKyAgICBpZiAodGVtcCA+IDApCisgICAgeworICAgICAgICBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMgPSBzdWIobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLGZyYW1lX3NpemUpOworICAgICAgICBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMgPSBleHRyYWN0X2woTF9tdWx0MChudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsNSkpOworICAgICAgICBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMgPSBzaHIobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLDMpOworICAgICAgICBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMgPSBhZGQobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLGZyYW1lX3NpemUpOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IHVzaW5nIHRoZSBvcmlnaW5hbCBjYXRlZ29yeSBhc3NpZ25tZW50cyAqLworICAgIG9mZnNldCA9IGNhbGNfb2Zmc2V0KHJtc19pbmRleCxudW1iZXJfb2ZfcmVnaW9ucyxudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMpOworCisKKworICAgIC8qIGNvbXB1dGUgdGhlIHBvd2VyIGNhdGVnb3JpZXMgYmFzZWQgb24gdGhlIHVuaWZvcm0gb2Zmc2V0ICovCisgICAgY29tcHV0ZV9yYXdfcG93X2NhdGVnb3JpZXMocG93ZXJfY2F0ZWdvcmllcyxybXNfaW5kZXgsbnVtYmVyX29mX3JlZ2lvbnMsb2Zmc2V0KTsKKyAgICAKKyAgICAKKyAgICAvKiBhZGp1c3QgdGhlIGNhdGVnb3J5IGFzc2lnbm1lbnRzICovCisgICAgLyogY29tcHV0ZSB0aGUgbmV3IHBvd2VyIGNhdGVnb3JpZXMgYW5kIGNhdGVnb3J5IGJhbGFuY2VzICovCisgICAgY29tcF9wb3dlcmNhdF9hbmRfY2F0YmFsYW5jZShwb3dlcl9jYXRlZ29yaWVzLGNhdGVnb3J5X2JhbGFuY2VzLHJtc19pbmRleCxudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsbnVtYmVyX29mX3JlZ2lvbnMsbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcyxvZmZzZXQpOworCit9CisgICAgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgIGNvbXBfcG93ZXJjYXRfYW5kX2NhdGJhbGFuY2UKKworIFN5bnRheDogICAgICB2b2lkIGNvbXBfcG93ZXJjYXRfYW5kX2NhdGJhbGFuY2UoV29yZDE2ICpwb3dlcl9jYXRlZ29yaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpjYXRlZ29yeV9iYWxhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcm1zX2luZGV4LCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG9mZnNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnB1dHM6ICAgKnJtc19pbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgb3V0cHV0czogICpwb3dlcl9jYXRlZ29yaWVzICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKmNhdGVnb3J5X2JhbGFuY2VzIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorIERlc2NyaXB0aW9uOiBDb21wdXRlcyB0aGUgcG93ZXJfY2F0ZWdvcmllcyBhbmQgdGhlIGNhdGVnb3J5IGJhbGFuY2VzCisKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4xMCAgICAgIHwgICAgIDAuMTAKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgTUFYICB8ICAgIDAuMTEgICAgICB8ICAgICAwLjExCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCQkJCQorICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQgICAgIHwgICAgIDQ4a2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4zMiAgICAgIHwgICAgIDAuMzUgICAgICAgfCAgICAgMC4zOCAgIAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBNQVggIHwgICAgMC4zOCAgICAgIHwgICAgIDAuNDIgICAgICAgfCAgICAgMC40MyAgIAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29tcF9wb3dlcmNhdF9hbmRfY2F0YmFsYW5jZShXb3JkMTYgKnBvd2VyX2NhdGVnb3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpjYXRlZ29yeV9iYWxhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnJtc19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKKwkJCQkJCQkJICBXb3JkMTYgb2Zmc2V0KQoreworICAgIAorICAgIFdvcmQxNiBleHBlY3RlZF9udW1iZXJfb2ZfY29kZV9iaXRzOworICAgIFdvcmQxNiByZWdpb247CisgICAgV29yZDE2IG1heF9yZWdpb247CisgICAgV29yZDE2IGo7CisgICAgV29yZDE2IG1heF9yYXRlX2NhdGVnb3JpZXNbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsKKyAgICBXb3JkMTYgbWluX3JhdGVfY2F0ZWdvcmllc1tNQVhfTlVNQkVSX09GX1JFR0lPTlNdOworICAgIFdvcmQxNiB0ZW1wX2NhdGVnb3J5X2JhbGFuY2VzWzIqTUFYX05VTV9DQVRFR09SSVpBVElPTl9DT05UUk9MX1BPU1NJQklMSVRJRVNdOworICAgIFdvcmQxNiByYXdfbWF4LCByYXdfbWluOworICAgIFdvcmQxNiByYXdfbWF4X2luZGV4LCByYXdfbWluX2luZGV4OworICAgIFdvcmQxNiBtYXhfcmF0ZV9wb2ludGVyLCBtaW5fcmF0ZV9wb2ludGVyOworICAgIFdvcmQxNiBtYXgsIG1pbjsKKyAgICBXb3JkMTYgaXRlbXAwOworICAgIFdvcmQxNiBpdGVtcDE7CisgICAgV29yZDE2IG1pbl9wbHVzX21heDsKKyAgICBXb3JkMTYgdHdvX3hfbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzOworCisgICAgV29yZDE2IHRlbXA7CisKKyAgICBleHBlY3RlZF9udW1iZXJfb2ZfY29kZV9iaXRzID0gMDsKKyAgICBtb3ZlMTYoKTsKKworICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCisgICAgICAgIGV4cGVjdGVkX251bWJlcl9vZl9jb2RlX2JpdHMgPSBhZGQoZXhwZWN0ZWRfbnVtYmVyX29mX2NvZGVfYml0cyxleHBlY3RlZF9iaXRzX3RhYmxlW3Bvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXV0pOworCisKKyAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKSAKKyAgICB7CisgICAgICAgIG1heF9yYXRlX2NhdGVnb3JpZXNbcmVnaW9uXSA9IHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIAorICAgICAgICBtaW5fcmF0ZV9jYXRlZ29yaWVzW3JlZ2lvbl0gPSBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl07CisgICAgICAgIG1vdmUxNigpOworICAgIH0KKyAgICAKKyAgICBtYXggPSBleHBlY3RlZF9udW1iZXJfb2ZfY29kZV9iaXRzOworICAgIG1vdmUxNigpOworICAgIG1pbiA9IGV4cGVjdGVkX251bWJlcl9vZl9jb2RlX2JpdHM7CisgICAgbW92ZTE2KCk7CisgICAgbWF4X3JhdGVfcG9pbnRlciA9IG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXM7CisgICAgbW92ZTE2KCk7CisgICAgbWluX3JhdGVfcG9pbnRlciA9IG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXM7CisgICAgbW92ZTE2KCk7CisgICAgCisgICAgZm9yIChqPTA7IGo8bnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcy0xOyBqKyspIAorICAgIHsKKyAgICAgICAgbWluX3BsdXNfbWF4ID0gYWRkKG1heCxtaW4pOworICAgICAgICB0d29feF9udW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMgPSBzaGwobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLDEpOworICAgICAgICAKKyAgICAgICAgdGVtcCA9IHN1YihtaW5fcGx1c19tYXgsdHdvX3hfbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzKTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAodGVtcCA8PSAwKSAKKyAgICAgICAgeworICAgICAgICAgICAgcmF3X21pbiA9IDk5OworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAvKiBTZWFyY2ggZnJvbSBsb3dlc3QgZnJlcSByZWdpb25zIHRvIGhpZ2hlc3QgZm9yIGJlc3QgKi8KKyAgICAgICAgICAgIC8qIHJlZ2lvbiB0byByZWFzc2lnbiB0byBhIGhpZ2hlciBiaXQgcmF0ZSBjYXRlZ29yeS4gICAqLworICAgICAgICAgICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgIGlmIChtYXhfcmF0ZV9jYXRlZ29yaWVzW3JlZ2lvbl0gPiAwKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1wMCA9IHNobChtYXhfcmF0ZV9jYXRlZ29yaWVzW3JlZ2lvbl0sMSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1wMSA9IHN1YihvZmZzZXQscm1zX2luZGV4W3JlZ2lvbl0pOworICAgICAgICAgICAgICAgICAgICBpdGVtcDAgPSBzdWIoaXRlbXAxLGl0ZW1wMCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc3ViKGl0ZW1wMCxyYXdfbWluKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCA8IDApIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYXdfbWluID0gaXRlbXAwOworICAgICAgICAgICAgICAgICAgICAgICAgcmF3X21pbl9pbmRleCA9IHJlZ2lvbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heF9yYXRlX3BvaW50ZXIgPSBzdWIobWF4X3JhdGVfcG9pbnRlciwxKTsKKyAgICAgICAgICAgIHRlbXBfY2F0ZWdvcnlfYmFsYW5jZXNbbWF4X3JhdGVfcG9pbnRlcl0gPSByYXdfbWluX2luZGV4OworICAgICAgICAgICAgbW92ZTE2KCk7CisKKyAgICAgICAgCW1heCA9IHN1YihtYXgsZXhwZWN0ZWRfYml0c190YWJsZVttYXhfcmF0ZV9jYXRlZ29yaWVzW3Jhd19taW5faW5kZXhdXSk7CisgICAgICAgIAltYXhfcmF0ZV9jYXRlZ29yaWVzW3Jhd19taW5faW5kZXhdID0gc3ViKG1heF9yYXRlX2NhdGVnb3JpZXNbcmF3X21pbl9pbmRleF0sMSk7CisgICAgICAgIAltb3ZlMTYoKTsKKworICAgICAgICAgICAgbWF4ID0gYWRkKG1heCxleHBlY3RlZF9iaXRzX3RhYmxlW21heF9yYXRlX2NhdGVnb3JpZXNbcmF3X21pbl9pbmRleF1dKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICByYXdfbWF4ID0gLTk5OworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAvKiBTZWFyY2ggZnJvbSBoaWdoZXN0IGZyZXEgcmVnaW9ucyB0byBsb3dlc3QgZm9yIGJlc3QgcmVnaW9uIHRvIHJlYXNzaWduIHRvCisgICAgICAgICAgICBhIGxvd2VyIGJpdCByYXRlIGNhdGVnb3J5LiAqLworICAgICAgICAgICAgbWF4X3JlZ2lvbiA9IHN1YihudW1iZXJfb2ZfcmVnaW9ucywxKTsKKyAgICAgICAgICAgIGZvciAocmVnaW9uPSBtYXhfcmVnaW9uOyByZWdpb24gPj0gMDsgcmVnaW9uLS0pIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSBzdWIobWluX3JhdGVfY2F0ZWdvcmllc1tyZWdpb25dLChOVU1fQ0FURUdPUklFUy0xKSk7CisgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1wMCA9IHNobChtaW5fcmF0ZV9jYXRlZ29yaWVzW3JlZ2lvbl0sMSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1wMSA9IHN1YihvZmZzZXQscm1zX2luZGV4W3JlZ2lvbl0pOworICAgICAgICAgICAgICAgICAgICBpdGVtcDAgPSBzdWIoaXRlbXAxLGl0ZW1wMCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc3ViKGl0ZW1wMCxyYXdfbWF4KTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCA+IDApIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYXdfbWF4ID0gaXRlbXAwOworICAgICAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByYXdfbWF4X2luZGV4ID0gcmVnaW9uOworICAgICAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wX2NhdGVnb3J5X2JhbGFuY2VzW21pbl9yYXRlX3BvaW50ZXJdID0gcmF3X21heF9pbmRleDsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtaW5fcmF0ZV9wb2ludGVyID0gYWRkKG1pbl9yYXRlX3BvaW50ZXIsMSk7CisgICAgICAgICAgICBtaW4gPSBzdWIobWluLGV4cGVjdGVkX2JpdHNfdGFibGVbbWluX3JhdGVfY2F0ZWdvcmllc1tyYXdfbWF4X2luZGV4XV0pOworICAgICAgICAgICAgCisgICAgICAgICAgICBtaW5fcmF0ZV9jYXRlZ29yaWVzW3Jhd19tYXhfaW5kZXhdID0gYWRkKG1pbl9yYXRlX2NhdGVnb3JpZXNbcmF3X21heF9pbmRleF0sMSk7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbWluID0gYWRkKG1pbixleHBlY3RlZF9iaXRzX3RhYmxlW21pbl9yYXRlX2NhdGVnb3JpZXNbcmF3X21heF9pbmRleF1dKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKQorICAgIHsKKyAgICAgICAgcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dID0gbWF4X3JhdGVfY2F0ZWdvcmllc1tyZWdpb25dOworICAgICAgICBtb3ZlMTYoKTsKKyAgICB9CisgICAgCisgICAgZm9yIChqPTA7IGo8bnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcy0xOyBqKyspCisgICAgeworICAgICAgICBjYXRlZ29yeV9iYWxhbmNlc1tqXSA9IHRlbXBfY2F0ZWdvcnlfYmFsYW5jZXNbbWF4X3JhdGVfcG9pbnRlcisrXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfQorCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgIGNhbGNfb2Zmc2V0CisKKyBTeW50YXg6ICAgICAgb2Zmc2V0PWNhbGNfb2Zmc2V0KFdvcmQxNiAqcm1zX2luZGV4LFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucyxXb3JkMTYgYXZhaWxhYmxlX2JpdHMpICAKKworICAgICAgICAgICAgICAgIGlucHV0OiAgV29yZDE2ICpybXNfaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucworICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGF2YWlsYWJsZV9iaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvdXRwdXQ6IFdvcmQxNiBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAKKworIERlc2NyaXB0aW9uOiBDYWxjdWxhdGVzIHRoZSB0aGUgY2F0ZWdvcnkgb2Zmc2V0LiAgVGhpcyBpcyB0aGUgc2hpZnQgcmVxdWlyZWQKKyAgICAgICAgICAgICAgVG8gZ2V0IHRoZSBtb3N0IG91dCBvZiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBiaXRzLiAgQSBiaW5hcnkgCisgICAgICAgICAgICAgIHR5cGUgc2VhcmNoIGlzIHVzZWQgdG8gZmluZCB0aGUgb2Zmc2V0LgorCisgV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuMDQgICAgICB8ICAgICAwLjA0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjA0ICAgICAgfCAgICAgMC4wNAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKKworICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQgICAgIHwgICAgIDQ4a2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wOCAgICAgIHwgICAgIDAuMDggICAgICAgfCAgICAgMC4wOCAgIAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBNQVggIHwgICAgMC4wOSAgICAgIHwgICAgIDAuMDkgICAgICAgfCAgICAgMC4wOSAgIAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBjYWxjX29mZnNldChXb3JkMTYgKnJtc19pbmRleCxXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsV29yZDE2IGF2YWlsYWJsZV9iaXRzKSAgICAKK3sKKworICAgIFdvcmQxNiBhbnN3ZXI7CisgICAgV29yZDE2IGRlbHRhOworICAgIFdvcmQxNiB0ZXN0X29mZnNldDsKKyAgICBXb3JkMTYgcmVnaW9uLGo7CisgICAgV29yZDE2IHBvd2VyX2NhdHNbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsKKyAgICBXb3JkMTYgYml0czsKKyAgICBXb3JkMTYgb2Zmc2V0OworICAgIFdvcmQxNiB0ZW1wOworCisgICAgLyogaW5pdGlhbGl6ZSB2YXJzICovCisgICAgYW5zd2VyID0gLTMyOworICAgIG1vdmUxNigpOworICAgIGRlbHRhID0gMzI7CisgICAgbW92ZTE2KCk7CisgICAgCisgICAgZG8gCisgICAgeworICAgICAgICB0ZXN0X29mZnNldCA9IGFkZChhbnN3ZXIsZGVsdGEpOworICAgICAgICAKKyAgICAgICAgLyogb2J0YWluIGEgY2F0ZWdvcnkgZm9yIGVhY2ggcmVnaW9uICovCisgICAgICAgIC8qIHVzaW5nIHRoZSB0ZXN0IG9mZnNldCAgICAgICAgICAgICAqLworICAgICAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKSAKKyAgICAgICAgeworICAgICAgICAgICAgaiA9IHN1Yih0ZXN0X29mZnNldCxybXNfaW5kZXhbcmVnaW9uXSk7CisgICAgICAgICAgICBqID0gc2hyKGosMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIEVuc3VyZSBqIGlzIGJldHdlZW4gMCBhbmQgTlVNX0NBVC0xICovCisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICBpZiAoaiA8IDApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcCA9IHN1YihqLE5VTV9DQVRFR09SSUVTLTEpOworICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgaWYgKHRlbXAgPiAwKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqID0gc3ViKE5VTV9DQVRFR09SSUVTLDEpOworICAgICAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG93ZXJfY2F0c1tyZWdpb25dID0gajsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICB9CisgICAgICAgIGJpdHMgPSAwOworICAgICAgICBtb3ZlMTYoKTsKKworICAgICAgICAvKiBjb21wdXRlIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IHdpbGwgYmUgdXNlZCBnaXZlbiB0aGUgY2F0IGFzc2lnbm1lbnRzICovCisgICAgICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCisgICAgICAgICAgICBiaXRzID0gYWRkKGJpdHMsZXhwZWN0ZWRfYml0c190YWJsZVtwb3dlcl9jYXRzW3JlZ2lvbl1dKTsKKworICAgICAgICAvKiBpZiAoYml0cyA+IGF2YWlsYWJsZV9iaXRzIC0gMzIpIHRoZW4gZGl2aWRlIHRoZSBvZmZzZXQgcmVnaW9uIGZvciB0aGUgYmluIHNlYXJjaCAqLworICAgICAgICBvZmZzZXQgPSBzdWIoYXZhaWxhYmxlX2JpdHMsMzIpOworICAgICAgICB0ZW1wID0gc3ViKGJpdHMsb2Zmc2V0KTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAodGVtcCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBhbnN3ZXIgPSB0ZXN0X29mZnNldDsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICB9CisgICAgICAgIGRlbHRhID0gc2hyKGRlbHRhLDEpOworICAgICAgICB0ZXN0KCk7IC8qIGZvciB0aGUgd2hpbGUgbG9vcCAqLworICAgIH0gd2hpbGUgKGRlbHRhID4gMCk7CisKKyAgICByZXR1cm4oYW5zd2VyKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogICAgY29tcHV0ZV9yYXdfcG93X2NhdGVnb3JpZXMKKworIFN5bnRheDogICAgICB2b2lkIGNvbXB1dGVfcmF3X3Bvd19jYXRlZ29yaWVzKFdvcmQxNiAqcG93ZXJfY2F0ZWdvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnJtc19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG9mZnNldCkKKyAgICAgICAgICAgICAgaW5wdXRzOiAgKnJtc19pbmRleAorICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucworICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIG91dHB1dHM6ICpwb3dlcl9jYXRlZ29yaWVzICAgICAgICAgICAgICAgICAgICAKKworCisKKyBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcG93ZXIgY2F0ZWdvcmllcyBnaXZlbiB0aGUgb2Zmc2V0CisgICAgICAgICAgICAgIFRoaXMgaXMga2luZCBvZiByZWR1bmRhbnQgc2luY2UgdGhleSB3ZXJlIGFscmVhZHkgY29tcHV0ZWQKKyAgICAgICAgICAgICAgaW4gY2FsY19vZmZzZXQgdG8gZGV0ZXJtaW5lIHRoZSBvZmZzZXQuCisKKyBXTU9QUzogICAgICAgICAgfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wMSAgICAgIHwgICAgIDAuMDEKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgTUFYICB8ICAgIDAuMDEgICAgICB8ICAgICAwLjAxCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjAxICAgICAgfCAgICAgMC4wMSAgICAgICB8ICAgICAwLjAxICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjAxICAgICAgfCAgICAgMC4wMSAgICAgICB8ICAgICAwLjAxICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjb21wdXRlX3Jhd19wb3dfY2F0ZWdvcmllcyhXb3JkMTYgKnBvd2VyX2NhdGVnb3JpZXMsV29yZDE2ICpybXNfaW5kZXgsV29yZDE2IG51bWJlcl9vZl9yZWdpb25zLFdvcmQxNiBvZmZzZXQpCit7CisgICAgV29yZDE2IHJlZ2lvbjsKKyAgICBXb3JkMTYgajsKKyAgICBXb3JkMTYgdGVtcDsKKworICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspIAorICAgIHsKKyAgICAgICAgaiA9IHN1YihvZmZzZXQscm1zX2luZGV4W3JlZ2lvbl0pOworICAgICAgICBqID0gc2hyKGosMSk7CisgICAgICAgIAorICAgICAgICAvKiBtYWtlIHN1cmUgaiBpcyBiZXR3ZWVuIDAgYW5kIE5VTV9DQVQtMSAqLworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmIChqIDwgMCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIH0KKyAgICAgICAgdGVtcCA9IHN1YihqLChOVU1fQ0FURUdPUklFUy0xKSk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYgKHRlbXAgPiAwKSAKKyAgICAgICAgICAgIGogPSBzdWIoTlVNX0NBVEVHT1JJRVMsMSk7CisgICAgICAgIAorICAgICAgICBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl0gPSBqOworICAgICAgICBtb3ZlMTYoKTsKKyAgICB9Cit9CisK