ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDhkYTZiMDkuLmI5MjgwODggMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTIsNyArMTIsNyBAQAogICAgIFFDT01fTUVESUFfUk9PVCA6PSAkKGNhbGwgbXktZGlyKS9zZG04NDUKICAgZW5kaWYKIAotICBpZm5lcSAoJChmaWx0ZXIgbXNtODYxMCBtc204MjI2IG1zbTg5NjAgbXNtODY2MCBtc203NjI3YSBtc203NjMwX3N1cmYgbXNtODA4NCBtc204OTUyIG1zbTg5OTIgbXNtODk5NCBtc204OTk2IG1zbTg5OTggc2RtODQ1LCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQorICBpZm5lcSAoJChmaWx0ZXIgbXNtODYxMCBtc204MjI2IG1zbTg5NjAgbXNtODY2MCBtc203NjI3YSBtc203NjMwX3N1cmYgbXNtODA4NCBtc204OTUyIG1zbTg5OTIgbXNtODk5NCBtc204OTk2IG1zbTg5OTgsJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKSwpCiAgICAgaW5jbHVkZSAkKFFDT01fTUVESUFfUk9PVCkvbW0tY29yZS9BbmRyb2lkLm1rCiAgICAgaW5jbHVkZSAkKFFDT01fTUVESUFfUk9PVCkvbGlic3RhZ2VmcmlnaHRody9BbmRyb2lkLm1rCiAgIGVuZGlmCkBAIC0yMSwxMSArMjEsMTEgQEAKICAgICBpbmNsdWRlICQoUUNPTV9NRURJQV9ST09UKS9tbS12aWRlby1sZWdhY3kvQW5kcm9pZC5tawogICBlbmRpZgogCi0gIGlmbmVxICgkKGZpbHRlciBtc204NjEwIG1zbTgyMjYgbXNtODA4NCBtc204OTUyIG1zbTg5OTIgbXNtODk5NCBtc204OTk2IG1zbTg5OTggc2RtODQ1LCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQorICBpZm5lcSAoJChmaWx0ZXIgbXNtODYxMCBtc204MjI2IG1zbTgwODQgbXNtODk1MiBtc204OTkyIG1zbTg5OTQgbXNtODk5NiBtc204OTk4LCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQogICAgIGluY2x1ZGUgJChRQ09NX01FRElBX1JPT1QpL21tLXZpZGVvLXY0bDIvQW5kcm9pZC5tawogICBlbmRpZgogCi0gIGlmbmVxICgkKGZpbHRlciBtc204NjEwIG1zbTgyMjYgbXNtODk2MCBtc204MDg0IG1zbTg5NTIgbXNtODk5MiBtc204OTk0IG1zbTg5OTYgbXNtODk5OCBzZG04NDUsJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKSwpCisgIGlmbmVxICgkKGZpbHRlciBtc204NjEwIG1zbTgyMjYgbXNtODk2MCBtc204MDg0IG1zbTg5NTIgbXNtODk5MiBtc204OTk0IG1zbTg5OTYgbXNtODk5OCwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpLCkKICAgICBpbmNsdWRlICQoUUNPTV9NRURJQV9ST09UKS9saWJjMmRjb2xvcmNvbnZlcnQvQW5kcm9pZC5tawogICBlbmRpZgogZW5kaWYKZGlmZiAtLWdpdCBhL21zbTg5NzQvbGliYzJkY29sb3Jjb252ZXJ0L0FuZHJvaWQubWsgYi9tc204OTc0L2xpYmMyZGNvbG9yY29udmVydC9BbmRyb2lkLm1rCmluZGV4IDRlZGIwYTUuLmUwNTVjMDQgMTAwNjQ0Ci0tLSBhL21zbTg5NzQvbGliYzJkY29sb3Jjb252ZXJ0L0FuZHJvaWQubWsKKysrIGIvbXNtODk3NC9saWJjMmRjb2xvcmNvbnZlcnQvQW5kcm9pZC5tawpAQCAtNSw2ICs1LDggQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAgICAgICAgIEMyRENvbG9yQ29udmVydGVyLmNwcAogCitMT0NBTF9DRkxBR1MgKz0gLVduby1lcnJvcgorCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvcWNvbS9kaXNwbGF5CiAKZGlmZiAtLWdpdCBhL21zbTg5NzQvbW0tY29yZS9BbmRyb2lkLm1rIGIvbXNtODk3NC9tbS1jb3JlL0FuZHJvaWQubWsKaW5kZXggMmUyOTU1Yy4uZTI3MjdmNSAxMDA2NDQKLS0tIGEvbXNtODk3NC9tbS1jb3JlL0FuZHJvaWQubWsKKysrIGIvbXNtODk3NC9tbS1jb3JlL0FuZHJvaWQubWsKQEAgLTcsNiArNyw3IEBACiBPTVhDT1JFX0NGTEFHUyArPSAtTzAgLWZuby1pbmxpbmUgLWZuby1zaG9ydC1lbnVtcwogT01YQ09SRV9DRkxBR1MgKz0gLURfQU5EUk9JRF8KIE9NWENPUkVfQ0ZMQUdTICs9IC1VX0VOQUJMRV9RQ19NU0dfTE9HXworT01YQ09SRV9DRkxBR1MgKz0gLVduby1lcnJvcgogCiAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyAgICAgICAgICAgICBGaWd1cmUgb3V0IHRoZSB0YXJnZXRzCmRpZmYgLS1naXQgYS9tc204OTc0L21tLWNvcmUvb214Y29yZS9BbmRyb2lkLm1rIGIvbXNtODk3NC9tbS1jb3JlL29teGNvcmUvQW5kcm9pZC5tawppbmRleCAxOWNlZTZkLi4yZTk3MTlkIDEwMDY0NAotLS0gYS9tc204OTc0L21tLWNvcmUvb214Y29yZS9BbmRyb2lkLm1rCisrKyBiL21zbTg5NzQvbW0tY29yZS9vbXhjb3JlL0FuZHJvaWQubWsKQEAgLTMwLDYgKzMwLDcgQEAKIAogT01YQ09SRV9DRkxBR1MgKz0gLURfQU5EUk9JRF8KIE9NWENPUkVfQ0ZMQUdTICs9IC1EX0VOQUJMRV9RQ19NU0dfTE9HXworT01YQ09SRV9DRkxBR1MgKz0gLVduby1lcnJvcgogCiBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtN3gzMCkKICAgICBNTV9DT1JFX1RBUkdFVCA9IDc2MzAKZGlmZiAtLWdpdCBhL21zbTg5NzQvbW0tdmlkZW8tbGVnYWN5L3ZpZGMvdmRlYy5tayBiL21zbTg5NzQvbW0tdmlkZW8tbGVnYWN5L3ZpZGMvdmRlYy5tawppbmRleCA3OThlYWNmLi5iOGNlNDhiIDEwMDY0NAotLS0gYS9tc204OTc0L21tLXZpZGVvLWxlZ2FjeS92aWRjL3ZkZWMubWsKKysrIGIvbXNtODk3NC9tbS12aWRlby1sZWdhY3kvdmlkYy92ZGVjLm1rCkBAIC04Myw2ICs4Myw4IEBACiBMT0NBTF9TUkNfRklMRVMgICAgICAgICArPSBjb21tb24vc3JjL2V4dHJhX2RhdGFfaGFuZGxlci5jcHAKIExPQ0FMX1NSQ19GSUxFUyAgICAgICAgICs9IGNvbW1vbi9zcmMvdmlkY19jb2xvcl9jb252ZXJ0ZXIuY3BwCiAKK0xPQ0FMX0NGTEFHUyAgICAgICAgICAgICs9IC1Xbm8tZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9tbS12aWRlby1sZWdhY3kvdmlkYy92ZW5jLm1rIGIvbXNtODk3NC9tbS12aWRlby1sZWdhY3kvdmlkYy92ZW5jLm1rCmluZGV4IDc1ZTU5YTEuLjUyODVlZDYgMTAwNjQ0Ci0tLSBhL21zbTg5NzQvbW0tdmlkZW8tbGVnYWN5L3ZpZGMvdmVuYy5taworKysgYi9tc204OTc0L21tLXZpZGVvLWxlZ2FjeS92aWRjL3ZlbmMubWsKQEAgLTczLDYgKzczLDggQEAKIAogTE9DQUxfU1JDX0ZJTEVTICAgKz0gY29tbW9uL3NyYy9leHRyYV9kYXRhX2hhbmRsZXIuY3BwCiAKK0xPQ0FMX0NGTEFHUyAgICAgICs9IC1Xbm8tZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tc204OTc0L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjLm1rIGIvbXNtODk3NC9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy5tawppbmRleCA3MzM4ZDQ3Li5jNTNjYzdhIDEwMDY0NAotLS0gYS9tc204OTc0L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjLm1rCisrKyBiL21zbTg5NzQvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMubWsKQEAgLTEzOSw2ICsxMzksOCBAQAogIyBvbXhfdmRlY19tc204OTc0LmNwcDo5Mzc1OjE2OiBhZGRyZXNzIG9mIGFycmF5ICdleHRyYS0+ZGF0YScgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ3RydWUnCiBMT0NBTF9DTEFOR19DRkxBR1MgICAgICArPSAtV25vLXBvaW50ZXItYm9vbC1jb252ZXJzaW9uCiAKK0xPQ0FMX0NGTEFHUyAgICAgICAgICAgICs9IC1Xbm8tZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiAKQEAgLTE3Miw2ICsxNzQsOCBAQAogTE9DQUxfU1JDX0ZJTEVTICAgICAgICAgKz0gY29tbW9uL3NyYy9leHRyYV9kYXRhX2hhbmRsZXIuY3BwCiBMT0NBTF9TUkNfRklMRVMgICAgICAgICArPSBjb21tb24vc3JjL3ZpZGNfY29sb3JfY29udmVydGVyLmNwcAogCitMT0NBTF9DRkxBR1MgICAgICAgICAgICArPSAtV25vLWVycm9yCisKICNpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKIGVuZGlmCmRpZmYgLS1naXQgYS9tc204OTc0L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jLm1rIGIvbXNtODk3NC9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy5tawppbmRleCBmMDE5YmMyLi42NWNjZTlkIDEwMDY0NAotLS0gYS9tc204OTc0L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jLm1rCisrKyBiL21zbTg5NzQvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMubWsKQEAgLTEwNiw2ICsxMDYsOCBAQAogCiBMT0NBTF9TUkNfRklMRVMgICArPSBjb21tb24vc3JjL2V4dHJhX2RhdGFfaGFuZGxlci5jcHAKIAorTE9DQUxfQ0ZMQUdTICAgICAgKz0gLVduby1lcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKIGVuZGlmICNCVUlMRF9USU5ZX0FORFJPSUQKZGlmZiAtLWdpdCBhL21zbTg5OTYvbGliYzJkY29sb3Jjb252ZXJ0L0FuZHJvaWQubWsgYi9tc204OTk2L2xpYmMyZGNvbG9yY29udmVydC9BbmRyb2lkLm1rCmluZGV4IDE4NzE4NjQuLmVjMzAyODAgMTAwNjQ0Ci0tLSBhL21zbTg5OTYvbGliYzJkY29sb3Jjb252ZXJ0L0FuZHJvaWQubWsKKysrIGIvbXNtODk5Ni9saWJjMmRjb2xvcmNvbnZlcnQvQW5kcm9pZC5tawpAQCAtNSw2ICs1LDggQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAgICAgICAgIEMyRENvbG9yQ29udmVydGVyLmNwcAogCitMT0NBTF9DRkxBR1MgKz0gLVduby1lcnJvcgorCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvcWNvbS9kaXNwbGF5CiAKZGlmZiAtLWdpdCBhL21zbTg5OTYvbGliYzJkY29sb3Jjb252ZXJ0L0MyRENvbG9yQ29udmVydGVyLmNwcCBiL21zbTg5OTYvbGliYzJkY29sb3Jjb252ZXJ0L0MyRENvbG9yQ29udmVydGVyLmNwcAppbmRleCBlMDU2MGNiLi5hOTc2MTcxIDEwMDY0NAotLS0gYS9tc204OTk2L2xpYmMyZGNvbG9yY29udmVydC9DMkRDb2xvckNvbnZlcnRlci5jcHAKKysrIGIvbXNtODk5Ni9saWJjMmRjb2xvcmNvbnZlcnQvQzJEQ29sb3JDb252ZXJ0ZXIuY3BwCkBAIC0zMiwxMCArMzIsMTEgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L21zbV9rZ3NsLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxtZWRpYS9tc21fbWVkaWFfaW5mby5oPgogCiAjdW5kZWYgTE9HX1RBRwpkaWZmIC0tZ2l0IGEvbXNtODk5Ni9saWJzdGFnZWZyaWdodGh3L0FuZHJvaWQubWsgYi9tc204OTk2L2xpYnN0YWdlZnJpZ2h0aHcvQW5kcm9pZC5tawppbmRleCAwMWQwNGViLi41OTk2OWRmIDEwMDY0NAotLS0gYS9tc204OTk2L2xpYnN0YWdlZnJpZ2h0aHcvQW5kcm9pZC5taworKysgYi9tc204OTk2L2xpYnN0YWdlZnJpZ2h0aHcvQW5kcm9pZC5tawpAQCAtMjYsNiArMjYsOCBAQAogTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9KRUxMWUJFQU5fTVIyPTEKIGVuZGlmCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gbWVkaWFfcGx1Z2luX2hlYWRlcnMKKwogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZQpkaWZmIC0tZ2l0IGEvbXNtODk5Ni9tbS1jb3JlL0FuZHJvaWQubWsgYi9tc204OTk2L21tLWNvcmUvQW5kcm9pZC5tawppbmRleCBiZDFmN2Q4Li4xNDU5NGQ0IDEwMDY0NAotLS0gYS9tc204OTk2L21tLWNvcmUvQW5kcm9pZC5taworKysgYi9tc204OTk2L21tLWNvcmUvQW5kcm9pZC5tawpAQCAtNyw2ICs3LDcgQEAKIE9NWENPUkVfQ0ZMQUdTICs9IC1PMCAtZm5vLWlubGluZSAtZm5vLXNob3J0LWVudW1zCiBPTVhDT1JFX0NGTEFHUyArPSAtRF9BTkRST0lEXwogT01YQ09SRV9DRkxBR1MgKz0gLVVfRU5BQkxFX1FDX01TR19MT0dfCitPTVhDT1JFX0NGTEFHUyArPSAtV25vLWVycm9yCiAKICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjICAgICAgICAgICAgIEZpZ3VyZSBvdXQgdGhlIHRhcmdldHMKZGlmZiAtLWdpdCBhL21zbTg5OTYvbW0tdmlkZW8tdjRsMi92aWRjL2NvbW1vbi9BbmRyb2lkLm1rIGIvbXNtODk5Ni9tbS12aWRlby12NGwyL3ZpZGMvY29tbW9uL0FuZHJvaWQubWsKaW5kZXggZTYwOTJiYS4uMzg0MGZjMiAxMDA2NDQKLS0tIGEvbXNtODk5Ni9tbS12aWRlby12NGwyL3ZpZGMvY29tbW9uL0FuZHJvaWQubWsKKysrIGIvbXNtODk5Ni9tbS12aWRlby12NGwyL3ZpZGMvY29tbW9uL0FuZHJvaWQubWsKQEAgLTQ4LDYgKzQ4LDcgQEAKIGlmZXEgKCQoVEFSR0VUX0NPTVBJTEVfV0lUSF9NU01fS0VSTkVMKSx0cnVlKQogTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgKz0gJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURVMpL0tFUk5FTF9PQkovdXNyCiBlbmRpZgorTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9tc204OTk2L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL0FuZHJvaWQubWsgYi9tc204OTk2L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL0FuZHJvaWQubWsKaW5kZXggNGVlODgwMi4uMzlkZDE1ZiAxMDA2NDQKLS0tIGEvbXNtODk5Ni9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9BbmRyb2lkLm1rCisrKyBiL21zbTg5OTYvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvQW5kcm9pZC5tawpAQCAtMTE3LDcgKzExNyw3IEBACiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICA6PSBsaWJsb2cgbGlidXRpbHMgbGlidWkgbGliYmluZGVyIGxpYmN1dGlscyBsaWJkbAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJxZE1ldGFEYXRhCi1MT0NBTF9IRUFERVJfTElCUkFSSUVTICA6PSBjb3B5Yml0X2hlYWRlcnMgZ3JhbGxvY19oZWFkZXJzCitMT0NBTF9IRUFERVJfTElCUkFSSUVTICA6PSBjb3B5Yml0X2hlYWRlcnMgZ3JhbGxvY19oZWFkZXJzIG1lZGlhX3BsdWdpbl9oZWFkZXJzCiAKIExPQ0FMX1NSQ19GSUxFUyAgICAgICAgIDo9IHNyYy9mcmFtZXBhcnNlci5jcHAKIExPQ0FMX1NSQ19GSUxFUyAgICAgICAgICs9IHNyYy9oMjY0X3V0aWxzLmNwcApAQCAtMTI3LDYgKzEyNyw4IEBACiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICA6PSBsaWJPbXhWaWRjQ29tbW9uCiBMT0NBTF9TUkNfRklMRVMgICAgICAgICArPSBzcmMvb214X3ZkZWNfdjRsMi5jcHAKIAorTE9DQUxfQ0ZMQUdTICAgICAgICAgICAgKz0gLVduby1lcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKIApAQCAtMTUyLDYgKzE1NCw3IEBACiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICA6PSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYmN1dGlscyBsaWJkbAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJxZE1ldGFEYXRhCitMT0NBTF9IRUFERVJfTElCUkFSSUVTICA6PSBtZWRpYV9wbHVnaW5faGVhZGVycwogCiBMT0NBTF9TUkNfRklMRVMgICAgICAgICA6PSBzcmMvZnJhbWVwYXJzZXIuY3BwCiBMT0NBTF9TUkNfRklMRVMgICAgICAgICArPSBzcmMvaDI2NF91dGlscy5jcHAKQEAgLTE2OSw2ICsxNzIsOCBAQAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICA6PSBsaWJPbXhWaWRjQ29tbW9uCiAKK0xPQ0FMX0NGTEFHUyAgICAgICAgICAgICs9IC1Xbm8tZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogZW5kaWYKIGVuZGlmCmRpZmYgLS1naXQgYS9tc204OTk2L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy90c19wYXJzZXIuaCBiL21zbTg5OTYvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL3RzX3BhcnNlci5oCmluZGV4IDJkNWQxYTQuLjZkNTc2YWQgMTAwNjQ0Ci0tLSBhL21zbTg5OTYvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL3RzX3BhcnNlci5oCisrKyBiL21zbTg5OTYvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL3RzX3BhcnNlci5oCkBAIC0zNiw2ICszNiw3IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgogCiAjaWZkZWYgX0FORFJPSURfCiBleHRlcm4gIkMiIHsKZGlmZiAtLWdpdCBhL21zbTg5OTYvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvc3JjL29teF92ZGVjX3Y0bDIuY3BwIGIvbXNtODk5Ni9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9zcmMvb214X3ZkZWNfdjRsMi5jcHAKaW5kZXggYjJjYTQ1Yy4uZjVkZTk4MSAxMDA2NDQKLS0tIGEvbXNtODk5Ni9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9zcmMvb214X3ZkZWNfdjRsMi5jcHAKKysrIGIvbXNtODk5Ni9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9zcmMvb214X3ZkZWNfdjRsMi5jcHAKQEAgLTQ3NDcsMTIgKzQ3NDcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYykgewogICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiJXMgYnVmZmVyIG1vZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1ldGFidWZmZXItPmJTdG9yZU1ldGFEYXRhID09IHRydWUpPyAiRW5hYmxlZCBkeW5hbWljIiA6ICJEaXNhYmxlZCBkeW5hbWljIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY19idWZfbW9kZSA9IG1ldGFidWZmZXItPmJTdG9yZU1ldGFEYXRhOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byAlcyBidWZmZXIgbW9kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWV0YWJ1ZmZlci0+YlN0b3JlTWV0YURhdGEgPT0gdHJ1ZSk/ICJlbmFibGUgZHluYW1pYyIgOiAiZGlzYWJsZSBkeW5hbWljIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNfYnVmX21vZGUgPSBtZXRhYnVmZmVyLT5iU3RvcmVNZXRhRGF0YTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigKICAgICAgICAgICAgICAgICAgICAgICAgIk9NWF9RY29tSW5kZXhQYXJhbVZpZGVvTWV0YUJ1ZmZlck1vZGUgbm90IHN1cHBvcnRlZCBmb3IgcG9ydDogJXUiLApAQCAtNjIwMiw3ICs2MjAxLDcgQEAKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5wdXQgPSBOVUxMOwogICAgIHVuc2lnbmVkICAgaSA9IDA7CiAgICAgdW5zaWduZWQgY2hhciAqYnVmX2FkZHIgPSBOVUxMOwotICAgIGludCBwbWVtX2ZkID0gLTE7CisgICAgaW50IHBtZW1fZmQgPSAtMSwgcmV0ID0gMDsKIAogICAgICh2b2lkKSBoQ29tcDsKICAgICAodm9pZCkgcG9ydDsKQEAgLTYyMTUsNiArNjIxNCwyMSBAQAogICAgIH0KIAogICAgIGlmICghbV9pbnBfbWVtX3B0cikgeworICAgICAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyBidWZyZXE7CisgICAgICAgIGJ1ZnJlcS5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOworICAgICAgICBidWZyZXEudHlwZT1WNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisgICAgICAgIGJ1ZnJlcS5jb3VudCA9IGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50OworICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCxWSURJT0NfUkVRQlVGUywgJmJ1ZnJlcSk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXR0aW5nIGJ1ZmZlciByZXF1aXJlbWVudHMgKHJlcWJ1ZnMpIGZhaWxlZCAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAvKlRPRE86IEhvdyB0byBoYW5kbGUgdGhpcyBjYXNlICovCisgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICB9IGVsc2UgaWYgKGJ1ZnJlcS5jb3VudCAhPSBkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudCkgeworICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzIENvdW50KCVkKSBpcyBub3QgZXhwZWN0ZWQgdG8gY2hhbmdlIHRvICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50LCBidWZyZXEuY291bnQpOworICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgfQorCiAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkFsbG9jYXRlIGkvcCBidWZmZXIgSGVhZGVyOiBDbnQoJWQpIFN6KCV1KSIsCiAgICAgICAgICAgICAgICAgZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQsCiAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClkcnZfY3R4LmlwX2J1Zi5idWZmZXJfc2l6ZSk7CmRpZmYgLS1naXQgYS9tc204OTk2L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL0FuZHJvaWQubWsgYi9tc204OTk2L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL0FuZHJvaWQubWsKaW5kZXggZTFkYTQ2Yi4uYmMxMzdhOCAxMDA2NDQKLS0tIGEvbXNtODk5Ni9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9BbmRyb2lkLm1rCisrKyBiL21zbTg5OTYvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvQW5kcm9pZC5tawpAQCAtODksOSArODksOSBAQAogCiBMT0NBTF9QUkVMSU5LX01PRFVMRSAgICAgIDo9IGZhbHNlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICAgIDo9IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGliY3V0aWxzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliYzJkY29sb3Jjb252ZXJ0IGxpYmRsIGxpYmd1aQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJjMmRjb2xvcmNvbnZlcnQgbGliZGwKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICAgKz0gbGlicWRNZXRhRGF0YQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyAgICA6PSBjb3B5Yml0X2hlYWRlcnMgZ3JhbGxvY19oZWFkZXJzCitMT0NBTF9IRUFERVJfTElCUkFSSUVTICAgIDo9IGNvcHliaXRfaGVhZGVycyBncmFsbG9jX2hlYWRlcnMgbWVkaWFfcGx1Z2luX2hlYWRlcnMKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgICAgOj0gbGliT214VmlkY0NvbW1vbgogCiBMT0NBTF9TUkNfRklMRVMgICA6PSBzcmMvb214X3ZpZGVvX2Jhc2UuY3BwCkBAIC0xMTksNyArMTE5LDcgQEAKIAogTE9DQUxfUFJFTElOS19NT0RVTEUgICAgICA6PSBmYWxzZQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgICA6PSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYmN1dGlscyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmMyZGNvbG9yY29udmVydCBsaWJkbCBsaWJndWkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliYzJkY29sb3Jjb252ZXJ0IGxpYmRsCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICAgICs9IGxpYk1wZWc0U3dFbmNvZGVyCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICAgIDo9IGxpYk9teFZpZGNDb21tb24KIApAQCAtMTQ2LDggKzE0Niw5IEBACiAKIExPQ0FMX1BSRUxJTktfTU9EVUxFICAgICAgOj0gZmFsc2UKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICAgOj0gbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJjdXRpbHMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJjMmRjb2xvcmNvbnZlcnQgbGliZGwgbGliZ3VpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmMyZGNvbG9yY29udmVydCBsaWJkbAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgICArPSBsaWJIZXZjU3dFbmNvZGVyCitMT0NBTF9IRUFERVJfTElCUkFSSUVTICAgIDo9IG1lZGlhX3BsdWdpbl9oZWFkZXJzCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICAgIDo9IGxpYk9teFZpZGNDb21tb24KIAogTE9DQUxfU1JDX0ZJTEVTICAgOj0gc3JjL29teF92aWRlb19iYXNlLmNwcApkaWZmIC0tZ2l0IGEvbXNtODk5Ni9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9zcmMvb214X3ZpZGVvX2VuY29kZXIuY3BwIGIvbXNtODk5Ni9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9zcmMvb214X3ZpZGVvX2VuY29kZXIuY3BwCmluZGV4IGYxMDNhMTMuLjMxYWQ3MDIgMTAwNjQ0Ci0tLSBhL21zbTg5OTYvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvc3JjL29teF92aWRlb19lbmNvZGVyLmNwcAorKysgYi9tc204OTk2L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL3NyYy9vbXhfdmlkZW9fZW5jb2Rlci5jcHAKQEAgLTIxNDEsNiArMjE0MSwxNyBAQAogICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgRGVzY3JpYmVDb2xvckFzcGVjdHNQYXJhbXMpOwogICAgICAgICAgICAgICAgRGVzY3JpYmVDb2xvckFzcGVjdHNQYXJhbXMgKnBhcmFtcyA9IChEZXNjcmliZUNvbG9yQXNwZWN0c1BhcmFtcyAqKWNvbmZpZ0RhdGE7CiAgICAgICAgICAgICAgICBwcmludF9kZWJ1Z19jb2xvcl9hc3BlY3RzKCYocGFyYW1zLT5zQXNwZWN0cyksICJzZXRfY29uZmlnIik7CisKKyAgICAgICAgICAgICAgIC8vIFdBOiBBbmRyb2lkIGNsaWVudCBkb2VzIG5vdCBzZXQgdGhlIGNvcnJlY3QgY29sb3ItYXNwZWN0cyAoZnJvbSBkYXRhc3BhY2UpLgorICAgICAgICAgICAgICAgLy8gU3VjaCBhIGRhdGFzcGFjZSBjaGFuZ2UgaXMgZGV0ZWN0ZWQgYW5kIHNldCB3aGlsZSBpbiBleGVjdXRpbmcuIFRoaXMgbGVhZHMgdG8KKyAgICAgICAgICAgICAgIC8vIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgY2xpZW50IGlzIHRyeWluZyB0byBzZXQgKHdyb25nKSBjb2xvciBhbmQgY29tcG9uZW50IHRyeWluZworICAgICAgICAgICAgICAgLy8gdG8gc2V0IChyaWdodCkgY29sb3IgZnJvbSBFVEIuCisgICAgICAgICAgICAgICAvLyBIZW5jZSBpZ25vcmUgdGhpcyBjb25maWcgaW4gRXhlY3V0aW5nIHN0YXRlIHRpbGwgdGhlIGZyYW1ld29yayBzdGFydHMgc2V0dGluZyByaWdodCBjb2xvci4KKyAgICAgICAgICAgICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgeworICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJJZ25vcmluZyBDb2xvclNwYWNlIHNldHRpbmcgaW4gRXhlY3V0aW5nIHN0YXRlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7CisgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9jb25maWcoY29uZmlnRGF0YSwgKE9NWF9JTkRFWFRZUEUpT01YX1FUSUluZGV4Q29uZmlnRGVzY3JpYmVDb2xvckFzcGVjdHMpKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgT01YX1FUSUluZGV4Q29uZmlnRGVzY3JpYmVDb2xvckFzcGVjdHMiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwpkaWZmIC0tZ2l0IGEvbXNtODk5OC9saWJjMmRjb2xvcmNvbnZlcnQvQW5kcm9pZC5tayBiL21zbTg5OTgvbGliYzJkY29sb3Jjb252ZXJ0L0FuZHJvaWQubWsKaW5kZXggMmExYzIwYi4uOGM3NjdiYSAxMDA2NDQKLS0tIGEvbXNtODk5OC9saWJjMmRjb2xvcmNvbnZlcnQvQW5kcm9pZC5taworKysgYi9tc204OTk4L2xpYmMyZGNvbG9yY29udmVydC9BbmRyb2lkLm1rCkBAIC01LDYgKzUsOCBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKICAgICAgICAgQzJEQ29sb3JDb252ZXJ0ZXIuY3BwCiAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCisKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9hZHJlbm8KIExPQ0FMX0NfSU5DTFVERVMgKz0gJChUQVJHRVRfT1VUX0hFQURFUlMpL3Fjb20vZGlzcGxheQpkaWZmIC0tZ2l0IGEvbXNtODk5OC9saWJzdGFnZWZyaWdodGh3L0FuZHJvaWQubWsgYi9tc204OTk4L2xpYnN0YWdlZnJpZ2h0aHcvQW5kcm9pZC5tawppbmRleCAwYmFiY2RkLi4xNjkzMWU4IDEwMDY0NAotLS0gYS9tc204OTk4L2xpYnN0YWdlZnJpZ2h0aHcvQW5kcm9pZC5taworKysgYi9tc204OTk4L2xpYnN0YWdlZnJpZ2h0aHcvQW5kcm9pZC5tawpAQCAtMzgsNiArMzgsOCBAQAogTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX05BVElWRV9IQU5ETEVfU09VUkNFCiBlbmRpZgogCitMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgorCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvbW0tY29yZS9vbXhjb3JlLyBcCmRpZmYgLS1naXQgYS9tc204OTk4L21tLWNvcmUvQW5kcm9pZC5tayBiL21zbTg5OTgvbW0tY29yZS9BbmRyb2lkLm1rCmluZGV4IGFkMzZhODUuLjlhNTVhNzUgMTAwNjQ0Ci0tLSBhL21zbTg5OTgvbW0tY29yZS9BbmRyb2lkLm1rCisrKyBiL21zbTg5OTgvbW0tY29yZS9BbmRyb2lkLm1rCkBAIC03LDYgKzcsMTIgQEAKIE9NWENPUkVfQ0ZMQUdTICs9IC1PMCAtZm5vLWlubGluZSAtZm5vLXNob3J0LWVudW1zCiBPTVhDT1JFX0NGTEFHUyArPSAtRF9BTkRST0lEXwogT01YQ09SRV9DRkxBR1MgKz0gLVVfRU5BQkxFX1FDX01TR19MT0dfCitPTVhDT1JFX0NGTEFHUyArPSBcCisgICAgLVdhbGwgXAorICAgIC1XZXJyb3IgXAorICAgIC1Xbm8tdW51c2VkLWZ1bmN0aW9uIFwKKyAgICAtV25vLXVudXNlZC12YWx1ZSBcCisgICAgLVduby11bnVzZWQtdmFyaWFibGUgXAogCiAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyAgICAgICAgICAgICBGaWd1cmUgb3V0IHRoZSB0YXJnZXRzCmRpZmYgLS1naXQgYS9tc204OTk4L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL0FuZHJvaWQubWsgYi9tc204OTk4L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL0FuZHJvaWQubWsKaW5kZXggNTk3NmFkZC4uMjUwMzUwZSAxMDA2NDQKLS0tIGEvbXNtODk5OC9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9BbmRyb2lkLm1rCisrKyBiL21zbTg5OTgvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvQW5kcm9pZC5tawpAQCAtMTMxLDYgKzEzMSw4IEBACiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICA6PSBsaWJPbXhWaWRjQ29tbW9uCiBMT0NBTF9TUkNfRklMRVMgICAgICAgICArPSBzcmMvb214X3ZkZWNfdjRsMi5jcHAKIAorTE9DQUxfQ0ZMQUdTICAgICAgICAgICAgKz0gLVduby1lcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKIApkaWZmIC0tZ2l0IGEvbXNtODk5OC9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9zcmMvb214X3ZkZWNfdjRsMi5jcHAgYi9tc204OTk4L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL3NyYy9vbXhfdmRlY192NGwyLmNwcAppbmRleCBhOTczOTk4Li4wNGNkNDQyIDEwMDY0NAotLS0gYS9tc204OTk4L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL3NyYy9vbXhfdmRlY192NGwyLmNwcAorKysgYi9tc204OTk4L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL3NyYy9vbXhfdmRlY192NGwyLmNwcApAQCAtMTA0MSw2ICsxMDQxLDcgQEAKICAgICBib29sIGNwdV9hY2Nlc3MgPSAoY2FwdHVyZV9jYXBhYmlsaXR5ICE9IFY0TDJfUElYX0ZNVF9OVjEyX1VCV0MpICYmCiAgICAgICAgIGNhcHR1cmVfY2FwYWJpbGl0eSAhPSBWNEwyX1BJWF9GTVRfTlYxMl9UUDEwX1VCV0M7CiAgICAgYm9vbCB0cDEwX2VuYWJsZSA9ICFkcnZfY3R4Lmlkcl9vbmx5X2RlY29kaW5nICYmCisgICAgICAgICFjbGllbnRfYnVmZmVycy5pc19jb2xvcl9jb252ZXJzaW9uX2VuYWJsZWQoKSAmJgogICAgICAgICBkcGJfYml0X2RlcHRoID09IE1TTV9WSURDX0JJVF9ERVBUSF8xMDsKICAgICBib29sIGRpdGhlcl9lbmFibGUgPSB0cnVlOwogCkBAIC01MDg2LDEyICs1MDg3LDExIEBACiAgICAgICAgICAgICAgICAgICAgIGlmICghcmMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIiVzIGJ1ZmZlciBtb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXRhYnVmZmVyLT5iU3RvcmVNZXRhRGF0YSA9PSB0cnVlKT8gIkVuYWJsZWQgZHluYW1pYyIgOiAiRGlzYWJsZWQgZHluYW1pYyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNfYnVmX21vZGUgPSBtZXRhYnVmZmVyLT5iU3RvcmVNZXRhRGF0YTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gJXMgYnVmZmVyIG1vZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1ldGFidWZmZXItPmJTdG9yZU1ldGFEYXRhID09IHRydWUpPyAiZW5hYmxlIGR5bmFtaWMiIDogImRpc2FibGUgZHluYW1pYyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkeW5hbWljX2J1Zl9tb2RlID0gbWV0YWJ1ZmZlci0+YlN0b3JlTWV0YURhdGE7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoCiAgICAgICAgICAgICAgICAgICAgICAgICJPTVhfUWNvbUluZGV4UGFyYW1WaWRlb01ldGFCdWZmZXJNb2RlIG5vdCBzdXBwb3J0ZWQgZm9yIHBvcnQ6ICV1IiwKQEAgLTY3MjksNyArNjcyOSw3IEBACiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmlucHV0ID0gTlVMTDsKICAgICB1bnNpZ25lZCAgIGkgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgKmJ1Zl9hZGRyID0gTlVMTDsKLSAgICBpbnQgcG1lbV9mZCA9IC0xOworICAgIGludCBwbWVtX2ZkID0gLTEsIHJldCA9IDA7CiAKICAgICAodm9pZCkgaENvbXA7CiAgICAgKHZvaWQpIHBvcnQ7CkBAIC02NzQyLDYgKzY3NDIsMjEgQEAKICAgICB9CiAKICAgICBpZiAoIW1faW5wX21lbV9wdHIpIHsKKyAgICAgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgYnVmcmVxOworICAgICAgICBidWZyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKKyAgICAgICAgYnVmcmVxLnR5cGU9VjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworICAgICAgICBidWZyZXEuY291bnQgPSBkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudDsKKyAgICAgICAgcmV0ID0gaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsVklESU9DX1JFUUJVRlMsICZidWZyZXEpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU2V0dGluZyBidWZmZXIgcmVxdWlyZW1lbnRzIChyZXFidWZzKSBmYWlsZWQgJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgLypUT0RPOiBIb3cgdG8gaGFuZGxlIHRoaXMgY2FzZSAqLworICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgfSBlbHNlIGlmIChidWZyZXEuY291bnQgIT0gZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQpIHsKKyAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcyBDb3VudCglZCkgaXMgbm90IGV4cGVjdGVkIHRvIGNoYW5nZSB0byAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudCwgYnVmcmVxLmNvdW50KTsKKyAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIH0KKwogICAgICAgICBERUJVR19QUklOVF9ISUdIKCJBbGxvY2F0ZSBpL3AgYnVmZmVyIEhlYWRlcjogQ250KCVkKSBTeigldSkiLAogICAgICAgICAgICAgICAgIGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50LAogICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZHJ2X2N0eC5pcF9idWYuYnVmZmVyX3NpemUpOwpkaWZmIC0tZ2l0IGEvbXNtODk5OC9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9BbmRyb2lkLm1rIGIvbXNtODk5OC9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9BbmRyb2lkLm1rCmluZGV4IGZiZDlkNzguLmE2NjU5M2IgMTAwNjQ0Ci0tLSBhL21zbTg5OTgvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvQW5kcm9pZC5taworKysgYi9tc204OTk4L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL0FuZHJvaWQubWsKQEAgLTE2Miw2ICsxNjIsOCBAQAogTE9DQUxfU1JDX0ZJTEVTICAgOj0gc3JjL29teF92aWRlb19iYXNlLmNwcAogTE9DQUxfU1JDX0ZJTEVTICAgKz0gc3JjL29teF9zd3ZlbmNfbXBlZzQuY3BwCiAKK0xPQ0FMX0NGTEFHUyAgICAgICs9IC1Xbm8tZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogZW5kaWYKIApkaWZmIC0tZ2l0IGEvc2RtODQ1L0FuZHJvaWQubWsgYi9zZG04NDUvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU1Mzg5OS4uMDAwMDAwMAotLS0gYS9zZG04NDUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLVFDT01fTUVESUFfUk9PVCA6PSAkKGNhbGwgbXktZGlyKQotCi0jQ29tcGlsZSB0aGVzZSBmb3IgYWxsIHRhcmdldHMgdW5kZXIgUUNPTV9CT0FSRF9QTEFURk9STVMgbGlzdC4KLWlmZXEgKCQoY2FsbCBpcy1ib2FyZC1wbGF0Zm9ybS1pbi1saXN0LCAkKFFDT01fQk9BUkRfUExBVEZPUk1TKSksdHJ1ZSkKLWluY2x1ZGUgJChRQ09NX01FRElBX1JPT1QpL21tLWNvcmUvQW5kcm9pZC5tawotaW5jbHVkZSAkKFFDT01fTUVESUFfUk9PVCkvbGlic3RhZ2VmcmlnaHRody9BbmRyb2lkLm1rCi1lbmRpZgotCi1pZmVxICgkKGNhbGwgaXMtYm9hcmQtcGxhdGZvcm0taW4tbGlzdCwgJChNU01fVklEQ19UQVJHRVRfTElTVCkpLHRydWUpCi1pbmNsdWRlICQoUUNPTV9NRURJQV9ST09UKS9tbS12aWRlby12NGwyL0FuZHJvaWQubWsKLWluY2x1ZGUgJChRQ09NX01FRElBX1JPT1QpL2xpYmMyZGNvbG9yY29udmVydC9BbmRyb2lkLm1rCi1lbmRpZgpkaWZmIC0tZ2l0IGEvc2RtODQ1L0NsZWFuU3BlYy5tayBiL3NkbTg0NS9DbGVhblNwZWMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4NGUxYjYuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L0NsZWFuU3BlYy5taworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgSWYgeW91IGRvbid0IG5lZWQgdG8gZG8gYSBmdWxsIGNsZWFuIGJ1aWxkIGJ1dCB3b3VsZCBsaWtlIHRvIHRvdWNoCi0jIGEgZmlsZSBvciBkZWxldGUgc29tZSBpbnRlcm1lZGlhdGUgZmlsZXMsIGFkZCBhIGNsZWFuIHN0ZXAgdG8gdGhlIGVuZAotIyBvZiB0aGUgbGlzdC4gIFRoZXNlIHN0ZXBzIHdpbGwgb25seSBiZSBydW4gb25jZSwgaWYgdGhleSBoYXZlbid0IGJlZW4KLSMgcnVuIGJlZm9yZS4KLSMKLSMgRS5nLjoKLSMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgdG91Y2ggLWMgZXh0ZXJuYWwvc3FsaXRlL3NxbGl0ZTMuaCkKLSMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TVEFUSUNfTElCUkFSSUVTL2xpYnpfaW50ZXJtZWRpYXRlcykKLSMKLSMgQWx3YXlzIHVzZSAidG91Y2ggLWMiIGFuZCAicm0gLWYiIG9yICJybSAtcmYiIHRvIGdyYWNlZnVsbHkgZGVhbCB3aXRoCi0jIGZpbGVzIHRoYXQgYXJlIG1pc3Npbmcgb3IgaGF2ZSBiZWVuIG1vdmVkLgotIwotIyBVc2UgJChQUk9EVUNUX09VVCkgdG8gZ2V0IHRvIHRoZSAib3V0L3RhcmdldC9wcm9kdWN0L2JsYWgvIiBkaXJlY3RvcnkuCi0jIFVzZSAkKE9VVF9ESVIpIHRvIHJlZmVyIHRvIHRoZSAib3V0IiBkaXJlY3RvcnkuCi0jCi0jIElmIHlvdSBuZWVkIHRvIHJlLWRvIHNvbWV0aGluZyB0aGF0J3MgYWxyZWFkeSBtZW50aW9uZWQsIGp1c3QgY29weQotIyB0aGUgY29tbWFuZCBhbmQgYWRkIGl0IHRvIHRoZSBib3R0b20gb2YgdGhlIGxpc3QuICBFLmcuLCBpZiBhIGNoYW5nZQotIyB0aGF0IHlvdSBtYWRlIGxhc3Qgd2VlayByZXF1aXJlZCB0b3VjaGluZyBhIGZpbGUgYW5kIGEgY2hhbmdlIHlvdQotIyBtYWRlIHRvZGF5IHJlcXVpcmVzIHRvdWNoaW5nIHRoZSBzYW1lIGZpbGUsIGp1c3QgY29weSB0aGUgb2xkCi0jIHRvdWNoIHN0ZXAgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgotIwotIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCi0jICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIEZvciBleGFtcGxlOgotIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9BbmRyb2lkVGVzdHNfaW50ZXJtZWRpYXRlcykKLSMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NvcmVfaW50ZXJtZWRpYXRlcykKLSMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChPVVRfRElSKSAtdHlwZSBmIC1uYW1lICJJR1RhbGtTZXNzaW9uKiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mKQotIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL2RhdGEvKikKLQotIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCi0jICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvc2RtODQ1L01ha2VmaWxlLmFtIGIvc2RtODQ1L01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzE1MjYzLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgTWFrZWZpbGUuYW0gLSBBdXRvbWFrZSBzY3JpcHQgZm9yIG1tLW9teHZpZGVvCi0jCi1BQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNAotCi1CVUlMRF9DT01QT05FTlRTIDo9IG1tLWNvcmUKLQotaWYgQlVJTERfTU1fVklERU8KLUJVSUxEX0NPTVBPTkVOVFMgKz0gbW0tdmlkZW8tdjRsMgotZW5kaWYKLQotU1VCRElSUyA6PSAkKEJVSUxEX0NPTVBPTkVOVFMpCmRpZmYgLS1naXQgYS9zZG04NDUvTk9USUNFIGIvc2RtODQ1L05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0YjQ2ZS4uMDAwMDAwMAotLS0gYS9zZG04NDUvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotQ29weXJpZ2h0IChjKSAyMDA5LTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLU9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLUlGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0tLS0KLUNvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0tLS0KLUNvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0iU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi13aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi1kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLXBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLWluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLUNMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi1UT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSBNaWNyb3NvZnQgU2t5cGUgRW5naW5lZXJpbmcKLSBDb3B5cmlnaHQgKEMpIDIwMTQgTWljcm9zb2Z0IENvcnBvcmF0aW9uLgotCi1NSVQgTGljZW5zZQotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci0gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLSBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi0gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi0gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi0gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgotIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL3NkbTg0NS9jb25mX2ZpbGVzL2NvbmZpZy5tayBiL3NkbTg0NS9jb25mX2ZpbGVzL2NvbmZpZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxZTAzNi4uMDAwMDAwMAotLS0gYS9zZG04NDUvY29uZl9maWxlcy9jb25maWcubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWlmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSxtc204OTM3KQotUFJPRFVDVF9DT1BZX0ZJTEVTICs9IGhhcmR3YXJlL3Fjb20vbWVkaWEvY29uZl9maWxlcy9tc204OTM3L21lZGlhX3Byb2ZpbGVzXzg5MzcueG1sOnN5c3RlbS9ldGMvbWVkaWFfcHJvZmlsZXMueG1sIFwKLSAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZS9xY29tL21lZGlhL2NvbmZfZmlsZXMvbXNtODkzNy9tZWRpYV9jb2RlY3NfODkzNy54bWw6c3lzdGVtL2V0Yy9tZWRpYV9jb2RlY3MueG1sIFwKLSAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZS9xY29tL21lZGlhL2NvbmZfZmlsZXMvbXNtODkzNy9tZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2VfODkzNy54bWw6c3lzdGVtL2V0Yy9tZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sCi1lbmRpZiAjVEFSR0VUX0JPQVJEX1BMQVRGT1JNCmRpZmYgLS1naXQgYS9zZG04NDUvY29uZl9maWxlcy9tc204OTM3L21lZGlhX2NvZGVjc184OTM3LnhtbCBiL3NkbTg0NS9jb25mX2ZpbGVzL21zbTg5MzcvbWVkaWFfY29kZWNzXzg5MzcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTExYWY5Li4wMDAwMDAwCi0tLSBhL3NkbTg0NS9jb25mX2ZpbGVzL21zbTg5MzcvbWVkaWFfY29kZWNzXzg5MzcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICAgICBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgIE5vdCBhIGNvbnRyaWJ1dGlvbi4KLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLQotPCFET0NUWVBFIE1lZGlhQ29kZWNzIFsKLTwhRUxFTUVOVCBJbmNsdWRlIEVNUFRZPgotPCFBVFRMSVNUIEluY2x1ZGUgaHJlZiBDREFUQSAjUkVRVUlSRUQ+Ci08IUVMRU1FTlQgTWVkaWFDb2RlY3MgKERlY29kZXJzfEVuY29kZXJzfEluY2x1ZGUpKj4KLTwhRUxFTUVOVCBEZWNvZGVycyAoTWVkaWFDb2RlY3xJbmNsdWRlKSo+Ci08IUVMRU1FTlQgRW5jb2RlcnMgKE1lZGlhQ29kZWN8SW5jbHVkZSkqPgotPCFFTEVNRU5UIE1lZGlhQ29kZWMgKFR5cGV8UXVpcmt8SW5jbHVkZSkqPgotPCFBVFRMSVNUIE1lZGlhQ29kZWMgbmFtZSBDREFUQSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgTWVkaWFDb2RlYyB0eXBlIENEQVRBPgotPCFFTEVNRU5UIFR5cGUgRU1QVFk+Ci08IUFUVExJU1QgVHlwZSBuYW1lIENEQVRBICNSRVFVSVJFRD4KLTwhRUxFTUVOVCBRdWlyayBFTVBUWT4KLTwhQVRUTElTVCBRdWlyayBuYW1lIENEQVRBICNSRVFVSVJFRD4KLV0+Ci0KLVRoZXJlJ3MgYSBzaW1wbGUgYW5kIGEgY29tcGxleCBzeW50YXggdG8gZGVjbGFyZSB0aGUgYXZhaWxhYmlsaXR5IG9mIGEKLW1lZGlhIGNvZGVjOgotCi1BIGNvZGVjIHRoYXQgcHJvcGVybHkgZm9sbG93cyB0aGUgT3Blbk1heCBzcGVjIGFuZCB0aGVyZWZvcmUgZG9lc24ndCBoYXZlIGFueQotcXVpcmtzIGFuZCB0aGF0IG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgY29udGVudCB0eXBlIGNhbiBiZSBkZWNsYXJlZCBsaWtlIHNvOgotCi0gICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmZvby5iYXIiIHR5cGU9InNvbWV0aGluZy9pbnRlcmVzdGluZyIgLz4KLQotSWYgYSBjb2RlYyBoYXMgcXVpcmtzIE9SIHN1cHBvcnRzIG11bHRpcGxlIGNvbnRlbnQgdHlwZXMsIHRoZSBmb2xsb3dpbmcgc3ludGF4Ci1jYW4gYmUgdXNlZDoKLQotICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5mb28uYmFyIiA+Ci0gICAgICAgIDxUeXBlIG5hbWU9InNvbWV0aGluZy9pbnRlcmVzdGluZyIgLz4KLSAgICAgICAgPFR5cGUgbmFtZT0ic29tZXRoaW5nL2Vsc2UiIC8+Ci0gICAgICAgIC4uLgotICAgICAgICA8UXVpcmsgbmFtZT0icmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiIC8+Ci0gICAgICAgIDxRdWlyayBuYW1lPSJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiIC8+Ci0gICAgICAgIDxRdWlyayBuYW1lPSJvdXRwdXQtYnVmZmVycy1hcmUtdW5yZWFkYWJsZSIgLz4KLSAgICA8L01lZGlhQ29kZWM+Ci0KLU9ubHkgdGhlIHRocmVlIHF1aXJrcyBpbmNsdWRlZCBhYm92ZSBhcmUgcmVjb2duaXplZCBhdCB0aGlzIHBvaW50OgotCi0icmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiCi0gICAgbXVzdCBiZSBhZHZlcnRpc2VkIGlmIHRoZSBjb21wb25lbnQgZG9lcyBub3QgcHJvcGVybHkgc3VwcG9ydCBzcGVjaWZpY2F0aW9uCi0gICAgb2YgaW5wdXQgYnVmZmVycyB1c2luZyB0aGUgT01YX1VzZUJ1ZmZlciguLi4pIEFQSSBidXQgaW5zdGVhZCByZXF1aXJlcwotICAgIE9NWF9BbGxvY2F0ZUJ1ZmZlciB0byBiZSB1c2VkLgotCi0icmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIgotICAgIG11c3QgYmUgYWR2ZXJ0aXNlZCBpZiB0aGUgY29tcG9uZW50IGRvZXMgbm90IHByb3Blcmx5IHN1cHBvcnQgc3BlY2lmaWNhdGlvbgotICAgIG9mIG91dHB1dCBidWZmZXJzIHVzaW5nIHRoZSBPTVhfVXNlQnVmZmVyKC4uLikgQVBJIGJ1dCBpbnN0ZWFkIHJlcXVpcmVzCi0gICAgT01YX0FsbG9jYXRlQnVmZmVyIHRvIGJlIHVzZWQuCi0KLSJvdXRwdXQtYnVmZmVycy1hcmUtdW5yZWFkYWJsZSIKLSAgICBtdXN0IGJlIGFkdmVydGlzZWQgaWYgdGhlIGVtaXR0ZWQgb3V0cHV0IGJ1ZmZlcnMgb2YgYSBkZWNvZGVyIGNvbXBvbmVudAotICAgIGFyZSBub3QgcmVhZGFibGUsIGkuZS4gdXNlIGEgY3VzdG9tIGZvcm1hdCBldmVuIHRob3VnaCBhYnVzaW5nIG9uZSBvZgotICAgIHRoZSBvZmZpY2lhbCBPTVggY29sb3JzcGFjZSBjb25zdGFudHMuCi0gICAgQ2xpZW50cyBvZiBzdWNoIGRlY29kZXJzIHdpbGwgbm90IGJlIGFibGUgdG8gYWNjZXNzIHRoZSBkZWNvZGVkIGRhdGEsCi0gICAgbmF0dXJhbGx5IG1ha2luZyB0aGUgY29tcG9uZW50IG11Y2ggbGVzcyB1c2VmdWwuIFRoZSBvbmx5IHVzZSBmb3IKLSAgICBhIGNvbXBvbmVudCB3aXRoIHRoaXMgcXVpcmsgaXMgdG8gcmVuZGVyIHRoZSBvdXRwdXQgdG8gdGhlIHNjcmVlbi4KLSAgICBBdWRpbyBkZWNvZGVycyBNVVNUIE5PVCBhZHZlcnRpc2UgdGhpcyBxdWlyay4KLSAgICBWaWRlbyBkZWNvZGVycyB0aGF0IGFkdmVydGlzZSB0aGlzIHF1aXJrIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYQotICAgIGNvcnJlc3BvbmRpbmcgY29sb3Igc3BhY2UgY29udmVydGVyIGZvciB0aHVtYm5haWwgZXh0cmFjdGlvbiwKLSAgICBtYXRjaGluZyBzdXJmYWNlZmxpbmdlciBzdXBwb3J0IHRoYXQgY2FuIHJlbmRlciB0aGUgY3VzdG9tIGZvcm1hdCB0bwotICAgIGEgdGV4dHVyZSBhbmQgcG9zc2libHkgb3RoZXIgY29kZSwgc28ganVzdCBET04nVCBVU0UgVEhJUyBRVUlSSy4KLQotCi0tLT4KLQotPCEtLQotICBEZWNvZGVyIGNhcGFiaWxpdGllcyBmb3IgdGhvcml1bQotICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotICB8IENvZGVjICAgIHwgVyAgICAgICBIICAgICAgIGZwcyAgICAgTWJwcyAgICBNQi9zICAgIHwgRW5jb2RlIFNlY3VyZS1kZWMgfAotICB8X19fX19fX19fX3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3xfX19fX19fX19fX19fX19fX19ffAotICB8IGgyNjQgICAgIHwgMTkyMCAgICAxMDg4ICAgIDMwICAgICAgMjAgICAgICAyNDQ4MDAgIHwgIFkgICAgICAgWSAgICAgICAgfAotICB8IGhldmMgICAgIHwgMTkyMCAgICAxMDg4ICAgIDMwICAgICAgMjAgICAgICAyNDQ4MDAgIHwgIE4gICAgICAgTiAgICAgICAgfAotICB8IG1wZWc0ICAgIHwgMTkyMCAgICAxMDg4ICAgIDMwICAgICAgNiAgICAgICAyNDQ4MDAgIHwgIFkgICAgICAgTiAgICAgICAgfAotICB8IHZwOCAgICAgIHwgMTkyMCAgICAxMDg4ICAgIDMwICAgICAgMjAgICAgICAyNDQ4MDAgIHwgIE4gICAgICAgTiAgICAgICAgfAotICB8IGRpdjQvNS82IHwgMTkyMCAgICAxMDg4ICAgIDMwICAgICAgNiAgICAgICAyNDQ4MDAgIHwgIE4gICAgICAgTiAgICAgICAgfAotICB8IGgyNjMgICAgIHwgIDg2NCAgICAgNDgwICAgIDMwICAgICAgMiAgICAgICA0ODYwMCAgIHwgIFkgICAgICAgTiAgICAgICAgfAotICB8X19fX19fX19fX3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3xfX19fX19fX19fX19fX19fX19ffAotCi0tLT4KLQotPCEtLQotICBFbmNvZGVyIGNhcGFiaWxpdGllcyBmb3IgdGhvcml1bQotICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotICB8IENvZGVjICAgIHwgVyAgICAgICBIICAgICAgIGZwcyAgICAgTWJwcyAgICBNQi9zICAgIHwKLSAgfF9fX19fX19fX198X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0gIHwgaDI2NCAgICAgfCAxOTIwICAgIDEwODggICAgMzAgICAgICAyMCAgICAgIDI0NDgwMCAgfAotICB8IG1wZWc0ICAgIHwgODY0ICAgICAgNDgwICAgIDMwICAgICAgIDIgICAgICAgNDg2MDAgIHwKLSAgfCBoMjYzICAgICB8IDg2NCAgICAgIDQ4MCAgICAzMCAgICAgICAyICAgICAgIDQ4NjAwICB8Ci0gIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotLS0+Ci0KLTxNZWRpYUNvZGVjcz4KLSAgICA8SW5jbHVkZSBocmVmPSJtZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbCIgLz4KLSAgICA8SW5jbHVkZSBocmVmPSJtZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWwiIC8+Ci0gICAgPFNldHRpbmdzPgotICAgICAgICA8U2V0dGluZyBuYW1lPSJtYXgtdmlkZW8tZW5jb2Rlci1pbnB1dC1idWZmZXJzIiB2YWx1ZT0iOSIgLz4KLSAgICA8L1NldHRpbmdzPgotICAgIDxFbmNvZGVycz4KLSAgICAgICAgPCEtLSBWaWRlbyBIYXJkd2FyZSAgLS0+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIiB0eXBlPSJ2aWRlby9hdmMiID4KLSAgICAgICAgICAgIDxRdWlyayBuYW1lPSJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIgLz4KLSAgICAgICAgICAgIDxRdWlyayBuYW1lPSJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiIC8+Ci0gICAgICAgICAgICA8UXVpcmsgbmFtZT0icmVxdWlyZXMtbG9hZGVkLXRvLWlkbGUtYWZ0ZXItYWxsb2NhdGlvbiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49Ijk2eDY0IiBtYXg9IjE5MjB4MTA4OCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiBtaW49IjEiIG1heD0iMjQ0ODAwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIwMDAwMDAwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbmN1cnJlbnQtaW5zdGFuY2VzIiBtYXg9IjgiIC8+Ci0gICAgICAgIDwvTWVkaWFDb2RlYz4KLSAgICAgICAgPCEtLSBWaWRlbyBTb2Z0d2FyZSAgLS0+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzRzdyIgdHlwZT0idmlkZW8vbXA0di1lcyIgPgotICAgICAgICAgICAgPFF1aXJrIG5hbWU9InJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIiAvPgotICAgICAgICAgICAgPFF1aXJrIG5hbWU9InJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIgLz4KLSAgICAgICAgICAgIDxRdWlyayBuYW1lPSJyZXF1aXJlcy1sb2FkZWQtdG8taWRsZS1hZnRlci1hbGxvY2F0aW9uIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMzJ4MzIiIG1heD0iODY0eDQ4MCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiBtaW49IjEiIG1heD0iNDg2MDAiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb25jdXJyZW50LWluc3RhbmNlcyIgbWF4PSIxIiAvPgotICAgICAgICA8L01lZGlhQ29kZWM+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5xY29tLnZpZGVvLmVuY29kZXIuaDI2M3N3IiB0eXBlPSJ2aWRlby8zZ3BwIiA+Ci0gICAgICAgICAgICA8UXVpcmsgbmFtZT0icmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiIC8+Ci0gICAgICAgICAgICA8UXVpcmsgbmFtZT0icmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIiAvPgotICAgICAgICAgICAgPFF1aXJrIG5hbWU9InJlcXVpcmVzLWxvYWRlZC10by1pZGxlLWFmdGVyLWFsbG9jYXRpb24iIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIzMngzMiIgbWF4PSI4NjR4NDgwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjR4NCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIG1pbj0iMSIgbWF4PSI0ODYwMCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbmN1cnJlbnQtaW5zdGFuY2VzIiBtYXg9IjEiIC8+Ci0gICAgICAgIDwvTWVkaWFDb2RlYz4KLSAgICA8L0VuY29kZXJzPgotICAgIDxEZWNvZGVycz4KLSAgICAgICAgPCEtLSBBdWRpbyBTb2Z0d2FyZSAgLS0+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5xdGkuYXVkaW8uZGVjb2Rlci5mbGFjIiB0eXBlPSJhdWRpby9mbGFjIiAvPgotICAgICAgICA8IS0tIFZpZGVvIEhhcmR3YXJlICAtLT4KLSAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiIHR5cGU9InZpZGVvL2F2YyIgPgotICAgICAgICAgICAgPFF1aXJrIG5hbWU9InJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIiAvPgotICAgICAgICAgICAgPFF1aXJrIG5hbWU9InJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIgLz4KLSAgICAgICAgICAgIDxRdWlyayBuYW1lPSJkZWZlcnMtb3V0cHV0LWJ1ZmZlci1hbGxvY2F0aW9uIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iNjR4NjQiIG1heD0iMTkyMHgxMDg4IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIG1pbj0iMSIgbWF4PSIyNDQ4MDAiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMDAiIC8+Ci0gICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb25jdXJyZW50LWluc3RhbmNlcyIgbWF4PSI4IiAvPgotICAgICAgICA8L01lZGlhQ29kZWM+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA4IiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4IiA+Ci0gICAgICAgICAgICA8UXVpcmsgbmFtZT0icmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiIC8+Ci0gICAgICAgICAgICA8UXVpcmsgbmFtZT0icmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIiAvPgotICAgICAgICAgICAgPFF1aXJrIG5hbWU9ImRlZmVycy1vdXRwdXQtYnVmZmVyLWFsbG9jYXRpb24iIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSI2NHg2NCIgbWF4PSIxOTIweDEwODgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgbWluPSIxIiBtYXg9IjI0NDgwMCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwMCIgLz4KLSAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbmN1cnJlbnQtaW5zdGFuY2VzIiBtYXg9IjgiIC8+Ci0gICAgICAgIDwvTWVkaWFDb2RlYz4KLSAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLnFjb20udmlkZW8uZGVjb2Rlci5oZXZjIiB0eXBlPSJ2aWRlby9oZXZjIiA+Ci0gICAgICAgICAgICA8UXVpcmsgbmFtZT0icmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiIC8+Ci0gICAgICAgICAgICA8UXVpcmsgbmFtZT0icmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIiAvPgotICAgICAgICAgICAgPFF1aXJrIG5hbWU9ImRlZmVycy1vdXRwdXQtYnVmZmVyLWFsbG9jYXRpb24iIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSI2NHg2NCIgbWF4PSIxOTIweDEwODgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgbWluPSIxIiBtYXg9IjI0NDgwMCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwMCIgLz4KLSAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbmN1cnJlbnQtaW5zdGFuY2VzIiBtYXg9IjgiIC8+Ci0gICAgICAgIDwvTWVkaWFDb2RlYz4KLSAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLnF0aS52aWRlby5kZWNvZGVyLmRpdnhzdyIgdHlwZT0idmlkZW8vZGl2eCIgPgotICAgICAgICAgICAgPFF1aXJrIG5hbWU9InJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIiAvPgotICAgICAgICAgICAgPFF1aXJrIG5hbWU9InJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE5MjB4MTA4OCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiBtaW49IjEiIG1heD0iMjQ0ODAwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTYwMDAwMDAiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iY29uY3VycmVudC1pbnN0YW5jZXMiIG1heD0iMSIgLz4KLSAgICAgICAgPC9NZWRpYUNvZGVjPgotICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVgucXRpLnZpZGVvLmRlY29kZXIuZGl2eDRzdyIgdHlwZT0idmlkZW8vZGl2eDQiID4KLSAgICAgICAgICAgIDxRdWlyayBuYW1lPSJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIgLz4KLSAgICAgICAgICAgIDxRdWlyayBuYW1lPSJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxOTIweDEwODgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgbWluPSIxIiBtYXg9IjI0NDgwMCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS02MDAwMDAwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbmN1cnJlbnQtaW5zdGFuY2VzIiBtYXg9IjEiIC8+Ci0gICAgICAgIDwvTWVkaWFDb2RlYz4KLSAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLnF0aS52aWRlby5kZWNvZGVyLm1wZWc0c3ciPgotICAgICAgICAgICAgPFR5cGUgbmFtZT0idmlkZW8vbXA0di1lcyIgLz4KLSAgICAgICAgICAgIDxUeXBlIG5hbWU9InZpZGVvL21wNHYtZXNkcCIgLz4KLSAgICAgICAgICAgIDxRdWlyayBuYW1lPSJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIgLz4KLSAgICAgICAgICAgIDxRdWlyayBuYW1lPSJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxOTIweDEwODgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgbWluPSIxIiBtYXg9IjI0NDgwMCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS02MDAwMDAwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbmN1cnJlbnQtaW5zdGFuY2VzIiBtYXg9IjEiIC8+Ci0gICAgICAgIDwvTWVkaWFDb2RlYz4KLSAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLnF0aS52aWRlby5kZWNvZGVyLmgyNjNzdyIgdHlwZT0idmlkZW8vM2dwcCIgPgotICAgICAgICAgICAgPFF1aXJrIG5hbWU9InJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIiAvPgotICAgICAgICAgICAgPFF1aXJrIG5hbWU9InJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9Ijg2NHg0ODAiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iNHg0IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgbWluPSIxIiBtYXg9IjQ4NjAwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIwMDAwMDAiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iY29uY3VycmVudC1pbnN0YW5jZXMiIG1heD0iMSIgLz4KLSAgICAgICAgPC9NZWRpYUNvZGVjPgotICAgIDwvRGVjb2RlcnM+Ci0gICAgPEluY2x1ZGUgaHJlZj0ibWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwiIC8+Ci08L01lZGlhQ29kZWNzPgpkaWZmIC0tZ2l0IGEvc2RtODQ1L2NvbmZfZmlsZXMvbXNtODkzNy9tZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2VfODkzNy54bWwgYi9zZG04NDUvY29uZl9maWxlcy9tc204OTM3L21lZGlhX2NvZGVjc19wZXJmb3JtYW5jZV84OTM3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxNWFjMi4uMDAwMDAwMAotLS0gYS9zZG04NDUvY29uZl9maWxlcy9tc204OTM3L21lZGlhX2NvZGVjc19wZXJmb3JtYW5jZV84OTM3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KLTwhLS0gQ29weXJpZ2h0IChjKSAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICBOb3QgYSBDb250cmlidXRpb24uCi0KLSAgICAgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TWVkaWFDb2RlY3M+Ci0gICAgPEVuY29kZXJzPgotICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIgdHlwZT0idmlkZW8vYXZjIiB1cGRhdGU9InRydWUiPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtMzIweDI0MCIgcmFuZ2U9IjM3Ny0zNzciIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS03MjB4NDgwIiByYW5nZT0iMTEzLTExMyIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTEyODB4NzIwIiByYW5nZT0iNzYtNzYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0xOTIweDEwODAiIHJhbmdlPSI0NC00NCIgLz4KLSAgICAgICAgPC9NZWRpYUNvZGVjPgotICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVgucWNvbS52aWRlby5lbmNvZGVyLmgyNjNzdyIgdHlwZT0idmlkZW8vM2dwcCIgdXBkYXRlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTE3NngxNDQiIHJhbmdlPSIxNjAtMTYwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtMzUyeDI4OCIgcmFuZ2U9Ijg2LTg2IiAvPgotICAgICAgICA8L01lZGlhQ29kZWM+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzRzdyIgdHlwZT0idmlkZW8vbXA0di1lcyIgdXBkYXRlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTE3NngxNDQiIHJhbmdlPSIxNzktMTc5IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtMzUyeDI4OCIgcmFuZ2U9Ijg0LTg0IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtNjQweDQ4MCIgcmFuZ2U9IjU0LTU0IiAvPgotICAgICAgICA8L01lZGlhQ29kZWM+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiIHVwZGF0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0zMjB4MjQwIiByYW5nZT0iMjA4LTIwOCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTcyMHg0ODAiIHJhbmdlPSI5OC05OCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTEyODB4NzIwIiByYW5nZT0iNDQtNDQiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0xOTIweDEwODAiIHJhbmdlPSIyMS0yMSIgLz4KLSAgICAgICAgPC9NZWRpYUNvZGVjPgotICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjMuZW5jb2RlciIgdHlwZT0idmlkZW8vM2dwcCIgdXBkYXRlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTE3NngxNDQiIHJhbmdlPSIzOTctMzk3IiAvPgotICAgICAgICA8L01lZGlhQ29kZWM+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyIgdXBkYXRlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTE3NngxNDQiIHJhbmdlPSI0MTMtNDEzIiAvPgotICAgICAgICA8L01lZGlhQ29kZWM+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudnA4LmVuY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiIHVwZGF0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0zMjB4MTgwIiByYW5nZT0iMzI4LTMyOCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTY0MHgzNjAiIHJhbmdlPSIxNTgtMTU4IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtMTI4MHg3MjAiIHJhbmdlPSI2NS02NSIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTE5MjB4MTA4MCIgcmFuZ2U9IjI5LTI5IiAvPgotICAgICAgICA8L01lZGlhQ29kZWM+Ci0gICAgPC9FbmNvZGVycz4KLSAgICA8RGVjb2RlcnM+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjIiB0eXBlPSJ2aWRlby9hdmMiIHVwZGF0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0zMjB4MjQwIiByYW5nZT0iNTcwLTU3MCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTcyMHg0ODAiIHJhbmdlPSIyODAtMjgwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtMTI4MHg3MjAiIHJhbmdlPSIxNTUtMTU1IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtMTkyMHgxMDg4IiByYW5nZT0iNTctNTciIC8+Ci0gICAgICAgIDwvTWVkaWFDb2RlYz4KLSAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLnFjb20udmlkZW8uZGVjb2Rlci5oZXZjIiB0eXBlPSJ2aWRlby9oZXZjIiB1cGRhdGU9InRydWUiPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtMzUyeDI4OCIgcmFuZ2U9IjU3OC01NzgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS03MjB4NDgwIiByYW5nZT0iMzkwLTM5MCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTEyODB4NzIwIiByYW5nZT0iMTU3LTE1NyIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTE5MjB4MTA4OCIgcmFuZ2U9IjYzLTYzIiAvPgotICAgICAgICA8L01lZGlhQ29kZWM+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5xdGkudmlkZW8uZGVjb2Rlci5oMjYzc3ciIHR5cGU9InZpZGVvLzNncHAiIHVwZGF0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0xNzZ4MTQ0IiByYW5nZT0iODg5LTg4OSIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTM1MngyODgiIHJhbmdlPSI1ODAtNTgwIiAvPgotICAgICAgICA8L01lZGlhQ29kZWM+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5xdGkudmlkZW8uZGVjb2Rlci5tcGVnNHN3IiB0eXBlPSJ2aWRlby9tcDR2LWVzIiB1cGRhdGU9InRydWUiPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtNDgweDM2MCIgcmFuZ2U9IjUxOS01MTkiIC8+Ci0gICAgICAgIDwvTWVkaWFDb2RlYz4KLSAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDgiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiIHVwZGF0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0zMjB4MjQwIiByYW5nZT0iNjU5LTY1OSIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTY0MHgzNjAiIHJhbmdlPSI1MDktNTA5IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtMTI4MHg3MjAiIHJhbmdlPSIxNjItMTYyIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtMTkyMHgxMDgwIiByYW5nZT0iODctODciIC8+Ci0gICAgICAgIDwvTWVkaWFDb2RlYz4KLSAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyIgdXBkYXRlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTMyMHgyNDAiIHJhbmdlPSI1ODYtNTg2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtNzIweDQ4MCIgcmFuZ2U9IjI4Ny0yODciIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0xMjgweDcyMCIgcmFuZ2U9IjE4Ni0xODYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0xOTIweDEwODAiIHJhbmdlPSI4MC04MCIgLz4KLSAgICAgICAgPC9NZWRpYUNvZGVjPgotICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgdHlwZT0idmlkZW8vaGV2YyIgdXBkYXRlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTM1MngyODgiIHJhbmdlPSI1MjUtNTI1IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtNzIweDQ4MCIgcmFuZ2U9IjMzMy0zMzMiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0xMjgweDcyMCIgcmFuZ2U9IjE4OS0xODkiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0xOTIweDEwODAiIHJhbmdlPSIxMDQtMTA0IiAvPgotICAgICAgICA8L01lZGlhQ29kZWM+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2My5kZWNvZGVyIiB0eXBlPSJ2aWRlby8zZ3BwIiB1cGRhdGU9InRydWUiPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtMTc2eDE0NCIgcmFuZ2U9IjEyOTItMTI5MiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTM1MngyODgiIHJhbmdlPSI4MzQtODM0IiAvPgotICAgICAgICA8L01lZGlhQ29kZWM+Ci0gICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudnA4LmRlY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiIHVwZGF0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0zMjB4MjQwIiByYW5nZT0iMTMzMC0xMzMwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtNjQweDM2MCIgcmFuZ2U9IjM0MC0zNDAiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0xMjgweDcyMCIgcmFuZ2U9IjU5LTU5IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtMTkyMHgxMDgwIiByYW5nZT0iNDQtNDQiIC8+Ci0gICAgICAgIDwvTWVkaWFDb2RlYz4KLSAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS52cDkuZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSIgdXBkYXRlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJtZWFzdXJlZC1mcmFtZS1yYXRlLTMyMHgyNDAiIHJhbmdlPSI1MTEtNTExIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9Im1lYXN1cmVkLWZyYW1lLXJhdGUtNjQweDM2MCIgcmFuZ2U9IjQyMS00MjEiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0xMjgweDcyMCIgcmFuZ2U9IjExMS0xMTEiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ibWVhc3VyZWQtZnJhbWUtcmF0ZS0xOTIweDEwODAiIHJhbmdlPSI3Ni03NiIgLz4KLSAgICAgICAgPC9NZWRpYUNvZGVjPgotICAgIDwvRGVjb2RlcnM+Ci08L01lZGlhQ29kZWNzPgotCmRpZmYgLS1naXQgYS9zZG04NDUvY29uZl9maWxlcy9tc204OTM3L21lZGlhX3Byb2ZpbGVzXzg5MzcueG1sIGIvc2RtODQ1L2NvbmZfZmlsZXMvbXNtODkzNy9tZWRpYV9wcm9maWxlc184OTM3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ4MDQzZS4uMDAwMDAwMAotLS0gYS9zZG04NDUvY29uZl9maWxlcy9tc204OTM3L21lZGlhX3Byb2ZpbGVzXzg5MzcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gICAgIENvcHlyaWdodCAoQykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgTm90IGEgY29udHJpYnV0aW9uLgotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCFET0NUWVBFIE1lZGlhU2V0dGluZ3MgWwotPCFFTEVNRU5UIE1lZGlhU2V0dGluZ3MgKENhbWNvcmRlclByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZXJPdXRwdXRGaWxlRm9ybWF0KywKLSAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0VuY29kZXJDYXArLAotICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5jb2RlckNhcCssCi0gICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9EZWNvZGVyQ2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGVjb2RlckNhcCk+Ci08IUVMRU1FTlQgQ2FtY29yZGVyUHJvZmlsZXMgKEVuY29kZXJQcm9maWxlKywgSW1hZ2VFbmNvZGluZyssIEltYWdlRGVjb2RpbmcsIENhbWVyYSk+Ci08IUVMRU1FTlQgRW5jb2RlclByb2ZpbGUgKFZpZGVvLCBBdWRpbyk+Ci08IUFUVExJU1QgRW5jb2RlclByb2ZpbGUgcXVhbGl0eSAoaGlnaHxsb3cpICNSRVFVSVJFRD4KLTwhQVRUTElTVCBFbmNvZGVyUHJvZmlsZSBmaWxlRm9ybWF0IChtcDR8M2dwKSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgRW5jb2RlclByb2ZpbGUgZHVyYXRpb24gKDMwfDYwKSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgRW5jb2RlclByb2ZpbGUgY2FtZXJhSWQgKDB8MSkgI1JFUVVJUkVEPgotPCFFTEVNRU5UIFZpZGVvIEVNUFRZPgotPCFBVFRMSVNUIFZpZGVvIGNvZGVjIChoMjY0fGgyNjN8bTR2KSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgVmlkZW8gYml0UmF0ZSBDREFUQSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgVmlkZW8gd2lkdGggQ0RBVEEgI1JFUVVJUkVEPgotPCFBVFRMSVNUIFZpZGVvIGhlaWdodCBDREFUQSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgVmlkZW8gZnJhbWVSYXRlIENEQVRBICNSRVFVSVJFRD4KLTwhRUxFTUVOVCBBdWRpbyBFTVBUWT4KLTwhQVRUTElTVCBBdWRpbyBjb2RlYyAoYW1ybmJ8YW1yd2J8YWFjfGxwY20pICNSRVFVSVJFRD4KLTwhQVRUTElTVCBBdWRpbyBiaXRSYXRlIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBBdWRpbyBzYW1wbGVSYXRlIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBBdWRpbyBjaGFubmVscyAoMXwyfDYpICNSRVFVSVJFRD4KLTwhRUxFTUVOVCBJbWFnZUVuY29kaW5nIEVNUFRZPgotPCFBVFRMSVNUIEltYWdlRW5jb2RpbmcgcXVhbGl0eSAoOTB8ODB8NzB8NjB8NTB8NDApICNSRVFVSVJFRD4KLTwhRUxFTUVOVCBJbWFnZURlY29kaW5nIEVNUFRZPgotPCFBVFRMSVNUIEltYWdlRGVjb2RpbmcgbWVtQ2FwIENEQVRBICNSRVFVSVJFRD4KLTwhRUxFTUVOVCBDYW1lcmEgRU1QVFk+Ci08IUVMRU1FTlQgRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQgRU1QVFk+Ci08IUFUVExJU1QgRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQgbmFtZSAobXA0fDNncCkgI1JFUVVJUkVEPgotPCFFTEVNRU5UIFZpZGVvRW5jb2RlckNhcCBFTVBUWT4KLTwhQVRUTElTVCBWaWRlb0VuY29kZXJDYXAgbmFtZSAoaDI2NHxoMjYzfG00dikgI1JFUVVJUkVEPgotPCFBVFRMSVNUIFZpZGVvRW5jb2RlckNhcCBlbmFibGVkICh0cnVlfGZhbHNlKSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgVmlkZW9FbmNvZGVyQ2FwIG1pbkJpdFJhdGUgQ0RBVEEgI1JFUVVJUkVEPgotPCFBVFRMSVNUIFZpZGVvRW5jb2RlckNhcCBtYXhCaXRSYXRlIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBWaWRlb0VuY29kZXJDYXAgbWluRnJhbWVXaWR0aCBDREFUQSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgVmlkZW9FbmNvZGVyQ2FwIG1heEZyYW1lV2lkdGggQ0RBVEEgI1JFUVVJUkVEPgotPCFBVFRMSVNUIFZpZGVvRW5jb2RlckNhcCBtaW5GcmFtZUhlaWdodCBDREFUQSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgVmlkZW9FbmNvZGVyQ2FwIG1heEZyYW1lSGVpZ2h0IENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBWaWRlb0VuY29kZXJDYXAgbWluRnJhbWVSYXRlIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBWaWRlb0VuY29kZXJDYXAgbWF4RnJhbWVSYXRlIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBWaWRlb0VuY29kZXJDYXAgbWF4SEZSRnJhbWVXaWR0aCBDREFUQSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgVmlkZW9FbmNvZGVyQ2FwIG1heEhGUkZyYW1lSGVpZ2h0IENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBWaWRlb0VuY29kZXJDYXAgbWF4SEZSTW9kZSBDREFUQSAjUkVRVUlSRUQ+Ci08IUVMRU1FTlQgQXVkaW9FbmNvZGVyQ2FwIEVNUFRZPgotPCFBVFRMSVNUIEF1ZGlvRW5jb2RlckNhcCBuYW1lIChhbXJuYnxhbXJ3YnxhYWN8d21hfGxwY20pICNSRVFVSVJFRD4KLTwhQVRUTElTVCBBdWRpb0VuY29kZXJDYXAgZW5hYmxlZCAodHJ1ZXxmYWxzZSkgI1JFUVVJUkVEPgotPCFBVFRMSVNUIEF1ZGlvRW5jb2RlckNhcCBtaW5CaXRSYXRlIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBBdWRpb0VuY29kZXJDYXAgbWF4Qml0UmF0ZSBDREFUQSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgQXVkaW9FbmNvZGVyQ2FwIG1pblNhbXBsZVJhdGUgQ0RBVEEgI1JFUVVJUkVEPgotPCFBVFRMSVNUIEF1ZGlvRW5jb2RlckNhcCBtYXhTYW1wbGVSYXRlIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBBdWRpb0VuY29kZXJDYXAgbWluQ2hhbm5lbHMgKDF8Mnw2KSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgQXVkaW9FbmNvZGVyQ2FwIG1heENoYW5uZWxzICgxfDJ8NikgI1JFUVVJUkVEPgotPCFFTEVNRU5UIFZpZGVvRGVjb2RlckNhcCBFTVBUWT4KLTwhQVRUTElTVCBWaWRlb0RlY29kZXJDYXAgbmFtZSAod212KSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgVmlkZW9EZWNvZGVyQ2FwIGVuYWJsZWQgKHRydWV8ZmFsc2UpICNSRVFVSVJFRD4KLTwhRUxFTUVOVCBBdWRpb0RlY29kZXJDYXAgRU1QVFk+Ci08IUFUVExJU1QgQXVkaW9EZWNvZGVyQ2FwIG5hbWUgKHdtYSkgI1JFUVVJUkVEPgotPCFBVFRMSVNUIEF1ZGlvRGVjb2RlckNhcCBlbmFibGVkICh0cnVlfGZhbHNlKSAjUkVRVUlSRUQ+Ci08IUVMRU1FTlQgVmlkZW9FZGl0b3JDYXAgRU1QVFk+Ci08IUFUVExJU1QgVmlkZW9FZGl0b3JDYXAgbWF4SW5wdXRGcmFtZVdpZHRoIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBWaWRlb0VkaXRvckNhcCBtYXhJbnB1dEZyYW1lSGVpZ2h0IENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBWaWRlb0VkaXRvckNhcCBtYXhPdXRwdXRGcmFtZVdpZHRoIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBWaWRlb0VkaXRvckNhcCBtYXhPdXRwdXRGcmFtZUhlaWdodCBDREFUQSAjUkVRVUlSRUQ+Ci08IUFUVExJU1QgVmlkZW9FZGl0b3JDYXAgbWF4UHJlZmV0Y2hZVVZGcmFtZXMgQ0RBVEEgI1JFUVVJUkVEPgotPCFFTEVNRU5UIEV4cG9ydFZpZGVvUHJvZmlsZSBFTVBUWT4KLTwhQVRUTElTVCBFeHBvcnRWaWRlb1Byb2ZpbGUgbmFtZSAoaDI2NCkgI1JFUVVJUkVEPgotPCFBVFRMSVNUIEV4cG9ydFZpZGVvUHJvZmlsZSBwcm9maWxlIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBFeHBvcnRWaWRlb1Byb2ZpbGUgbGV2ZWwgQ0RBVEEgI1JFUVVJUkVEPgotXT4KLTwhLS0KLSAgICAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVjbGFyZSB0aGUgbXVsdGltZWRpYSBwcm9maWxlcyBhbmQgY2FwYWJpbGl0aWVzCi0gICAgIG9uIGFuIGFuZHJvaWQtcG93ZXJlZCBkZXZpY2UuCi0tLT4KLTxNZWRpYVNldHRpbmdzPgotICAgIDwhLS0gRWFjaCBjYW1jb3JkZXIgcHJvZmlsZSBkZWZpbmVzIGEgc2V0IG9mIHByZWRlZmluZWQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gQmFjayBDYW1lcmEgLS0+Ci0gICAgPENhbWNvcmRlclByb2ZpbGVzIGNhbWVyYUlkPSIwIiBzdGFydE9mZnNldE1zPSIzMDAiPgotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9ImxvdyIgZmlsZUZvcm1hdD0iM2dwIiBkdXJhdGlvbj0iMzAiPgotICAgICAgPFZpZGVvIGNvZGVjPSJoMjY0IgotICAgICAgICAgICAgIGJpdFJhdGU9IjE5MjAwMCIKLSAgICAgICAgICAgICB3aWR0aD0iMTc2IgotICAgICAgICAgICAgIGhlaWdodD0iMTQ0IgotICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDxBdWRpbyBjb2RlYz0iYW1ybmIiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTIyMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iODAwMCIKLSAgICAgICAgICAgICBjaGFubmVscz0iMSIgLz4KLSAgICA8L0VuY29kZXJQcm9maWxlPgotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9ImhpZ2giIGZpbGVGb3JtYXQ9Im1wNCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSIyMDAwMDAwMCIKLSAgICAgICAgICAgICB3aWR0aD0iMTkyMCIKLSAgICAgICAgICAgICBoZWlnaHQ9IjEwODAiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPEF1ZGlvIGNvZGVjPSJhYWMiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTU2MDAwIgotICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjQ4MDAwIgotICAgICAgICAgICAgIGNoYW5uZWxzPSIyIiAvPgotICAgIDwvRW5jb2RlclByb2ZpbGU+Ci0KLSAgICA8RW5jb2RlclByb2ZpbGUgcXVhbGl0eT0icXZnYSIgZmlsZUZvcm1hdD0ibXA0IiBkdXJhdGlvbj0iNjAiPgotICAgICAgPFZpZGVvIGNvZGVjPSJoMjY0IgotICAgICAgICAgICAgIGJpdFJhdGU9IjUxMjAwMCIKLSAgICAgICAgICAgICB3aWR0aD0iMzIwIgotICAgICAgICAgICAgIGhlaWdodD0iMjQwIgotICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDxBdWRpbyBjb2RlYz0iYWFjIgotICAgICAgICAgICAgIGJpdFJhdGU9IjE1NjAwMCIKLSAgICAgICAgICAgICBzYW1wbGVSYXRlPSI0ODAwMCIKLSAgICAgICAgICAgICBjaGFubmVscz0iMiIgLz4KLSAgICA8L0VuY29kZXJQcm9maWxlPgotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9ImNpZiIgZmlsZUZvcm1hdD0iM2dwIiBkdXJhdGlvbj0iMzAiPgotICAgICAgPFZpZGVvIGNvZGVjPSJoMjY0IgotICAgICAgICAgICAgIGJpdFJhdGU9IjcyMDAwMCIKLSAgICAgICAgICAgICB3aWR0aD0iMzUyIgotICAgICAgICAgICAgIGhlaWdodD0iMjg4IgotICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDxBdWRpbyBjb2RlYz0iYW1ybmIiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTIyMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iODAwMCIKLSAgICAgICAgICAgICBjaGFubmVscz0iMSIgLz4KLSAgICA8L0VuY29kZXJQcm9maWxlPgotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9IjQ4MHAiIGZpbGVGb3JtYXQ9Im1wNCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSIyMDAwMDAwIgotICAgICAgICAgICAgIHdpZHRoPSI3MjAiCi0gICAgICAgICAgICAgaGVpZ2h0PSI0ODAiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPEF1ZGlvIGNvZGVjPSJhYWMiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTU2MDAwIgotICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjQ4MDAwIgotICAgICAgICAgICAgIGNoYW5uZWxzPSIyIiAvPgotICAgIDwvRW5jb2RlclByb2ZpbGU+Ci0KLSAgICA8RW5jb2RlclByb2ZpbGUgcXVhbGl0eT0iNzIwcCIgZmlsZUZvcm1hdD0ibXA0IiBkdXJhdGlvbj0iMzAiPgotICAgICAgPFZpZGVvIGNvZGVjPSJoMjY0IgotICAgICAgICAgICAgIGJpdFJhdGU9IjE0MDAwMDAwIgotICAgICAgICAgICAgIHdpZHRoPSIxMjgwIgotICAgICAgICAgICAgIGhlaWdodD0iNzIwIgotICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDxBdWRpbyBjb2RlYz0iYWFjIgotICAgICAgICAgICAgIGJpdFJhdGU9IjE1NjAwMCIKLSAgICAgICAgICAgICBzYW1wbGVSYXRlPSI0ODAwMCIKLSAgICAgICAgICAgICBjaGFubmVscz0iMiIgLz4KLSAgICA8L0VuY29kZXJQcm9maWxlPgotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9IjEwODBwIiBmaWxlRm9ybWF0PSJtcDQiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMjAwMDAwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjE5MjAiCi0gICAgICAgICAgICAgaGVpZ2h0PSIxMDgwIgotICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDxBdWRpbyBjb2RlYz0iYWFjIgotICAgICAgICAgICAgIGJpdFJhdGU9IjE1NjAwMCIKLSAgICAgICAgICAgICBzYW1wbGVSYXRlPSI0ODAwMCIKLSAgICAgICAgICAgICBjaGFubmVscz0iMiIgLz4KLSAgICA8L0VuY29kZXJQcm9maWxlPgotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9InFjaWYiIGZpbGVGb3JtYXQ9IjNncCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxOTIwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjE3NiIKLSAgICAgICAgICAgICBoZWlnaHQ9IjE0NCIKLSAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8QXVkaW8gY29kZWM9ImFtcm5iIgotICAgICAgICAgICAgIGJpdFJhdGU9IjEyMjAwIgotICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjEiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJ2Z2EiIGZpbGVGb3JtYXQ9Im1wNCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSIyMDAwMDAwIgotICAgICAgICAgICAgIHdpZHRoPSI2NDAiCi0gICAgICAgICAgICAgaGVpZ2h0PSI0ODAiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPEF1ZGlvIGNvZGVjPSJhYWMiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTU2MDAwIgotICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjQ4MDAwIgotICAgICAgICAgICAgIGNoYW5uZWxzPSIyIiAvPgotICAgIDwvRW5jb2RlclByb2ZpbGU+Ci0KLSAgICA8RW5jb2RlclByb2ZpbGUgcXVhbGl0eT0idGltZWxhcHNlbG93IiBmaWxlRm9ybWF0PSJtcDQiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTkyMDAwIgotICAgICAgICAgICAgIHdpZHRoPSIxNzYiCi0gICAgICAgICAgICAgaGVpZ2h0PSIxNDQiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPCEtLSBhdWRpbyBzZXR0aW5nIGlzIGlnbm9yZWQgLS0+Ci0gICAgICA8QXVkaW8gY29kZWM9ImFtcm5iIgotICAgICAgICAgICAgIGJpdFJhdGU9IjEyMjAwIgotICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjEiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJ0aW1lbGFwc2VoaWdoIiBmaWxlRm9ybWF0PSJtcDQiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMjAwMDAwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjE5MjAiCi0gICAgICAgICAgICAgaGVpZ2h0PSIxMDgwIgotICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDwhLS0gYXVkaW8gc2V0dGluZyBpcyBpZ25vcmVkIC0tPgotICAgICAgPEF1ZGlvIGNvZGVjPSJhYWMiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTU2MDAwIgotICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjQ4MDAwIgotICAgICAgICAgICAgIGNoYW5uZWxzPSIyIiAvPgotICAgIDwvRW5jb2RlclByb2ZpbGU+Ci0KLSAgICA8RW5jb2RlclByb2ZpbGUgcXVhbGl0eT0idGltZWxhcHNlcWNpZiIgZmlsZUZvcm1hdD0ibXA0IiBkdXJhdGlvbj0iMzAiPgotICAgICAgPFZpZGVvIGNvZGVjPSJoMjY0IgotICAgICAgICAgICAgIGJpdFJhdGU9IjE5MjAwMCIKLSAgICAgICAgICAgICB3aWR0aD0iMTc2IgotICAgICAgICAgICAgIGhlaWdodD0iMTQ0IgotICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDwhLS0gYXVkaW8gc2V0dGluZyBpcyBpZ25vcmVkIC0tPgotICAgICAgPEF1ZGlvIGNvZGVjPSJhbXJuYiIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxMjIwMCIKLSAgICAgICAgICAgICBzYW1wbGVSYXRlPSI4MDAwIgotICAgICAgICAgICAgIGNoYW5uZWxzPSIxIiAvPgotICAgIDwvRW5jb2RlclByb2ZpbGU+Ci0KLSAgICA8RW5jb2RlclByb2ZpbGUgcXVhbGl0eT0idGltZWxhcHNlY2lmIiBmaWxlRm9ybWF0PSJtcDQiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgYml0UmF0ZT0iNzIwMDAwIgotICAgICAgICAgICAgIHdpZHRoPSIzNTIiCi0gICAgICAgICAgICAgaGVpZ2h0PSIyODgiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPCEtLSBhdWRpbyBzZXR0aW5nIGlzIGlnbm9yZWQgLS0+Ci0gICAgICA8QXVkaW8gY29kZWM9ImFtcm5iIgotICAgICAgICAgICAgIGJpdFJhdGU9IjEyMjAwIgotICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjEiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9InRpbWVsYXBzZXF2Z2EiIGZpbGVGb3JtYXQ9Im1wNCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSI1MTIwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjMyMCIKLSAgICAgICAgICAgICBoZWlnaHQ9IjI0MCIKLSAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8IS0tIGF1ZGlvIHNldHRpbmcgaXMgaWdub3JlZCAtLT4KLSAgICAgIDxBdWRpbyBjb2RlYz0iYW1ybmIiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTIyMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iODAwMCIKLSAgICAgICAgICAgICBjaGFubmVscz0iMSIgLz4KLSAgICA8L0VuY29kZXJQcm9maWxlPgotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9InRpbWVsYXBzZXZnYSIgZmlsZUZvcm1hdD0ibXA0IiBkdXJhdGlvbj0iMzAiPgotICAgICAgPFZpZGVvIGNvZGVjPSJoMjY0IgotICAgICAgICAgICAgIGJpdFJhdGU9IjIwMDAwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjY0MCIKLSAgICAgICAgICAgICBoZWlnaHQ9IjQ4MCIKLSAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8IS0tIGF1ZGlvIHNldHRpbmcgaXMgaWdub3JlZCAtLT4KLSAgICAgIDxBdWRpbyBjb2RlYz0iYW1ybmIiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTIyMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iODAwMCIKLSAgICAgICAgICAgICBjaGFubmVscz0iMSIgLz4KLSAgICA8L0VuY29kZXJQcm9maWxlPgotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9InRpbWVsYXBzZTQ4MHAiIGZpbGVGb3JtYXQ9Im1wNCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSIyMDAwMDAwIgotICAgICAgICAgICAgIHdpZHRoPSI2NDAiCi0gICAgICAgICAgICAgaGVpZ2h0PSI0ODAiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPCEtLSBhdWRpbyBzZXR0aW5nIGlzIGlnbm9yZWQgLS0+Ci0gICAgICA8QXVkaW8gY29kZWM9ImFhYyIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxNTYwMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iNDgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjIiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJ0aW1lbGFwc2U3MjBwIiBmaWxlRm9ybWF0PSJtcDQiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTQwMDAwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjEyODAiCi0gICAgICAgICAgICAgaGVpZ2h0PSI3MjAiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPCEtLSBhdWRpbyBzZXR0aW5nIGlzIGlnbm9yZWQgLS0+Ci0gICAgICA8QXVkaW8gY29kZWM9ImFhYyIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxNTYwMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iNDgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjIiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJ0aW1lbGFwc2UxMDgwcCIgZmlsZUZvcm1hdD0ibXA0IiBkdXJhdGlvbj0iMzAiPgotICAgICAgPFZpZGVvIGNvZGVjPSJoMjY0IgotICAgICAgICAgICAgIGJpdFJhdGU9IjIwMDAwMDAwIgotICAgICAgICAgICAgIHdpZHRoPSIxOTIwIgotICAgICAgICAgICAgIGhlaWdodD0iMTA4MCIKLSAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8IS0tIGF1ZGlvIHNldHRpbmcgaXMgaWdub3JlZCAtLT4KLSAgICAgIDxBdWRpbyBjb2RlYz0iYWFjIgotICAgICAgICAgICAgIGJpdFJhdGU9IjE1NjAwMCIKLSAgICAgICAgICAgICBzYW1wbGVSYXRlPSI0ODAwMCIKLSAgICAgICAgICAgICBjaGFubmVscz0iMiIgLz4KLSAgICA8L0VuY29kZXJQcm9maWxlPgotCi0gICAgICAgIDxJbWFnZUVuY29kaW5nIHF1YWxpdHk9Ijk1IiAvPgotICAgICAgICA8SW1hZ2VFbmNvZGluZyBxdWFsaXR5PSI4MCIgLz4KLSAgICAgICAgPEltYWdlRW5jb2RpbmcgcXVhbGl0eT0iNzAiIC8+Ci0gICAgICAgIDxJbWFnZURlY29kaW5nIG1lbUNhcD0iMjAwMDAwMDAiIC8+Ci0KLSAgICA8L0NhbWNvcmRlclByb2ZpbGVzPgotICAgIDwhLS0gRnJvbnQgQ2FtZXJhIC0tPgotICAgIDxDYW1jb3JkZXJQcm9maWxlcyBjYW1lcmFJZD0iMSIgc3RhcnRPZmZzZXRNcz0iMzAwIj4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJsb3ciIGZpbGVGb3JtYXQ9IjNncCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxOTIwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjE3NiIKLSAgICAgICAgICAgICBoZWlnaHQ9IjE0NCIKLSAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8QXVkaW8gY29kZWM9ImFtcm5iIgotICAgICAgICAgICAgIGJpdFJhdGU9IjEyMjAwIgotICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjEiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJoaWdoIiBmaWxlRm9ybWF0PSJtcDQiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMjAwMDAwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjE5MjAiCi0gICAgICAgICAgICAgaGVpZ2h0PSIxMDgwIgotICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDxBdWRpbyBjb2RlYz0iYWFjIgotICAgICAgICAgICAgIGJpdFJhdGU9IjE1NjAwMCIKLSAgICAgICAgICAgICBzYW1wbGVSYXRlPSI0ODAwMCIKLSAgICAgICAgICAgICBjaGFubmVscz0iMiIgLz4KLSAgICA8L0VuY29kZXJQcm9maWxlPgotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9InF2Z2EiIGZpbGVGb3JtYXQ9Im1wNCIgZHVyYXRpb249IjYwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSI1MTIwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjMyMCIKLSAgICAgICAgICAgICBoZWlnaHQ9IjI0MCIKLSAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8QXVkaW8gY29kZWM9ImFhYyIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxNTYwMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iNDgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjIiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJjaWYiIGZpbGVGb3JtYXQ9IjNncCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSI3MjAwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjM1MiIKLSAgICAgICAgICAgICBoZWlnaHQ9IjI4OCIKLSAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8QXVkaW8gY29kZWM9ImFtcm5iIgotICAgICAgICAgICAgIGJpdFJhdGU9IjEyMjAwIgotICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjEiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSI0ODBwIiBmaWxlRm9ybWF0PSJtcDQiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMjAwMDAwMCIKLSAgICAgICAgICAgICB3aWR0aD0iNzIwIgotICAgICAgICAgICAgIGhlaWdodD0iNDgwIgotICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDxBdWRpbyBjb2RlYz0iYWFjIgotICAgICAgICAgICAgIGJpdFJhdGU9IjE1NjAwMCIKLSAgICAgICAgICAgICBzYW1wbGVSYXRlPSI0ODAwMCIKLSAgICAgICAgICAgICBjaGFubmVscz0iMiIgLz4KLSAgICA8L0VuY29kZXJQcm9maWxlPgotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9IjcyMHAiIGZpbGVGb3JtYXQ9Im1wNCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxNDAwMDAwMCIKLSAgICAgICAgICAgICB3aWR0aD0iMTI4MCIKLSAgICAgICAgICAgICBoZWlnaHQ9IjcyMCIKLSAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8QXVkaW8gY29kZWM9ImFhYyIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxNTYwMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iNDgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjIiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSIxMDgwcCIgZmlsZUZvcm1hdD0ibXA0IiBkdXJhdGlvbj0iMzAiPgotICAgICAgPFZpZGVvIGNvZGVjPSJoMjY0IgotICAgICAgICAgICAgIGJpdFJhdGU9IjIwMDAwMDAwIgotICAgICAgICAgICAgIHdpZHRoPSIxOTIwIgotICAgICAgICAgICAgIGhlaWdodD0iMTA4MCIKLSAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8QXVkaW8gY29kZWM9ImFhYyIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxNTYwMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iNDgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjIiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJxY2lmIiBmaWxlRm9ybWF0PSIzZ3AiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTkyMDAwIgotICAgICAgICAgICAgIHdpZHRoPSIxNzYiCi0gICAgICAgICAgICAgaGVpZ2h0PSIxNDQiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPEF1ZGlvIGNvZGVjPSJhbXJuYiIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxMjIwMCIKLSAgICAgICAgICAgICBzYW1wbGVSYXRlPSI4MDAwIgotICAgICAgICAgICAgIGNoYW5uZWxzPSIxIiAvPgotICAgIDwvRW5jb2RlclByb2ZpbGU+Ci0KLSAgICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9InZnYSIgZmlsZUZvcm1hdD0ibXA0IiBkdXJhdGlvbj0iMzAiPgotICAgICAgPFZpZGVvIGNvZGVjPSJoMjY0IgotICAgICAgICAgICAgIGJpdFJhdGU9IjIwMDAwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjY0MCIKLSAgICAgICAgICAgICBoZWlnaHQ9IjQ4MCIKLSAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8QXVkaW8gY29kZWM9ImFhYyIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxNTYwMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iNDgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjIiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJ0aW1lbGFwc2Vsb3ciIGZpbGVGb3JtYXQ9Im1wNCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxOTIwMDAiCi0gICAgICAgICAgICAgd2lkdGg9IjE3NiIKLSAgICAgICAgICAgICBoZWlnaHQ9IjE0NCIKLSAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8IS0tIGF1ZGlvIHNldHRpbmcgaXMgaWdub3JlZCAtLT4KLSAgICAgIDxBdWRpbyBjb2RlYz0iYW1ybmIiCi0gICAgICAgICAgICAgYml0UmF0ZT0iMTIyMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iODAwMCIKLSAgICAgICAgICAgICBjaGFubmVscz0iMSIgLz4KLSAgICA8L0VuY29kZXJQcm9maWxlPgotCi0gICAgPEVuY29kZXJQcm9maWxlIHF1YWxpdHk9InRpbWVsYXBzZWhpZ2giIGZpbGVGb3JtYXQ9Im1wNCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSIyMDAwMDAwMCIKLSAgICAgICAgICAgICB3aWR0aD0iMTkyMCIKLSAgICAgICAgICAgICBoZWlnaHQ9IjEwODAiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPCEtLSBhdWRpbyBzZXR0aW5nIGlzIGlnbm9yZWQgLS0+Ci0gICAgICA8QXVkaW8gY29kZWM9ImFhYyIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxNTYwMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iNDgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjIiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLSAgICA8RW5jb2RlclByb2ZpbGUgcXVhbGl0eT0idGltZWxhcHNlcWNpZiIgZmlsZUZvcm1hdD0ibXA0IiBkdXJhdGlvbj0iMzAiPgotICAgICAgPFZpZGVvIGNvZGVjPSJoMjY0IgotICAgICAgICAgICAgICAgICAgIGJpdFJhdGU9IjE5MjAwMCIKLSAgICAgICAgICAgICAgICAgICB3aWR0aD0iMTc2IgotICAgICAgICAgICAgICAgICAgIGhlaWdodD0iMTQ0IgotICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDwhLS0gYXVkaW8gc2V0dGluZyBpcyBpZ25vcmVkIC0tPgotICAgICAgPEF1ZGlvIGNvZGVjPSJhbXJuYiIKLSAgICAgICAgICAgICAgICAgICBiaXRSYXRlPSIxMjIwMCIKLSAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlPSI4MDAwIgotICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzPSIxIiAvPgotICAgIDwvRW5jb2RlclByb2ZpbGU+Ci0KLSAgICA8RW5jb2RlclByb2ZpbGUgcXVhbGl0eT0idGltZWxhcHNlY2lmIiBmaWxlRm9ybWF0PSJtcDQiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgICAgICAgYml0UmF0ZT0iMTIwMDAwMCIKLSAgICAgICAgICAgICAgICAgICB3aWR0aD0iMzUyIgotICAgICAgICAgICAgICAgICAgIGhlaWdodD0iMjg4IgotICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDwhLS0gYXVkaW8gc2V0dGluZyBpcyBpZ25vcmVkIC0tPgotICAgICAgPEF1ZGlvIGNvZGVjPSJhYWMiCi0gICAgICAgICAgICAgYml0UmF0ZT0iOTYwMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iNDgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjEiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJ0aW1lbGFwc2VxdmdhIiBmaWxlRm9ybWF0PSJtcDQiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgYml0UmF0ZT0iNTEyMDAwIgotICAgICAgICAgICAgIHdpZHRoPSIzMjAiCi0gICAgICAgICAgICAgaGVpZ2h0PSIyNDAiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPCEtLSBhdWRpbyBzZXR0aW5nIGlzIGlnbm9yZWQgLS0+Ci0gICAgICA8QXVkaW8gY29kZWM9ImFtcm5iIgotICAgICAgICAgICAgIGJpdFJhdGU9IjEyMjAwIgotICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjEiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJ0aW1lbGFwc2V2Z2EiIGZpbGVGb3JtYXQ9Im1wNCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSIyMDAwMDAwIgotICAgICAgICAgICAgIHdpZHRoPSI2NDAiCi0gICAgICAgICAgICAgaGVpZ2h0PSI0ODAiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPCEtLSBhdWRpbyBzZXR0aW5nIGlzIGlnbm9yZWQgLS0+Ci0gICAgICA8QXVkaW8gY29kZWM9ImFtcm5iIgotICAgICAgICAgICAgIGJpdFJhdGU9IjEyMjAwIgotICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjEiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJ0aW1lbGFwc2U0ODBwIiBmaWxlRm9ybWF0PSJtcDQiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgICAgICAgYml0UmF0ZT0iNTAwMDAwMCIKLSAgICAgICAgICAgICAgICAgICB3aWR0aD0iNzIwIgotICAgICAgICAgICAgICAgICAgIGhlaWdodD0iNDgwIgotICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZT0iMzAiIC8+Ci0KLSAgICAgIDwhLS0gYXVkaW8gc2V0dGluZyBpcyBpZ25vcmVkIC0tPgotICAgICAgPEF1ZGlvIGNvZGVjPSJhYWMiCi0gICAgICAgICAgICAgICAgICAgYml0UmF0ZT0iOTYwMDAiCi0gICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZT0iNDgwMDAiCi0gICAgICAgICAgICAgICAgICAgY2hhbm5lbHM9IjEiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgIDxFbmNvZGVyUHJvZmlsZSBxdWFsaXR5PSJ0aW1lbGFwc2U3MjBwIiBmaWxlRm9ybWF0PSJtcDQiIGR1cmF0aW9uPSIzMCI+Ci0gICAgICA8VmlkZW8gY29kZWM9ImgyNjQiCi0gICAgICAgICAgICAgICAgICAgYml0UmF0ZT0iODAwMDAwMCIKLSAgICAgICAgICAgICAgICAgICB3aWR0aD0iMTI4MCIKLSAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjcyMCIKLSAgICAgICAgICAgICAgICAgICBmcmFtZVJhdGU9IjMwIiAvPgotCi0gICAgICA8IS0tIGF1ZGlvIHNldHRpbmcgaXMgaWdub3JlZCAtLT4KLSAgICAgIDxBdWRpbyBjb2RlYz0iYWFjIgotICAgICAgICAgICAgICAgICAgIGJpdFJhdGU9Ijk2MDAwIgotICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGU9IjQ4MDAwIgotICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzPSIxIiAvPgotICAgIDwvRW5jb2RlclByb2ZpbGU+Ci0KLSAgICA8RW5jb2RlclByb2ZpbGUgcXVhbGl0eT0idGltZWxhcHNlMTA4MHAiIGZpbGVGb3JtYXQ9Im1wNCIgZHVyYXRpb249IjMwIj4KLSAgICAgIDxWaWRlbyBjb2RlYz0iaDI2NCIKLSAgICAgICAgICAgICBiaXRSYXRlPSIyMDAwMDAwMCIKLSAgICAgICAgICAgICB3aWR0aD0iMTkyMCIKLSAgICAgICAgICAgICBoZWlnaHQ9IjEwODAiCi0gICAgICAgICAgICAgZnJhbWVSYXRlPSIzMCIgLz4KLQotICAgICAgPCEtLSBhdWRpbyBzZXR0aW5nIGlzIGlnbm9yZWQgLS0+Ci0gICAgICA8QXVkaW8gY29kZWM9ImFhYyIKLSAgICAgICAgICAgICBiaXRSYXRlPSIxNTYwMDAiCi0gICAgICAgICAgICAgc2FtcGxlUmF0ZT0iNDgwMDAiCi0gICAgICAgICAgICAgY2hhbm5lbHM9IjIiIC8+Ci0gICAgPC9FbmNvZGVyUHJvZmlsZT4KLQotICAgICAgICA8SW1hZ2VFbmNvZGluZyBxdWFsaXR5PSI5NSIgLz4KLSAgICAgICAgPEltYWdlRW5jb2RpbmcgcXVhbGl0eT0iODAiIC8+Ci0gICAgICAgIDxJbWFnZUVuY29kaW5nIHF1YWxpdHk9IjcwIiAvPgotICAgICAgICA8SW1hZ2VEZWNvZGluZyBtZW1DYXA9IjIwMDAwMDAwIiAvPgotCi0gICAgPC9DYW1jb3JkZXJQcm9maWxlcz4KLQotICAgIDxFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdCBuYW1lPSIzZ3AiIC8+Ci0gICAgPEVuY29kZXJPdXRwdXRGaWxlRm9ybWF0IG5hbWU9Im1wNCIgLz4KLQotICAgIDwhLS0KLSAgICAgICAgIElmIGEgY29kZWMgaXMgbm90IGVuYWJsZWQsIGl0IGlzIGludmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb25zCi0gICAgICAgICBJbiBvdGhlciB3b3JkcywgdGhlIGFwcGxpY2F0aW9ucyB3b24ndCBiZSBhYmxlIHRvIHVzZSB0aGUgY29kZWMKLSAgICAgICAgIG9yIHF1ZXJ5IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGNvZGVjIGF0IGFsbCBpZiBpdCBpcyBkaXNhYmxlZAotICAgIC0tPgotICAgIDxWaWRlb0VuY29kZXJDYXAgbmFtZT0iaDI2NCIgZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgbWluQml0UmF0ZT0iNjQwMDAiIG1heEJpdFJhdGU9IjIwMDAwMDAwIgotICAgICAgICBtaW5GcmFtZVdpZHRoPSIxNzYiIG1heEZyYW1lV2lkdGg9IjE5MjAiCi0gICAgICAgIG1pbkZyYW1lSGVpZ2h0PSIxNDQiIG1heEZyYW1lSGVpZ2h0PSIxMDgwIgotICAgICAgICBtaW5GcmFtZVJhdGU9IjE1IiBtYXhGcmFtZVJhdGU9IjMwIgotICAgICAgICBtYXhIRlJGcmFtZVdpZHRoPSIxMjgwIiBtYXhIRlJGcmFtZUhlaWdodD0iNzIwIgotICAgICAgICBtYXhIRlJNb2RlPSI2MCIgIC8+Ci0KLSAgICA8VmlkZW9FbmNvZGVyQ2FwIG5hbWU9ImgyNjMiIGVuYWJsZWQ9InRydWUiCi0gICAgICAgIG1pbkJpdFJhdGU9IjY0MDAwIiBtYXhCaXRSYXRlPSIyMDAwMDAwIgotICAgICAgICBtaW5GcmFtZVdpZHRoPSIxNzYiIG1heEZyYW1lV2lkdGg9Ijg2NCIKLSAgICAgICAgbWluRnJhbWVIZWlnaHQ9IjE0NCIgbWF4RnJhbWVIZWlnaHQ9IjQ4MCIKLSAgICAgICAgbWluRnJhbWVSYXRlPSIxNSIgbWF4RnJhbWVSYXRlPSIzMCIKLSAgICAgICAgbWF4SEZSRnJhbWVXaWR0aD0iMCIgbWF4SEZSRnJhbWVIZWlnaHQ9IjAiCi0gICAgICAgIG1heEhGUk1vZGU9IjAiICAvPgotCi0gICAgPFZpZGVvRW5jb2RlckNhcCBuYW1lPSJtNHYiIGVuYWJsZWQ9InRydWUiCi0gICAgICAgIG1pbkJpdFJhdGU9IjY0MDAwIiBtYXhCaXRSYXRlPSIyMDAwMDAwIgotICAgICAgICBtaW5GcmFtZVdpZHRoPSIxNzYiIG1heEZyYW1lV2lkdGg9Ijg2NCIKLSAgICAgICAgbWluRnJhbWVIZWlnaHQ9IjE0NCIgbWF4RnJhbWVIZWlnaHQ9IjQ4MCIKLSAgICAgICAgbWluRnJhbWVSYXRlPSIxNSIgbWF4RnJhbWVSYXRlPSIzMCIKLSAgICAgICAgbWF4SEZSRnJhbWVXaWR0aD0iMCIgbWF4SEZSRnJhbWVIZWlnaHQ9IjAiCi0gICAgICAgIG1heEhGUk1vZGU9IjAiICAvPgotCi0gICAgPEF1ZGlvRW5jb2RlckNhcCBuYW1lPSJhYWMiIGVuYWJsZWQ9InRydWUiCi0gICAgICAgIG1pbkJpdFJhdGU9IjgwMDAiIG1heEJpdFJhdGU9Ijk2MDAwIgotICAgICAgICBtaW5TYW1wbGVSYXRlPSI4MDAwIiBtYXhTYW1wbGVSYXRlPSI0ODAwMCIKLSAgICAgICAgbWluQ2hhbm5lbHM9IjEiIG1heENoYW5uZWxzPSI2IiAvPgotCi0gICAgPEF1ZGlvRW5jb2RlckNhcCBuYW1lPSJoZWFhYyIgZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgbWluQml0UmF0ZT0iODAwMCIgbWF4Qml0UmF0ZT0iNjQwMDAiCi0gICAgICAgIG1pblNhbXBsZVJhdGU9IjE2MDAwIiBtYXhTYW1wbGVSYXRlPSI0ODAwMCIKLSAgICAgICAgbWluQ2hhbm5lbHM9IjEiIG1heENoYW5uZWxzPSIxIiAvPgotCi0gICAgPEF1ZGlvRW5jb2RlckNhcCBuYW1lPSJhYWNlbGQiIGVuYWJsZWQ9InRydWUiCi0gICAgICAgIG1pbkJpdFJhdGU9IjE2MDAwIiBtYXhCaXRSYXRlPSIxOTIwMDAiCi0gICAgICAgIG1pblNhbXBsZVJhdGU9IjE2MDAwIiBtYXhTYW1wbGVSYXRlPSI0ODAwMCIKLSAgICAgICAgbWluQ2hhbm5lbHM9IjEiIG1heENoYW5uZWxzPSIxIiAvPgotCi0gICAgPEF1ZGlvRW5jb2RlckNhcCBuYW1lPSJhbXJ3YiIgZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgbWluQml0UmF0ZT0iNjYwMCIgbWF4Qml0UmF0ZT0iMjM4NTAiCi0gICAgICAgIG1pblNhbXBsZVJhdGU9IjE2MDAwIiBtYXhTYW1wbGVSYXRlPSIxNjAwMCIKLSAgICAgICAgbWluQ2hhbm5lbHM9IjEiIG1heENoYW5uZWxzPSIxIiAvPgotCi0gICAgPEF1ZGlvRW5jb2RlckNhcCBuYW1lPSJhbXJuYiIgZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgbWluQml0UmF0ZT0iNTUyNSIgbWF4Qml0UmF0ZT0iMTIyMDAiCi0gICAgICAgIG1pblNhbXBsZVJhdGU9IjgwMDAiIG1heFNhbXBsZVJhdGU9IjgwMDAiCi0gICAgICAgIG1pbkNoYW5uZWxzPSIxIiBtYXhDaGFubmVscz0iMSIgLz4KLQotPCEtLSAgICA8QXVkaW9FbmNvZGVyQ2FwIG5hbWU9ImxwY20iIGVuYWJsZWQ9InRydWUiCi0gICAgICAgIG1pbkJpdFJhdGU9Ijc2ODAwMCIgbWF4Qml0UmF0ZT0iNDYwODAwMCIKLSAgICAgICAgbWluU2FtcGxlUmF0ZT0iNDgwMDAiIG1heFNhbXBsZVJhdGU9IjQ4MDAwIgotICAgICAgICBtaW5DaGFubmVscz0iMSIgbWF4Q2hhbm5lbHM9IjYiIC8+LS0+Ci0KLSAgICA8IS0tCi0gICAgICAgIEZJWE1FOgotICAgICAgICBXZSBkbyBub3QgY2hlY2sgZGVjb2RlciBjYXBhYmlsaXRpZXMgYXQgcHJlc2VudAotICAgICAgICBBdCBwcmVzZW50LCB3ZSBvbmx5IGNoZWNrIHdoZXRoZXIgd2luZG93cyBtZWRpYSBpcyB2aXNpYmxlCi0gICAgICAgIGZvciBURVNUIGFwcGxpY2F0aW9ucy4gRm9yIG90aGVyIGFwcGxpY2F0aW9ucywgd2UgZG8KLSAgICAgICAgbm90IHBlcmZvcm0gYW55IGNoZWNrcyBhdCBhbGwuCi0gICAgLS0+Ci0gICAgPFZpZGVvRGVjb2RlckNhcCBuYW1lPSJ3bXYiIGVuYWJsZWQ9InRydWUiLz4KLSAgICA8QXVkaW9EZWNvZGVyQ2FwIG5hbWU9IndtYSIgZW5hYmxlZD0idHJ1ZSIvPgotCi0gICAgPCEtLQotICAgICAgICBUaGUgVmlkZW9FZGl0b3IgQ2FwYWJpbGl0eSBjb25maWd1cmF0aW9uOgotICAgICAgICAtIG1heElucHV0RnJhbWVXaWR0aDogbWF4aW11bSB2aWRlbyB3aWR0aCBvZiBpbXBvcnRlZCB2aWRlbyBjbGlwLgotICAgICAgICAtIG1heElucHV0RnJhbWVIZWlnaHQ6IG1heGltdW0gdmlkZW8gaGVpZ2h0IG9mIGltcG9ydGVkIHZpZGVvIGNsaXAuCi0gICAgICAgIC0gbWF4T3V0cHV0RnJhbWVXaWR0aDogbWF4aW11bSB2aWRlbyB3aWR0aCBvZiBleHBvcnRlZCB2aWRlbyBjbGlwLgotICAgICAgICAtIG1heE91dHB1dEZyYW1lSGVpZ2h0OiBtYXhpbXVtIHZpZGVvIGhlaWdodCBvZiBleHBvcnRlZCB2aWRlbyBjbGlwLgotICAgICAgICAtIG1heFByZWZldGNoWVVWRnJhbWVzOiBtYXhpbXVtIHByZWZldGNoIFlVViBmcmFtZXMgZm9yIGVuY29kZXIsCi0gICAgICAgIHVzZWQgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgZm9yIHByZWZldGNoZWQgWVVWIGZyYW1lcy4KLSAgICAgICAgRm9yIHRoaXMgcGxhdGZvcm0sIGl0IGFsbG93cyBtYXhpbXVtIDMwTUIoM01CIHBlciAxMDgwcCBmcmFtZSB4IDEwCi0gICAgICAgIGZyYW1lcykgbWVtb3J5LgotICAgIC0tPgotICAgIDxWaWRlb0VkaXRvckNhcCAgbWF4SW5wdXRGcmFtZVdpZHRoPSIxOTIwIgotICAgICAgICBtYXhJbnB1dEZyYW1lSGVpZ2h0PSIxMDgwIiBtYXhPdXRwdXRGcmFtZVdpZHRoPSIxOTIwIgotICAgICAgICBtYXhPdXRwdXRGcmFtZUhlaWdodD0iMTA4MCIgbWF4UHJlZmV0Y2hZVVZGcmFtZXM9IjEwIi8+Ci0gICAgPCEtLQotICAgICAgICBUaGUgVmlkZW9FZGl0b3IgRXhwb3J0IGNvZGVjIHByb2ZpbGUgYW5kIGxldmVsIHZhbHVlcwotICAgICAgICBjb3JyZXNwb25kIHRvIHRoZSB2YWx1ZXMgaW4gT01YX1ZpZGVvLmguCi0gICAgICAgIEUuZy4gZm9yIGgyNjQsIHByb2ZpbGUgdmFsdWUgMSBtZWFucyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lCi0gICAgICAgIGFuZCAgbGV2ZWwgNDA5NiBtZWFucyBPTVhfVklERU9fQVZDTGV2ZWw0MS4KLSAgICAgICAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgdmFsdWVzIGFyZSBpbiBkZWNpbWFsLgotICAgICAgICBUaGVzZSB2YWx1ZXMgYXJlIGZvciB2aWRlbyBlbmNvZGVyLgotICAgIC0tPgotICAgIDwhLS0KLSAgICAgIENvZGVjID0gaC4yNjQsIEJhc2VsaW5lIHByb2ZpbGUsIGxldmVsIDQKLSAgICAtLT4KLSAgICA8RXhwb3J0VmlkZW9Qcm9maWxlIG5hbWU9ImgyNjQiIHByb2ZpbGU9ICIxIiBsZXZlbD0iMjA0OCIvPgotPC9NZWRpYVNldHRpbmdzPgpkaWZmIC0tZ2l0IGEvc2RtODQ1L2NvbmZpZ3VyZS5hYyBiL3NkbTg0NS9jb25maWd1cmUuYWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczY2RkNWEuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L2NvbmZpZ3VyZS5hYworKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0jIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLSMgUmVxdWlyZXMgYXV0b2NvbmYgdG9vbCBsYXRlciB0aGFuIDIuNjEKLUFDX1BSRVJFUShbMi42MV0pCi0jIEluaXRpYWxpemUgdGhlIG9teHZpZGVvIHBhY2thZ2UgdmVyc2lvbiAxLjAuMAotQUNfSU5JVChbb214dmlkZW9dLCAxLjAuMCkKLSMgRG9lcyBub3Qgc3RyaWN0bHkgZm9sbG93IEdOVSBDb2Rpbmcgc3RhbmRhcmRzCi1BTV9JTklUX0FVVE9NQUtFKFtnbnUgZm9yZWlnbiBzdWJkaXItb2JqZWN0c10pCi1BTV9NQUlOVEFJTkVSX01PREUKLSMgZGVmaW5lcyBzb21lIG1hY3JvcyB2YXJpYWJsZSB0byBiZSBpbmNsdWRlZCBieSBzb3VyY2UKLUFDX0NPTkZJR19IRUFERVIoW2NvbmZpZy5oXSkKLUFDX0NPTkZJR19NQUNST19ESVIoW200XSkKLQotIyBDaGVja3MgZm9yIHByb2dyYW1zLgotQU1fUFJPR19BUgotQUNfUFJPR19DQwotQUNfUFJPR19DUFAKLUFDX1BST0dfQ1hYCi1BTV9QUk9HX0NDX0NfTwotQUNfUFJPR19MSUJUT09MCi1BQ19QUk9HX0FXSwotQUNfUFJPR19JTlNUQUxMCi1BQ19QUk9HX0xOX1MKLUFDX1BST0dfTUFLRV9TRVQKLQotUEtHX1BST0dfUEtHX0NPTkZJRwotCi1BQ19BUkdfRU5BQkxFKFt0YXJnZXQtbXNtODk1M10sCi0gICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS10YXJnZXQtbXNtODk1M10sCi0gICAgICAgICAgICAgICAgW0VuYWJsZSBjb25kaXRpb25hbCBjb21waWxlIGZvciB0YXJnZXQgbXNtODk1MyBbZGVmYXVsdD1ub11dKSwKLSAgICAgICAgW3RhcmdldF9tc204OTUzPSIke2VuYWJsZXZhbH0iXSkKLQotQUNfQVJHX0VOQUJMRShbdGFyZ2V0LW1zbTg5MDldLAotICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdGFyZ2V0LW1zbTg5MDldLAotICAgICAgICAgICAgICAgIFtFbmFibGUgY29uZGl0aW9uYWwgY29tcGlsZSBmb3IgdGFyZ2V0IG1zbTg5MDkgW2RlZmF1bHQ9bm9dXSksCi0gICAgICAgIFt0YXJnZXRfbXNtODkwOT0iJHtlbmFibGV2YWx9Il0pCi0KLUFDX0FSR19FTkFCTEUoW3RhcmdldC1tc204OTk2XSwKLSAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRhcmdldC1tc204OTk2XSwKLSAgICAgICAgICAgICAgICBbRW5hYmxlIGNvbmRpdGlvbmFsIGNvbXBpbGUgZm9yIHRhcmdldCBtc204OTk2IFtkZWZhdWx0PW5vXV0pLAotICAgICAgICBbdGFyZ2V0X21zbTg5OTY9IiR7ZW5hYmxldmFsfSJdKQotCi1BQ19BUkdfRU5BQkxFKFt0YXJnZXQtbXNtODYxMF0sCi0gICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS10YXJnZXQtbXNtODYxMF0sCi0gICAgICAgICAgICAgICAgW0VuYWJsZSBjb25kaXRpb25hbCBjb21waWxlIGZvciB0YXJnZXQgbXNtODYxMCBbZGVmYXVsdD1ub11dKSwKLSAgICAgICAgW3RhcmdldF9tc204NjEwPSIke2VuYWJsZXZhbH0iXSkKLQotQUNfQVJHX0VOQUJMRShbdGFyZ2V0LW1zbTgyMjZdLAotICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdGFyZ2V0LW1zbTgyMjZdLAotICAgICAgICAgICAgICAgIFtFbmFibGUgY29uZGl0aW9uYWwgY29tcGlsZSBmb3IgdGFyZ2V0IG1zbTg2MTAgW2RlZmF1bHQ9bm9dXSksCi0gICAgICAgIFt0YXJnZXRfbXNtODIyNj0iJHtlbmFibGV2YWx9Il0pCi0KLUFDX0FSR19FTkFCTEUoW2lzLXVid2Mtc3VwcG9ydGVkXSwKLSAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXVid2Mtc3VwcG9ydGVkXSwKLSAgICAgICAgICAgICAgICBbRW5hYmxlIGNvbmRpdGlvbmFsIGNvbXBpbGUgZm9yIHRhcmdldCBtc204OTUzIFtkZWZhdWx0PW5vXV0pLAotICAgICAgICBbdGFyZ2V0c190aGF0X3N1cHBvcnRfdWJ3Yz0iJHtlbmFibGV2YWx9Il0pCi0KLUFDX0FSR19FTkFCTEUoW3RhcmdldHMtdGhhdC1zdXBwb3J0LXBxXSwKLSAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRhcmdldHMtdGhhdC1zdXBwb3J0LXBxXSwKLSAgICAgICAgICAgICAgICBbRW5hYmxlIGNvbmRpdGlvbmFsIGNvbXBpbGUgZm9yIHRhcmdldCBtc204OTUzIFtkZWZhdWx0PW5vXV0pLAotICAgICAgICBbdGFyZ2V0c190aGF0X3N1cHBvcnRfcHE9IiR7ZW5hYmxldmFsfSJdKQotCi1BQ19BUkdfRU5BQkxFKFt0YXJnZXQtdXNlcy1pb25dLAotICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdGFyZ2V0LXVzZXMtaW9uXSwKLSAgICAgICAgICAgICAgICBbRW5hYmxlIGNvbmRpdGlvbmFsIGNvbXBpbGUgZm9yIHRhcmdldCB0YXJnZXQtdXNlcy1pb24gW2RlZmF1bHQ9bm9dXSksCi0gICAgICAgIFt0YXJnZXRfdXNlc19pb249IiR7ZW5hYmxldmFsfSJdKQotCi1BQ19BUkdfRU5BQkxFKFt0YXJnZXRzLXRoYXQtdXNlLWZsYWctbXNtODIyNl0sCi0gICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS10YXJnZXRzLXRoYXQtdXNlLWZsYWctbXNtODIyNl0sCi0gICAgICAgICAgICAgICAgW0VuYWJsZSBjb25kaXRpb25hbCBjb21waWxlIGZvciB0YXJnZXQgdGFyZ2V0c190aGF0X3VzZV9mbGFnX21zbTgyMjYgW2RlZmF1bHQ9bm9dXSksCi0gICAgICAgIFt0YXJnZXRzX3RoYXRfdXNlX2ZsYWdfbXNtODIyNj0iJHtlbmFibGV2YWx9Il0pCi0KLUFDX0FSR19FTkFCTEUoW3RhcmdldC11c2VzLW1lZGlhLWV4dGVuc2lvbnNdLAotICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdGFyZ2V0LXVzZXMtbWVkaWEtZXh0ZW5zaW9uc10sCi0gICAgICAgICAgICAgICAgW0VuYWJsZSBjb25kaXRpb25hbCBjb21waWxlIGZvciB0YXJnZXQgdGFyZ2V0X3VzZXNfbWVkaWFfZXh0ZW5zaW9ucyBbZGVmYXVsdD1ub11dKSwKLSAgICAgICAgW3RhcmdldF91c2VzX21lZGlhX2V4dGVuc2lvbnM9IiR7ZW5hYmxldmFsfSJdKQotCi1BQ19BUkdfRU5BQkxFKFttYXN0ZXItc2lkZS1jcC10YXJnZXQtbGlzdF0sCi0gICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1tYXN0ZXItc2lkZS1jcC10YXJnZXQtbGlzdF0sCi0gICAgICAgICAgICAgICAgW0VuYWJsZSBjb25kaXRpb25hbCBjb21waWxlIGZvciB0YXJnZXQgbWFzdGVyX3NpZGVfY3BfdGFyZ2V0X2xpc3QgW2RlZmF1bHQ9bm9dXSksCi0gICAgICAgIFttYXN0ZXJfc2lkZV9jcF90YXJnZXRfbGlzdD0iJHtlbmFibGV2YWx9Il0pCi0KLUFDX0FSR19FTkFCTEUoW3RhcmdldHMtdGhhdC11c2UtaGV2Yy1hZHNwLWhlYXBdLAotICAgICAgICBBQ19IRUxQX1NUUklORyhbLXRhcmdldHMtdGhhdC11c2UtaGV2Yy1hZHNwLWhlYXBdLAotICAgICAgICAgICAgICAgIFtFbmFibGUgY29uZGl0aW9uYWwgY29tcGlsZSBmb3IgdGFyZ2V0IHRhcmdldC11c2VzLWlvbiBbZGVmYXVsdD1ub11dKSwKLSAgICAgICAgW3RhcmdldHNfdGhhdF91c2VfaGV2Y19hZHNwX2hlYXA9IiR7ZW5hYmxldmFsfSJdKQotCi1BQ19BUkdfRU5BQkxFKFt1c2UtZ2xpYl0sCi0gICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS11c2UtZ2xpYl0sCi0gICAgICAgICAgICAgICAgW0VuYWJsZSBjb25kaXRpb25hbCBjb21waWxlIGZvciB1c2UgZ2xpYiBbZGVmYXVsdD1ub11dKSwKLSAgICAgICAgW3VzZV9nbGliPSIke2VuYWJsZXZhbH0iXSkKLQotQUNfQVJHX0VOQUJMRShbYnVpbGQtbW0tdmlkZW9dLAotICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdXNlLWdsaWJdLAotICAgICAgICAgICAgICAgIFtFbmFibGUgY29uZGl0aW9uYWwgY29tcGlsZSBmb3IgdXNlIGdsaWIgW2RlZmF1bHQ9bm9dXSksCi0gICAgICAgIFtidWlsZF9tbV92aWRlbz0iJHtlbmFibGV2YWx9Il0pCi0KLUFDX0FSR19XSVRIKFtzYW5pdGl6ZWQtaGVhZGVyc10sCi0gICAgICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXNhbml0aXplZC1oZWFkZXJzPURJUl0sW2xvY2F0aW9uIG9mIHRoZSBzYW5pdGl6ZWQgTGludXgga2VybmVsIGhlYWRlcnNdKV0sCi0gICAgICAgIFtDUFBGTEFHUz0iJENQUEZMQUdTIC1JICR3aXRodmFsIl0pCi0KLUFDX0FSR19XSVRIKFtnbGliLWhlYWRlcnNdLAotICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1iaW5kZXItaW5jPURJUl0sW2xvY2F0aW9uIG9mIGNvbW1vbiBoZWFkZXJzXSldLAotICAgICAgICBbQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRodmFsIl0pCi0KLUFDX0FSR19XSVRIKFt1dGlscy1oZWFkZXJzXSwKLSAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtdXRpbHMtaW5jPURJUl0sW2xvY2F0aW9uIG9mIGNvbW1vbiBoZWFkZXJzXSldLAotICAgICAgICBbQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRodmFsIl0pCi0KLUFDX0FSR19XSVRIKFtjdXRpbHMtaGVhZGVyc10sCi0gICAgICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWN1dGlscy1pbmM9RElSXSxbbG9jYXRpb24gb2YgY29tbW9uIGhlYWRlcnNdKV0sCi0gICAgICAgIFtDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHdpdGh2YWwiXSkKLQotQUNfQVJHX1dJVEgoW2tlcm5lbC1oZWFkZXJzXSwKLSAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgta2VybmVsLWluYz1ESVJdLFtsb2NhdGlvbiBvZiBjb21tb24gaGVhZGVyc10pXSwKLSAgICAgICAgW0NQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkd2l0aHZhbCJdKQotCi1BQ19BUkdfV0lUSChba2VybmVsLXVhcGktaGVhZGVyc10sCi0gICAgICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWtlcm5lbC11YXBpLWluYz1ESVJdLFtsb2NhdGlvbiBvZiBjb21tb24gaGVhZGVyc10pXSwKLSAgICAgICAgW0NQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkd2l0aHZhbCJdKQotCi1BQ19BUkdfV0lUSChbYWRyZW5vLWhlYWRlcnNdLAotICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1hZHJlbm8taW5jPURJUl0sW2xvY2F0aW9uIG9mIGNvbW1vbiBoZWFkZXJzXSldLAotICAgICAgICBbQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRodmFsIl0pCi0KLUFDX0FSR19XSVRIKFtsaWJncHVzdGF0cy1oZWFkZXJzXSwKLSAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtbGliZ3B1c3RhdHMtaGVhZGVycz1ESVJdLFtsb2NhdGlvbiBvZiBjb21tb24gaGVhZGVyc10pXSwKLSAgICAgICAgW0NQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkd2l0aHZhbCJdKQotCi1BQ19BUkdfV0lUSChbdWktaGVhZGVyc10sCi0gICAgICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXVpLWluYz1ESVJdLFtsb2NhdGlvbiBvZiBjb21tb24gaGVhZGVyc10pXSwKLSAgICAgICAgW0NQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkd2l0aHZhbCJdKQotCi1BQ19BUkdfV0lUSChbYW5kcm9pZC1oZWFkZXJzXSwKLSAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtZ3JhbGxvYy1pbmM9RElSXSxbbG9jYXRpb24gb2YgY29tbW9uIGhlYWRlcnNdKV0sCi0gICAgICAgIFtDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHdpdGh2YWwiXSkKLQotQUNfQVJHX1dJVEgoW2dyYWxsb2MtaGVhZGVyc10sCi0gICAgICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXN0cmNweWluY2x1ZGVzLWluYz1ESVJdLFtsb2NhdGlvbiBvZiBjb21tb24gaGVhZGVyc10pXSwKLSAgICAgICAgW0NQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkd2l0aHZhbCJdKQotCi1BQ19BUkdfV0lUSChbYmluZGVyLWhlYWRlcnNdLAotICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1iaW5kZXItaW5jPURJUl0sW2xvY2F0aW9uIG9mIGNvbW1vbiBoZWFkZXJzXSldLAotICAgICAgICBbQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRodmFsIl0pCi0KLUFDX0FSR19XSVRIKFtkaXNwbGF5LWhlYWRlcnNdLAotICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1iaW5kZXItaW5jPURJUl0sW2xvY2F0aW9uIG9mIGNvbW1vbiBoZWFkZXJzXSldLAotICAgICAgICBbQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRodmFsIl0pCi0KLUFDX0FSR19XSVRIKFtxZHV0aWxzLWhlYWRlcnNdLAotICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1iaW5kZXItaW5jPURJUl0sW2xvY2F0aW9uIG9mIGNvbW1vbiBoZWFkZXJzXSldLAotICAgICAgICBbQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRodmFsIl0pCi0KLUFDX0FSR19XSVRIKFtnbGliLWxpYi1kaXJdLAotICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1iaW5kZXItaW5jPURJUl0sW2xvY2F0aW9uIG9mIGNvbW1vbiBoZWFkZXJzXSldLAotICAgICAgICBbQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRodmFsIl0pCi0KLUFNX0NPTkRJVElPTkFMKFRBUkdFVF9NU004OTUzLCBbdGVzdCAieCR0YXJnZXRfbXNtODk1MyIgPSAieHllcyJdKQotQU1fQ09ORElUSU9OQUwoVEFSR0VUX01TTTg5MDksIFt0ZXN0ICJ4JHRhcmdldF9tc204OTA5IiA9ICJ4eWVzIl0pCi1BTV9DT05ESVRJT05BTChUQVJHRVRfTVNNODk5NiwgW3Rlc3QgIngkdGFyZ2V0X21zbTg5OTYiID0gInh5ZXMiXSkKLUFNX0NPTkRJVElPTkFMKFRBUkdFVF9NU004NjEwLCBbdGVzdCAieCR0YXJnZXRfbXNtODYxMCIgPSAieHllcyJdKQotQU1fQ09ORElUSU9OQUwoVEFSR0VUX01TTTgyMjYsIFt0ZXN0ICJ4JHRhcmdldF9tc204MjI2IiA9ICJ4eWVzIl0pCi1BTV9DT05ESVRJT05BTChUQVJHRVRTX1RIQVRfU1VQUE9SVF9VQldDLCBbdGVzdCAieCR0YXJnZXRzX3RoYXRfc3VwcG9ydF91YndjIiA9ICJ4eWVzIl0pCi1BTV9DT05ESVRJT05BTChUQVJHRVRTX1RIQVRfU1VQUE9SVF9QUSwgW3Rlc3QgIngkdGFyZ2V0c190aGF0X3N1cHBvcnRfcHEiID0gInh5ZXMiXSkKLUFNX0NPTkRJVElPTkFMKFRBUkdFVF9VU0VTX0lPTiwgW3Rlc3QgIngkdGFyZ2V0X3VzZXNfaW9uIiA9ICJ4eWVzIl0pCi1BTV9DT05ESVRJT05BTChUQVJHRVRTX1RIQVRfVVNFX0ZMQUdfTVNNODIyNiwgW3Rlc3QgIngkdGFyZ2V0c190aGF0X3VzZV9mbGFnX21zbTgyMjYiID0gInh5ZXMiXSkKLUFNX0NPTkRJVElPTkFMKFRBUkdFVF9VU0VTX01FRElBX0VYVEVOU0lPTlMsIFt0ZXN0ICJ4JHRhcmdldF91c2VzX21lZGlhX2V4dGVuc2lvbnMiID0gInh5ZXMiXSkKLUFNX0NPTkRJVElPTkFMKE1BU1RFUl9TSURFX0NQX1RBUkdFVF9MSVNULCBbdGVzdCAieCRtYXN0ZXJfc2lkZV9jcF90YXJnZXRfbGlzdCIgPSAieHllcyJdKQotQU1fQ09ORElUSU9OQUwoVVNFX0dMSUIsIFt0ZXN0ICJ4JHVzZV9nbGliIiA9ICJ4eWVzIl0pCi1BTV9DT05ESVRJT05BTChCVUlMRF9NTV9WSURFTywgW3Rlc3QgIngkYnVpbGRfbW1fdmlkZW8iID0gInh5ZXMiXSkKLQotQUNfQVJHX1dJVEgoW2dsaWJdLAotICAgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1nbGliXSwKLSAgICAgICAgIFtlbmFibGUgZ2xpYiwgYnVpbGRpbmcgSExPUyBzeXN0ZW1zIHdoaWNoIHVzZSBnbGliXSkpCi0KLWlmICh0ZXN0ICJ4JHt3aXRoX2dsaWJ9IiA9ICJ4eWVzIik7IHRoZW4KLSAgICAgICAgR0xJQl9DRkxBR1M9IiRHTElCX0NGTEFHUyAkR1RIUkVBRF9DRkxBR1MiCi0gICAgICAgIEdMSUJfTElCUz0iJEdMSUJfTElCUyAkR1RIUkVBRF9MSUJTIgotCi0gICAgICAgIEFDX1NVQlNUKEdMSUJfQ0ZMQUdTKQotICAgICAgICBBQ19TVUJTVChHTElCX0xJQlMpCi1maQotCi1BQ19TVUJTVChbQ1BQRkxBR1NdKQotQUNfU1VCU1QoW0NGTEFHU10pCi0KLUFDX0NPTkZJR19GSUxFUyhbIFwKLSAgICAgICAgTWFrZWZpbGUgXAotICAgICAgICBtbS1jb3JlL01ha2VmaWxlCi0gICAgICAgIG1tLXZpZGVvLXY0bDIvTWFrZWZpbGUgXAotICAgICAgICBtbS12aWRlby12NGwyL3ZpZGMvTWFrZWZpbGUgXAotICAgICAgICBtbS12aWRlby12NGwyL3ZpZGMvdmVuYy9NYWtlZmlsZSBcCi0gICAgICAgIG1tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL01ha2VmaWxlIFwKLSAgICAgICAgXSkKLUFDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2RtODQ1L2xpYmMyZGNvbG9yY29udmVydC9BbmRyb2lkLm1rIGIvc2RtODQ1L2xpYmMyZGNvbG9yY29udmVydC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjUzODhkLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9saWJjMmRjb2xvcmNvbnZlcnQvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgICAgIEMyRENvbG9yQ29udmVydGVyLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvYWRyZW5vCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoVEFSR0VUX09VVF9IRUFERVJTKS9xY29tL2Rpc3BsYXkKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURVMpL0tFUk5FTF9PQkovdXNyL2luY2x1ZGUKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliZGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmMyZGNvbG9yY29udmVydAotCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLQotTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURVMpL0tFUk5FTF9PQkovdXNyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NkbTg0NS9saWJjMmRjb2xvcmNvbnZlcnQvQzJEQ29sb3JDb252ZXJ0ZXIuY3BwIGIvc2RtODQ1L2xpYmMyZGNvbG9yY29udmVydC9DMkRDb2xvckNvbnZlcnRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNjRkMDguLjAwMDAwMDAKLS0tIGEvc2RtODQ1L2xpYmMyZGNvbG9yY29udmVydC9DMkRDb2xvckNvbnZlcnRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3ODYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyIC0gMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogcmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogcmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogbmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIGFuZCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gKiB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQgd2FycmFudGllcyBvZgotICogbWVyY2hhbnRhYmlsaXR5LCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhbmQgbm9uLWluZnJpbmdlbWVudAotICogYXJlIGRpc2NsYWltZWQuICBpbiBubyBldmVudCBzaGFsbCB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGNvbnRyaWJ1dG9ycwotICogYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvcgotICogY29uc2VxdWVudGlhbCBkYW1hZ2VzIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2YKLSAqIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvcgotICogYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksCi0gKiB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZQotICogb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbgotICogaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxDMkRDb2xvckNvbnZlcnRlci5oPgotCi1DMkRDb2xvckNvbnZlcnRlcjo6QzJEQ29sb3JDb252ZXJ0ZXIoKQotICAgIDogbUMyRExpYkhhbmRsZShOVUxMKSwKLSAgICAgIG1BZHJlbm9VdGlsc0hhbmRsZShOVUxMKQotewotCi0gICAgZW5hYmxlZCA9IHRydWU7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZtTG9jaywgTlVMTCk7Ci0KLSAgICBtQzJETGliSGFuZGxlID0gZGxvcGVuKCJsaWJDMkQyLnNvIiwgUlRMRF9OT1cpOwotICAgIGlmICghbUMyRExpYkhhbmRsZSkgewotICAgICAgICBBTE9HRSgiRkFUQUwgRVJST1I6IGNvdWxkIG5vdCBkbG9wZW4gbGliYzJkMi5zbzogJXMiLCBkbGVycm9yKCkpOwotICAgICAgICBlbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbUFkcmVub1V0aWxzSGFuZGxlID0gZGxvcGVuKCJsaWJhZHJlbm9fdXRpbHMuc28iLCBSVExEX05PVyk7Ci0gICAgaWYgKCFtQWRyZW5vVXRpbHNIYW5kbGUpIHsKLSAgICAgICAgQUxPR0UoIkZBVEFMIEVSUk9SOiBjb3VsZCBub3QgZGxvcGVuIGxpYmFkcmVub191dGlscy5zbzogJXMiLCBkbGVycm9yKCkpOwotICAgICAgICBlbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtQzJEQ3JlYXRlU3VyZmFjZSA9IChMSU5LX2MyZENyZWF0ZVN1cmZhY2UpZGxzeW0obUMyRExpYkhhbmRsZSwgImMyZENyZWF0ZVN1cmZhY2UiKTsKLSAgICAgbUMyRFVwZGF0ZVN1cmZhY2UgPSAoTElOS19jMmRVcGRhdGVTdXJmYWNlKWRsc3ltKG1DMkRMaWJIYW5kbGUsICJjMmRVcGRhdGVTdXJmYWNlIik7Ci0gICAgIG1DMkRSZWFkU3VyZmFjZSA9IChMSU5LX2MyZFJlYWRTdXJmYWNlKWRsc3ltKG1DMkRMaWJIYW5kbGUsICJjMmRSZWFkU3VyZmFjZSIpOwotICAgICBtQzJERHJhdyA9IChMSU5LX2MyZERyYXcpZGxzeW0obUMyRExpYkhhbmRsZSwgImMyZERyYXciKTsKLSAgICAgbUMyREZsdXNoID0gKExJTktfYzJkRmx1c2gpZGxzeW0obUMyRExpYkhhbmRsZSwgImMyZEZsdXNoIik7Ci0gICAgIG1DMkRGaW5pc2ggPSAoTElOS19jMmRGaW5pc2gpZGxzeW0obUMyRExpYkhhbmRsZSwgImMyZEZpbmlzaCIpOwotICAgICBtQzJEV2FpdFRpbWVzdGFtcCA9IChMSU5LX2MyZFdhaXRUaW1lc3RhbXApZGxzeW0obUMyRExpYkhhbmRsZSwgImMyZFdhaXRUaW1lc3RhbXAiKTsKLSAgICAgbUMyRERlc3Ryb3lTdXJmYWNlID0gKExJTktfYzJkRGVzdHJveVN1cmZhY2UpZGxzeW0obUMyRExpYkhhbmRsZSwgImMyZERlc3Ryb3lTdXJmYWNlIik7Ci0gICAgIG1DMkRNYXBBZGRyID0gKExJTktfYzJkTWFwQWRkcilkbHN5bShtQzJETGliSGFuZGxlLCAiYzJkTWFwQWRkciIpOwotICAgICBtQzJEVW5NYXBBZGRyID0gKExJTktfYzJkVW5NYXBBZGRyKWRsc3ltKG1DMkRMaWJIYW5kbGUsICJjMmRVbk1hcEFkZHIiKTsKLQotICAgICBpZiAoIW1DMkRDcmVhdGVTdXJmYWNlIHx8ICFtQzJEVXBkYXRlU3VyZmFjZSB8fCAhbUMyRFJlYWRTdXJmYWNlCi0gICAgICAgIHx8ICFtQzJERHJhdyB8fCAhbUMyREZsdXNoIHx8ICFtQzJERmluaXNoIHx8ICFtQzJEV2FpdFRpbWVzdGFtcAotICAgICAgICB8fCAhbUMyRERlc3Ryb3lTdXJmYWNlIHx8ICFtQzJETWFwQWRkciB8fCAhbUMyRFVuTWFwQWRkcikgewotICAgICAgICAgQUxPR0UoIiVzOiBkbHN5bSBFUlJPUiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICBlbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgICBtQWRyZW5vQ29tcHV0ZUFsaWduZWRXaWR0aEFuZEhlaWdodCA9IChMSU5LX0FkcmVub0NvbXB1dGVBbGlnbmVkV2lkdGhBbmRIZWlnaHQpZGxzeW0obUFkcmVub1V0aWxzSGFuZGxlLCAiY29tcHV0ZV9hbGlnbmVkX3dpZHRoX2FuZF9oZWlnaHQiKTsKLSAgICAgaWYgKCFtQWRyZW5vQ29tcHV0ZUFsaWduZWRXaWR0aEFuZEhlaWdodCkgewotICAgICAgICAgQUxPR0UoIiVzOiBkbHN5bSBFUlJPUiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICBlbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICByZXR1cm47Ci0gICAgIH0KLX0KLQotQzJEQ29sb3JDb252ZXJ0ZXI6On5DMkRDb2xvckNvbnZlcnRlcigpCi17Ci0gICAgaWYgKGVuYWJsZWQpIHsKLQotICAgICAgICBtQzJERGVzdHJveVN1cmZhY2UobURzdFN1cmZhY2UpOwotICAgICAgICBtQzJERGVzdHJveVN1cmZhY2UobVNyY1N1cmZhY2UpOwotICAgICAgICBpZiAoaXNZVVZTdXJmYWNlKG1TcmNGb3JtYXQpKSB7Ci0gICAgICAgICAgICBkZWxldGUgKChDMkRfWVVWX1NVUkZBQ0VfREVGICopbVNyY1N1cmZhY2VEZWYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVsZXRlICgoQzJEX1JHQl9TVVJGQUNFX0RFRiAqKW1TcmNTdXJmYWNlRGVmKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1lVVlN1cmZhY2UobURzdEZvcm1hdCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSAoKEMyRF9ZVVZfU1VSRkFDRV9ERUYgKiltRHN0U3VyZmFjZURlZik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWxldGUgKChDMkRfUkdCX1NVUkZBQ0VfREVGICopbURzdFN1cmZhY2VEZWYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1DMkRMaWJIYW5kbGUpIHsKLSAgICAgICAgZGxjbG9zZShtQzJETGliSGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKG1BZHJlbm9VdGlsc0hhbmRsZSkgewotICAgICAgICBkbGNsb3NlKG1BZHJlbm9VdGlsc0hhbmRsZSk7Ci0gICAgfQotfQotCi1ib29sIEMyRENvbG9yQ29udmVydGVyOjpzZXRSZXNvbHV0aW9uKHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvckNvbnZlcnRGb3JtYXQgc3JjRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvckNvbnZlcnRGb3JtYXQgZHN0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzLCBzaXplX3Qgc3JjU3RyaWRlKQotewotICAgIGludDMyX3QgcmV0dmFsID0gLTE7Ci0gICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtTG9jayk7Ci0gICAgICAgIG1TcmNXaWR0aCA9IHNyY1dpZHRoOwotICAgICAgICBtU3JjSGVpZ2h0ID0gc3JjSGVpZ2h0OwotICAgICAgICBtU3JjU3RyaWRlID0gc3JjU3RyaWRlOzsKLSAgICAgICAgbURzdFdpZHRoID0gZHN0V2lkdGg7Ci0gICAgICAgIG1Ec3RIZWlnaHQgPSBkc3RIZWlnaHQ7Ci0gICAgICAgIG1TcmNGb3JtYXQgPSBzcmNGb3JtYXQ7Ci0gICAgICAgIG1Ec3RGb3JtYXQgPSBkc3RGb3JtYXQ7Ci0gICAgICAgIG1TcmNTaXplID0gY2FsY1NpemUoc3JjRm9ybWF0LCBzcmNXaWR0aCwgc3JjSGVpZ2h0KTsKLSAgICAgICAgbURzdFNpemUgPSBjYWxjU2l6ZShkc3RGb3JtYXQsIGRzdFdpZHRoLCBkc3RIZWlnaHQpOwotICAgICAgICBtU3JjWVNpemUgPSBjYWxjWVNpemUoc3JjRm9ybWF0LCBzcmNXaWR0aCwgc3JjSGVpZ2h0KTsKLSAgICAgICAgbURzdFlTaXplID0gY2FsY1lTaXplKGRzdEZvcm1hdCwgZHN0V2lkdGgsIGRzdEhlaWdodCk7Ci0KLSAgICAgICAgbUZsYWdzID0gZmxhZ3M7IC8vIGNhbiBiZSB1c2VkIGZvciByb3RhdGlvbgotCi0gICAgICAgIHJldHZhbCA9IGdldER1bW15U3VyZmFjZURlZihzcmNGb3JtYXQsIHNyY1dpZHRoLCBzcmNIZWlnaHQsIHRydWUpOwotICAgICAgICByZXR2YWwgfD0gZ2V0RHVtbXlTdXJmYWNlRGVmKGRzdEZvcm1hdCwgZHN0V2lkdGgsIGRzdEhlaWdodCwgZmFsc2UpOwotCi0gICAgICAgIGlmIChyZXR2YWwgPT0gMCkgewotICAgICAgICAgICAgbWVtc2V0KCh2b2lkKikmbUJsaXQsMCxzaXplb2YoQzJEX09CSkVDVCkpOwotICAgICAgICAgICAgbUJsaXQuc291cmNlX3JlY3QueCA9IDAgPDwgMTY7Ci0gICAgICAgICAgICBtQmxpdC5zb3VyY2VfcmVjdC55ID0gMCA8PCAxNjsKLSAgICAgICAgICAgIG1CbGl0LnNvdXJjZV9yZWN0LndpZHRoID0gc3JjV2lkdGggPDwgMTY7Ci0gICAgICAgICAgICBtQmxpdC5zb3VyY2VfcmVjdC5oZWlnaHQgPSBzcmNIZWlnaHQgPDwgMTY7Ci0gICAgICAgICAgICBtQmxpdC50YXJnZXRfcmVjdC54ID0gMCA8PCAxNjsKLSAgICAgICAgICAgIG1CbGl0LnRhcmdldF9yZWN0LnkgPSAwIDw8IDE2OwotICAgICAgICAgICAgbUJsaXQudGFyZ2V0X3JlY3Qud2lkdGggPSBkc3RXaWR0aCA8PCAxNjsKLSAgICAgICAgICAgIG1CbGl0LnRhcmdldF9yZWN0LmhlaWdodCA9IGRzdEhlaWdodCA8PCAxNjsKLSAgICAgICAgICAgIG1CbGl0LmNvbmZpZ19tYXNrID0gQzJEX0FMUEhBX0JMRU5EX05PTkUgICAgfAotICAgICAgICAgICAgICAgIEMyRF9OT19CSUxJTkVBUl9CSVQgICAgIHwKLSAgICAgICAgICAgICAgICBDMkRfTk9fQU5USUFMSUFTSU5HX0JJVCB8Ci0gICAgICAgICAgICAgICAgQzJEX1RBUkdFVF9SRUNUX0JJVDsKLSAgICAgICAgICAgIG1CbGl0LnN1cmZhY2VfaWQgPSBtU3JjU3VyZmFjZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTG9jayk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbCA9PSAwPyB0cnVlOmZhbHNlOwotfQotCi0KLWJvb2wgQzJEQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRDMkQoaW50IHNyY0ZkLCB2b2lkICpzcmNCYXNlLCB2b2lkICogc3JjRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdEZkLCB2b2lkICpkc3RCYXNlLCB2b2lkICogZHN0RGF0YSkKLXsKLSAgQzJEX1NUQVRVUyByZXQ7Ci0gIGJvb2wgc3RhdHVzID0gZmFsc2U7Ci0KLSAgaWYgKGVuYWJsZWQpIHsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm1Mb2NrKTsKLSAgICBpZiAoc3JjRmQgPCAwIHx8IGRzdEZkIDwgMAotICAgICAgICAgICAgICAgIHx8IHNyY0RhdGEgPT0gTlVMTCB8fCBkc3REYXRhID09IE5VTEwKLSAgICAgICAgICAgICAgICB8fCBzcmNCYXNlID09IE5VTEwgfHwgZHN0QmFzZSA9PSBOVUxMKSB7Ci0gICAgICBBTE9HRSgiSW5jb3JyZWN0IGlucHV0IHBhcmFtZXRlcnNcbiIpOwotICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLQotICAgICAgaWYgKGlzWVVWU3VyZmFjZShtU3JjRm9ybWF0KSkgewotICAgICAgICByZXQgPSB1cGRhdGVZVVZTdXJmYWNlRGVmKHNyY0ZkLCBzcmNCYXNlLCBzcmNEYXRhLCB0cnVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IHVwZGF0ZVJHQlN1cmZhY2VEZWYoc3JjRmQsIHNyY0RhdGEsIHRydWUpOwotICAgICAgfQotCi0gICAgICBpZiAocmV0ID09IEMyRF9TVEFUVVNfT0spIHsKLQotICAgICAgICBpZiAoaXNZVVZTdXJmYWNlKG1Ec3RGb3JtYXQpKSB7Ci0gICAgICAgICAgcmV0ID0gdXBkYXRlWVVWU3VyZmFjZURlZihkc3RGZCwgZHN0QmFzZSwgZHN0RGF0YSwgZmFsc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldCA9IHVwZGF0ZVJHQlN1cmZhY2VEZWYoZHN0RmQsIGRzdERhdGEsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXQgPT0gQzJEX1NUQVRVU19PSykgewotCi0gICAgICAgICAgbUJsaXQuc3VyZmFjZV9pZCA9IG1TcmNTdXJmYWNlOwotICAgICAgICAgIHJldCA9IG1DMkREcmF3KG1Ec3RTdXJmYWNlLCBDMkRfVEFSR0VUX1JPVEFURV8wLCAwLCAwLCAwLCAmbUJsaXQsIDEpOwotICAgICAgICAgIG1DMkRGaW5pc2gobURzdFN1cmZhY2UpOwotCi0gICAgICAgICAgaWYgKHJldCA9PSBDMkRfU1RBVFVTX09LKSB7Ci0gICAgICAgICAgICBib29sIHVubWFwcGVkU3JjU3VjY2VzczsKLSAgICAgICAgICAgIGlmIChpc1lVVlN1cmZhY2UobVNyY0Zvcm1hdCkpIHsKLSAgICAgICAgICAgICAgdW5tYXBwZWRTcmNTdWNjZXNzID0gdW5tYXBHUFVBZGRyKCh1bnNpZ25lZCBsb25nKSAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDMkRfWVVWX1NVUkZBQ0VfREVGICopbVNyY1N1cmZhY2VEZWYpLT5waHlzMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICB1bm1hcHBlZFNyY1N1Y2Nlc3MgPSB1bm1hcEdQVUFkZHIoKHVuc2lnbmVkIGxvbmcpICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEMyRF9SR0JfU1VSRkFDRV9ERUYgKiltU3JjU3VyZmFjZURlZiktPnBoeXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sIHVubWFwcGVkRHN0U3VjY2VzczsKLSAgICAgICAgICAgIGlmIChpc1lVVlN1cmZhY2UobURzdEZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgdW5tYXBwZWREc3RTdWNjZXNzID0gdW5tYXBHUFVBZGRyKCh1bnNpZ25lZCBsb25nKSAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDMkRfWVVWX1NVUkZBQ0VfREVGICopbURzdFN1cmZhY2VEZWYpLT5waHlzMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICB1bm1hcHBlZERzdFN1Y2Nlc3MgPSB1bm1hcEdQVUFkZHIoKHVuc2lnbmVkIGxvbmcpICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEMyRF9SR0JfU1VSRkFDRV9ERUYgKiltRHN0U3VyZmFjZURlZiktPnBoeXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXVubWFwcGVkU3JjU3VjY2VzcyB8fCAhdW5tYXBwZWREc3RTdWNjZXNzKSB7Ci0gICAgICAgICAgICAgIEFMT0dFKCJ1bm1hcHBpbmcgR1BVIGFkZHJlc3MgZmFpbGVkICglZDolZClcbiIsIHVubWFwcGVkU3JjU3VjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgdW5tYXBwZWREc3RTdWNjZXNzKTsKLSAgICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBzdGF0dXMgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiQzJEIERyYXcgZmFpbGVkICglZClcbiIsIHJldCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQUxPR0UoIlVwZGF0ZSBkc3Qgc3VyZmFjZSBkZWYgZmFpbGVkICglZClcbiIsIHJldCk7Ci0gICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJVcGRhdGUgc3JjIHN1cmZhY2UgZGVmIGZhaWxlZCApJWQpXG4iLCByZXQpOwotICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUxvY2spOwotICB9Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotYm9vbCBDMkRDb2xvckNvbnZlcnRlcjo6aXNZVVZTdXJmYWNlKENvbG9yQ29udmVydEZvcm1hdCBmb3JtYXQpCi17Ci0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgY2FzZSBZQ2JDcjQyMFRpbGU6Ci0gICAgICAgIGNhc2UgWUNiQ3I0MjBTUDoKLSAgICAgICAgY2FzZSBZQ2JDcjQyMFA6Ci0gICAgICAgIGNhc2UgWUNyQ2I0MjBQOgotICAgICAgICBjYXNlIE5WMTJfMks6Ci0gICAgICAgIGNhc2UgTlYxMl8xMjhtOgotICAgICAgICBjYXNlIE5WMTJfVUJXQzoKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotaW50MzJfdCBDMkRDb2xvckNvbnZlcnRlcjo6Z2V0RHVtbXlTdXJmYWNlRGVmKENvbG9yQ29udmVydEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdXJjZSkKLXsKLSAgICB2b2lkICpzdXJmYWNlRGVmID0gTlVMTDsKLSAgICBDMkRfU1VSRkFDRV9UWVBFIGhvc3RTdXJmYWNlVHlwZTsKLQotICAgIGlmIChpc1lVVlN1cmZhY2UoZm9ybWF0KSkgewotICAgICAgICBDMkRfWVVWX1NVUkZBQ0VfREVGICoqc3VyZmFjZVlVVkRlZiA9IChDMkRfWVVWX1NVUkZBQ0VfREVGICoqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1NvdXJjZSA/ICZtU3JjU3VyZmFjZURlZiA6ICZtRHN0U3VyZmFjZURlZik7Ci0gICAgICAgIGlmICgqc3VyZmFjZVlVVkRlZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAqc3VyZmFjZVlVVkRlZiA9IChDMkRfWVVWX1NVUkZBQ0VfREVGICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbG9jKDEsIHNpemVvZihDMkRfWVVWX1NVUkZBQ0VfREVGKSk7Ci0gICAgICAgICAgICBpZiAoKnN1cmZhY2VZVVZEZWYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJDMkQgRHJhdyBmYWlsZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbXNldCgqc3VyZmFjZVlVVkRlZiwgMCwgc2l6ZW9mKEMyRF9ZVVZfU1VSRkFDRV9ERUYpKTsKLSAgICAgICAgfQotICAgICAgICAoKnN1cmZhY2VZVVZEZWYpLT5mb3JtYXQgPSBnZXRDMkRGb3JtYXQoZm9ybWF0KTsKLSAgICAgICAgKCpzdXJmYWNlWVVWRGVmKS0+d2lkdGggPSB3aWR0aDsKLSAgICAgICAgKCpzdXJmYWNlWVVWRGVmKS0+aGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAoKnN1cmZhY2VZVVZEZWYpLT5wbGFuZTAgPSAodm9pZCAqKTB4YWFhYWFhYWE7Ci0gICAgICAgICgqc3VyZmFjZVlVVkRlZiktPnBoeXMwID0gKHZvaWQgKikweGFhYWFhYWFhOwotICAgICAgICAoKnN1cmZhY2VZVVZEZWYpLT5zdHJpZGUwID0gY2FsY1N0cmlkZShmb3JtYXQsIHdpZHRoKTsKLSAgICAgICAgKCpzdXJmYWNlWVVWRGVmKS0+cGxhbmUxID0gKHZvaWQgKikweGFhYWFhYWFhOwotICAgICAgICAoKnN1cmZhY2VZVVZEZWYpLT5waHlzMSA9ICh2b2lkICopMHhhYWFhYWFhYTsKLSAgICAgICAgKCpzdXJmYWNlWVVWRGVmKS0+c3RyaWRlMSA9IGNhbGNTdHJpZGUoZm9ybWF0LCB3aWR0aCk7Ci0gICAgICAgICgqc3VyZmFjZVlVVkRlZiktPnN0cmlkZTIgPSBjYWxjU3RyaWRlKGZvcm1hdCwgd2lkdGgpOwotICAgICAgICAoKnN1cmZhY2VZVVZEZWYpLT5waHlzMiA9IE5VTEw7Ci0gICAgICAgICgqc3VyZmFjZVlVVkRlZiktPnBsYW5lMiA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKGZvcm1hdCA9PSBZQ2JDcjQyMFAgfHwKLSAgICAgICAgICAgIGZvcm1hdCA9PSBZQ3JDYjQyMFApIHsKLSAgICAgICAgICBwcmludGYoImhhbGYgc3RyaWRlIGZvciBDYiBDciBwbGFuZXMgXG4iKTsKLSAgICAgICAgICAoKnN1cmZhY2VZVVZEZWYpLT5zdHJpZGUxID0gY2FsY1N0cmlkZShmb3JtYXQsIHdpZHRoKSAvIDI7Ci0gICAgICAgICAgKCpzdXJmYWNlWVVWRGVmKS0+cGh5czIgPSAodm9pZCAqKTB4YWFhYWFhYWE7Ci0gICAgICAgICAgKCpzdXJmYWNlWVVWRGVmKS0+c3RyaWRlMiA9IGNhbGNTdHJpZGUoZm9ybWF0LCB3aWR0aCkgLyAyOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VyZmFjZURlZiA9ICpzdXJmYWNlWVVWRGVmOwotICAgICAgICBob3N0U3VyZmFjZVR5cGUgPSBDMkRfU1VSRkFDRV9ZVVZfSE9TVDsKLSAgICB9IGVsc2UgewotICAgICAgICBDMkRfUkdCX1NVUkZBQ0VfREVGICoqc3VyZmFjZVJHQkRlZiA9IChDMkRfUkdCX1NVUkZBQ0VfREVGICoqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1NvdXJjZSA/ICZtU3JjU3VyZmFjZURlZiA6ICZtRHN0U3VyZmFjZURlZik7Ci0gICAgICAgIGlmICgqc3VyZmFjZVJHQkRlZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAqc3VyZmFjZVJHQkRlZiA9IChDMkRfUkdCX1NVUkZBQ0VfREVGICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbG9jKDEsIHNpemVvZihDMkRfUkdCX1NVUkZBQ0VfREVGKSk7Ci0gICAgICAgICAgICBpZiAoKnN1cmZhY2VSR0JEZWYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJDMkQgRHJhdyBmYWlsZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbXNldCgqc3VyZmFjZVJHQkRlZiwgMCwgc2l6ZW9mKEMyRF9SR0JfU1VSRkFDRV9ERUYpKTsKLSAgICAgICAgfQotICAgICAgICAoKnN1cmZhY2VSR0JEZWYpLT5mb3JtYXQgPSBnZXRDMkRGb3JtYXQoZm9ybWF0KTsKLQotICAgICAgICBpZiAobUZsYWdzICYgcHJpdmF0ZV9oYW5kbGVfdDo6UFJJVl9GTEFHU19VQldDX0FMSUdORUQpCi0gICAgICAgICAgICAoKnN1cmZhY2VSR0JEZWYpLT5mb3JtYXQgfD0gQzJEX0ZPUk1BVF9VQldDX0NPTVBSRVNTRUQ7Ci0gICAgICAgICgqc3VyZmFjZVJHQkRlZiktPndpZHRoID0gd2lkdGg7Ci0gICAgICAgICgqc3VyZmFjZVJHQkRlZiktPmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgKCpzdXJmYWNlUkdCRGVmKS0+YnVmZmVyID0gKHZvaWQgKikweGFhYWFhYWFhOwotICAgICAgICAoKnN1cmZhY2VSR0JEZWYpLT5waHlzID0gKHZvaWQgKikweGFhYWFhYWFhOwotICAgICAgICAoKnN1cmZhY2VSR0JEZWYpLT5zdHJpZGUgPSBjYWxjU3RyaWRlKGZvcm1hdCwgd2lkdGgpOwotCi0gICAgICAgIHN1cmZhY2VEZWYgPSAqc3VyZmFjZVJHQkRlZjsKLSAgICAgICAgaG9zdFN1cmZhY2VUeXBlID0gQzJEX1NVUkZBQ0VfUkdCX0hPU1Q7Ci0gICAgfQotCi0gICAgbUMyRENyZWF0ZVN1cmZhY2UoaXNTb3VyY2UgPyAmbVNyY1N1cmZhY2UgOgotICAgICAgICAgICAgICAgICAgICAgICZtRHN0U3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBpc1NvdXJjZSA/IEMyRF9TT1VSQ0UgOiBDMkRfVEFSR0VULAotICAgICAgICAgICAgICAgICAgICAgIChDMkRfU1VSRkFDRV9UWVBFKShob3N0U3VyZmFjZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDMkRfU1VSRkFDRV9XSVRIX1BIWVMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDMkRfU1VSRkFDRV9XSVRIX1BIWVNfRFVNTVkpLAotICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VEZWYpOwotICAgIHJldHVybiAwOwotfQotCi1DMkRfU1RBVFVTIEMyRENvbG9yQ29udmVydGVyOjp1cGRhdGVZVVZTdXJmYWNlRGVmKGludCBmZCwgdm9pZCAqYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgYm9vbCBpc1NvdXJjZSkKLXsKLSAgICBpZiAoaXNTb3VyY2UpIHsKLSAgICAgICAgQzJEX1lVVl9TVVJGQUNFX0RFRiAqIHNyY1N1cmZhY2VEZWYgPSAoQzJEX1lVVl9TVVJGQUNFX0RFRiAqKW1TcmNTdXJmYWNlRGVmOwotICAgICAgICBzcmNTdXJmYWNlRGVmLT5wbGFuZTAgPSBkYXRhOwotICAgICAgICBzcmNTdXJmYWNlRGVmLT5waHlzMCAgPSAodWludDhfdCAqKWdldE1hcHBlZEdQVUFkZHIoZmQsIGRhdGEsIG1TcmNTaXplKSArICgodWludDhfdCAqKWRhdGEgLSAodWludDhfdCAqKWJhc2UpOwotICAgICAgICBzcmNTdXJmYWNlRGVmLT5wbGFuZTEgPSAodWludDhfdCAqKWRhdGEgKyBtU3JjWVNpemU7Ci0gICAgICAgIHNyY1N1cmZhY2VEZWYtPnBoeXMxICA9ICh1aW50OF90ICopc3JjU3VyZmFjZURlZi0+cGh5czAgKyBtU3JjWVNpemU7Ci0gICAgICAgIGlmIChzcmNTdXJmYWNlRGVmLT5mb3JtYXQgJiBDMkRfQ09MT1JfRk9STUFUXzQyMF9JNDIwIHx8Ci0gICAgICAgICAgICAgICBzcmNTdXJmYWNlRGVmLT5mb3JtYXQgJiBDMkRfQ09MT1JfRk9STUFUXzQyMF9ZVjEyKSB7Ci0gICAgICAgICAgICBzcmNTdXJmYWNlRGVmLT5wbGFuZTIgPSAodWludDhfdCAqKXNyY1N1cmZhY2VEZWYtPnBsYW5lMSArIG1TcmNZU2l6ZS80OwotICAgICAgICAgICAgc3JjU3VyZmFjZURlZi0+cGh5czIgID0gKHVpbnQ4X3QgKilzcmNTdXJmYWNlRGVmLT5waHlzMSArIG1TcmNZU2l6ZS80OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQzJEVXBkYXRlU3VyZmFjZShtU3JjU3VyZmFjZSwgQzJEX1NPVVJDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChDMkRfU1VSRkFDRV9UWVBFKShDMkRfU1VSRkFDRV9ZVVZfSE9TVCB8IEMyRF9TVVJGQUNFX1dJVEhfUEhZUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAmKCpzcmNTdXJmYWNlRGVmKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQzJEX1lVVl9TVVJGQUNFX0RFRiAqIGRzdFN1cmZhY2VEZWYgPSAoQzJEX1lVVl9TVVJGQUNFX0RFRiAqKW1Ec3RTdXJmYWNlRGVmOwotICAgICAgICBkc3RTdXJmYWNlRGVmLT5wbGFuZTAgPSBkYXRhOwotICAgICAgICBkc3RTdXJmYWNlRGVmLT5waHlzMCAgPSAodWludDhfdCAqKWdldE1hcHBlZEdQVUFkZHIoZmQsIGRhdGEsIG1Ec3RTaXplKSArICgodWludDhfdCAqKWRhdGEgLSAodWludDhfdCAqKWJhc2UpOwotICAgICAgICBkc3RTdXJmYWNlRGVmLT5wbGFuZTEgPSAodWludDhfdCAqKWRhdGEgKyBtRHN0WVNpemU7Ci0gICAgICAgIGRzdFN1cmZhY2VEZWYtPnBoeXMxICA9ICh1aW50OF90ICopZHN0U3VyZmFjZURlZi0+cGh5czAgKyBtRHN0WVNpemU7Ci0gICAgICAgIGlmIChkc3RTdXJmYWNlRGVmLT5mb3JtYXQgJiBDMkRfQ09MT1JfRk9STUFUXzQyMF9JNDIwIHx8Ci0gICAgICAgICAgICAgICBkc3RTdXJmYWNlRGVmLT5mb3JtYXQgJiBDMkRfQ09MT1JfRk9STUFUXzQyMF9ZVjEyKSB7Ci0gICAgICAgICAgICBkc3RTdXJmYWNlRGVmLT5wbGFuZTIgPSAodWludDhfdCAqKWRzdFN1cmZhY2VEZWYtPnBsYW5lMSArIG1Ec3RZU2l6ZS80OwotICAgICAgICAgICAgZHN0U3VyZmFjZURlZi0+cGh5czIgID0gKHVpbnQ4X3QgKilkc3RTdXJmYWNlRGVmLT5waHlzMSArIG1Ec3RZU2l6ZS80OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1DMkRVcGRhdGVTdXJmYWNlKG1Ec3RTdXJmYWNlLCBDMkRfVEFSR0VULAotICAgICAgICAgICAgICAgICAgICAgICAgKEMyRF9TVVJGQUNFX1RZUEUpKEMyRF9TVVJGQUNFX1lVVl9IT1NUIHwgQzJEX1NVUkZBQ0VfV0lUSF9QSFlTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYoKmRzdFN1cmZhY2VEZWYpKTsKLSAgICB9Ci19Ci0KLUMyRF9TVEFUVVMgQzJEQ29sb3JDb252ZXJ0ZXI6OnVwZGF0ZVJHQlN1cmZhY2VEZWYoaW50IGZkLCB2b2lkICogZGF0YSwgYm9vbCBpc1NvdXJjZSkKLXsKLSAgICBpZiAoaXNTb3VyY2UpIHsKLSAgICAgICAgQzJEX1JHQl9TVVJGQUNFX0RFRiAqIHNyY1N1cmZhY2VEZWYgPSAoQzJEX1JHQl9TVVJGQUNFX0RFRiAqKW1TcmNTdXJmYWNlRGVmOwotICAgICAgICBzcmNTdXJmYWNlRGVmLT5idWZmZXIgPSBkYXRhOwotICAgICAgICBzcmNTdXJmYWNlRGVmLT5waHlzID0gZ2V0TWFwcGVkR1BVQWRkcihmZCwgZGF0YSwgbVNyY1NpemUpOwotICAgICAgICByZXR1cm4gIG1DMkRVcGRhdGVTdXJmYWNlKG1TcmNTdXJmYWNlLCBDMkRfU09VUkNFLAotICAgICAgICAgICAgICAgICAgICAgICAgKEMyRF9TVVJGQUNFX1RZUEUpKEMyRF9TVVJGQUNFX1JHQl9IT1NUIHwgQzJEX1NVUkZBQ0VfV0lUSF9QSFlTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYoKnNyY1N1cmZhY2VEZWYpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDMkRfUkdCX1NVUkZBQ0VfREVGICogZHN0U3VyZmFjZURlZiA9IChDMkRfUkdCX1NVUkZBQ0VfREVGICopbURzdFN1cmZhY2VEZWY7Ci0gICAgICAgIGRzdFN1cmZhY2VEZWYtPmJ1ZmZlciA9IGRhdGE7Ci0gICAgICAgIEFMT0dWKCJkc3RTdXJmYWNlRGVmLT5idWZmZXIgPSAlcFxuIiwgZGF0YSk7Ci0gICAgICAgIGRzdFN1cmZhY2VEZWYtPnBoeXMgPSBnZXRNYXBwZWRHUFVBZGRyKGZkLCBkYXRhLCBtRHN0U2l6ZSk7Ci0gICAgICAgIHJldHVybiBtQzJEVXBkYXRlU3VyZmFjZShtRHN0U3VyZmFjZSwgQzJEX1RBUkdFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChDMkRfU1VSRkFDRV9UWVBFKShDMkRfU1VSRkFDRV9SR0JfSE9TVCB8IEMyRF9TVVJGQUNFX1dJVEhfUEhZUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAmKCpkc3RTdXJmYWNlRGVmKSk7Ci0gICAgfQotfQotCi11aW50MzJfdCBDMkRDb2xvckNvbnZlcnRlcjo6Z2V0QzJERm9ybWF0KENvbG9yQ29udmVydEZvcm1hdCBmb3JtYXQpCi17Ci0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgY2FzZSBSR0I1NjU6Ci0gICAgICAgICAgICByZXR1cm4gQzJEX0NPTE9SX0ZPUk1BVF81NjVfUkdCOwotICAgICAgICBjYXNlIFJHQkE4ODg4OgotICAgICAgICAgICAgcmV0dXJuIEMyRF9DT0xPUl9GT1JNQVRfODg4OF9SR0JBIHwgQzJEX0ZPUk1BVF9TV0FQX0VORElBTk5FU1MgfCBDMkRfRk9STUFUX1BSRU1VTFRJUExJRUQ7Ci0gICAgICAgIGNhc2UgUkdCQTg4ODhfVUJXQzoKLSAgICAgICAgICAgIHJldHVybiBDMkRfQ09MT1JfRk9STUFUXzg4ODhfUkdCQSB8Ci0gICAgICAgICAgICAgICAgICAgQzJEX0ZPUk1BVF9TV0FQX0VORElBTk5FU1MgfAotICAgICAgICAgICAgICAgICAgIEMyRF9GT1JNQVRfUFJFTVVMVElQTElFRCAgIHwKLSAgICAgICAgICAgICAgICAgICBDMkRfRk9STUFUX1VCV0NfQ09NUFJFU1NFRDsKLSAgICAgICAgY2FzZSBZQ2JDcjQyMFRpbGU6Ci0gICAgICAgICAgICByZXR1cm4gKEMyRF9DT0xPUl9GT1JNQVRfNDIwX05WMTIgfCBDMkRfRk9STUFUX01BQ1JPVElMRUQpOwotICAgICAgICBjYXNlIFlDYkNyNDIwU1A6Ci0gICAgICAgIGNhc2UgTlYxMl8ySzoKLSAgICAgICAgY2FzZSBOVjEyXzEyOG06Ci0gICAgICAgICAgICByZXR1cm4gQzJEX0NPTE9SX0ZPUk1BVF80MjBfTlYxMjsKLSAgICAgICAgY2FzZSBZQ2JDcjQyMFA6Ci0gICAgICAgICAgICByZXR1cm4gQzJEX0NPTE9SX0ZPUk1BVF80MjBfSTQyMDsKLSAgICAgICAgY2FzZSBZQ3JDYjQyMFA6Ci0gICAgICAgICAgICByZXR1cm4gQzJEX0NPTE9SX0ZPUk1BVF80MjBfWVYxMjsKLSAgICAgICAgY2FzZSBOVjEyX1VCV0M6Ci0gICAgICAgICAgICByZXR1cm4gQzJEX0NPTE9SX0ZPUk1BVF80MjBfTlYxMiB8IEMyRF9GT1JNQVRfVUJXQ19DT01QUkVTU0VEOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIkZvcm1hdCBub3Qgc3VwcG9ydGVkICwgJWRcbiIsIGZvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi1zaXplX3QgQzJEQ29sb3JDb252ZXJ0ZXI6OmNhbGNTdHJpZGUoQ29sb3JDb252ZXJ0Rm9ybWF0IGZvcm1hdCwgc2l6ZV90IHdpZHRoKQotewotICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgUkdCNTY1OgotICAgICAgICAgICAgcmV0dXJuIEFMSUdOKHdpZHRoLCBBTElHTjMyKSAqIDI7IC8vIFJHQjU2NSBoYXMgd2lkdGggYXMgdHdpY2UKLSAgICAgICAgY2FzZSBSR0JBODg4ODoKLSAgICAgICAgICAgIGlmIChtU3JjU3RyaWRlKQotICAgICAgICAgICAgICAgIHJldHVybiBtU3JjU3RyaWRlICogNDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gQUxJR04od2lkdGgsIEFMSUdOMzIpICogNDsKLSAgICAgICAgY2FzZSBZQ2JDcjQyMFRpbGU6Ci0gICAgICAgICAgICByZXR1cm4gQUxJR04od2lkdGgsIEFMSUdOMTI4KTsKLSAgICAgICAgY2FzZSBZQ2JDcjQyMFNQOgotICAgICAgICAgICAgcmV0dXJuIEFMSUdOKHdpZHRoLCBBTElHTjE2KTsKLSAgICAgICAgY2FzZSBOVjEyXzJLOgotICAgICAgICAgICAgcmV0dXJuIEFMSUdOKHdpZHRoLCBBTElHTjE2KTsKLSAgICAgICAgY2FzZSBOVjEyXzEyOG06Ci0gICAgICAgICAgICByZXR1cm4gQUxJR04od2lkdGgsIEFMSUdOMTI4KTsKLSAgICAgICAgY2FzZSBZQ2JDcjQyMFA6Ci0gICAgICAgICAgICByZXR1cm4gQUxJR04od2lkdGgsIEFMSUdOMTYpOwotICAgICAgICBjYXNlIFlDckNiNDIwUDoKLSAgICAgICAgICAgIHJldHVybiBBTElHTih3aWR0aCwgQUxJR04xNik7Ci0gICAgICAgIGNhc2UgTlYxMl9VQldDOgotICAgICAgICAgICAgcmV0dXJuIFZFTlVTX1lfU1RSSURFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIHdpZHRoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotc2l6ZV90IEMyRENvbG9yQ29udmVydGVyOjpjYWxjWVNpemUoQ29sb3JDb252ZXJ0Rm9ybWF0IGZvcm1hdCwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KQotewotICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgWUNiQ3I0MjBTUDoKLSAgICAgICAgICAgIHJldHVybiAoQUxJR04od2lkdGgsIEFMSUdOMTYpICogaGVpZ2h0KTsKLSAgICAgICAgY2FzZSBZQ2JDcjQyMFA6Ci0gICAgICAgICAgICByZXR1cm4gQUxJR04od2lkdGgsIEFMSUdOMTYpICogaGVpZ2h0OwotICAgICAgICBjYXNlIFlDckNiNDIwUDoKLSAgICAgICAgICAgIHJldHVybiBBTElHTih3aWR0aCwgQUxJR04xNikgKiBoZWlnaHQ7Ci0gICAgICAgIGNhc2UgWUNiQ3I0MjBUaWxlOgotICAgICAgICAgICAgcmV0dXJuIEFMSUdOKEFMSUdOKHdpZHRoLCBBTElHTjEyOCkgKiBBTElHTihoZWlnaHQsIEFMSUdOMzIpLCBBTElHTjhLKTsKLSAgICAgICAgY2FzZSBOVjEyXzJLOiB7Ci0gICAgICAgICAgICBzaXplX3QgYWxpZ25lZHcgPSBBTElHTih3aWR0aCwgQUxJR04xNik7Ci0gICAgICAgICAgICBzaXplX3QgbHVtYVNpemUgPSBBTElHTihhbGlnbmVkdyAqIGhlaWdodCwgQUxJR04ySyk7Ci0gICAgICAgICAgICByZXR1cm4gbHVtYVNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBOVjEyXzEyOG06Ci0gICAgICAgICAgICByZXR1cm4gQUxJR04od2lkdGgsIEFMSUdOMTI4KSAqIEFMSUdOKGhlaWdodCwgQUxJR04zMik7Ci0gICAgICAgIGNhc2UgTlYxMl9VQldDOgotICAgICAgICAgICAgcmV0dXJuIEFMSUdOKCBWRU5VU19ZX1NUUklERShDT0xPUl9GTVRfTlYxMl9VQldDLCB3aWR0aCkgKgotICAgICAgICAgICAgICAgICAgICBWRU5VU19ZX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBoZWlnaHQpLCBBTElHTjRLKSArCi0gICAgICAgICAgICAgICAgIEFMSUdOKCBWRU5VU19ZX01FVEFfU1RSSURFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIHdpZHRoKSAqCi0gICAgICAgICAgICAgICAgICAgVkVOVVNfWV9NRVRBX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBoZWlnaHQpLCBBTElHTjRLKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotc2l6ZV90IEMyRENvbG9yQ29udmVydGVyOjpjYWxjU2l6ZShDb2xvckNvbnZlcnRGb3JtYXQgZm9ybWF0LCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpCi17Ci0gICAgaW50MzJfdCBhbGlnbmVkdyA9IDA7Ci0gICAgaW50MzJfdCBhbGlnbmVkaCA9IDA7Ci0gICAgaW50MzJfdCBzaXplID0gMDsKLSAgICBpbnQzMl90IHRpbGVfbW9kZSA9IDA7Ci0gICAgaW50MzJfdCByYXN0ZXJfbW9kZSA9IDA7Ci0gICAgaW50MzJfdCBwYWRkaW5nX3RocmVzaG9sZCA9IDUxMjsgLyogaGFyZGNvZGUgZm9yIFJHQiBmb3JtYXRzICovCi0gICAgaW50MzJfdCBicHAgPSAwOwotCi0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgY2FzZSBSR0I1NjU6Ci0gICAgICAgICAgICBicHAgPSAyOwotICAgICAgICAgICAgbUFkcmVub0NvbXB1dGVBbGlnbmVkV2lkdGhBbmRIZWlnaHQod2lkdGgsIGhlaWdodCwgYnBwLCB0aWxlX21vZGUsIHJhc3Rlcl9tb2RlLCBwYWRkaW5nX3RocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbmVkdywgJmFsaWduZWRoKTsKLSAgICAgICAgICAgIHNpemUgPSBhbGlnbmVkdyAqIGFsaWduZWRoICogYnBwOwotICAgICAgICAgICAgc2l6ZSA9IEFMSUdOKHNpemUsIEFMSUdONEspOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkdCQTg4ODg6Ci0gICAgICAgICAgICBicHAgPSA0OwotICAgICAgICAgICAgbUFkcmVub0NvbXB1dGVBbGlnbmVkV2lkdGhBbmRIZWlnaHQod2lkdGgsIGhlaWdodCwgYnBwLCB0aWxlX21vZGUsIHJhc3Rlcl9tb2RlLCBwYWRkaW5nX3RocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbmVkdywgJmFsaWduZWRoKTsKLSAgICAgICAgICAgIGlmIChtU3JjU3RyaWRlKQotICAgICAgICAgICAgICBzaXplID0gbVNyY1N0cmlkZSAqICBhbGlnbmVkaCAqIGJwcDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgc2l6ZSA9IGFsaWduZWR3ICogYWxpZ25lZGggKiBicHA7Ci0gICAgICAgICAgICBzaXplID0gQUxJR04oc2l6ZSwgQUxJR040Syk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBZQ2JDcjQyMFNQOgotICAgICAgICAgICAgYWxpZ25lZHcgPSBBTElHTih3aWR0aCwgQUxJR04xNik7Ci0gICAgICAgICAgICBzaXplID0gQUxJR04oKGFsaWduZWR3ICogaGVpZ2h0KSArIChBTElHTih3aWR0aC8yLCBBTElHTjMyKSAqIChoZWlnaHQvMikgKiAyKSwgQUxJR040Syk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBZQ2JDcjQyMFA6Ci0gICAgICAgICAgICBhbGlnbmVkdyA9IEFMSUdOKHdpZHRoLCBBTElHTjE2KTsKLSAgICAgICAgICAgIHNpemUgPSBBTElHTigoYWxpZ25lZHcgKiBoZWlnaHQpICsgKEFMSUdOKHdpZHRoLzIsIEFMSUdOMTYpICogKGhlaWdodC8yKSAqIDIpLCBBTElHTjRLKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFlDckNiNDIwUDoKLSAgICAgICAgICAgIGFsaWduZWR3ID0gQUxJR04od2lkdGgsIEFMSUdOMTYpOwotICAgICAgICAgICAgc2l6ZSA9IEFMSUdOKChhbGlnbmVkdyAqIGhlaWdodCkgKyAoQUxJR04od2lkdGgvMiwgQUxJR04xNikgKiAoaGVpZ2h0LzIpICogMiksIEFMSUdONEspOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWUNiQ3I0MjBUaWxlOgotICAgICAgICAgICAgYWxpZ25lZHcgPSBBTElHTih3aWR0aCwgQUxJR04xMjgpOwotICAgICAgICAgICAgYWxpZ25lZGggPSBBTElHTihoZWlnaHQsIEFMSUdOMzIpOwotICAgICAgICAgICAgc2l6ZSA9IEFMSUdOKGFsaWduZWR3ICogYWxpZ25lZGgsIEFMSUdOOEspICsgQUxJR04oYWxpZ25lZHcgKiBBTElHTihoZWlnaHQvMiwgQUxJR04zMiksIEFMSUdOOEspOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTlYxMl8ySzogewotICAgICAgICAgICAgYWxpZ25lZHcgPSBBTElHTih3aWR0aCwgQUxJR04xNik7Ci0gICAgICAgICAgICBzaXplX3QgbHVtYVNpemUgPSBBTElHTihhbGlnbmVkdyAqIGhlaWdodCwgQUxJR04ySyk7Ci0gICAgICAgICAgICBzaXplX3QgY2hyb21hU2l6ZSA9IEFMSUdOKChhbGlnbmVkdyAqIGhlaWdodCkvMiwgQUxJR04ySyk7Ci0gICAgICAgICAgICBzaXplID0gQUxJR04obHVtYVNpemUgKyBjaHJvbWFTaXplLCBBTElHTjRLKTsKLSAgICAgICAgICAgIEFMT0dWKCJOVjEyXzJrLCB3aWR0aCA9ICV6dSwgaGVpZ2h0ID0gJXp1LCBzaXplID0gJWQiLCB3aWR0aCwgaGVpZ2h0LCBzaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5WMTJfMTI4bToKLSAgICAgICAgICAgIGFsaWduZWR3ID0gQUxJR04od2lkdGgsIEFMSUdOMTI4KTsKLSAgICAgICAgICAgIGFsaWduZWRoID0gQUxJR04oaGVpZ2h0LCBBTElHTjMyKTsKLSAgICAgICAgICAgIHNpemUgPSBBTElHTihhbGlnbmVkdyAqIGFsaWduZWRoICsgKGFsaWduZWR3ICogQUxJR04oaGVpZ2h0LzIsIEFMSUdOMTYpKSwgQUxJR040Syk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOVjEyX1VCV0M6Ci0gICAgICAgICAgICBzaXplID0gVkVOVVNfQlVGRkVSX1NJWkUoQ09MT1JfRk1UX05WMTJfVUJXQywgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLS8qCi0gKiBUZWxscyBHUFUgdG8gbWFwIGdpdmVuIGJ1ZmZlciBhbmQgcmV0dXJucyBhIHBoeXNpY2FsIGFkZHJlc3Mgb2YgbWFwcGVkIGJ1ZmZlcgotICovCi12b2lkICogQzJEQ29sb3JDb252ZXJ0ZXI6OmdldE1hcHBlZEdQVUFkZHIoaW50IGJ1ZkZELCB2b2lkICpidWZQdHIsIHNpemVfdCBidWZMZW4pCi17Ci0gICAgQzJEX1NUQVRVUyBzdGF0dXM7Ci0gICAgdm9pZCAqZ3B1YWRkciA9IE5VTEw7Ci0KLSAgICBzdGF0dXMgPSBtQzJETWFwQWRkcihidWZGRCwgYnVmUHRyLCBidWZMZW4sIDAsIEtHU0xfVVNFUl9NRU1fVFlQRV9JT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmdwdWFkZHIpOwotICAgIGlmIChzdGF0dXMgIT0gQzJEX1NUQVRVU19PSykgewotICAgICAgICBBTE9HRSgiYzJkTWFwQWRkciBmYWlsZWQ6IHN0YXR1cyAlZCBmZCAlZCBwdHIgJXAgbGVuICV6dSBmbGFncyAlZFxuIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMsIGJ1ZkZELCBidWZQdHIsIGJ1ZkxlbiwgS0dTTF9VU0VSX01FTV9UWVBFX0lPTik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBBTE9HVigiYzJkIG1hcHBpbmcgY3JlYXRlZDogZ3B1YWRkciAlcCBmZCAlZCBwdHIgJXAgbGVuICV6dVxuIiwKLSAgICAgICAgICAgIGdwdWFkZHIsIGJ1ZkZELCBidWZQdHIsIGJ1Zkxlbik7Ci0KLSAgICByZXR1cm4gZ3B1YWRkcjsKLX0KLQotYm9vbCBDMkRDb2xvckNvbnZlcnRlcjo6dW5tYXBHUFVBZGRyKHVuc2lnbmVkIGxvbmcgZ0FkZHIpCi17Ci0KLSAgICBDMkRfU1RBVFVTIHN0YXR1cyA9IG1DMkRVbk1hcEFkZHIoKHZvaWQqKWdBZGRyKTsKLQotICAgIGlmIChzdGF0dXMgIT0gQzJEX1NUQVRVU19PSykKLSAgICAgICAgQUxPR0UoImMyZFVuTWFwQWRkciBmYWlsZWQ6IHN0YXR1cyAlZCBncHVhZGRyICUwOGx4XG4iLCBzdGF0dXMsIGdBZGRyKTsKLQotICAgIHJldHVybiAoc3RhdHVzID09IEMyRF9TVEFUVVNfT0spOwotfQotCi1pbnQzMl90IEMyRENvbG9yQ29udmVydGVyOjpnZXRCdWZmU2l6ZShpbnQzMl90IHBvcnQpCi17Ci0gIGlmIChlbmFibGVkKSB7Ci0gICAgaWYgKHBvcnQgPT0gQzJEX0lOUFVUKSB7Ci0gICAgICByZXR1cm4gY2FsY1NpemUobVNyY0Zvcm1hdCwgbVNyY1dpZHRoLCBtU3JjSGVpZ2h0KTsKLSAgICB9IGVsc2UgaWYgKHBvcnQgPT0gQzJEX09VVFBVVCkgewotICAgICAgcmV0dXJuIGNhbGNTaXplKG1Ec3RGb3JtYXQsIG1Ec3RXaWR0aCwgbURzdEhlaWdodCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotCi1ib29sIEMyRENvbG9yQ29udmVydGVyOjpnZXRCdWZmRmlsbGVkTGVuKGludDMyX3QgcG9ydCwgdW5zaWduZWQgaW50ICZmaWxsZWRfbGVuZ3RoKQotewotICBib29sIHJldCA9IGZhbHNlOwotICBDMkRCdWZmUmVxIHJlcTsKLSAgaWYgKGVuYWJsZWQpIHsKLSAgICByZXQgPSBnZXRCdWZmUmVxKHBvcnQsICZyZXEpOwotICAgIGlmIChyZXQgJiYgcmVxLmJwcC5kZW5vbWluYXRvciA+IDApIHsKLSAgICAgIGZpbGxlZF9sZW5ndGggPSAocmVxLnN0cmlkZSAqIHJlcS5zbGljZUhlaWdodCAqIHJlcS5icHAubnVtZXJhdG9yKTsKLSAgICAgIGZpbGxlZF9sZW5ndGggLz0gcmVxLmJwcC5kZW5vbWluYXRvcjsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfQotCi1ib29sIEMyRENvbG9yQ29udmVydGVyOjpnZXRCdWZmUmVxKGludDMyX3QgcG9ydCwgQzJEQnVmZlJlcSAqcmVxKSB7Ci0gICAgaWYgKCFyZXEKLSAgICAgICAgfHwgKHBvcnQgIT0gQzJEX0lOUFVUCi0gICAgICAgICAgICAmJiBwb3J0ICE9IEMyRF9PVVRQVVQpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBtZW1zZXQocmVxLCAwLCBzaXplb2YoQzJEQnVmZlJlcSkpOwotICAgIGlmIChwb3J0ID09IEMyRF9JTlBVVCkgewotICAgICAgICByZXEtPndpZHRoID0gbVNyY1dpZHRoOwotICAgICAgICByZXEtPmhlaWdodCA9IG1TcmNIZWlnaHQ7Ci0gICAgICAgIHJlcS0+c3RyaWRlID0gY2FsY1N0cmlkZShtU3JjRm9ybWF0LCBtU3JjV2lkdGgpOwotICAgICAgICByZXEtPnNsaWNlSGVpZ2h0ID0gbVNyY0hlaWdodDsKLSAgICAgICAgcmVxLT5sdW1hQWxpZ24gPSBjYWxjTHVtYUFsaWduKG1TcmNGb3JtYXQpOwotICAgICAgICByZXEtPnNpemVBbGlnbiA9IGNhbGNTaXplQWxpZ24obVNyY0Zvcm1hdCk7Ci0gICAgICAgIHJlcS0+c2l6ZSA9IGNhbGNTaXplKG1TcmNGb3JtYXQsIG1TcmNXaWR0aCwgbVNyY0hlaWdodCk7Ci0gICAgICAgIHJlcS0+YnBwID0gY2FsY0J5dGVzUGVyUGl4ZWwobVNyY0Zvcm1hdCk7Ci0gICAgICAgIEFMT0dWKCJpbnB1dCByZXEtPnNpemUgPSAlZFxuIiwgcmVxLT5zaXplKTsKLSAgICB9IGVsc2UgaWYgKHBvcnQgPT0gQzJEX09VVFBVVCkgewotICAgICAgICByZXEtPndpZHRoID0gbURzdFdpZHRoOwotICAgICAgICByZXEtPmhlaWdodCA9IG1Ec3RIZWlnaHQ7Ci0gICAgICAgIHJlcS0+c3RyaWRlID0gY2FsY1N0cmlkZShtRHN0Rm9ybWF0LCBtRHN0V2lkdGgpOwotICAgICAgICByZXEtPnNsaWNlSGVpZ2h0ID0gbURzdEhlaWdodDsKLSAgICAgICAgcmVxLT5sdW1hQWxpZ24gPSBjYWxjTHVtYUFsaWduKG1Ec3RGb3JtYXQpOwotICAgICAgICByZXEtPnNpemVBbGlnbiA9IGNhbGNTaXplQWxpZ24obURzdEZvcm1hdCk7Ci0gICAgICAgIHJlcS0+c2l6ZSA9IGNhbGNTaXplKG1Ec3RGb3JtYXQsIG1Ec3RXaWR0aCwgbURzdEhlaWdodCk7Ci0gICAgICAgIHJlcS0+YnBwID0gY2FsY0J5dGVzUGVyUGl4ZWwobURzdEZvcm1hdCk7Ci0gICAgICAgIEFMT0dWKCJvdXRwdXQgcmVxLT5zaXplID0gJWRcbiIsIHJlcS0+c2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1zaXplX3QgQzJEQ29sb3JDb252ZXJ0ZXI6OmNhbGNMdW1hQWxpZ24oQ29sb3JDb252ZXJ0Rm9ybWF0IGZvcm1hdCkgewotICAgIGlmICghaXNZVVZTdXJmYWNlKGZvcm1hdCkpIHJldHVybiAxOyAvL25vIHJlcXVpcmVtZW50Ci0KLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgICAgICBjYXNlIE5WMTJfMks6Ci0gICAgICAgICAgcmV0dXJuIEFMSUdOMks7Ci0gICAgICAgIGNhc2UgTlYxMl8xMjhtOgotICAgICAgICAgIHJldHVybiAxOwotICAgICAgICBjYXNlIE5WMTJfVUJXQzoKLSAgICAgICAgICByZXR1cm4gQUxJR040SzsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBBTE9HRSgidW5rbm93biBmb3JtYXQgcGFzc2VkIGZvciBsdW1hIGFsaWdubWVudCBudW1iZXIiKTsKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci19Ci0KLXNpemVfdCBDMkRDb2xvckNvbnZlcnRlcjo6Y2FsY1NpemVBbGlnbihDb2xvckNvbnZlcnRGb3JtYXQgZm9ybWF0KSB7Ci0gICAgaWYgKCFpc1lVVlN1cmZhY2UoZm9ybWF0KSkgcmV0dXJuIDE7IC8vbm8gcmVxdWlyZW1lbnQKLQotICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgWUNiQ3I0MjBTUDogLy9PUiBOVjEyCi0gICAgICAgIGNhc2UgWUNiQ3I0MjBQOgotICAgICAgICBjYXNlIE5WMTJfMks6Ci0gICAgICAgIGNhc2UgTlYxMl8xMjhtOgotICAgICAgICBjYXNlIE5WMTJfVUJXQzoKLSAgICAgICAgICByZXR1cm4gQUxJR040SzsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBBTE9HRSgidW5rbm93biBmb3JtYXQgcGFzc2VkIGZvciBzaXplIGFsaWdubWVudCBudW1iZXIiKTsKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci19Ci0KLUMyREJ5dGVzUGVyUGl4ZWwgQzJEQ29sb3JDb252ZXJ0ZXI6OmNhbGNCeXRlc1BlclBpeGVsKENvbG9yQ29udmVydEZvcm1hdCBmb3JtYXQpIHsKLSAgICBDMkRCeXRlc1BlclBpeGVsIGJwcDsKLSAgICBicHAubnVtZXJhdG9yID0gMDsKLSAgICBicHAuZGVub21pbmF0b3IgPSAxOwotCi0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgY2FzZSBSR0I1NjU6Ci0gICAgICAgICAgICBicHAubnVtZXJhdG9yID0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJHQkE4ODg4OgotICAgICAgICBjYXNlIFJHQkE4ODg4X1VCV0M6Ci0gICAgICAgICAgICBicHAubnVtZXJhdG9yID0gNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFlDYkNyNDIwU1A6Ci0gICAgICAgIGNhc2UgWUNiQ3I0MjBQOgotICAgICAgICBjYXNlIFlDckNiNDIwUDoKLSAgICAgICAgY2FzZSBZQ2JDcjQyMFRpbGU6Ci0gICAgICAgIGNhc2UgTlYxMl8ySzoKLSAgICAgICAgY2FzZSBOVjEyXzEyOG06Ci0gICAgICAgIGNhc2UgTlYxMl9VQldDOgotICAgICAgICAgICAgYnBwLm51bWVyYXRvciA9IDM7Ci0gICAgICAgICAgICBicHAuZGVub21pbmF0b3IgPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGJwcDsKLX0KLQotaW50MzJfdCBDMkRDb2xvckNvbnZlcnRlcjo6ZHVtcE91dHB1dChjaGFyICogZmlsZW5hbWUsIGNoYXIgbW9kZSkgewotICAgIGludCBmZDsKLSAgICBzaXplX3Qgc3RyaWRlLCBzbGljZUhlaWdodDsKLSAgICBpZiAoIWZpbGVuYW1lKSByZXR1cm4gLTE7Ci0KLSAgICBpbnQgZmxhZ3MgPSBPX1JEV1IgfCBPX0NSRUFUOwotICAgIGlmIChtb2RlID09ICdhJykgewotICAgICAgZmxhZ3MgfD0gT19BUFBFTkQ7Ci0gICAgfQotCi0gICAgaWYgKChmZCA9IG9wZW4oZmlsZW5hbWUsIGZsYWdzKSkgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJvcGVuIGR1bXAgZmlsZSBmYWlsZWQgdy8gZXJybm8gJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaW50IHJldCA9IDA7Ci0gICAgaWYgKGlzWVVWU3VyZmFjZShtRHN0Rm9ybWF0KSkgewotICAgICAgQzJEX1lVVl9TVVJGQUNFX0RFRiAqIGRzdFN1cmZhY2VEZWYgPSAoQzJEX1lVVl9TVVJGQUNFX0RFRiAqKW1Ec3RTdXJmYWNlRGVmOwotICAgICAgdWludDhfdCAqIGJhc2UgPSAodWludDhfdCAqKWRzdFN1cmZhY2VEZWYtPnBsYW5lMDsKLSAgICAgIHN0cmlkZSA9IGRzdFN1cmZhY2VEZWYtPnN0cmlkZTA7Ci0gICAgICBzbGljZUhlaWdodCA9IGRzdFN1cmZhY2VEZWYtPmhlaWdodDsKLSAgICAgIC8qIGR1bXAgbHVtYSAqLwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzbGljZUhlaWdodDsgaSsrKSB7Ci0gICAgICAgIHJldCA9IHdyaXRlKGZkLCBiYXNlLCBtRHN0V2lkdGgpOyAvL3dpbGwgd29yayBvbmx5IGZvciB0aGUgNDIwIG9uZXMKLSAgICAgICAgaWYgKHJldCA8IDApIGdvdG8gY2xlYW51cDsKLSAgICAgICAgYmFzZSArPSBzdHJpZGU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtRHN0Rm9ybWF0ID09IFlDYkNyNDIwUCB8fAotICAgICAgICAgIG1Ec3RGb3JtYXQgPT0gWUNyQ2I0MjBQKSB7Ci0gICAgICAgICAgcHJpbnRmKCJEdW1wIENiIGFuZCBDciBzZXBhcmF0ZWx5IGZvciBQbGFuYXJcbiIpOwotICAgICAgICAgIC8vZHVtcCBDYi9DcgotICAgICAgICAgIGJhc2UgPSAodWludDhfdCAqKWRzdFN1cmZhY2VEZWYtPnBsYW5lMTsKLSAgICAgICAgICBzdHJpZGUgPSBkc3RTdXJmYWNlRGVmLT5zdHJpZGUxOwotICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2xpY2VIZWlnaHQvMjtpKyspIHsgLy93aWxsIHdvcmsgb25seSBmb3IgdGhlIDQyMCBvbmVzCi0gICAgICAgICAgICByZXQgPSB3cml0ZShmZCwgYmFzZSwgbURzdFdpZHRoLzIpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIGJhc2UgKz0gc3RyaWRlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vZHVtcCBDci9DYgotICAgICAgICAgIGJhc2UgPSAodWludDhfdCAqKWRzdFN1cmZhY2VEZWYtPnBsYW5lMjsKLSAgICAgICAgICBzdHJpZGUgPSBkc3RTdXJmYWNlRGVmLT5zdHJpZGUyOwotCi0gICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzbGljZUhlaWdodC8yO2krKykgeyAvL3dpbGwgd29yayBvbmx5IGZvciB0aGUgNDIwIG9uZXMKLSAgICAgICAgICAgIHJldCA9IHdyaXRlKGZkLCBiYXNlLCBtRHN0V2lkdGgvMik7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgYmFzZSArPSBzdHJpZGU7Ci0gICAgICAgICAgfQotCi0gICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIGR1bXAgY2hyb21hICovCi0gICAgICAgICAgYmFzZSA9ICh1aW50OF90ICopZHN0U3VyZmFjZURlZi0+cGxhbmUxOwotICAgICAgICAgIHN0cmlkZSA9IGRzdFN1cmZhY2VEZWYtPnN0cmlkZTE7Ci0gICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzbGljZUhlaWdodC8yO2krKykgeyAvL3dpbGwgd29yayBvbmx5IGZvciB0aGUgNDIwIG9uZXMKLSAgICAgICAgICAgIHJldCA9IHdyaXRlKGZkLCBiYXNlLCBtRHN0V2lkdGgpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIGJhc2UgKz0gc3RyaWRlOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgQzJEX1JHQl9TVVJGQUNFX0RFRiAqIGRzdFN1cmZhY2VEZWYgPSAoQzJEX1JHQl9TVVJGQUNFX0RFRiAqKW1Ec3RTdXJmYWNlRGVmOwotICAgICAgdWludDhfdCAqIGJhc2UgPSAodWludDhfdCAqKWRzdFN1cmZhY2VEZWYtPmJ1ZmZlcjsKLSAgICAgIHN0cmlkZSA9IGRzdFN1cmZhY2VEZWYtPnN0cmlkZTsKLSAgICAgIHNsaWNlSGVpZ2h0ID0gZHN0U3VyZmFjZURlZi0+aGVpZ2h0OwotCi0gICAgICBwcmludGYoInJnYiBzdXJmYWNlIGJhc2UgaXMgJXAiLCBiYXNlKTsKLSAgICAgIHByaW50ZigicmdiIHN1cmZhY2UgZHVtcHNzbGljZSBoZWlnaHQgaXMgJWx1XG4iLCAodW5zaWduZWQgbG9uZylzbGljZUhlaWdodCk7Ci0gICAgICBwcmludGYoInJnYiBzdXJmYWNlIGR1bXAgc3RyaWRlIGlzICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpc3RyaWRlKTsKLQotICAgICAgaW50IGJwcCA9IDE7IC8vYnl0ZXMgcGVyIHBpeGVsCi0gICAgICBpZiAobURzdEZvcm1hdCA9PSBSR0I1NjUpIHsKLSAgICAgICAgYnBwID0gMjsKLSAgICAgIH0gZWxzZSBpZiAobURzdEZvcm1hdCA9PSBSR0JBODg4OCAgfHwgbURzdEZvcm1hdCA9PSBSR0JBODg4OF9VQldDKSB7Ci0gICAgICAgIGJwcCA9IDQ7Ci0gICAgICB9Ci0KLSAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNsaWNlSGVpZ2h0OyBpKyspIHsKLSAgICAgICAgcmV0ID0gd3JpdGUoZmQsIGJhc2UsIG1Ec3RXaWR0aCpicHApOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgIHByaW50Zigid3JpdGUgZmFpbGVkLCBjb3VudCA9ICVkXG4iLCBjb3VudCk7Ci0gICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9Ci0gICAgICAgIGJhc2UgKz0gc3RyaWRlOwotICAgICAgICBjb3VudCArPSBzdHJpZGU7Ci0gICAgICB9Ci0gICAgfQotIGNsZWFudXA6Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgIEFMT0dFKCJmaWxlIHdyaXRlIGZhaWxlZCB3LyBlcnJubyAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICAgIGNsb3NlKGZkKTsKLSAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7Ci19CmRpZmYgLS1naXQgYS9zZG04NDUvbGliYzJkY29sb3Jjb252ZXJ0L0MyRENvbG9yQ29udmVydGVyLmggYi9zZG04NDUvbGliYzJkY29sb3Jjb252ZXJ0L0MyRENvbG9yQ29udmVydGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZjAwZmEuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L2xpYmMyZGNvbG9yY29udmVydC9DMkRDb2xvckNvbnZlcnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiAtIDIwMTMsIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogcmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogcmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogbmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIGFuZCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gKiB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQgd2FycmFudGllcyBvZgotICogbWVyY2hhbnRhYmlsaXR5LCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhbmQgbm9uLWluZnJpbmdlbWVudAotICogYXJlIGRpc2NsYWltZWQuICBpbiBubyBldmVudCBzaGFsbCB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGNvbnRyaWJ1dG9ycwotICogYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvcgotICogY29uc2VxdWVudGlhbCBkYW1hZ2VzIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2YKLSAqIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvcgotICogYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksCi0gKiB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZQotICogb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbgotICogaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0gKgotICovCi0KLSNpZm5kZWYgQzJEX0NvbG9yQ29udmVydGVyX0hfCi0jZGVmaW5lIEMyRF9Db2xvckNvbnZlcnRlcl9IXwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fa2dzbC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fbWVkaWFfaW5mby5oPgotI2luY2x1ZGUgPGdyYWxsb2NfcHJpdi5oPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlIDxjMmQyLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIkMyRENvbG9yQ29udmVydCIKLSNkZWZpbmUgQUxJR04oIG51bSwgdG8gKSAoKChudW0pICsgKHRvLTEpKSAmICh+KHRvLTEpKSkKLSNkZWZpbmUgQUxJR044SyA4MTkyCi0jZGVmaW5lIEFMSUdONEsgNDA5NgotI2RlZmluZSBBTElHTjJLIDIwNDgKLSNkZWZpbmUgQUxJR04xMjggMTI4Ci0jZGVmaW5lIEFMSUdOMzIgMzIKLSNkZWZpbmUgQUxJR04xNiAxNgotCi10eXBlZGVmIEMyRF9TVEFUVVMgKCpMSU5LX2MyZENyZWF0ZVN1cmZhY2UpKCB1aW50MzIgKnN1cmZhY2VfaWQsCi0gICAgICAgIHVpbnQzMiBzdXJmYWNlX2JpdHMsCi0gICAgICAgIEMyRF9TVVJGQUNFX1RZUEUgc3VyZmFjZV90eXBlLAotICAgICAgICB2b2lkICpzdXJmYWNlX2RlZmluaXRpb24gKTsKLQotdHlwZWRlZiBDMkRfU1RBVFVTICgqTElOS19jMmRVcGRhdGVTdXJmYWNlKSggdWludDMyIHN1cmZhY2VfaWQsCi0gICAgICAgIHVpbnQzMiBzdXJmYWNlX2JpdHMsCi0gICAgICAgIEMyRF9TVVJGQUNFX1RZUEUgc3VyZmFjZV90eXBlLAotICAgICAgICB2b2lkICpzdXJmYWNlX2RlZmluaXRpb24gKTsKLQotdHlwZWRlZiBDMkRfU1RBVFVTICgqTElOS19jMmRSZWFkU3VyZmFjZSkoIHVpbnQzMiBzdXJmYWNlX2lkLAotICAgICAgICBDMkRfU1VSRkFDRV9UWVBFIHN1cmZhY2VfdHlwZSwKLSAgICAgICAgdm9pZCAqc3VyZmFjZV9kZWZpbml0aW9uLAotICAgICAgICBpbnQzMiB4LCBpbnQzMiB5ICk7Ci0KLXR5cGVkZWYgQzJEX1NUQVRVUyAoKkxJTktfYzJkRHJhdykoIHVpbnQzMiB0YXJnZXRfaWQsCi0gICAgICAgIHVpbnQzMiB0YXJnZXRfY29uZmlnLCBDMkRfUkVDVCAqdGFyZ2V0X3NjaXNzb3IsCi0gICAgICAgIHVpbnQzMiB0YXJnZXRfbWFza19pZCwgdWludDMyIHRhcmdldF9jb2xvcl9rZXksCi0gICAgICAgIEMyRF9PQkpFQ1QgKm9iamVjdHNfbGlzdCwgdWludDMyIG51bV9vYmplY3RzICk7Ci0KLXR5cGVkZWYgQzJEX1NUQVRVUyAoKkxJTktfYzJkRmx1c2gpKCB1aW50MzIgdGFyZ2V0X2lkLCBjMmRfdHNfaGFuZGxlICp0aW1lc3RhbXApOwotCi10eXBlZGVmIEMyRF9TVEFUVVMgKCpMSU5LX2MyZEZpbmlzaCkoIHVpbnQzMiB0YXJnZXRfaWQpOwotCi10eXBlZGVmIEMyRF9TVEFUVVMgKCpMSU5LX2MyZFdhaXRUaW1lc3RhbXApKCBjMmRfdHNfaGFuZGxlIHRpbWVzdGFtcCApOwotCi10eXBlZGVmIEMyRF9TVEFUVVMgKCpMSU5LX2MyZERlc3Ryb3lTdXJmYWNlKSggdWludDMyIHN1cmZhY2VfaWQgKTsKLQotdHlwZWRlZiBDMkRfU1RBVFVTICgqTElOS19jMmRNYXBBZGRyKSggaW50IG1lbV9mZCwgdm9pZCAqIGhvc3RwdHIsIHVpbnQzMiBsZW4sIHVpbnQzMiBvZmZzZXQsIHVpbnQzMiBmbGFncywgdm9pZCAqKiBncHVhZGRyKTsKLQotdHlwZWRlZiBDMkRfU1RBVFVTICgqTElOS19jMmRVbk1hcEFkZHIpKHZvaWQgKiBncHVhZGRyKTsKLQotdHlwZWRlZiB2b2lkICgqTElOS19BZHJlbm9Db21wdXRlQWxpZ25lZFdpZHRoQW5kSGVpZ2h0KSAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBpbnQgdGlsZV9tb2RlLCBpbnQgcmFzdGVyX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZGRpbmdfdGhyZXNob2xkLCBpbnQgKmFsaWduZWRfd2lkdGgsIGludCAqIGFsaWduZWRfaGVpZ2h0KTsKLQotLypUT0RPOiBUSElTIE5FRURTIFRPIEVOQUJMRUQgRk9SIEpCIFBMVVMqLwotZW51bSBDb2xvckNvbnZlcnRGb3JtYXQgewotICAgIFJHQjU2NSA9IDEsCi0gICAgWUNiQ3I0MjBUaWxlLAotICAgIFlDYkNyNDIwU1AsCi0gICAgWUNiQ3I0MjBQLAotICAgIFlDckNiNDIwUCwKLSAgICBSR0JBODg4OCwKLSAgICBSR0JBODg4OF9VQldDLAotICAgIE5WMTJfMkssCi0gICAgTlYxMl8xMjhtLAotICAgIE5WMTJfVUJXQywKLSAgICBOVjEyX1RQMTAsCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50MzJfdCBudW1lcmF0b3I7Ci0gICAgaW50MzJfdCBkZW5vbWluYXRvcjsKLX0gQzJEQnl0ZXNQZXJQaXhlbDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQzMl90IHdpZHRoOwotICBpbnQzMl90IGhlaWdodDsKLSAgaW50MzJfdCBzdHJpZGU7Ci0gIGludDMyX3Qgc2xpY2VIZWlnaHQ7Ci0gIGludDMyX3QgbHVtYUFsaWduOwotICBpbnQzMl90IHNpemVBbGlnbjsKLSAgaW50MzJfdCBzaXplOwotICBDMkRCeXRlc1BlclBpeGVsIGJwcDsKLX0gQzJEQnVmZlJlcTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQzJEX0lOUFVUID0gMCwKLSAgQzJEX09VVFBVVCwKLX0gQzJEX1BPUlQ7Ci0KLXR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwIDxpbnQsIGludD4gQ29sb3JNYXBwaW5nOwotCi1jbGFzcyBDMkRDb2xvckNvbnZlcnRlcnsKLQotICB2b2lkICptQzJETGliSGFuZGxlOwotICBMSU5LX2MyZENyZWF0ZVN1cmZhY2UgbUMyRENyZWF0ZVN1cmZhY2U7Ci0gIExJTktfYzJkVXBkYXRlU3VyZmFjZSBtQzJEVXBkYXRlU3VyZmFjZTsKLSAgTElOS19jMmRSZWFkU3VyZmFjZSBtQzJEUmVhZFN1cmZhY2U7Ci0gIExJTktfYzJkRHJhdyBtQzJERHJhdzsKLSAgTElOS19jMmRGbHVzaCBtQzJERmx1c2g7Ci0gIExJTktfYzJkRmluaXNoIG1DMkRGaW5pc2g7Ci0gIExJTktfYzJkV2FpdFRpbWVzdGFtcCBtQzJEV2FpdFRpbWVzdGFtcDsKLSAgTElOS19jMmREZXN0cm95U3VyZmFjZSBtQzJERGVzdHJveVN1cmZhY2U7Ci0gIExJTktfYzJkTWFwQWRkciBtQzJETWFwQWRkcjsKLSAgTElOS19jMmRVbk1hcEFkZHIgbUMyRFVuTWFwQWRkcjsKLQotICB2b2lkICptQWRyZW5vVXRpbHNIYW5kbGU7Ci0gIExJTktfQWRyZW5vQ29tcHV0ZUFsaWduZWRXaWR0aEFuZEhlaWdodCBtQWRyZW5vQ29tcHV0ZUFsaWduZWRXaWR0aEFuZEhlaWdodDsKLQotICB1aW50MzJfdCBtU3JjU3VyZmFjZSwgbURzdFN1cmZhY2U7Ci0gIHZvaWQgKiBtU3JjU3VyZmFjZURlZjsKLSAgdm9pZCAqIG1Ec3RTdXJmYWNlRGVmOwotCi0gIEMyRF9PQkpFQ1QgbUJsaXQ7Ci0gIHNpemVfdCBtU3JjV2lkdGg7Ci0gIHNpemVfdCBtU3JjSGVpZ2h0OwotICBzaXplX3QgbVNyY1N0cmlkZTsKLSAgc2l6ZV90IG1Ec3RXaWR0aDsKLSAgc2l6ZV90IG1Ec3RIZWlnaHQ7Ci0gIHNpemVfdCBtU3JjU2l6ZTsKLSAgc2l6ZV90IG1Ec3RTaXplOwotICBzaXplX3QgbVNyY1lTaXplOwotICBzaXplX3QgbURzdFlTaXplOwotICBDb2xvckNvbnZlcnRGb3JtYXQgbVNyY0Zvcm1hdDsKLSAgQ29sb3JDb252ZXJ0Rm9ybWF0IG1Ec3RGb3JtYXQ7Ci0gIGludDMyX3QgbUZsYWdzOwotCi0gIGJvb2wgZW5hYmxlZDsKLQotICBwdGhyZWFkX211dGV4X3QgbUxvY2s7Ci0KLSBwdWJsaWM6Ci0gIEMyRENvbG9yQ29udmVydGVyKCk7Ci0gIH5DMkRDb2xvckNvbnZlcnRlcigpOwotCi0gIENvbG9yTWFwcGluZyBtTWFwQ292ZXJ0b3IyUGl4ZWxGb3JtYXQ7Ci0gIENvbG9yTWFwcGluZyBtTWFwUGl4ZWxGb3JtYXQyQ292ZXJ0b3I7Ci0KLSAgYm9vbCBzZXRSZXNvbHV0aW9uKHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwgc2l6ZV90IGRzdFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdEhlaWdodCwgQ29sb3JDb252ZXJ0Rm9ybWF0IHNyY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgIENvbG9yQ29udmVydEZvcm1hdCBkc3RGb3JtYXQsIGludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjU3RyaWRlKTsKLSAgaW50MzJfdCBnZXRCdWZmU2l6ZShpbnQzMl90IHBvcnQpOwotICBib29sIGdldEJ1ZmZGaWxsZWRMZW4oaW50MzJfdCBwb3J0LCB1bnNpZ25lZCBpbnQgJmZpbGxlZF9sZW5ndGgpOwotICBib29sIGdldEJ1ZmZSZXEoaW50MzJfdCBwb3J0LCBDMkRCdWZmUmVxICpyZXEpOwotICBpbnQzMl90IGR1bXBPdXRwdXQoY2hhciAqIGZpbGVuYW1lLCBjaGFyIG1vZGUpOwotICBib29sIGNvbnZlcnRDMkQoaW50IHNyY0ZkLCB2b2lkICpzcmNCYXNlLCB2b2lkICogc3JjRGF0YSwKLSAgICAgICAgICAgICAgICAgIGludCBkc3RGZCwgdm9pZCAqZHN0QmFzZSwgdm9pZCAqIGRzdERhdGEpOwotICBib29sIGlzWVVWU3VyZmFjZShDb2xvckNvbnZlcnRGb3JtYXQgZm9ybWF0KTsKLSAgaW50MzJfdCBnZXREdW1teVN1cmZhY2VEZWYoQ29sb3JDb252ZXJ0Rm9ybWF0IGZvcm1hdCwgc2l6ZV90IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaGVpZ2h0LCBib29sIGlzU291cmNlKTsKLSAgQzJEX1NUQVRVUyB1cGRhdGVZVVZTdXJmYWNlRGVmKGludCBmZCwgdm9pZCAqYmFzZSwgdm9pZCAqIGRhdGEsIGJvb2wgaXNTb3VyY2UpOwotICBDMkRfU1RBVFVTIHVwZGF0ZVJHQlN1cmZhY2VEZWYoaW50IGZkLCB2b2lkICogZGF0YSwgYm9vbCBpc1NvdXJjZSk7Ci0gIHVpbnQzMl90IGdldEMyREZvcm1hdChDb2xvckNvbnZlcnRGb3JtYXQgZm9ybWF0KTsKLSAgc2l6ZV90IGNhbGNTdHJpZGUoQ29sb3JDb252ZXJ0Rm9ybWF0IGZvcm1hdCwgc2l6ZV90IHdpZHRoKTsKLSAgc2l6ZV90IGNhbGNZU2l6ZShDb2xvckNvbnZlcnRGb3JtYXQgZm9ybWF0LCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpOwotICBzaXplX3QgY2FsY1NpemUoQ29sb3JDb252ZXJ0Rm9ybWF0IGZvcm1hdCwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KTsKLSAgdm9pZCAqZ2V0TWFwcGVkR1BVQWRkcihpbnQgYnVmRkQsIHZvaWQgKmJ1ZlB0ciwgc2l6ZV90IGJ1Zkxlbik7Ci0gIGJvb2wgdW5tYXBHUFVBZGRyKHVuc2lnbmVkIGxvbmcgZ0FkZHIpOwotICBzaXplX3QgY2FsY0x1bWFBbGlnbihDb2xvckNvbnZlcnRGb3JtYXQgZm9ybWF0KTsKLSAgc2l6ZV90IGNhbGNTaXplQWxpZ24oQ29sb3JDb252ZXJ0Rm9ybWF0IGZvcm1hdCk7Ci0gIEMyREJ5dGVzUGVyUGl4ZWwgY2FsY0J5dGVzUGVyUGl4ZWwoQ29sb3JDb252ZXJ0Rm9ybWF0IGZvcm1hdCk7Ci19OwotCi0jZW5kaWYgIC8vIEMyRF9Db2xvckNvbnZlcnRlcl9IXwpkaWZmIC0tZ2l0IGEvc2RtODQ1L2xpYmMyZGNvbG9yY29udmVydC9NYWtlZmlsZS5hbSBiL3NkbTg0NS9saWJjMmRjb2xvcmNvbnZlcnQvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZmQ3MTcuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L2xpYmMyZGNvbG9yY29udmVydC9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLUFNX0NGTEFHUyA9IC1XYWxsCi1BTV9DRkxBR1MgKz0gLVd1bmRlZgotQU1fQ0ZMQUdTICs9IC1Xc3RyaWN0LXByb3RvdHlwZXMKLUFNX0NGTEFHUyArPSAtV25vLXRyaWdyYXBocwotQU1fQ0ZMQUdTICs9IC1nIC1PMwotQU1fQ0ZMQUdTICs9ICItaW5jbHVkZSBzdGRpbnQuaCIKLUFNX0NGTEFHUyArPSAiLXN0ZD1jKysxMSIKLQotCi1BTV9DUFBGTEFHUyA9ICQoQ1BQRkxBR1MpCi0KLWNfc291cmNlcyA9IEMyRENvbG9yQ29udmVydGVyLmNwcAotaF9zb3VyY2VzID0gQzJEQ29sb3JDb252ZXJ0ZXIuaAotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJjMmRjb2xvcmNvbnZlcnQubGEKLWxpYmMyZGNvbG9yY29udmVydF9sYV9TT1VSQ0VTID0gJChjX3NvdXJjZXMpICQoaF9zb3VyY2VzKQotbGliYzJkY29sb3Jjb252ZXJ0X2xhX0NQUEZMQUdTID0gJChBTV9DRkxBR1MpICQoQU1fQ1BQRkxBR1MpIC1mUElDCi1saWJjMmRjb2xvcmNvbnZlcnRfbGFfTElCQUREID0gLWxkbCAtbHB0aHJlYWQgLWxsb2cKZGlmZiAtLWdpdCBhL3NkbTg0NS9saWJzdGFnZWZyaWdodGh3L0FuZHJvaWQubWsgYi9zZG04NDUvbGlic3RhZ2VmcmlnaHRody9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTc5YTIxLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9saWJzdGFnZWZyaWdodGh3L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICAgICAgICAgICAgRGVwbG95IHRoZSBoZWFkZXJzIHRoYXQgY2FuIGJlIGV4cG9zZWQKLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUxPQ0FMX0NPUFlfSEVBREVSU19UTyAgIDo9IG1tLWNvcmUvb214Y29yZQotTE9DQUxfQ09QWV9IRUFERVJTICAgICAgOj0gUUNvbU9NWE1ldGFkYXRhLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNvbU9NWFBsdWdpbi5oCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgUUNvbU9NWFBsdWdpbi5jcHAgICAgICAgICAgICAgICAgICAgICAgXAotCi1MT0NBTF9DRkxBR1MgOj0gJChQVl9DRkxBR1NfTUlOVVNfVklTSUJJTElUWSkKLQotaWZlcSAoJChQTEFURk9STV9TREtfVkVSU0lPTiksIDE4KSAgI0pCX01SMgotTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9KRUxMWUJFQU5fTVIyPTEKLWVuZGlmCi0KLWlmZXEgKCQoVEFSR0VUX1VTRVNfTUVESUFfRVhURU5TSU9OUyksdHJ1ZSkKLUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9OQVRJVkVfSEFORExFX1NPVVJDRQotZW5kaWYKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLSAgICAgICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL21tLWNvcmUvb214Y29yZS8gXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgXAotICAgICAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICBcCi0gICAgICAgIGxpYmN1dGlscyAgICAgICAgICAgICAgIFwKLSAgICAgICAgbGliZGwgICAgICAgICAgICAgICAgICAgXAotCi1MT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRodwotCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9zZG04NDUvbGlic3RhZ2VmcmlnaHRody9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvc2RtODQ1L2xpYnN0YWdlZnJpZ2h0aHcvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9zZG04NDUvbGlic3RhZ2VmcmlnaHRody9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3NkbTg0NS9saWJzdGFnZWZyaWdodGh3L05PVElDRSBiL3NkbTg0NS9saWJzdGFnZWZyaWdodGh3L05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0Y2ExZi4uMDAwMDAwMAotLS0gYS9zZG04NDUvbGlic3RhZ2VmcmlnaHRody9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotICAgQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvc2RtODQ1L2xpYnN0YWdlZnJpZ2h0aHcvUUNvbU9NWE1ldGFkYXRhLmggYi9zZG04NDUvbGlic3RhZ2VmcmlnaHRody9RQ29tT01YTWV0YWRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0OWM0NS4uMDAwMDAwMAotLS0gYS9zZG04NDUvbGlic3RhZ2VmcmlnaHRody9RQ29tT01YTWV0YWRhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgUUNPTV9PTVhfTUVUQURBVEFfSF8KLSNkZWZpbmUgUUNPTV9PTVhfTUVUQURBVEFfSF8KLQotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2lmZGVmIFVTRV9OQVRJVkVfSEFORExFX1NPVVJDRQotICAgIHR5cGVkZWYgc3RydWN0IGVuY29kZXJfbmF0aXZlaGFuZGxlX2J1ZmZlcl90eXBlIHsKLSAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlIGJ1ZmZlcl90eXBlOwotICAgICAgICBidWZmZXJfaGFuZGxlX3QgbWV0YV9oYW5kbGU7Ci0gICAgfSBlbmNvZGVyX25hdGl2ZWhhbmRsZV9idWZmZXJfdHlwZTsKLSNlbmRpZgotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgZW5jb2Rlcl9tZWRpYV9idWZmZXJfdHlwZSB7Ci0gICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSBidWZmZXJfdHlwZTsKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90IG1ldGFfaGFuZGxlOwotICAgIH0gZW5jb2Rlcl9tZWRpYV9idWZmZXJfdHlwZTsKLQotI2lmZGVmIEFORFJPSURfSkVMTFlCRUFOX01SMgotICAgIC8vIE1ldGEgZGF0YSBidWZmZXIgbGF5b3V0IHVzZWQgdG8gdHJhbnNwb3J0IG91dHB1dCBmcmFtZXMgdG8gdGhlIGRlY29kZXIgZm9yCi0gICAgLy8gZHluYW1pYyBidWZmZXIgaGFuZGxpbmcuCi0gICAgc3RydWN0IFZpZGVvRGVjb2Rlck91dHB1dE1ldGFEYXRhIHsKLSAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlIGVUeXBlOwotICAgICAgICBidWZmZXJfaGFuZGxlX3QgcEhhbmRsZTsKLSAgICB9OwotI2VuZGlmCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2RtODQ1L2xpYnN0YWdlZnJpZ2h0aHcvUUNvbU9NWFBsdWdpbi5jcHAgYi9zZG04NDUvbGlic3RhZ2VmcmlnaHRody9RQ29tT01YUGx1Z2luLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4OTMzYi4uMDAwMDAwMAotLS0gYS9zZG04NDUvbGlic3RhZ2VmcmlnaHRody9RQ29tT01YUGx1Z2luLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqIENvcHlyaWdodCAoYykgMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJRQ29tT01YUGx1Z2luLmgiCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgotCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1PTVhQbHVnaW5CYXNlICpjcmVhdGVPTVhQbHVnaW4oKSB7Ci0gICAgcmV0dXJuIG5ldyBRQ29tT01YUGx1Z2luOwotfQotCi1RQ29tT01YUGx1Z2luOjpRQ29tT01YUGx1Z2luKCkKLSAgICA6IG1MaWJIYW5kbGUoZGxvcGVuKCJsaWJPbXhDb3JlLnNvIiwgUlRMRF9OT1cpKSwKLSAgICAgIG1Jbml0KE5VTEwpLAotICAgICAgbURlaW5pdChOVUxMKSwKLSAgICAgIG1Db21wb25lbnROYW1lRW51bShOVUxMKSwKLSAgICAgIG1HZXRIYW5kbGUoTlVMTCksCi0gICAgICBtRnJlZUhhbmRsZShOVUxMKSwKLSAgICAgIG1HZXRSb2xlc09mQ29tcG9uZW50SGFuZGxlKE5VTEwpIHsKLSAgICBpZiAobUxpYkhhbmRsZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Jbml0ID0gKEluaXRGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJPTVhfSW5pdCIpOwotICAgICAgICBtRGVpbml0ID0gKERlaW5pdEZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIk9NWF9EZWluaXQiKTsKLQotICAgICAgICBtQ29tcG9uZW50TmFtZUVudW0gPQotICAgICAgICAgICAgKENvbXBvbmVudE5hbWVFbnVtRnVuYylkbHN5bShtTGliSGFuZGxlLCAiT01YX0NvbXBvbmVudE5hbWVFbnVtIik7Ci0KLSAgICAgICAgbUdldEhhbmRsZSA9IChHZXRIYW5kbGVGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJPTVhfR2V0SGFuZGxlIik7Ci0gICAgICAgIG1GcmVlSGFuZGxlID0gKEZyZWVIYW5kbGVGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJPTVhfRnJlZUhhbmRsZSIpOwotCi0gICAgICAgIG1HZXRSb2xlc09mQ29tcG9uZW50SGFuZGxlID0KLSAgICAgICAgICAgIChHZXRSb2xlc09mQ29tcG9uZW50RnVuYylkbHN5bSgKLSAgICAgICAgICAgICAgICAgICAgbUxpYkhhbmRsZSwgIk9NWF9HZXRSb2xlc09mQ29tcG9uZW50Iik7Ci0KLSAgICAgICAgaWYgKCFtSW5pdCB8fCAhbURlaW5pdCB8fCAhbUNvbXBvbmVudE5hbWVFbnVtIHx8ICFtR2V0SGFuZGxlIHx8Ci0gICAgICAgICAgICAhbUZyZWVIYW5kbGUgfHwgIW1HZXRSb2xlc09mQ29tcG9uZW50SGFuZGxlKSB7Ci0gICAgICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOwotICAgICAgICAgICAgbUxpYkhhbmRsZSA9IE5VTEw7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgKCptSW5pdCkoKTsKLSAgICB9Ci19Ci0KLVFDb21PTVhQbHVnaW46On5RQ29tT01YUGx1Z2luKCkgewotICAgIGlmIChtTGliSGFuZGxlICE9IE5VTEwpIHsKLSAgICAgICAgKCptRGVpbml0KSgpOwotCi0gICAgICAgIGRsY2xvc2UobUxpYkhhbmRsZSk7Ci0gICAgICAgIG1MaWJIYW5kbGUgPSBOVUxMOwotICAgIH0KLX0KLQotT01YX0VSUk9SVFlQRSBRQ29tT01YUGx1Z2luOjptYWtlQ29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgT01YX1BUUiBhcHBEYXRhLAotICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewotICAgIGlmIChtTGliSGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKCptR2V0SGFuZGxlKSgKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8T01YX0hBTkRMRVRZUEUgKj4oY29tcG9uZW50KSwKLSAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhciAqPihuYW1lKSwKLSAgICAgICAgICAgIGFwcERhdGEsIGNvbnN0X2Nhc3Q8T01YX0NBTExCQUNLVFlQRSAqPihjYWxsYmFja3MpKTsKLX0KLQotT01YX0VSUk9SVFlQRSBRQ29tT01YUGx1Z2luOjpkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgIE9NWF9DT01QT05FTlRUWVBFICpjb21wb25lbnQpIHsKLSAgICBpZiAobUxpYkhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgfQotCi0gICAgcmV0dXJuICgqbUZyZWVIYW5kbGUpKHJlaW50ZXJwcmV0X2Nhc3Q8T01YX0hBTkRMRVRZUEUgKj4oY29tcG9uZW50KSk7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgUUNvbU9NWFBsdWdpbjo6ZW51bWVyYXRlQ29tcG9uZW50cygKLSAgICAgICAgT01YX1NUUklORyBuYW1lLAotICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgT01YX1UzMiBpbmRleCkgewotICAgIGlmIChtTGliSGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKCptQ29tcG9uZW50TmFtZUVudW0pKG5hbWUsIHNpemUsIGluZGV4KTsKLX0KLQotT01YX0VSUk9SVFlQRSBRQ29tT01YUGx1Z2luOjpnZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICBWZWN0b3I8U3RyaW5nOD4gKnJvbGVzKSB7Ci0gICAgcm9sZXMtPmNsZWFyKCk7Ci0KLSAgICBpZiAobUxpYkhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgfQotCi0gICAgT01YX1UzMiBudW1Sb2xlczsKLSAgICBPTVhfRVJST1JUWVBFIGVyciA9ICgqbUdldFJvbGVzT2ZDb21wb25lbnRIYW5kbGUpKAotICAgICAgICAgICAgY29uc3RfY2FzdDxPTVhfU1RSSU5HPihuYW1lKSwgJm51bVJvbGVzLCBOVUxMKTsKLQotICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChudW1Sb2xlcyA+IDApIHsKLSAgICAgICAgT01YX1U4ICoqYXJyYXkgPSBuZXcgT01YX1U4ICpbbnVtUm9sZXNdOwotICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBudW1Sb2xlczsgKytpKSB7Ci0gICAgICAgICAgICBhcnJheVtpXSA9IG5ldyBPTVhfVThbT01YX01BWF9TVFJJTkdOQU1FX1NJWkVdOwotICAgICAgICB9Ci0KLSAgICAgICAgT01YX1UzMiBudW1Sb2xlczI7Ci0gICAgICAgIGVyciA9ICgqbUdldFJvbGVzT2ZDb21wb25lbnRIYW5kbGUpKAotICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8T01YX1NUUklORz4obmFtZSksICZudW1Sb2xlczIsIGFycmF5KTsKLQotCWlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotCSAgcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAobnVtUm9sZXMyICE9IG51bVJvbGVzKSB7Ci0JICByZXR1cm4gZXJyOwotCX0KLQotICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBudW1Sb2xlczsgKytpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHMoKGNvbnN0IGNoYXIgKilhcnJheVtpXSk7Ci0gICAgICAgICAgICByb2xlcy0+cHVzaChzKTsKLQotICAgICAgICAgICAgZGVsZXRlW10gYXJyYXlbaV07Ci0gICAgICAgICAgICBhcnJheVtpXSA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWxldGVbXSBhcnJheTsKLSAgICAgICAgYXJyYXkgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2RtODQ1L2xpYnN0YWdlZnJpZ2h0aHcvUUNvbU9NWFBsdWdpbi5oIGIvc2RtODQ1L2xpYnN0YWdlZnJpZ2h0aHcvUUNvbU9NWFBsdWdpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzYyM2UzLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9saWJzdGFnZWZyaWdodGh3L1FDb21PTVhQbHVnaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFFDT01fT01YX1BMVUdJTl9IXwotCi0jZGVmaW5lIFFDT01fT01YX1BMVUdJTl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvT01YUGx1Z2luQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBRQ29tT01YUGx1Z2luIDogcHVibGljIE9NWFBsdWdpbkJhc2UgewotICAgIFFDb21PTVhQbHVnaW4oKTsKLSAgICB2aXJ0dWFsIH5RQ29tT01YUGx1Z2luKCk7Ci0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgbWFrZUNvbXBvbmVudEluc3RhbmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBlbnVtZXJhdGVDb21wb25lbnRzKAotICAgICAgICAgICAgT01YX1NUUklORyBuYW1lLAotICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICBPTVhfVTMyIGluZGV4KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpOwotCi1wcml2YXRlOgotICAgIHZvaWQgKm1MaWJIYW5kbGU7Ci0KLSAgICB0eXBlZGVmIE9NWF9FUlJPUlRZUEUgKCpJbml0RnVuYykoKTsKLSAgICB0eXBlZGVmIE9NWF9FUlJPUlRZUEUgKCpEZWluaXRGdW5jKSgpOwotICAgIHR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudE5hbWVFbnVtRnVuYykoCi0gICAgICAgICAgICBPTVhfU1RSSU5HLCBPTVhfVTMyLCBPTVhfVTMyKTsKLQotICAgIHR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKkdldEhhbmRsZUZ1bmMpKAotICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgKiwgT01YX1NUUklORywgT01YX1BUUiwgT01YX0NBTExCQUNLVFlQRSAqKTsKLQotICAgIHR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKkZyZWVIYW5kbGVGdW5jKShPTVhfSEFORExFVFlQRSAqKTsKLQotICAgIHR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKkdldFJvbGVzT2ZDb21wb25lbnRGdW5jKSgKLSAgICAgICAgICAgIE9NWF9TVFJJTkcsIE9NWF9VMzIgKiwgT01YX1U4ICoqKTsKLQotICAgIEluaXRGdW5jIG1Jbml0OwotICAgIERlaW5pdEZ1bmMgbURlaW5pdDsKLSAgICBDb21wb25lbnROYW1lRW51bUZ1bmMgbUNvbXBvbmVudE5hbWVFbnVtOwotICAgIEdldEhhbmRsZUZ1bmMgbUdldEhhbmRsZTsKLSAgICBGcmVlSGFuZGxlRnVuYyBtRnJlZUhhbmRsZTsKLSAgICBHZXRSb2xlc09mQ29tcG9uZW50RnVuYyBtR2V0Um9sZXNPZkNvbXBvbmVudEhhbmRsZTsKLQotICAgIFFDb21PTVhQbHVnaW4oY29uc3QgUUNvbU9NWFBsdWdpbiAmKTsKLSAgICBRQ29tT01YUGx1Z2luICZvcGVyYXRvcj0oY29uc3QgUUNvbU9NWFBsdWdpbiAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gUUNPTV9PTVhfUExVR0lOX0hfCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9BbmRyb2lkLm1rIGIvc2RtODQ1L21tLWNvcmUvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2RlNDk4ZS4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLWlmbmVxICgkKEJVSUxEX1RJTllfQU5EUk9JRCksdHJ1ZSkKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotT01YQ09SRV9DRkxBR1MgOj0gLWcgLU8zIC1EVkVSQk9TRQotT01YQ09SRV9DRkxBR1MgKz0gLU8wIC1mbm8taW5saW5lIC1mbm8tc2hvcnQtZW51bXMKLU9NWENPUkVfQ0ZMQUdTICs9IC1EX0FORFJPSURfCi1PTVhDT1JFX0NGTEFHUyArPSAtVV9FTkFCTEVfUUNfTVNHX0xPR18KLQotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICAgICAgICAgICAgRmlndXJlIG91dCB0aGUgdGFyZ2V0cwotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLG1zbTg5OTgpCi1NTV9DT1JFX1RBUkdFVCA9IG1zbTg5OTgKLWVsc2UgaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLG1zbTg5MzcpCi1NTV9DT1JFX1RBUkdFVCA9IDg5MzcKLWVsc2UgaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLG1zbTg5NTIpCi1NTV9DT1JFX1RBUkdFVCA9IDg5NTIKLWVsc2UgaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLG1zbTg5NTMpCi1NTV9DT1JFX1RBUkdFVCA9IG1zbTg5NTMKLWVsc2UgaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLG1zbTg5OTgpCi1NTV9DT1JFX1RBUkdFVCA9IG1zbTg5OTgKLWVsc2UgaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLHNkbTY2MCkKLU1NX0NPUkVfVEFSR0VUID0gc2RtNjYwCi1lbHNlIGlmZXEgKCQoZmlsdGVyICQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSwgc2RtODQ1KSwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpCi1NTV9DT1JFX1RBUkdFVCA9IHNkbTg0NQotZWxzZQotTU1fQ09SRV9UQVJHRVQgPSBkZWZhdWx0Ci1lbmRpZgotCi0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgICAgICAgICAgICBEZXBsb3kgdGhlIGhlYWRlcnMgdGhhdCBjYW4gYmUgZXhwb3NlZAotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotTE9DQUxfQ09QWV9IRUFERVJTX1RPICAgOj0gbW0tY29yZS9vbXhjb3JlCi1MT0NBTF9DT1BZX0hFQURFUlMgICAgICA6PSBpbmMvT01YX0F1ZGlvLmgKLUxPQ0FMX0NPUFlfSEVBREVSUyAgICAgICs9IGluYy9PTVhfQ29tcG9uZW50LmgKLUxPQ0FMX0NPUFlfSEVBREVSUyAgICAgICs9IGluYy9PTVhfQ29udGVudFBpcGUuaAotTE9DQUxfQ09QWV9IRUFERVJTICAgICAgKz0gaW5jL09NWF9Db3JlLmgKLUxPQ0FMX0NPUFlfSEVBREVSUyAgICAgICs9IGluYy9PTVhfSW1hZ2UuaAotTE9DQUxfQ09QWV9IRUFERVJTICAgICAgKz0gaW5jL09NWF9JbmRleC5oCi1MT0NBTF9DT1BZX0hFQURFUlMgICAgICArPSBpbmMvT01YX0lWQ29tbW9uLmgKLUxPQ0FMX0NPUFlfSEVBREVSUyAgICAgICs9IGluYy9PTVhfT3RoZXIuaAotTE9DQUxfQ09QWV9IRUFERVJTICAgICAgKz0gaW5jL09NWF9RQ09NRXh0bnMuaAotTE9DQUxfQ09QWV9IRUFERVJTICAgICAgKz0gaW5jL09NWF9UeXBlcy5oCi1MT0NBTF9DT1BZX0hFQURFUlMgICAgICArPSBpbmMvT01YX1ZpZGVvLmgKLUxPQ0FMX0NPUFlfSEVBREVSUyAgICAgICs9IGluYy9xY19vbXhfY29tbW9uLmgKLUxPQ0FMX0NPUFlfSEVBREVSUyAgICAgICs9IGluYy9xY19vbXhfY29tcG9uZW50LmgKLUxPQ0FMX0NPUFlfSEVBREVSUyAgICAgICs9IGluYy9xY19vbXhfbXNnLmgKLUxPQ0FMX0NPUFlfSEVBREVSUyAgICAgICs9IGluYy9RT01YX0F1ZGlvRXh0ZW5zaW9ucy5oCi1MT0NBTF9DT1BZX0hFQURFUlMgICAgICArPSBpbmMvUU9NWF9BdWRpb0luZGV4RXh0ZW5zaW9ucy5oCi1MT0NBTF9DT1BZX0hFQURFUlMgICAgICArPSBpbmMvT01YX0NvcmVFeHQuaAotTE9DQUxfQ09QWV9IRUFERVJTICAgICAgKz0gaW5jL1FPTVhfQ29yZUV4dGVuc2lvbnMuaAotTE9DQUxfQ09QWV9IRUFERVJTICAgICAgKz0gaW5jL1FPTVhfRmlsZUZvcm1hdEV4dGVuc2lvbnMuaAotTE9DQUxfQ09QWV9IRUFERVJTICAgICAgKz0gaW5jL1FPTVhfSVZDb21tb25FeHRlbnNpb25zLmgKLUxPQ0FMX0NPUFlfSEVBREVSUyAgICAgICs9IGluYy9RT01YX1NvdXJjZUV4dGVuc2lvbnMuaAotTE9DQUxfQ09QWV9IRUFERVJTICAgICAgKz0gaW5jL1FPTVhfVmlkZW9FeHRlbnNpb25zLmgKLUxPQ0FMX0NPUFlfSEVBREVSUyAgICAgICs9IGluYy9PTVhfSW5kZXhFeHQuaAotTE9DQUxfQ09QWV9IRUFERVJTICAgICAgKz0gaW5jL09NWF9WaWRlb0V4dC5oCi1MT0NBTF9DT1BZX0hFQURFUlMgICAgICArPSBpbmMvUU9NWF9TdHJlYW1pbmdFeHRlbnNpb25zLmgKLUxPQ0FMX0NPUFlfSEVBREVSUyAgICAgICs9IGluYy9RQ01lZGlhRGVmcy5oCi1MT0NBTF9DT1BZX0hFQURFUlMgICAgICArPSBpbmMvUUNNZXRhRGF0YS5oCi0KLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICAgICAgICAgICAgIExJQlJBUlkgZm9yIEFuZHJvaWQgYXBwcwotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotTE9DQUxfQ19JTkNMVURFUyAgICAgICAgOj0gJChMT0NBTF9QQVRIKS9zcmMvY29tbW9uCi1MT0NBTF9DX0lOQ0xVREVTICAgICAgICArPSAkKExPQ0FMX1BBVEgpL2luYwotTE9DQUxfUFJFTElOS19NT0RVTEUgICAgOj0gZmFsc2UKLUxPQ0FMX01PRFVMRSAgICAgICAgICAgIDo9IGxpYk9teENvcmUKLUxPQ0FMX01PRFVMRV9UQUdTICAgICAgIDo9IG9wdGlvbmFsCi1MT0NBTF9WRU5ET1JfTU9EVUxFICAgICA6PSB0cnVlCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICA6PSBsaWJsb2cgbGliZGwgbGliY3V0aWxzCi1MT0NBTF9DRkxBR1MgICAgICAgICAgICA6PSAkKE9NWENPUkVfQ0ZMQUdTKQotCi1MT0NBTF9TUkNfRklMRVMgICAgICAgICA6PSBzcmMvY29tbW9uL29teF9jb3JlX2NtcC5jcHAKLUxPQ0FMX1NSQ19GSUxFUyAgICAgICAgICs9IHNyYy9jb21tb24vcWNfb214X2NvcmUuYwotaWZuZXEgKCwkKGZpbHRlciBtc204OTk2IG1zbTg5OTggc2RtNjYwIHNkbTg0NSwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpKQotTE9DQUxfU1JDX0ZJTEVTICAgICAgICAgKz0gc3JjLyQoTU1fQ09SRV9UQVJHRVQpL3JlZ2lzdHJ5X3RhYmxlX2FuZHJvaWQuYwotZWxzZQotTE9DQUxfU1JDX0ZJTEVTICAgICAgICAgKz0gc3JjLyQoTU1fQ09SRV9UQVJHRVQpL3FjX3JlZ2lzdHJ5X3RhYmxlX2FuZHJvaWQuYwotZW5kaWYKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgICAgICAgICAgICBMSUJSQVJZIGZvciBjb21tYW5kIGxpbmUgdGVzdCBhcHBzCi0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfQ19JTkNMVURFUyAgICAgICAgOj0gJChMT0NBTF9QQVRIKS9zcmMvY29tbW9uCi1MT0NBTF9DX0lOQ0xVREVTICAgICAgICArPSAkKExPQ0FMX1BBVEgpL2luYwotTE9DQUxfUFJFTElOS19NT0RVTEUgICAgOj0gZmFsc2UKLUxPQ0FMX01PRFVMRSAgICAgICAgICAgIDo9IGxpYm1tLW9teGNvcmUKLUxPQ0FMX01PRFVMRV9UQUdTICAgICAgIDo9IG9wdGlvbmFsCi1MT0NBTF9WRU5ET1JfTU9EVUxFICAgICA6PSB0cnVlCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICA6PSBsaWJsb2cgbGliZGwgbGliY3V0aWxzCi1MT0NBTF9DRkxBR1MgICAgICAgICAgICA6PSAkKE9NWENPUkVfQ0ZMQUdTKQotCi1MT0NBTF9TUkNfRklMRVMgICAgICAgICA6PSBzcmMvY29tbW9uL29teF9jb3JlX2NtcC5jcHAKLUxPQ0FMX1NSQ19GSUxFUyAgICAgICAgICs9IHNyYy9jb21tb24vcWNfb214X2NvcmUuYwotaWZuZXEgKCwkKGZpbHRlciBtc204OTk2IG1zbTg5OTggc2RtNjYwIHNkbTg0NSwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpKQotTE9DQUxfU1JDX0ZJTEVTICAgICAgICAgKz0gc3JjLyQoTU1fQ09SRV9UQVJHRVQpL3JlZ2lzdHJ5X3RhYmxlLmMKLWVsc2UKLUxPQ0FMX1NSQ19GSUxFUyAgICAgICAgICs9IHNyYy8kKE1NX0NPUkVfVEFSR0VUKS9xY19yZWdpc3RyeV90YWJsZS5jCi1lbmRpZgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWVuZGlmICNCVUlMRF9USU5ZX0FORFJPSUQKZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL01ha2VmaWxlLmFtIGIvc2RtODQ1L21tLWNvcmUvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYTliMzIuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0jIHNvdXJjZXMgYW5kIGludGVybWVkaWF0ZSBmaWxlcyBhcmUgc2VwYXJhdGVkCi0KLSNBTV9DRkxBR1MgPSAtV2FsbAotI0FNX0NGTEFHUyArPSAtV3VuZGVmCi0jQU1fQ0ZMQUdTICs9IC1Xc3RyaWN0LXByb3RvdHlwZXMKLSNBTV9DRkxBR1MgKz0gLVduby10cmlncmFwaHMKLSNBTV9DRkxBR1MgKz0gLWcgLU8zCi0jQU1fQ0ZMQUdTICs9IC1PMCAtZm5vLWlubGluZSAtZm5vLXNob3J0LWVudW1zCi0jQU1fQ0ZMQUdTICs9IC1mUElDCi0KLUFNX0NQUEZMQUdTID0gLURfX3BhY2tlZF9fPQotQU1fQ1BQRkxBR1MgKz0gLURfQU5EUk9JRF8KLUFNX0NQUEZMQUdTICs9IC1EX0VOQUJMRV9RQ19NU0dfTE9HXwotI0FNX0NQUEZMQUdTICs9IC1nIC1PMwotI0FNX0NQUEZMQUdTICs9IC1PMCAtZm5vLWlubGluZSAtZm5vLXNob3J0LWVudW1zCi1BTV9DUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvbW0tY29yZS9pbmMvCi1BTV9DUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvbW0tY29yZS9zcmMvY29tbW9uLwotQU1fQ1BQRkxBR1MgKz0gIi1Ec3RybGNweT1nX3N0cmxjcHkiCi1BTV9DUFBGTEFHUyArPSAiLURzdHJsY2F0PWdfc3RybGNhdCIKLQotaF9zb3VyY2VzICA9aW5jL09NWF9BdWRpby5oCi1oX3NvdXJjZXMgKz1pbmMvT01YX0NvbXBvbmVudC5oCi1oX3NvdXJjZXMgKz1pbmMvT01YX0NvbnRlbnRQaXBlLmgKLWhfc291cmNlcyArPWluYy9PTVhfQ29yZS5oCi1oX3NvdXJjZXMgKz1pbmMvT01YX0ltYWdlLmgKLWhfc291cmNlcyArPWluYy9PTVhfSW5kZXguaAotaF9zb3VyY2VzICs9aW5jL09NWF9JVkNvbW1vbi5oCi1oX3NvdXJjZXMgKz1pbmMvT01YX090aGVyLmgKLWhfc291cmNlcyArPWluYy9PTVhfUUNPTUV4dG5zLmgKLWhfc291cmNlcyArPWluYy9PTVhfVHlwZXMuaAotaF9zb3VyY2VzICs9aW5jL09NWF9WaWRlby5oCi1oX3NvdXJjZXMgKz1pbmMvcWNfb214X2NvbW1vbi5oCi1oX3NvdXJjZXMgKz1pbmMvcWNfb214X2NvbXBvbmVudC5oCi1oX3NvdXJjZXMgKz1pbmMvcWNfb214X21zZy5oCi1oX3NvdXJjZXMgKz1pbmMvUU9NWF9BdWRpb0V4dGVuc2lvbnMuaAotaF9zb3VyY2VzICs9aW5jL1FPTVhfQXVkaW9JbmRleEV4dGVuc2lvbnMuaAotaF9zb3VyY2VzICs9aW5jL09NWF9Db3JlRXh0LmgKLWhfc291cmNlcyArPWluYy9RT01YX0NvcmVFeHRlbnNpb25zLmgKLWhfc291cmNlcyArPWluYy9RT01YX0ZpbGVGb3JtYXRFeHRlbnNpb25zLmgKLWhfc291cmNlcyArPWluYy9RT01YX0lWQ29tbW9uRXh0ZW5zaW9ucy5oCi1oX3NvdXJjZXMgKz1pbmMvUU9NWF9Tb3VyY2VFeHRlbnNpb25zLmgKLWhfc291cmNlcyArPWluYy9RT01YX1ZpZGVvRXh0ZW5zaW9ucy5oCi1oX3NvdXJjZXMgKz1pbmMvT01YX0luZGV4RXh0LmgKLWhfc291cmNlcyArPWluYy9RT01YX1N0cmVhbWluZ0V4dGVuc2lvbnMuaAotCi1jX3NvdXJjZXMgID1zcmMvY29tbW9uL29teF9jb3JlX2NtcC5jcHAKLWNfc291cmNlcyArPXNyYy9jb21tb24vcWNfb214X2NvcmUuYwotCi1pZiBUQVJHRVRfTVNNODk1MwotVEFSR0VUX1JFR0lTVFJZID0gbXNtODk1MwotZW5kaWYKLQotaWYgVEFSR0VUX01TTTg5OTYKLVRBUkdFVF9SRUdJU1RSWSA9IG1zbTg5OTYKLWVuZGlmCi0KLWlmIFRBUkdFVF9NU004OTA5Ci1UQVJHRVRfUkVHSVNUUlkgPSA4OTA5Ci1lbmRpZgotCi1jX3NvdXJjZXMgKz1zcmMvJHtUQVJHRVRfUkVHSVNUUll9L3JlZ2lzdHJ5X3RhYmxlX2FuZHJvaWQuYwotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJPbXhDb3JlLmxhCi1pbmNsdWRlX0hFQURFUlMgPSAkKGhfc291cmNlcykKLWxpYk9teENvcmVfbGFfU09VUkNFUyA9ICQoY19zb3VyY2VzKQotbGliT214Q29yZV9sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykgLWZQSUMKLWxpYk9teENvcmVfbGFfQ1BQRkxBR1MgPSAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykgLWZQSUMKLWxpYk9teENvcmVfbGFfTERGTEFHUyA9IC1sZGwgLWxydCAtbHB0aHJlYWQgLWxnbGliLTIuMCAtbGN1dGlscwotbGliT214Q29yZV9sYV9MREZMQUdTICs9IC1zaGFyZWQgLWF2b2lkLXZlcnNpb24KLQotbGliX0xUTElCUkFSSUVTICs9IGxpYm1tLW9teGNvcmUubGEKLQotY19zb3VyY2VzICA9c3JjL2NvbW1vbi9vbXhfY29yZV9jbXAuY3BwCi1jX3NvdXJjZXMgKz1zcmMvY29tbW9uL3FjX29teF9jb3JlLmMKLWNfc291cmNlcyArPXNyYy8ke1RBUkdFVF9SRUdJU1RSWX0vcmVnaXN0cnlfdGFibGUuYwotCi1pbmNsdWRlX0hFQURFUlMgPSAkKGhfc291cmNlcykKLWxpYm1tX29teGNvcmVfbGFfU09VUkNFUyA9ICQoY19zb3VyY2VzKQotbGlibW1fb214Y29yZV9sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykgLWZQSUMKLWxpYm1tX29teGNvcmVfbGFfQ1BQRkxBR1MgPSAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykgLWZQSUMKLWxpYm1tX29teGNvcmVfbGFfTERGTEFHUyA9IC1sZGwgLWxydCAtbHB0aHJlYWQgLWxnbGliLTIuMCAtbGN1dGlscwotbGlibW1fb214Y29yZV9sYV9MREZMQUdTICs9IC1zaGFyZWQgLWF2b2lkLXZlcnNpb24KLQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9BdWRpby5oIGIvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9BdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDBlZjFjLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfQXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAotICoKLSAqLwotCi0vKiogQGZpbGUgT01YX0F1ZGlvLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqICBUaGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgQXVkaW8gY29tcG9uZW50cyB0byBleGNoYW5nZQotICogIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIHRoZSBjb21wb25lbm1pbHRzLgotICovCi0KLSNpZm5kZWYgT01YX0F1ZGlvX2gKLSNkZWZpbmUgT01YX0F1ZGlvX2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKLSAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKLSAqLwotCi0jaW5jbHVkZSA8T01YX0NvcmUuaD4KLQotLyoqIEBkZWZncm91cCBtaWRpIE1JREkKLSAqIEBpbmdyb3VwIGF1ZGlvCi0gKi8KLSAKLS8qKiBAZGVmZ3JvdXAgZWZmZWN0cyBBdWRpbyBlZmZlY3RzCi0gKiBAaW5ncm91cCBhdWRpbwotICovCi0KLS8qKiBAZGVmZ3JvdXAgYXVkaW8gT3Blbk1BWCBJTCBBdWRpbyBEb21haW4KLSAqIFN0cnVjdHVyZXMgZm9yIE9wZW5NQVggSUwgQXVkaW8gZG9tYWluCi0gKiBAewotICovCi0KLS8qKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcG9zc2libGUgYXVkaW8gY29kaW5ncy4gIAotICogIElmICJPTVhfQVVESU9fQ29kaW5nVW51c2VkIiBpcyBzZWxlY3RlZCwgdGhlIGNvZGluZyBzZWxlY3Rpb24gbXVzdCAKLSAqICBiZSBkb25lIGluIGEgdmVuZG9yIHNwZWNpZmljIHdheS4gIFNpbmNlIHRoaXMgaXMgZm9yIGFuIGF1ZGlvIAotICogIHByb2Nlc3NpbmcgZWxlbWVudCB0aGlzIGVudW0gaXMgcmVsZXZhbnQuICBIb3dldmVyLCBmb3IgYW5vdGhlciAKLSAqICB0eXBlIG9mIGNvbXBvbmVudCBvdGhlciBlbnVtcyB3b3VsZCBiZSBpbiB0aGlzIGFyZWEuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQ09ESU5HVFlQRSB7Ci0gICAgT01YX0FVRElPX0NvZGluZ1VudXNlZCA9IDAsICAvKio8IFBsYWNlaG9sZGVyIHZhbHVlIHdoZW4gY29kaW5nIGlzIE4vQSAgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nQXV0b0RldGVjdCwgIC8qKjwgYXV0byBkZXRlY3Rpb24gb2YgYXVkaW8gZm9ybWF0ICovCi0gICAgT01YX0FVRElPX0NvZGluZ1BDTSwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBDTSBjb2RpbmcgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nQURQQ00sICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQURQQ00gZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0FNUiwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEFNUiBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nR1NNRlIsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgR1NNIGZ1bGxyYXRlIChpLmUuIEdTTTYxMCkgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nR1NNRUZSLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgR1NNIEVuaGFuY2VkIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSovCi0gICAgT01YX0FVRElPX0NvZGluZ0dTTUhSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEdTTSBIYWxmcmF0ZSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nUERDRlIsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUERDIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdQRENFRlIsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBQREMgRW5oYW5jZWQgRnVsbHJhdGUgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1BEQ0hSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBEQyBIYWxmcmF0ZSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nVERNQUZSLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgVERNQSBGdWxscmF0ZSBlbmNvZGVkIGRhdGEgKFRJQS9FSUEtMTM2LTQyMCkgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nVERNQUVGUiwgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgVERNQSBFbmhhbmNlZCBGdWxscmF0ZSBlbmNvZGVkIGRhdGEgKFRJQS9FSUEtMTM2LTQxMCkgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nUUNFTFA4LCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUUNFTFAgOGticHMgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1FDRUxQMTMsICAgICAvKio8IEFueSB2YXJpYW50IG9mIFFDRUxQIDEza2JwcyBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nRVZSQywgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRVZSQyBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nU01WLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgU01WIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdHNzExLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHLjcxMSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nRzcyMywgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRy43MjMgZG90IDEgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0c3MjYsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEcuNzI2IGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdHNzI5LCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHLjcyOSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nQUFDLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQUFDIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdNUDMsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBNUDMgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1NCQywgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFNCQyBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nVk9SQklTLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgVk9SQklTIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdXTUEsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBXTUEgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1JBLCAgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFJBIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdNSURJLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBNSURJIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdBQzMsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBQzMgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQ29kaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fQ09ESU5HVFlQRTsKLQotCi0vKiogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCi0gKiAgbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQgYXVkaW8gCi0gKiAgcGF0aC4gIElmIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGRlZmluZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUKLSAqICBwb3J0IChzdWNoIGFzIGZyZXF1ZW5jeSksIGFkZGl0aW9uYWwgc3RydWN0dXJlcyBtdXN0IGJlIHNlbnQgc3VjaCBhcyB0aGUKLSAqICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgc3RydWN0dXJlIHRvIHN1cHBseSB0aGUgZXh0cmEgcGFyYW1ldGVycyBmb3IgdGhlIHBvcnQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QT1JUREVGSU5JVElPTlRZUEUgewotICAgIE9NWF9TVFJJTkcgY01JTUVUeXBlOyAgICAgICAgICAgIC8qKjwgTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0ICovCi0gICAgT01YX05BVElWRV9ERVZJQ0VUWVBFIHBOYXRpdmVSZW5kZXI7IC8qKiA8IHBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW4gb3V0cHV0IGRldmljZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDAgKi8KLSAgICBPTVhfQk9PTCBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQ7ICAvKio8IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSBPTVggY29tcG9uZW50ICovCi0gICAgT01YX0FVRElPX0NPRElOR1RZUEUgZUVuY29kaW5nOyAgLyoqPCBUeXBlIG9mIGRhdGEgZXhwZWN0ZWQgZm9yIHRoaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0IChlLmcuIFBDTSwgQU1SLCBNUDMsIGV0YykgKi8KLX0gT01YX0FVRElPX1BPUlRERUZJTklUSU9OVFlQRTsKLQotCi0vKiogIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlCi0gICogIHRoZSB2YXJpb3VzIGRhdGEgaW5wdXQvb3V0cHV0IGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIHBvcnQuCi0gICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQgKi8KLSAgICBPTVhfVTMyIG5JbmRleDsgICAgICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tIDB4MCB0byBOLTEgKi8KLSAgICBPTVhfQVVESU9fQ09ESU5HVFlQRSBlRW5jb2Rpbmc7IC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIHBvcnQgKGUuZy4gUENNLCBBTVIsIE1QMywgZXRjKSAqLwotfSBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEU7Ci0KLQotLyoqIFBDTSBtb2RlIHR5cGUgICovIAotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19QQ01NT0RFVFlQRSB7IAotICAgIE9NWF9BVURJT19QQ01Nb2RlTGluZWFyID0gMCwgIC8qKjwgTGluZWFyIFBDTSBlbmNvZGVkIGRhdGEgKi8gCi0gICAgT01YX0FVRElPX1BDTU1vZGVBTGF3LCAgICAgICAgLyoqPCBBIGxhdyBQQ00gZW5jb2RlZCBkYXRhIChHLjcxMSkgKi8gCi0gICAgT01YX0FVRElPX1BDTU1vZGVNVUxhdywgICAgICAgLyoqPCBNdSBsYXcgUENNIGVuY29kZWQgZGF0YSAoRy43MTEpICAqLyAKLSAgICBPTVhfQVVESU9fUENNTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fUENNTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX1BDTU1vZGVNYXggPSAweDdGRkZGRkZGIAotfSBPTVhfQVVESU9fUENNTU9ERVRZUEU7IAotCi0KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQ0hBTk5FTFRZUEUgewotICAgIE9NWF9BVURJT19DaGFubmVsTm9uZSA9IDB4MCwgICAgLyoqPCBVbnVzZWQgb3IgZW1wdHkgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbExGICAgPSAweDEsICAgIC8qKjwgTGVmdCBmcm9udCAqLwotICAgIE9NWF9BVURJT19DaGFubmVsUkYgICA9IDB4MiwgICAgLyoqPCBSaWdodCBmcm9udCAqLwotICAgIE9NWF9BVURJT19DaGFubmVsQ0YgICA9IDB4MywgICAgLyoqPCBDZW50ZXIgZnJvbnQgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbExTICAgPSAweDQsICAgIC8qKjwgTGVmdCBzdXJyb3VuZCAqLwotICAgIE9NWF9BVURJT19DaGFubmVsUlMgICA9IDB4NSwgICAgLyoqPCBSaWdodCBzdXJyb3VuZCAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTEZFICA9IDB4NiwgICAgLyoqPCBMb3cgZnJlcXVlbmN5IGVmZmVjdHMgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbENTICAgPSAweDcsICAgIC8qKjwgQmFjayBzdXJyb3VuZCAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTFIgICA9IDB4OCwgICAgLyoqPCBMZWZ0IHJlYXIuICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxSUiAgID0gMHg5LCAgICAvKio8IFJpZ2h0IHJlYXIuICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX0NoYW5uZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTWF4ICA9IDB4N0ZGRkZGRkYgCi19IE9NWF9BVURJT19DSEFOTkVMVFlQRTsKLQotI2RlZmluZSBPTVhfQVVESU9fTUFYQ0hBTk5FTFMgMTYgIC8qKjwgbWF4aW11bSBudW1iZXIgZGlzdGluY3QgYXVkaW8gY2hhbm5lbHMgdGhhdCBhIGJ1ZmZlciBtYXkgY29udGFpbiAqLwotI2RlZmluZSBPTVhfTUlOX1BDTVBBWUxPQURfTVNFQyA1IC8qKjwgTWluaW11bSBhdWRpbyBidWZmZXIgcGF5bG9hZCBzaXplIGZvciB1bmNvbXByZXNzZWQgKFBDTSkgYXVkaW8gKi8KLQotLyoqIFBDTSBmb3JtYXQgZGVzY3JpcHRpb24gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgeyAKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAoZS5nLiAyIGZvciBzdGVyZW8pICovIAotICAgIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBlTnVtRGF0YTsgICAvKio8IGluZGljYXRlcyBQQ00gZGF0YSBhcyBzaWduZWQgb3IgdW5zaWduZWQgKi8gCi0gICAgT01YX0VORElBTlRZUEUgZUVuZGlhbjsgICAgICAgICAgIC8qKjwgaW5kaWNhdGVzIFBDTSBkYXRhIGFzIGxpdHRsZSBvciBiaWcgZW5kaWFuICovIAotICAgIE9NWF9CT09MIGJJbnRlcmxlYXZlZDsgICAgICAgICAgICAvKio8IFRydWUgZm9yIG5vcm1hbCBpbnRlcmxlYXZlZCBkYXRhOyBmYWxzZSBmb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLWludGVybGVhdmVkIGRhdGEgKGUuZy4gYmxvY2sgZGF0YSkgKi8gCi0gICAgT01YX1UzMiBuQml0UGVyU2FtcGxlOyAgICAgICAgICAgIC8qKjwgQml0IHBlciBzYW1wbGUgKi8gCi0gICAgT01YX1UzMiBuU2FtcGxpbmdSYXRlOyAgICAgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLyAKLSAgICBPTVhfQVVESU9fUENNTU9ERVRZUEUgZVBDTU1vZGU7ICAgLyoqPCBQQ00gbW9kZSBlbnVtZXJhdGlvbiAqLyAKLSAgICBPTVhfQVVESU9fQ0hBTk5FTFRZUEUgZUNoYW5uZWxNYXBwaW5nW09NWF9BVURJT19NQVhDSEFOTkVMU107IC8qKjwgU2xvdCBpIGNvbnRhaW5zIGNoYW5uZWwgZGVmaW5lZCBieSBlQ2hhbm5lbE1hcFtpXSAqLwotCi19IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRTsgCi0KLQotLyoqIEF1ZGlvIGNoYW5uZWwgbW9kZS4gIFRoaXMgaXMgdXNlZCBieSBib3RoIEFBQyBhbmQgTVAzLCBhbHRob3VnaCB0aGUgbmFtZXMgYXJlIG1vcmUgYXBwcm9wcmlhdGUKLSAqIGZvciB0aGUgTVAzLiAgRm9yIGV4YW1wbGUsIEpvaW50U3RlcmVvIGZvciBNUDMgaXMgQ291cGxpbmdDaGFubmVscyBmb3IgQUFDLiAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgewotICAgIE9NWF9BVURJT19DaGFubmVsTW9kZVN0ZXJlbyA9IDAsICAvKio8IDIgY2hhbm5lbHMsIHRoZSBiaXRyYXRlIGFsbG9jYXRpb24gYmV0d2VlbiB0aG9zZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3byBjaGFubmVscyBjaGFuZ2VzIGFjY29yZGluZ2x5IHRvIGVhY2ggY2hhbm5lbCBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTW9kZUpvaW50U3RlcmVvLCAvKio8IG1vZGUgdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2Ygd2hhdCBpcyBjb21tb24gYmV0d2VlbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIGNoYW5uZWxzIGZvciBoaWdoZXIgY29tcHJlc3Npb24gZ2FpbiAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTW9kZUR1YWwsICAgICAgICAvKio8IDIgbW9uby1jaGFubmVscywgZWFjaCBjaGFubmVsIGlzIGVuY29kZWQgd2l0aCBoYWxmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRyYXRlIG9mIHRoZSBvdmVyYWxsIGJpdHJhdGUgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVNb25vLCAgICAgICAgLyoqPCBNb25vIGNoYW5uZWwgbW9kZSAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTW9kZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRTsKLQotCi10eXBlZGVmIGVudW0gT01YX0FVRElPX01QM1NUUkVBTUZPUk1BVFRZUEUgewotICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNUDFMYXllcjMgPSAwLCAvKio8IE1QMyBBdWRpbyBNUEVHIDEgTGF5ZXIgMyBTdHJlYW0gZm9ybWF0ICovCi0gICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1QMkxheWVyMywgICAgIC8qKjwgTVAzIEF1ZGlvIE1QRUcgMiBMYXllciAzIFN0cmVhbSBmb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TVAyXzVMYXllcjMsICAgLyoqPCBNUDMgQXVkaW8gTVBFRzIuNSBMYXllciAzIFN0cmVhbSBmb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19NUDNTVFJFQU1GT1JNQVRUWVBFOwotCi0vKiogTVAzIHBhcmFtcyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX01QM1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLwotICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLwotICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLwotICAgIE9NWF9VMzIgbkF1ZGlvQmFuZFdpZHRoOyAgICAgICAvKio8IEF1ZGlvIGJhbmQgd2lkdGggKGluIEh6KSB0byB3aGljaCBhbiBlbmNvZGVyIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHRoZSBhdWRpbyBzaWduYWwuIFVzZSAwIHRvIGxldCBlbmNvZGVyIGRlY2lkZSAqLwotICAgIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgZUNoYW5uZWxNb2RlOyAgIC8qKjwgQ2hhbm5lbCBtb2RlIGVudW1lcmF0aW9uICovCi0gICAgT01YX0FVRElPX01QM1NUUkVBTUZPUk1BVFRZUEUgZUZvcm1hdDsgIC8qKjwgTVAzIHN0cmVhbSBmb3JtYXQgKi8KLX0gT01YX0FVRElPX1BBUkFNX01QM1RZUEU7Ci0KLQotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19BQUNTVFJFQU1GT1JNQVRUWVBFIHsKLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVAyQURUUyA9IDAsIC8qKjwgQUFDIEF1ZGlvIERhdGEgVHJhbnNwb3J0IFN0cmVhbSAyIGZvcm1hdCAqLwotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRBRFRTLCAgICAgLyoqPCBBQUMgQXVkaW8gRGF0YSBUcmFuc3BvcnQgU3RyZWFtIDQgZm9ybWF0ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNExPQVMsICAgICAvKio8IEFBQyBMb3cgT3ZlcmhlYWQgQXVkaW8gU3RyZWFtIGZvcm1hdCAqLwotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRMQVRNLCAgICAgLyoqPCBBQUMgTG93IG92ZXJoZWFkIEF1ZGlvIFRyYW5zcG9ydCBNdWx0aXBsZXggKi8KLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0QURJRiwgICAgICAgIC8qKjwgQUFDIEF1ZGlvIERhdGEgSW50ZXJjaGFuZ2UgRm9ybWF0ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGLCAgICAgICAvKio8IEFBQyBpbnNpZGUgTVBFRy00L0lTTyBGaWxlIEZvcm1hdCAqLwotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRSQVcsICAgICAgICAgLyoqPCBBQUMgUmF3IEZvcm1hdCAqLwotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0FBQ1NUUkVBTUZPUk1BVFRZUEU7Ci0KLQotLyoqIEFBQyBtb2RlIHR5cGUuICBOb3RlIHRoYXQgdGhlIHRlcm0gcHJvZmlsZSBpcyB1c2VkIHdpdGggdGhlIE1QRUctMgotICogc3RhbmRhcmQgYW5kIHRoZSB0ZXJtIG9iamVjdCB0eXBlIGFuZCBwcm9maWxlIGlzIHVzZWQgd2l0aCBNUEVHLTQgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEV7Ci0gIE9NWF9BVURJT19BQUNPYmplY3ROdWxsID0gMCwgICAgICAvKio8IE51bGwsIG5vdCB1c2VkICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RNYWluID0gMSwgICAgICAvKio8IEFBQyBNYWluIG9iamVjdCAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0TEMsICAgICAgICAgICAgLyoqPCBBQUMgTG93IENvbXBsZXhpdHkgb2JqZWN0IChBQUMgcHJvZmlsZSkgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdFNTUiwgICAgICAgICAgIC8qKjwgQUFDIFNjYWxhYmxlIFNhbXBsZSBSYXRlIG9iamVjdCAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0TFRQLCAgICAgICAgICAgLyoqPCBBQUMgTG9uZyBUZXJtIFByZWRpY3Rpb24gb2JqZWN0ICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RIRSwgICAgICAgICAgICAvKio8IEFBQyBIaWdoIEVmZmljaWVuY3kgKG9iamVjdCB0eXBlIFNCUiwgSEUtQUFDIHByb2ZpbGUpICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RTY2FsYWJsZSwgICAgICAvKio8IEFBQyBTY2FsYWJsZSBvYmplY3QgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdEVSTEMgPSAxNywgICAgIC8qKjwgRVIgQUFDIExvdyBDb21wbGV4aXR5IG9iamVjdCAoRXJyb3IgUmVzaWxpZW50IEFBQy1MQykgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdExEID0gMjMsICAgICAgIC8qKjwgQUFDIExvdyBEZWxheSBvYmplY3QgKEVycm9yIFJlc2lsaWVudCkgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTID0gMjksICAgIC8qKjwgQUFDIEhpZ2ggRWZmaWNpZW5jeSB3aXRoIFBhcmFtZXRyaWMgU3RlcmVvIGNvZGluZyAoSEUtQUFDIHYyLCBvYmplY3QgdHlwZSBQUykgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgT01YX0FVRElPX0FBQ09iamVjdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRTsKLQotCi0vKiogQUFDIHRvb2wgdXNhZ2UgKGZvciBuQUFDdG9vbHMgaW4gT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFKS4KLSAqIFJlcXVpcmVkIGZvciBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbmFsIGFzIGRlY29kZXIgaW5mbyBvdXRwdXQuCi0gKiBGb3IgTVAzLCBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIGlzIHN1ZmZpY2llbnQuICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNUb29sTm9uZSAweDAwMDAwMDAwIC8qKjwgbm8gQUFDIHRvb2xzIGFsbG93ZWQgKGVuY29kZXIgY29uZmlnKSBvciBhY3RpdmUgKGRlY29kZXIgaW5mbyBvdXRwdXQpICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNUb29sTVMgICAweDAwMDAwMDAxIC8qKjwgTVM6IE1pZC9zaWRlIGpvaW50IGNvZGluZyB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNUb29sSVMgICAweDAwMDAwMDAyIC8qKjwgSVM6IEludGVuc2l0eSBzdGVyZW8gdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbFROUyAgMHgwMDAwMDAwNCAvKio8IFROUzogVGVtcG9yYWwgTm9pc2UgU2hhcGluZyB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNUb29sUE5TICAweDAwMDAwMDA4IC8qKjwgUE5TOiBNUEVHLTQgUGVyY2VwdHVhbCBOb2lzZSBzdWJzdGl0dXRpb24gdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbExUUCAgMHgwMDAwMDAxMCAvKio8IExUUDogTVBFRy00IExvbmcgVGVybSBQcmVkaWN0aW9uIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xBbGwgIDB4N0ZGRkZGRkYgLyoqPCBhbGwgQUFDIHRvb2xzIGFsbG93ZWQgb3IgYWN0aXZlICgqLwotCi0vKiogTVBFRy00IEFBQyBlcnJvciByZXNpbGllbmNlIChFUikgdG9vbCB1c2FnZSAoZm9yIG5BQUNFUnRvb2xzIGluIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSkuCi0gKiBSZXF1aXJlZCBmb3IgRVIgZW5jb2RlciBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25hbCBhcyBkZWNvZGVyIGluZm8gb3V0cHV0ICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNFUk5vbmUgIDB4MDAwMDAwMDAgIC8qKjwgbm8gQUFDIEVSIHRvb2xzIGFsbG93ZWQvdXNlZCAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDRVJWQ0IxMSAweDAwMDAwMDAxICAvKio8IFZDQjExOiBWaXJ0dWFsIENvZGUgQm9va3MgZm9yIEFBQyBzZWN0aW9uIGRhdGEgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ0VSUlZMQyAgMHgwMDAwMDAwMiAgLyoqPCBSVkxDOiBSZXZlcnNpYmxlIFZhcmlhYmxlIExlbmd0aCBDb2RpbmcgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ0VSSENSICAgMHgwMDAwMDAwNCAgLyoqPCBIQ1I6IEh1ZmZtYW4gQ29kZXdvcmQgUmVvcmRlcmluZyAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDRVJBbGwgICAweDdGRkZGRkZGICAvKio8IGFsbCBBQUMgRVIgdG9vbHMgYWxsb3dlZC91c2VkICovCi0KLQotLyoqIEFBQyBwYXJhbXMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8KLSAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KLSAgICBPTVhfVTMyIG5BdWRpb0JhbmRXaWR0aDsgICAgICAgLyoqPCBBdWRpbyBiYW5kIHdpZHRoIChpbiBIeikgdG8gd2hpY2ggYW4gZW5jb2RlciBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB0aGUgYXVkaW8gc2lnbmFsLiBVc2UgMCB0byBsZXQgZW5jb2RlciBkZWNpZGUgKi8KLSAgICBPTVhfVTMyIG5GcmFtZUxlbmd0aDsgICAgICAgICAgLyoqPCBGcmFtZSBsZW5ndGggKGluIGF1ZGlvIHNhbXBsZXMgcGVyIGNoYW5uZWwpIG9mIHRoZSBjb2RlYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgMTAyNCBvciA5NjAgKEFBQy1MQyksIDIwNDggKEhFLUFBQyksIDQ4MCBvciA1MTIgKEFBQy1MRCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIDAgdG8gbGV0IGVuY29kZXIgZGVjaWRlICovCi0gICAgT01YX1UzMiBuQUFDdG9vbHM7ICAgICAgICAgICAgIC8qKjwgQUFDIHRvb2wgdXNhZ2UgKi8KLSAgICBPTVhfVTMyIG5BQUNFUnRvb2xzOyAgICAgICAgICAgLyoqPCBNUEVHLTQgQUFDIGVycm9yIHJlc2lsaWVuY2UgdG9vbCB1c2FnZSAqLwotICAgIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSBlQUFDUHJvZmlsZTsgICAvKio8IEFBQyBwcm9maWxlIGVudW1lcmF0aW9uICovCi0gICAgT01YX0FVRElPX0FBQ1NUUkVBTUZPUk1BVFRZUEUgZUFBQ1N0cmVhbUZvcm1hdDsgLyoqPCBBQUMgc3RyZWFtIGZvcm1hdCBlbnVtZXJhdGlvbiAqLwotICAgIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgZUNoYW5uZWxNb2RlOyAgIC8qKjwgQ2hhbm5lbCBtb2RlIGVudW1lcmF0aW9uICovCi19IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRTsKLQotCi0vKiogVk9SQklTIHBhcmFtcyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGVuY29kZWQgZGF0YSBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMuIEVuY29kaW5nIGlzIHNldCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZSBjbG9zZXN0IHRvIHNwZWNpZmllZCAgdmFsdWUgKGluIGJwcykgKi8KLSAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgIC8qKjwgU2V0cyBtaW5pbXVtIGJpdHJhdGUgKGluIGJwcykuICovCi0gICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAvKio8IFNldHMgbWF4aW11bSBiaXRyYXRlIChpbiBicHMpLiAqLwotCi0gICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8KLSAgICBPTVhfVTMyIG5BdWRpb0JhbmRXaWR0aDsgIC8qKjwgQXVkaW8gYmFuZCB3aWR0aCAoaW4gSHopIHRvIHdoaWNoIGFuIGVuY29kZXIgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHRoZSBhdWRpbyBzaWduYWwuIFVzZSAwIHRvIGxldCBlbmNvZGVyIGRlY2lkZSAqLwotICAgIE9NWF9TMzIgblF1YWxpdHk7CQkgIC8qKjwgU2V0cyBlbmNvZGluZyBxdWFsaXR5IHRvIG4sIGJldHdlZW4gLTEgKGxvdykgYW5kIDEwIChoaWdoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhlIGRlZmF1bHQgbW9kZSBvZiBvcGVyYXRpb24sIHRlaCBxdWFsaXR5IGxldmVsIGlzIDMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbCBxdWFsaXR5IHJhbmdlIGlzIDAgLSAxMC4gKi8KLSAgICBPTVhfQk9PTCBiTWFuYWdlZDsJCSAgLyoqPCBTZXQgIGJpdHJhdGUgIG1hbmFnZW1lbnQgIG1vZGUuIFRoaXMgdHVybnMgb2ZmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWwgVkJSIGVuY29kaW5nLCBidXQgYWxsb3dzIGhhcmQgb3Igc29mdCBiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzIHRvIGJlIGVuZm9yY2VkIGJ5IHRoZSBlbmNvZGVyLiBUaGlzIG1vZGUgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNsb3dlciwgYW5kIG1heSBhbHNvIGJlIGxvd2VyIHF1YWxpdHkuIEl0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcmlseSB1c2VmdWwgZm9yIHN0cmVhbWluZy4gKi8KLSAgICBPTVhfQk9PTCBiRG93bm1peDsJCSAgLyoqPCBEb3dubWl4IGlucHV0IGZyb20gc3RlcmVvIHRvIG1vbm8gKGhhcyBubyBlZmZlY3Qgb24gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1zdGVyZW8gc3RyZWFtcykuIFVzZWZ1bCBmb3IgbG93ZXItYml0cmF0ZSBlbmNvZGluZy4gKi8gICAgIAotfSBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRTsKLQotCi0vKiogV01BIFZlcnNpb24gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fV01BRk9STUFUVFlQRSB7Ci0gIE9NWF9BVURJT19XTUFGb3JtYXRVbnVzZWQgPSAwLCAvKio8IGZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLwotICBPTVhfQVVESU9fV01BRm9ybWF0NywgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIEF1ZGlvIGZvcm1hdCA3ICovCi0gIE9NWF9BVURJT19XTUFGb3JtYXQ4LCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgQXVkaW8gZm9ybWF0IDggKi8KLSAgT01YX0FVRElPX1dNQUZvcm1hdDksICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBBdWRpbyBmb3JtYXQgOSAqLwotICBPTVhfQVVESU9fV01BRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICBPTVhfQVVESU9fV01BRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgT01YX0FVRElPX1dNQUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX1dNQUZPUk1BVFRZUEU7Ci0KLQotLyoqIFdNQSBQcm9maWxlICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX1dNQVBST0ZJTEVUWVBFIHsKLSAgT01YX0FVRElPX1dNQVByb2ZpbGVVbnVzZWQgPSAwLCAgLyoqPCBwcm9maWxlIHVudXNlZCBvciB1bmtub3duICovCi0gIE9NWF9BVURJT19XTUFQcm9maWxlTDEsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBhdWRpbyB2ZXJzaW9uIDkgcHJvZmlsZSBMMSAqLwotICBPTVhfQVVESU9fV01BUHJvZmlsZUwyLCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgYXVkaW8gdmVyc2lvbiA5IHByb2ZpbGUgTDIgKi8KLSAgT01YX0FVRElPX1dNQVByb2ZpbGVMMywgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIGF1ZGlvIHZlcnNpb24gOSBwcm9maWxlIEwzICovCi0gIE9NWF9BVURJT19XTUFQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICBPTVhfQVVESU9fV01BUHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gIE9NWF9BVURJT19XTUFQcm9maWxlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fV01BUFJPRklMRVRZUEU7Ci0KLQotLyoqIFdNQSBwYXJhbXMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9XTUFUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTE2IG5DaGFubmVsczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KLSAgICBPTVhfQVVESU9fV01BRk9STUFUVFlQRSBlRm9ybWF0OyAvKio8IFZlcnNpb24gb2YgV01BIHN0cmVhbSAvIGRhdGEgKi8KLQlPTVhfQVVESU9fV01BUFJPRklMRVRZUEUgZVByb2ZpbGU7ICAvKio8IFByb2ZpbGUgb2YgV01BIHN0cmVhbSAvIGRhdGEgKi8KLSAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEgKi8KLSAgICBPTVhfVTE2IG5CbG9ja0FsaWduOyAgICAgIC8qKjwgaXMgdGhlIGJsb2NrIGFsaWdubWVudCwgb3IgYmxvY2sgc2l6ZSwgaW4gYnl0ZXMgb2YgdGhlIGF1ZGlvIGNvZGVjICovCi0gICAgT01YX1UxNiBuRW5jb2RlT3B0aW9uczsgICAvKio8IFdNQSBUeXBlLXNwZWNpZmljIGRhdGEgKi8KLSAgICBPTVhfVTMyIG5TdXBlckJsb2NrQWxpZ247IC8qKjwgV01BIFR5cGUtc3BlY2lmaWMgZGF0YSAqLwotfSBPTVhfQVVESU9fUEFSQU1fV01BVFlQRTsKLQotLyoqIEc3MTEgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fRzcxMVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMTYgbkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEgKi8KLX0gT01YX0FVRElPX1BBUkFNX0c3MTFUWVBFOwotCi0vKiogCi0gKiBSZWFsQXVkaW8gZm9ybWF0Ci0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fUkFGT1JNQVRUWVBFIHsKLSAgICBPTVhfQVVESU9fUkFGb3JtYXRVbnVzZWQgPSAwLCAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLwotICAgIE9NWF9BVURJT19SQTgsICAgICAgICAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIDggY29kZWMgKi8KLSAgICBPTVhfQVVESU9fUkE5LCAgICAgICAgICAgICAgICAvKio8IFJlYWxBdWRpbyA5IGNvZGVjICovCi0gICAgT01YX0FVRElPX1JBMTBfQUFDLCAgICAgICAgICAgLyoqPCBNUEVHLTQgQUFDIGNvZGVjIGZvciBiaXRyYXRlcyBvZiBtb3JlIHRoYW4gMTI4a2JwcyAqLwotICAgIE9NWF9BVURJT19SQTEwX0NPREVDLCAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIGNvZGVjIGZvciBiaXRyYXRlcyBsZXNzIHRoYW4gMTI4IGticHMgKi8KLSAgICBPTVhfQVVESU9fUkExMF9MT1NTTEVTUywgICAgICAvKio8IFJlYWxBdWRpbyBMb3NzbGVzcyAqLwotICAgIE9NWF9BVURJT19SQTEwX01VTFRJQ0hBTk5FTCwgIC8qKjwgUmVhbEF1ZGlvIE11bHRpY2hhbm5lbCAqLwotICAgIE9NWF9BVURJT19SQTEwX1ZPSUNFLCAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIFZvaWNlIGZvciBiaXRyYXRlcyBiZWxvdyAxNSBrYnBzICovCi0gICAgT01YX0FVRElPX1JBRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19SQUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX1JBRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fUkFGT1JNQVRUWVBFOwotCi0vKiogUkEgKFJlYWwgQXVkaW8pIHBhcmFtcyAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9SQVRZUEUgeyAKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLyAKLSAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgICAgLyoqPCBpcyB0aGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEgKi8gCi0gICAgT01YX1UzMiBuQml0c1BlckZyYW1lOyAgICAgIC8qKjwgaXMgdGhlIHZhbHVlIGZvciBiaXRzIHBlciBmcmFtZSAgKi8gCi0gICAgT01YX1UzMiBuU2FtcGxlUGVyRnJhbWU7ICAgIC8qKjwgaXMgdGhlIHZhbHVlIGZvciBzYW1wbGVzIHBlciBmcmFtZSAqLyAKLSAgICBPTVhfVTMyIG5Db3VwbGluZ1F1YW50Qml0czsgLyoqPCBpcyB0aGUgbnVtYmVyIG9mIGNvdXBsaW5nIHF1YW50aXphdGlvbiBiaXRzIGluIHRoZSBzdHJlYW0gKi8gCi0gICAgT01YX1UzMiBuQ291cGxpbmdTdGFydFJlZ2lvbjsgICAvKio8IGlzIHRoZSBjb3VwbGluZyBzdGFydCByZWdpb24gaW4gdGhlIHN0cmVhbSAgKi8gCi0gICAgT01YX1UzMiBuTnVtUmVnaW9uczsgICAgICAgIC8qKjwgaXMgdGhlIG51bWJlciBvZiByZWdpb25zIHZhbHVlICovIAotICAgIE9NWF9BVURJT19SQUZPUk1BVFRZUEUgZUZvcm1hdDsgLyoqPCBpcyB0aGUgUmVhbEF1ZGlvIGF1ZGlvIGZvcm1hdCAqLwotfSBPTVhfQVVESU9fUEFSQU1fUkFUWVBFOyAKLQotCi0vKiogU0JDIEFsbG9jYXRpb24gTWV0aG9kIFR5cGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFIHsKLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kTG91ZG5lc3MsIC8qKjwgTG91ZG5lc3MgYWxsb2NhdGlvbiBtZXRob2QgKi8KLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kU05SLCAgICAgIC8qKjwgU05SIGFsbG9jYXRpb24gbWV0aG9kICovCi0gIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFOwotCi0KLS8qKiBTQkMgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fU0JDVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCi0gICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLwotICAgIE9NWF9VMzIgbkJsb2NrczsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJsb2NrcyAqLwotICAgIE9NWF9VMzIgblN1YmJhbmRzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHN1YmJhbmRzICovCi0gICAgT01YX1UzMiBuQml0UG9vbDsgICAgICAgICAgLyoqPCBCaXRwb29sIHZhbHVlICovCi0gICAgT01YX0JPT0wgYkVuYWJsZUJpdHJhdGU7ICAgLyoqPCBVc2UgYml0cmF0ZSB2YWx1ZSBpbnN0ZWFkIG9mIGJpdHBvb2wgKi8KLSAgICBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIGVDaGFubmVsTW9kZTsgLyoqPCBDaGFubmVsIG1vZGUgZW51bWVyYXRpb24gKi8KLSAgICBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFIGVTQkNBbGxvY1R5cGU7ICAgLyoqPCBTQkMgQWxsb2NhdGlvbiBtZXRob2QgdHlwZSAqLwotfSBPTVhfQVVESU9fUEFSQU1fU0JDVFlQRTsKLQotCi0vKiogQURQQ00gc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0FEUENNVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKLSAgICBPTVhfVTMyIG5CaXRzUGVyU2FtcGxlOyAgICAgLyoqPCBOdW1iZXIgb2YgYml0cyBpbiBlYWNoIHNhbXBsZSAqLyAKLSAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8gCi19IE9NWF9BVURJT19QQVJBTV9BRFBDTVRZUEU7IAotCi0KLS8qKiBHNzIzIHJhdGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fRzcyM1JBVEUgewotICAgIE9NWF9BVURJT19HNzIzTW9kZVVudXNlZCA9IDAsICAvKio8IEFNUk5CIE1vZGUgdW51c2VkIC8gdW5rbm93biAqLwotICAgIE9NWF9BVURJT19HNzIzTW9kZUxvdywgICAgICAgICAvKio8IDUzMDAgYnBzICovCi0gICAgT01YX0FVRElPX0c3MjNNb2RlSGlnaCwgICAgICAgIC8qKjwgNjMwMCBicHMgKi8KLSAgICBPTVhfQVVESU9fRzcyM01vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX0c3MjNNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fRzcyM01vZGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19HNzIzUkFURTsKLQotCi0vKiogRzcyMyAtIFNhbXBsZSByYXRlIG11c3QgYmUgOCBLSHogKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HNzIzVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8gCi0gICAgT01YX0FVRElPX0c3MjNSQVRFIGVCaXRSYXRlOyAgLyoqPCB0b2RvOiBTaG91bGQgdGhpcyBiZSBtb3ZlZCB0byBhIGNvbmZpZz8gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovIAotICAgIE9NWF9CT09MIGJQb3N0RmlsdGVyOyAgICAgICAgIC8qKjwgRW5hYmxlIFBvc3QgRmlsdGVyICovIAotfSBPTVhfQVVESU9fUEFSQU1fRzcyM1RZUEU7IAotCi0KLS8qKiBJVFUgRzcyNiAoQURQQ00pIHJhdGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fRzcyNk1PREUgewotICAgIE9NWF9BVURJT19HNzI2TW9kZVVudXNlZCA9IDAsICAvKio8IEc3MjYgTW9kZSB1bnVzZWQgLyB1bmtub3duICovCi0gICAgT01YX0FVRElPX0c3MjZNb2RlMTYsICAgICAgICAgIC8qKjwgMTYga2JwcyAqLwotICAgIE9NWF9BVURJT19HNzI2TW9kZTI0LCAgICAgICAgICAvKio8IDI0IGticHMgKi8KLSAgICBPTVhfQVVESU9fRzcyNk1vZGUzMiwgICAgICAgICAgLyoqPCAzMiBrYnBzLCBtb3N0IGNvbW1vbiByYXRlLCBhbHNvIEc3MjEgKi8KLSAgICBPTVhfQVVESU9fRzcyNk1vZGU0MCwgICAgICAgICAgLyoqPCA0MCBrYnBzICovCi0gICAgT01YX0FVRElPX0c3MjZNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19HNzI2TW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0c3MjZNb2RlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fRzcyNk1PREU7Ci0KLQotLyoqIEcuNzI2IHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAtIG11c3QgYmUgYXQgOEtIeiAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HNzI2VFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKLSAgICAgT01YX0FVRElPX0c3MjZNT0RFIGVHNzI2TW9kZTsKLX0gT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFOyAKLQotCi0vKiogRzcyOSBjb2RlciB0eXBlICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0c3MjlUWVBFIHsKLSAgICBPTVhfQVVESU9fRzcyOSA9IDAsICAgICAgICAgICAvKio8IElUVSBHLjcyOSAgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0c3MjlBLCAgICAgICAgICAgICAgLyoqPCBJVFUgRy43MjkgYW5uZXggQSAgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0c3MjlCLCAgICAgICAgICAgICAgLyoqPCBJVFUgRy43Mjkgd2l0aCBhbm5leCBCIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19HNzI5QUIsICAgICAgICAgICAgIC8qKjwgSVRVIEcuNzI5IGFubmV4ZXMgQSBhbmQgQiBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fRzcyOUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fRzcyOVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0c3MjlNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19HNzI5VFlQRTsKLQotCi0vKiogRzcyOSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgLSBmaXhlZCA2S0h6IHNhbXBsZSByYXRlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fRzcyOVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLwotICAgIE9NWF9BVURJT19HNzI5VFlQRSBlQml0VHlwZTsKLX0gT01YX0FVRElPX1BBUkFNX0c3MjlUWVBFOwotCi0KLS8qKiBBTVIgRnJhbWUgZm9ybWF0ICovIAotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEUgeyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRDb25mb3JtYW5jZSA9IDAsICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgQ29uZm9ybWFuY2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhbmRhcmQpIEZvcm1hdCAqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRJRjEsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgSW50ZXJmYWNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IDEgKi8gCi0gICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SUYyLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEludGVyZmFjZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAyKi8gCi0gICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0RlNGLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEZpbGUgU3RvcmFnZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRSVFBQYXlsb2FkLCAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgUmVhbC1UaW1lIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0IFByb3RvY29sIFBheWxvYWQgRm9ybWF0ICovIAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdElUVSwgICAgICAgICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIElUVSBGb3JtYXQgKGFkZGVkIGF0IE1vdG9yb2xhIHJlcXVlc3QpICovIAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYgCi19IE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEU7IAotCi0KLS8qKiBBTVIgYmFuZCBtb2RlICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSB7Ci0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlVW51c2VkID0gMCwgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIHVudXNlZCAvIHVua25vd24gKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjAsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMCA9ICA0NzUwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMSwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSAxID0gIDUxNTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIyLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDIgPSAgNTkwMCBicHMgKi8gCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIzLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDMgPSAgNjcwMCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjQsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNCA9ICA3NDAwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNSwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSA1ID0gIDc5NTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI2LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDYgPSAxMDIwMCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjcsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNyA9IDEyMjAwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMCwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSAwID0gIDY2MDAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IxLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDEgPSAgODg1MCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjIsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMiA9IDEyNjUwIGJwcyAqLyAKLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjMsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMyA9IDE0MjUwIGJwcyAqLyAKLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjQsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNCA9IDE1ODUwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNSwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA1ID0gMTgyNTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I2LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDYgPSAxOTg1MCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjcsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNyA9IDIzMDUwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCOCwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA4ID0gMjM4NTAgYnBzICovICAgICAgCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFOwotICAgICAKLQotLyoqIEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBtb2RlICovIAotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19BTVJEVFhNT0RFVFlQRSB7IAotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT2ZmID0gMCwgICAgICAgIC8qKjwgQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIE1vZGUgaXMgZGlzYWJsZWQgKi8gCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVPblZBRDEsICAgICAgICAgLyoqPCBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gTW9kZSB1c2luZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvaWNlIEFjdGl2aXR5IERldGVjdG9yIDEgKFZBRDEpIGlzIGVuYWJsZWQgKi8gCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVPblZBRDIsICAgICAgICAgLyoqPCBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gTW9kZSB1c2luZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvaWNlIEFjdGl2aXR5IERldGVjdG9yIDIgKFZBRDIpIGlzIGVuYWJsZWQgKi8gICAgICAgCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVPbkF1dG8sICAgICAgICAgLyoqPCBUaGUgY29kZWMgd2lsbCBhdXRvbWF0aWNhbGx5IHNlbGVjdCBiZXR3ZWVuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2ZmLCBWQUQxIG9yIFZBRDIgbW9kZXMgKi8gCi0KLSAgICBPTVhfQVVESU9fQU1SRFRYYXNFRlIsICAgICAgICAgICAgIC8qKjwgRFRYIGFzIEVGUiBpbnN0ZWFkIG9mIEFNUiBzdGFuZGFyZCAoM0dQUCAyNi4xMDEsIGZyYW1lIHR5cGUgPTgsOSwxMCkgKi8KLQotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU1heCA9IDB4N0ZGRkZGRkYgCi19IE9NWF9BVURJT19BTVJEVFhNT0RFVFlQRTsgCi0gCi0KLS8qKiBBTVIgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgcmVhZCBvbmx5IGZpZWxkICovCi0gICAgT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSBlQU1SQmFuZE1vZGU7IC8qKjwgQU1SIEJhbmQgTW9kZSBlbnVtZXJhdGlvbiAqLyAKLSAgICBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEUgIGVBTVJEVFhNb2RlOyAgLyoqPCBBTVIgRFRYIE1vZGUgZW51bWVyYXRpb24gKi8KLSAgICBPTVhfQVVESU9fQU1SRlJBTUVGT1JNQVRUWVBFIGVBTVJGcmFtZUZvcm1hdDsgLyoqPCBBTVIgZnJhbWUgZm9ybWF0IGVudW1lcmF0aW9uICovCi19IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFOwotCi0KLS8qKiBHU01fRlIgKEVUU0kgMDYuMTAsIDNHUFAgNDYuMDEwKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HU01GUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9HU01GUlRZUEU7Ci0KLQotLyoqIEdTTS1IUiAoRVRTSSAwNi4yMCwgM0dQUCA0Ni4wMjApIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KLX0gT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRTsKLQotCi0vKiogR1NNLUVGUiAoRVRTSSAwNi42MCwgM0dQUCA0Ni4wNjApIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0dTTUVGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9HU01FRlJUWVBFOwotCi0KLS8qKiBURE1BIEZSIChUSUEvRUlBLTEzNi00MjAsIFZTRUxQIDcuOTVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9URE1BRlJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCi0gICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLwotfSBPTVhfQVVESU9fUEFSQU1fVERNQUZSVFlQRTsKLQotCi0vKiogVERNQSBFRlIgKFRJQS9FSUEtMTM2LTQxMCwgQUNFTFAgNy40a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fVERNQUVGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9URE1BRUZSVFlQRTsKLQotCi0vKiogUERDIEZSICggUkNSLTI3LCBWU0VMUCA2LjdrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QRENGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9QRENGUlRZUEU7Ci0KLQotLyoqIFBEQyBFRlIgKCBSQ1ItMjcsIEFDRUxQIDYuN2ticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BEQ0VGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9QRENFRlJUWVBFOwotCi0vKiogUERDIEhSICggUkNSLTI3LCBQU0ktQ0VMUCAzLjQ1a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUERDSFJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCi0gICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLwotfSBPTVhfQVVESU9fUEFSQU1fUERDSFJUWVBFOwotCi0KLS8qKiBDRE1BIFJhdGUgdHlwZXMgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIHsKLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVCbGFuayA9IDAsICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGlzIGJsYW5rICovCi0gICAgT01YX0FVRElPX0NETUFSYXRlRnVsbCwgICAgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBmdWxsIHJhdGUgKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVIYWxmLCAgICAgICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGluIGhhbGYgcmF0ZSAqLwotICAgIE9NWF9BVURJT19DRE1BUmF0ZVF1YXJ0ZXIsICAgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaW4gcXVhcnRlciByYXRlICovCi0gICAgT01YX0FVRElPX0NETUFSYXRlRWlnaHRoLCAgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBlaWdodGggcmF0ZSAoRFRYKSovCi0gICAgT01YX0FVRElPX0NETUFSYXRlRXJhc3VyZSwgICAgICAgICAgICAvKio8IENETUEgZXJhc3VyZSBmcmFtZSAqLwotICAgIE9NWF9BVURJT19DRE1BUmF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19DRE1BUmF0ZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0NETUFSQVRFVFlQRTsKLQotCi0vKiogUUNFTFA4IChUSUEvRUlBLTk2LCB1cCB0byA4a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUUNFTFA4VFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBGcmFtZSByYXRlICovCi0gICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSAqLwotICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWF4aW1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSA0ICovCi19IE9NWF9BVURJT19QQVJBTV9RQ0VMUDhUWVBFOwotCi0KLS8qKiBRQ0VMUDEzICggQ0RNQSwgRUlBL1RJQS03MzMsIDEzLjNrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9RQ0VMUDEzVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IEZyYW1lIHJhdGUgKi8KLSAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxICovCi0gICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgKi8KLX0gT01YX0FVRElPX1BBUkFNX1FDRUxQMTNUWVBFOwotCi0KLS8qKiBFVlJDICggQ0RNQSwgRUlBL1RJQS0xMjcsIFJDRUxQIHVwIHRvIDguNTVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IGFjdHVhbCBGcmFtZSByYXRlICovCi0gICAgT01YX0JPT0wgYlJBVEVfUkVEVUNvbjsgICAgICAgLyoqPCBSQVRFX1JFRFVDdGlvbiBpcyByZXF1ZXN0ZWQgZm9yIHRoaXMgZnJhbWUgKi8KLSAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxICovCi0gICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3MgSGlnaCBQYXNzIEZpbHRlciAqLwotICAgIE9NWF9CT09MIGJOb2lzZVN1cHByZXNzb3I7ICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBub2lzZSBzdXBwcmVzc29yIHByZS1wcm9jZXNzaW5nICovCi0gICAgT01YX0JPT0wgYlBvc3RGaWx0ZXI7ICAgICAgICAgLyoqPCBFbmFibGUgZGVjb2RlcidzIHBvc3QgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRTsKLQotCi0vKiogU01WICggdXAgdG8gOC41NWticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1NNVlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBGcmFtZSByYXRlICovCi0gICAgT01YX0JPT0wgYlJBVEVfUkVEVUNvbjsgICAgICAgICAgIC8qKjwgUkFURV9SRURVQ3Rpb24gaXMgcmVxdWVzdGVkIGZvciB0aGlzIGZyYW1lICovCi0gICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSA/PyovCi0gICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgPz8qLwotICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBIaWdoIFBhc3MgRmlsdGVyID8/Ki8KLSAgICBPTVhfQk9PTCBiTm9pc2VTdXBwcmVzc29yOyAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3Mgbm9pc2Ugc3VwcHJlc3NvciBwcmUtcHJvY2Vzc2luZyAqLwotICAgIE9NWF9CT09MIGJQb3N0RmlsdGVyOyAgICAgICAgIC8qKjwgRW5hYmxlIGRlY29kZXIncyBwb3N0IEZpbHRlciA/PyovCi19IE9NWF9BVURJT19QQVJBTV9TTVZUWVBFOwotCi0KLS8qKiBNSURJIEZvcm1hdCAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJRk9STUFUVFlQRQotewotICAgIE9NWF9BVURJT19NSURJRm9ybWF0VW5rbm93biA9IDAsIC8qKjwgTUlESSBGb3JtYXQgdW5rbm93biBvciBkb24ndCBjYXJlICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYwLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAwICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYxLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAxICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYyLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAyICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTUE1JREksICAgICAgLyoqPCBTUC1NSURJICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRYTUYwLCAgICAgICAgLyoqPCBlWHRlbnNpYmxlIE11c2ljIEZvcm1hdCB0eXBlIDAgKi8KLSAgICBPTVhfQVVESU9fTUlESUZvcm1hdFhNRjEsICAgICAgICAvKio8IGVYdGVuc2libGUgTXVzaWMgRm9ybWF0IHR5cGUgMSAqLwotICAgIE9NWF9BVURJT19NSURJRm9ybWF0TW9iaWxlWE1GLCAgIC8qKjwgTW9iaWxlIFhNRiAoZVh0ZW5zaWJsZSBNdXNpYyBGb3JtYXQgdHlwZSAyKSAqLwotICAgIE9NWF9BVURJT19NSURJRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19NSURJRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fTUlESUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX01JRElGT1JNQVRUWVBFOwotCi0KLS8qKiBNSURJIHBhcmFtcyAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX01JRElUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5GaWxlU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBNSURJIGZpbGUgaW4gYnl0ZXMsIHdoZXJlIHRoZSBlbnRpcmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSBmaWxlIHBhc3NlZCBpbiwgb3RoZXJ3aXNlIGlmIDB4MCwgdGhlIE1JREkgZGF0YSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtZXJnZWQgYW5kIHN0cmVhbWVkIChpbnN0ZWFkIG9mIHBhc3NlZCBhcyBhbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmUgTUlESSBmaWxlKSAqLwotICAgIE9NWF9CVTMyIHNNYXhQb2x5cGhvbnk7ICAgICAgICAvKio8IFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaW11bHRhbmVvdXMgcG9seXBob25pYyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2ljZXMuIEEgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkgb2YgdGhlIGRldmljZSBpcyB1c2VkICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9CT09MIGJMb2FkRGVmYXVsdFNvdW5kOyAgICAvKio8IFdoZXRoZXIgdG8gbG9hZCBkZWZhdWx0IHNvdW5kIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmsgYXQgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBPTVhfQVVESU9fTUlESUZPUk1BVFRZUEUgZU1pZGlGb3JtYXQ7IC8qKjwgVmVyc2lvbiBvZiB0aGUgTUlESSBmaWxlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19IE9NWF9BVURJT19QQVJBTV9NSURJVFlQRTsKLQotCi0vKiogVHlwZSBvZiB0aGUgTUlESSBzb3VuZCBiYW5rIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElTT1VOREJBTktUWVBFIHsKLSAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua1VudXNlZCA9IDAsICAgICAgICAgICAvKio8IHVudXNlZC91bmtub3duIHNvdW5kYmFuayB0eXBlICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtETFMxLCAgICAgICAgICAgICAgICAgLyoqPCBETFMgdmVyc2lvbiAxICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtETFMyLCAgICAgICAgICAgICAgICAgLyoqPCBETFMgdmVyc2lvbiAyICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtNb2JpbGVETFNCYXNlLCAgICAgICAgLyoqPCBNb2JpbGUgRExTLCB1c2luZyB0aGUgYmFzZSBmdW5jdGlvbmFsaXR5ICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtNb2JpbGVETFNQbHVzT3B0aW9ucywgLyoqPCBNb2JpbGUgRExTLCB1c2luZyB0aGUgc3BlY2lmaWNhdGlvbi1kZWZpbmVkIG9wdGlvbmFsIGZlYXR1cmUgc2V0ICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS1RZUEU7Ci0KLQotLyoqIEJhbmsgTGF5b3V0IGRlc2NyaWJlcyBob3cgYmFuayBNU0IgJiBMU0IgYXJlIHVzZWQgaW4gdGhlIERMUyBpbnN0cnVtZW50IGRlZmluaXRpb25zIHNvdW5kIGJhbmsgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS0xBWU9VVFRZUEUgewotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRVbnVzZWQgPSAwLCAgIC8qKjwgdW51c2VkL3Vua25vd24gc291bmRiYW5rIHR5cGUgKi8KLSAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0R00sICAgICAgICAgICAvKio8IEdTIGxheW91dCAoYmFzZWQgb24gYmFuayBNU0IgMHgwMCkgKi8KLSAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0R00yLCAgICAgICAgICAvKio8IEdlbmVyYWwgTUlESSAyIGxheW91dCAodXNpbmcgTVNCIDB4NzgvMHg3OSwgTFNCIDB4MDApICovCi0gICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dFVzZXIsICAgICAgICAgLyoqPCBEb2VzIG5vdCBjb25mb3JtIHRvIGFueSBiYW5rIG51bWJlcmluZyBzdGFuZGFyZHMgKi8KLSAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19NSURJU09VTkRCQU5LTEFZT1VUVFlQRTsKLQotCi0vKiogTUlESSBwYXJhbXMgdG8gbG9hZC91bmxvYWQgdXNlciBzb3VuZGJhbmsgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9NSURJTE9BRFVTRVJTT1VORFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkRMU0luZGV4OyAgICAgICAgLyoqPCBETFMgZmlsZSBpbmRleCB0byBiZSBsb2FkZWQgKi8KLSAgICBPTVhfVTMyIG5ETFNTaXplOyAgICAgICAgIC8qKjwgU2l6ZSBpbiBieXRlcyAqLwotICAgIE9NWF9QVFIgcERMU0RhdGE7ICAgICAgICAgLyoqPCBQb2ludGVyIHRvIERMUyBmaWxlIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fTUlESVNPVU5EQkFOS1RZUEUgZU1pZGlTb3VuZEJhbms7ICAgLyoqPCBNaWRpIHNvdW5kIGJhbmsgdHlwZSBlbnVtZXJhdGlvbiAqLwotICAgIE9NWF9BVURJT19NSURJU09VTkRCQU5LTEFZT1VUVFlQRSBlTWlkaVNvdW5kQmFua0xheW91dDsgLyoqPCBNaWRpIHNvdW5kIGJhbmsgbGF5b3V0IGVudW1lcmF0aW9uICovCi19IE9NWF9BVURJT19QQVJBTV9NSURJTE9BRFVTRVJTT1VORFRZUEU7Ci0KLQotLyoqIFN0cnVjdHVyZSBmb3IgTGl2ZSBNSURJIGV2ZW50cyBhbmQgTUlQIG1lc3NhZ2VzLiAKLSAqIChNSVAgPSBNYXhpbXVtIEluc3RhbnRhbmVvdXMgUG9seXBob255OyBwYXJ0IG9mIHRoZSBTUC1NSURJIHN0YW5kYXJkLikgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESUlNTUVESUFURUVWRU5UVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuTWlkaUV2ZW50U2l6ZTsgICAvKio8IFNpemUgb2YgaW1tZWRpYXRlIE1JREkgZXZlbnRzIG9yIE1JUCBtZXNzYWdlIGluIGJ5dGVzICAqLwotICAgIE9NWF9VOCBuTWlkaUV2ZW50c1sxXTsgICAgLyoqPCBNSURJIGV2ZW50IGFycmF5IHRvIGJlIHJlbmRlcmVkIGltbWVkaWF0ZWx5LCBvciBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSBmb3IgdGhlIE1JUCBtZXNzYWdlIGJ1ZmZlciwgd2hlcmUgdGhlIHNpemUgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlZCBieSBuTWlkaUV2ZW50U2l6ZSAqLwotfSBPTVhfQVVESU9fQ09ORklHX01JRElJTU1FRElBVEVFVkVOVFRZUEU7Ci0KLQotLyoqIE1JREkgc291bmQgYmFuay8gcHJvZ3JhbSBwYWlyIGluIGEgZ2l2ZW4gY2hhbm5lbCAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJU09VTkRCQU5LUFJPR1JBTVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWw7ICAgICAgICAgICAvKio8IFZhbGlkIGNoYW5uZWwgdmFsdWVzIHJhbmdlIGZyb20gMSB0byAxNiAqLwotICAgIE9NWF9VMTYgbklEUHJvZ3JhbTsgICAgICAgICAvKio8IFZhbGlkIHByb2dyYW0gSUQgcmFuZ2UgaXMgMSB0byAxMjggKi8KLSAgICBPTVhfVTE2IG5JRFNvdW5kQmFuazsgICAgICAgLyoqPCBTb3VuZCBiYW5rIElEICovCi0gICAgT01YX1UzMiBuVXNlclNvdW5kQmFua0luZGV4Oy8qKjwgVXNlciBzb3VuZGJhbmsgaW5kZXgsIGVhc2llciB0byBhY2Nlc3Mgc291bmRiYW5rcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBpbmRleCBpZiBtdWx0aXBsZSBiYW5rcyBhcmUgcHJlc2VudCAqLwotfSBPTVhfQVVESU9fQ09ORklHX01JRElTT1VOREJBTktQUk9HUkFNVFlQRTsKLQotCi0vKiogTUlESSBjb250cm9sIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElDT05UUk9MVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JTMzIgc1BpdGNoVHJhbnNwb3NpdGlvbjsgLyoqPCBQaXRjaCB0cmFuc3Bvc2l0aW9uIGluIHNlbWl0b25lcywgc3RvcmVkIGFzIFEyMi4xMCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBiYXNlZCBvbiBKQVZBIE1NQVBJIChKU1ItMTM1KSByZXF1aXJlbWVudCAqLwotICAgIE9NWF9CVTMyIHNQbGF5QmFja1JhdGU7ICAgICAgIC8qKjwgUmVsYXRpdmUgcGxheWJhY2sgcmF0ZSwgc3RvcmVkIGFzIFExNC4xNyBmaXhlZC1wb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJhc2VkIG9uIEpTUi0xMzUgcmVxdWlyZW1lbnQgKi8KLSAgICBPTVhfQlUzMiBzVGVtcG8gOyAgICAgICAgICAgICAvKio8IFRlbXBvIGluIGJlYXRzIHBlciBtaW51dGUgKEJQTSksIHN0b3JlZCBhcyBRMjIuMTAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZC1wb2ludCBudW1iZXIgYmFzZWQgb24gSlNSLTEzNSByZXF1aXJlbWVudCAqLwotICAgIE9NWF9VMzIgbk1heFBvbHlwaG9ueTsgICAgICAgIC8qKjwgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpbXVsdGFuZW91cyBwb2x5cGhvbmljIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2VzLiBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkgb2YgdGhlIGRldmljZSBpcyB1c2VkICAqLwotICAgIE9NWF9VMzIgbk51bVJlcGVhdDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCBwbGF5YmFjayAqLwotICAgIE9NWF9VMzIgblN0b3BUaW1lOyAgICAgICAgICAgIC8qKjwgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gaW5kaWNhdGUgd2hlbiBwbGF5YmFjayAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgc3RvcCBhdXRvbWF0aWNhbGx5LiAgU2V0IHRvIHplcm8gaWYgbm90IHVzZWQgKi8KLSAgICBPTVhfVTE2IG5DaGFubmVsTXV0ZU1hc2s7ICAgICAvKio8IDE2IGJpdCBtYXNrIGZvciBjaGFubmVsIG11dGUgc3RhdHVzICovCi0gICAgT01YX1UxNiBuQ2hhbm5lbFNvbG9NYXNrOyAgICAgLyoqPCAxNiBiaXQgbWFzayBmb3IgY2hhbm5lbCBzb2xvIHN0YXR1cyAqLwotICAgIE9NWF9VMzIgblRyYWNrMDAzMU11dGVNYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIG11dGUgc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMC0zMSAqLwotICAgIE9NWF9VMzIgblRyYWNrMzI2M011dGVNYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIG11dGUgc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMzItNjMgKi8KLSAgICBPTVhfVTMyIG5UcmFjazAwMzFTb2xvTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBzb2xvIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDAtMzEgKi8KLSAgICBPTVhfVTMyIG5UcmFjazMyNjNTb2xvTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBzb2xvIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDMyLTYzICovCi0KLX0gT01YX0FVRElPX0NPTkZJR19NSURJQ09OVFJPTFRZUEU7Ci0KLQotLyoqIE1JREkgUGxheWJhY2sgU3RhdGVzIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElQTEFZQkFDS1NUQVRFVFlQRSB7Ci0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVVua25vd24gPSAwLCAgICAgIC8qKjwgVW5rbm93biBzdGF0ZSBvciBzdGF0ZSBkb2VzIG5vdCBtYXAgdG8gCi0gIAkJCQkJCQkJCQkJCQlvdGhlciBkZWZpbmVkIHN0YXRlcyAqLwotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVDbG9zZWRFbmdhZ2VkLCAgICAvKio8IE5vIE1JREkgcmVzb3VyY2UgaXMgY3VycmVudGx5IG9wZW4uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJIGV2ZW50cy4gKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGFyc2luZywgICAgICAgICAgLyoqPCBBIE1JREkgcmVzb3VyY2UgaXMgb3BlbiBhbmQgaXMgYmVpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWVkLiBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgTUlESSBldmVudHMuICovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZU9wZW5FbmdhZ2VkLCAgICAgIC8qKjwgQSBNSURJIHJlc291cmNlIGlzIG9wZW4gYW5kIHByaW1lZCBidXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHBsYXlpbmcuIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIE1JREkgZXZlbnRzLiBUaGUgdHJhbnNpdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc3RhdGUgaXMgb25seSBwb3NzaWJsZSBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQbGF5aW5nIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlICdwbGF5YmFjayBoZWFkJyByZWFjaGVzIHRoZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBtZWRpYSBkYXRhIG9yIHRoZSBwbGF5YmFjayBzdG9wcyBkdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdG9wIHRpbWUgc2V0LiovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmcsICAgICAgICAgIC8qKjwgQSBNSURJIHJlc291cmNlIGlzIG9wZW4gYW5kIGN1cnJlbnRseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlpbmcuIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIE1JREkgZXZlbnRzLiovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmdQYXJ0aWFsbHksIC8qKjwgQmVzdC1lZmZvcnQgcGxheWJhY2sgZHVlIHRvIFNQLU1JREkvRExTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgY29uc3RyYWludHMgKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGxheWluZ1NpbGVudGx5LCAgLyoqPCBEdWUgdG8gc3lzdGVtIHJlc291cmNlIGNvbnN0cmFpbnRzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQLU1JREkgY29udGVudCBjb25zdHJhaW50cywgdGhlcmUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBhdWRpYmxlIE1JREkgY29udGVudCBkdXJpbmcgcGxheWJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkuIFRoZSBzaXR1YXRpb24gbWF5IGNoYW5nZSBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyBhcmUgZnJlZWQgbGF0ZXIuKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19NSURJUExBWUJBQ0tTVEFURVRZUEU7Ci0KLQotLyoqIE1JREkgc3RhdHVzIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElTVEFUVVNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTE2IG5OdW1UcmFja3M7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgTUlESSB0cmFja3MgaW4gdGhlIGZpbGUsIHJlYWQgb25seSBmaWVsZC4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIHVudGlsIHRoZSBlbnRpcmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8KLSAgICBPTVhfVTMyIG5EdXJhdGlvbjsgICAgICAgICAgLyoqPCBUaGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50bHkgb3BlbiBNSURJIHJlc291cmNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcy4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8gIAotICAgIE9NWF9VMzIgblBvc2l0aW9uOyAgICAgICAgICAvKio8IEN1cnJlbnQgUG9zaXRpb24gb2YgdGhlIE1JREkgcmVzb3VyY2UgYmVpbmcgcGxheWVkIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE9NWF9CT09MIGJWaWJyYTsgICAgICAgICAgICAvKio8IERvZXMgVmlicmEgdHJhY2sgZXhpc3Q/IE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB1bnRpbCB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gKi8KLSAgICBPTVhfVTMyIG5OdW1NZXRhRXZlbnRzOyAgICAgLyoqPCBUb3RhbCBudW1iZXIgb2YgTUlESSBNZXRhIEV2ZW50cyBpbiB0aGUgY3VycmVudGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gTUlESSByZXNvdXJjZS4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8KLSAgICBPTVhfVTMyIG5OdW1BY3RpdmVWb2ljZXM7ICAgLyoqPCBOdW1iZXIgb2YgYWN0aXZlIHZvaWNlcyBpbiB0aGUgY3VycmVudGx5IHBsYXlpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSByZXNvdXJjZS4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIHVudGlsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAqLwotICAgIE9NWF9BVURJT19NSURJUExBWUJBQ0tTVEFURVRZUEUgZU1JRElQbGF5QmFja1N0YXRlOyAgLyoqPCBNSURJIHBsYXliYWNrIHN0YXRlIGVudW1lcmF0aW9uLCByZWFkIG9ubHkgZmllbGQgKi8KLX0gT01YX0FVRElPX0NPTkZJR19NSURJU1RBVFVTVFlQRTsKLQotCi0vKiogTUlESSBNZXRhIEV2ZW50IHN0cnVjdHVyZSBvbmUgcGVyIE1ldGEgRXZlbnQuCi0gKiAgTUlESSBNZXRhIEV2ZW50cyBhcmUgbGlrZSBhdWRpbyBtZXRhZGF0YSwgZXhjZXB0IHRoYXQgdGhleSBhcmUgaW50ZXJzcGVyc2VkIAotICogIHdpdGggdGhlIE1JREkgY29udGVudCB0aHJvdWdob3V0IHRoZSBmaWxlIGFuZCBhcmUgbm90IGxvY2FsaXplZCBpbiB0aGUgaGVhZGVyLiAKLSAqICBBcyBzdWNoLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgTWV0YSBFdmVudHMgZnJvbSAKLSAqICB0aGUgZW5naW5lLCBhcyBpdCBlbmNvdW50ZXJzIHRoZXNlIE1ldGEgRXZlbnRzIHdpdGhpbiB0aGUgTUlESSBjb250ZW50LiAKLSAqICBGb3IgZXhhbXBsZSwgU01GIGZpbGVzIGNhbiBoYXZlIHVwIHRvIDE0IHR5cGVzIG9mIE1JREkgTWV0YSBFdmVudHMgKGNvcHlyaWdodCwgCi0gKiAgYXV0aG9yLCBkZWZhdWx0IHRlbXBvLCBldGMuKSBzY2F0dGVyZWQgdGhyb3VnaG91dCB0aGUgZmlsZS4gCi0gKiAgQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlRUWVBFeyAKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKLSAgICBPTVhfVTMyIG5JbmRleDsgICAgICAgICAgIC8qKjwgSW5kZXggb2YgTWV0YSBFdmVudCAqLyAKLSAgICBPTVhfVTggbk1ldGFFdmVudFR5cGU7ICAgIC8qKjwgTWV0YSBFdmVudCBUeXBlLCA3Yml0cyAoaS5lLiAwIC0gMTI3KSAqLyAKLSAgICBPTVhfVTMyIG5NZXRhRXZlbnRTaXplOyAgIC8qKjwgc2l6ZSBvZiB0aGUgTWV0YSBFdmVudCBpbiBieXRlcyAqLyAKLSAgICBPTVhfVTMyIG5UcmFjazsgICAgICAgICAgIC8qKjwgdHJhY2sgbnVtYmVyIGZvciB0aGUgbWV0YSBldmVudCAqLwotICAgIE9NWF9VMzIgblBvc2l0aW9uOyAgICAgICAgLyoqPCBQb3NpdGlvbiBvZiB0aGUgbWV0YS1ldmVudCBpbiBtaWxsaXNlY29uZHMgKi8KLX0gT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UVFlQRTsgCi0KLQotLyoqIE1JREkgTWV0YSBFdmVudCBEYXRhIHN0cnVjdHVyZSAtIG9uZSBwZXIgTWV0YSBFdmVudC4gCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlREQVRBVFlQRXsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuSW5kZXg7ICAgICAgICAgICAvKio8IEluZGV4IG9mIE1ldGEgRXZlbnQgKi8gCi0gICAgT01YX1UzMiBuTWV0YUV2ZW50U2l6ZTsgICAvKio8IHNpemUgb2YgdGhlIE1ldGEgRXZlbnQgaW4gYnl0ZXMgKi8gCi0gICAgT01YX1U4IG5EYXRhWzFdOyAgICAgICAgICAvKio8IGFycmF5IG9mIG9uZSBvciBtb3JlIGJ5dGVzIG9mIG1ldGEgZGF0YSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaW5kaWNhdGVkIGJ5IHRoZSBuTWV0YUV2ZW50U2l6ZSBmaWVsZCAqLyAKLX0gT01YX0FVRElPX0NPTkZJR19fTUlESU1FVEFFVkVOVERBVEFUWVBFOyAKLQotCi0vKiogQXVkaW8gVm9sdW1lIGFkanVzdG1lbnQgZm9yIGEgcG9ydCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19WT0xVTUVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIHZvbHVtZS4gIFNlbGVjdCB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLiAqLwotICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxvZ2FyaXRobWljIHNjYWxlIChtQikgKi8KLSAgICBPTVhfQlMzMiBzVm9sdW1lOyAgICAgICAgICAgLyoqPCBWb2x1bWUgbGluZWFyIHNldHRpbmcgaW4gdGhlIDAuLjEwMCByYW5nZSwgT1IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWUgbG9nYXJpdGhtaWMgc2V0dGluZyBmb3IgdGhpcyBwb3J0LiAgVGhlIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2b2x1bWUgYXJlIGluIG1CIChtaWxsaWJlbHMgPSAxLzEwMCBkQikgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhIGdhaW4gb2YgMSAoZS5nLiB0aGUgb3V0cHV0IGlzIHRoZSBzYW1lIGFzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBsZXZlbCkuICBWYWx1ZXMgYXJlIGluIG1CIGZyb20gbk1heCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4aW11bSB2b2x1bWUpIHRvIG5NaW4gbUIgKHR5cGljYWxseSBuZWdhdGl2ZSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIHZvbHVtZSBpcyAidm9sdGFnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IGEgInBvd2VyIiwgaXQgdGFrZXMgYSBzZXR0aW5nIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYwMCBtQiB0byBkZWNyZWFzZSB0aGUgdm9sdW1lIGJ5IDEvMi4gIElmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21wb25lbnQgY2Fubm90IGFjY3VyYXRlbHkgc2V0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZSwgaXQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgdm9sdW1lIHRvIHRoZSBjbG9zZXN0IHZhbHVlIEJFTE9XCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCB2YWx1ZS4gIFdoZW4gZ2V0dGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgc2V0dGluZywgdGhlIGN1cnJlbnQgYWN0dWFsIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgcmV0dXJuZWQuICovCi19IE9NWF9BVURJT19DT05GSUdfVk9MVU1FVFlQRTsKLQotCi0vKiogQXVkaW8gVm9sdW1lIGFkanVzdG1lbnQgZm9yIGEgY2hhbm5lbCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSEFOTkVMVk9MVU1FVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyB2b2x1bWUuICBTZWxlY3QgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZS4gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsOyAgICAgICAgICAgLyoqPCBjaGFubmVsIHRvIHNlbGVjdCBmcm9tIDAgdG8gTi0xLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBPTVhfQUxMIHRvIGFwcGx5IHZvbHVtZSBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFsbCBjaGFubmVscyAqLwotICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApIG9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2FyaXRobWljIHNjYWxlIChtQikgKi8KLSAgICBPTVhfQlMzMiBzVm9sdW1lOyAgICAgICAgICAgLyoqPCBWb2x1bWUgbGluZWFyIHNldHRpbmcgaW4gdGhlIDAuLjEwMCByYW5nZSwgT1IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWUgbG9nYXJpdGhtaWMgc2V0dGluZyBmb3IgdGhpcyBwb3J0LiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlcyBmb3Igdm9sdW1lIGFyZSBpbiBtQiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWlsbGliZWxzID0gMS8xMDAgZEIpIHJlbGF0aXZlIHRvIGEgZ2FpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIDEgKGUuZy4gdGhlIG91dHB1dCBpcyB0aGUgc2FtZSBhcyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgbGV2ZWwpLiAgVmFsdWVzIGFyZSBpbiBtQiBmcm9tIG5NYXggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heGltdW0gdm9sdW1lKSB0byBuTWluIG1CICh0eXBpY2FsbHkgbmVnYXRpdmUpLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIHZvbHVtZSBpcyAidm9sdGFnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IGEgInBvd2VyIiwgaXQgdGFrZXMgYSBzZXR0aW5nIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYwMCBtQiB0byBkZWNyZWFzZSB0aGUgdm9sdW1lIGJ5IDEvMi4gIElmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21wb25lbnQgY2Fubm90IGFjY3VyYXRlbHkgc2V0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZSwgaXQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgdm9sdW1lIHRvIHRoZSBjbG9zZXN0IHZhbHVlIEJFTE9XCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCB2YWx1ZS4gIFdoZW4gZ2V0dGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgc2V0dGluZywgdGhlIGN1cnJlbnQgYWN0dWFsIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgcmV0dXJuZWQuICovCi0gICAgT01YX0JPT0wgYklzTUlESTsgICAgICAgICAgIC8qKjwgVFJVRSBpZiBuQ2hhbm5lbCByZWZlcnMgdG8gYSBNSURJIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlICovCi19IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTFZPTFVNRVRZUEU7Ci0KLQotLyoqIEF1ZGlvIGJhbGFuY2Ugc2V0dGluZyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19CQUxBTkNFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyBiYWxhbmNlLiAgU2VsZWN0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlLiAqLwotICAgIE9NWF9TMzIgbkJhbGFuY2U7ICAgICAgICAgICAvKio8IGJhbGFuY2Ugc2V0dGluZyBmb3IgdGhpcyBwb3J0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTAwIHRvIDEwMCwgd2hlcmUgLTEwMCBpbmRpY2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgbGVmdCwgYW5kIG5vIHJpZ2h0ICovCi19IE9NWF9BVURJT19DT05GSUdfQkFMQU5DRVRZUEU7Ci0KLQotLyoqIEF1ZGlvIFBvcnQgbXV0ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NVVRFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyBtdXRlLiAgU2VsZWN0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlLiAqLwotICAgIE9NWF9CT09MIGJNdXRlOyAgICAgICAgICAgICAvKio8IE11dGUgc2V0dGluZyBmb3IgdGhpcyBwb3J0ICovCi19IE9NWF9BVURJT19DT05GSUdfTVVURVRZUEU7Ci0KLQotLyoqIEF1ZGlvIENoYW5uZWwgbXV0ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSEFOTkVMTVVURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWw7ICAgICAgICAgICAvKio8IGNoYW5uZWwgdG8gc2VsZWN0IGZyb20gMCB0byBOLTEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIE9NWF9BTEwgdG8gYXBwbHkgbXV0ZSBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFsbCBjaGFubmVscyAqLwotICAgIE9NWF9CT09MIGJNdXRlOyAgICAgICAgICAgICAvKio8IE11dGUgc2V0dGluZyBmb3IgdGhpcyBjaGFubmVsICovCi0gICAgT01YX0JPT0wgYklzTUlESTsgICAgICAgICAgIC8qKjwgVFJVRSBpZiBuQ2hhbm5lbCByZWZlcnMgdG8gYSBNSURJIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlICovIAotfSBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxNVVRFVFlQRTsKLQotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBsb3VkbmVzcyBjb250cm9sLCB3aGljaCBib29zdHMgYmFzcyBhbmQgdG8gYSAKLSAqICBzbWFsbGVyIGV4dGVudCBoaWdoIGVuZCBmcmVxdWVuY2llcyB0byBjb21wZW5zYXRlIGZvciBoZWFyaW5nCi0gKiAgYWJpbGl0eSBhdCB0aGUgZXh0cmVtZSBlbmRzIG9mIHRoZSBhdWRpbyBzcGVjdHJ1bQotICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19MT1VETkVTU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJMb3VkbmVzczsgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGxvdWRuZXNzICovCi19IE9NWF9BVURJT19DT05GSUdfTE9VRE5FU1NUWVBFOwotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBiYXNzLCB3aGljaCBjb250cm9scyBsb3cgZnJlcXVlbmNpZXMKLSAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQkFTU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGJhc3MgY29udHJvbCAqLwotICAgIE9NWF9TMzIgbkJhc3M7ICAgICAgICAgICAgIC8qKjwgYmFzcyBzZXR0aW5nIGZvciB0aGUgcG9ydCwgYXMgYSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCBtZWFucyBubyBjaGFuZ2UgaW4gYmFzcyBsZXZlbCkqLwotfSBPTVhfQVVESU9fQ09ORklHX0JBU1NUWVBFOwotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciB0cmVibGUsIHdoaWNoIGNvbnRyb2xzIGhpZ2ggZnJlcXVlbmNpZXMgdG9uZXMKLSAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfVFJFQkxFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgdHJlYmxlIGNvbnRyb2wgKi8KLSAgICBPTVhfUzMyICBuVHJlYmxlOyAgICAgICAgICAvKio8IHRyZWJsZSBzZXR0aW5nIGZvciB0aGUgcG9ydCwgYXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91cyB2YWx1ZSBmcm9tIC0xMDAgdG8gMTAwICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIG1lYW5zIG5vIGNoYW5nZSBpbiB0cmVibGUgbGV2ZWwpICovCi19IE9NWF9BVURJT19DT05GSUdfVFJFQkxFVFlQRTsKLQotCi0vKiogQW4gZXF1YWxpemVyIGlzIHR5cGljYWxseSB1c2VkIGZvciB0d28gcmVhc29uczogdG8gY29tcGVuc2F0ZSBmb3IgYW4gCi0gKiAgc3ViLW9wdGltYWwgZnJlcXVlbmN5IHJlc3BvbnNlIG9mIGEgc3lzdGVtIHRvIG1ha2UgaXQgc291bmQgbW9yZSBuYXR1cmFsIAotICogIG9yIHRvIGNyZWF0ZSBpbnRlbnRpb25hbGx5IHNvbWUgdW5uYXR1cmFsIGNvbG9yaW5nIHRvIHRoZSBzb3VuZCB0byBjcmVhdGUKLSAqICBhbiBlZmZlY3QuCi0gKiAgQGluZ3JvdXAgZWZmZWN0cwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0VRVUFMSVpFUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGVxdWFsaXplciAqLwotICAgIE9NWF9CVTMyIHNCYW5kSW5kZXg7ICAgICAgIC8qKjwgQmFuZCBudW1iZXIgdG8gYmUgc2V0LiAgVXBwZXIgTGltaXQgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLTEsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBiYW5kcywgbG93ZXIgbGltaXQgaXMgMCAqLwotICAgIE9NWF9CVTMyIHNDZW50ZXJGcmVxOyAgICAgIC8qKjwgQ2VudGVyIGZyZXF1ZWNpZXMgaW4gSHouICBUaGlzIGlzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgb25seSBlbGVtZW50IGFuZCBpcyB1c2VkIHRvIGRldGVybWluZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsb3dlciwgY2VudGVyIGFuZCB1cHBlciBmcmVxdWVuY3kgb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJhbmQuICAqLwotICAgIE9NWF9CUzMyIHNCYW5kTGV2ZWw7ICAgICAgIC8qKjwgYmFuZCBsZXZlbCBpbiBtaWxsaWJlbHMgKi8KLX0gT01YX0FVRElPX0NPTkZJR19FUVVBTElaRVJUWVBFOwotCi0KLS8qKiBTdGVyZW8gd2lkZW5pbmcgbW9kZSB0eXBlIAotICogQGluZ3JvdXAgZWZmZWN0cwotICovIAotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19TVEVSRU9XSURFTklOR1RZUEUgewotICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ0hlYWRwaG9uZXMsICAgIC8qKjwgU3RlcmVvIHdpZGVuaW5nIGZvciBsb3Vkc3BlYWtlcnMgKi8KLSAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdMb3Vkc3BlYWtlcnMsICAvKio8IFN0ZXJlbyB3aWRlbmluZyBmb3IgY2xvc2VseSBzcGFjZWQgbG91ZHNwZWFrZXJzICovCi0gICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fU1RFUkVPV0lERU5JTkdUWVBFOwotCi0KLS8qKiBDb250cm9sIGZvciBzdGVyZW8gd2lkZW5pbmcsIHdoaWNoIGlzIGEgc3BlY2lhbCAyLWNoYW5uZWwKLSAqICBjYXNlIG9mIHRoZSBhdWRpbyB2aXJ0dWFsaXplciBlZmZlY3QuIEZvciBleGFtcGxlLCBmb3IgNS4xLWNoYW5uZWwgCi0gKiAgb3V0cHV0LCBpdCB0cmFuc2xhdGVzIHRvIHZpcnR1YWwgc3Vycm91bmQgc291bmQuIAotICogQGluZ3JvdXAgZWZmZWN0cwotICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19TVEVSRU9XSURFTklOR1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIHN0ZXJlbyB3aWRlbmluZyBjb250cm9sICovCi0gICAgT01YX0FVRElPX1NURVJFT1dJREVOSU5HVFlQRSBlV2lkZW5pbmdUeXBlOyAvKio8IFN0ZXJlbyB3aWRlbmluZyBhbGdvcml0aG0gdHlwZSAqLwotICAgIE9NWF9VMzIgIG5TdGVyZW9XaWRlbmluZzsgIC8qKjwgc3RlcmVvIHdpZGVuaW5nIHNldHRpbmcgZm9yIHRoZSBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBjb250aW51b3VzIHZhbHVlIGZyb20gMCB0byAxMDAgICovCi19IE9NWF9BVURJT19DT05GSUdfU1RFUkVPV0lERU5JTkdUWVBFOwotCi0KLS8qKiBUaGUgY2hvcnVzIGVmZmVjdCAob3IgYGBjaG9yYWxpemVyJycpIGlzIGFueSBzaWduYWwgcHJvY2Vzc29yIHdoaWNoIG1ha2VzCi0gKiAgb25lIHNvdW5kIHNvdXJjZSAoc3VjaCBhcyBhIHZvaWNlKSBzb3VuZCBsaWtlIG1hbnkgc3VjaCBzb3VyY2VzIHNpbmdpbmcgCi0gKiAgKG9yIHBsYXlpbmcpIGluIHVuaXNvbi4gU2luY2UgcGVyZm9ybWFuY2UgaW4gdW5pc29uIGlzIG5ldmVyIGV4YWN0LCBjaG9ydXMgCi0gKiAgZWZmZWN0cyBzaW11bGF0ZSB0aGlzIGJ5IG1ha2luZyBpbmRlcGVuZGVudGx5IG1vZGlmaWVkIGNvcGllcyBvZiB0aGUgaW5wdXQgCi0gKiAgc2lnbmFsLiBNb2RpZmljYXRpb25zIG1heSBpbmNsdWRlICgxKSBkZWxheSwgKDIpIGZyZXF1ZW5jeSBzaGlmdCwgYW5kIAotICogICgzKSBhbXBsaXR1ZGUgbW9kdWxhdGlvbi4KLSAqIEBpbmdyb3VwIGVmZmVjdHMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSE9SVVNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBjaG9ydXMgKi8KLSAgICBPTVhfQlUzMiBzRGVsYXk7ICAgICAgICAgICAvKio8IGF2ZXJhZ2UgZGVsYXkgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgT01YX0JVMzIgc01vZHVsYXRpb25SYXRlOyAgLyoqPCByYXRlIG9mIG1vZHVsYXRpb24gaW4gbWlsbGloZXJ0eiAqLwotICAgIE9NWF9VMzIgbk1vZHVsYXRpb25EZXB0aDsgIC8qKjwgZGVwdGggb2YgbW9kdWxhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSAoaS5lLiAwIHRvIDEwMCkgKi8KLSAgICBPTVhfQlUzMiBuRmVlZGJhY2s7ICAgICAgICAvKio8IEZlZWRiYWNrIGZyb20gY2hvcnVzIG91dHB1dCB0byBpbnB1dCBpbiBwZXJjZW50YWdlICovCi19IE9NWF9BVURJT19DT05GSUdfQ0hPUlVTVFlQRTsKLQotCi0vKiogUmV2ZXJiZXJhdGlvbiBpcyBwYXJ0IG9mIHRoZSByZWZsZWN0ZWQgc291bmQgdGhhdCBmb2xsb3dzIHRoZSBlYXJseSAKLSAqICByZWZsZWN0aW9ucy4gSW4gYSB0eXBpY2FsIHJvb20sIHRoaXMgY29uc2lzdHMgb2YgYSBkZW5zZSBzdWNjZXNzaW9uIG9mIAotICogIGVjaG9lcyB3aG9zZSBlbmVyZ3kgZGVjYXlzIGV4cG9uZW50aWFsbHkuIFRoZSByZXZlcmJlcmF0aW9uIGVmZmVjdCBzdHJ1Y3R1cmUgCi0gKiAgYXMgZGVmaW5lZCBoZXJlIGluY2x1ZGVzIGJvdGggKGVhcmx5KSByZWZsZWN0aW9ucyBhcyB3ZWxsIGFzIChsYXRlKSByZXZlcmJlcmF0aW9ucy4gCi0gKiBAaW5ncm91cCBlZmZlY3RzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIHJldmVyYmVyYXRpb24gY29udHJvbCAqLwotICAgIE9NWF9CUzMyIHNSb29tTGV2ZWw7ICAgICAgICAgIC8qKjwgSW50ZW5zaXR5IGxldmVsIGZvciB0aGUgd2hvbGUgcm9vbSBlZmZlY3QgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBib3RoIGVhcmx5IHJlZmxlY3Rpb25zIGFuZCBsYXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJiZXJhdGlvbikgaW4gbWlsbGliZWxzICovCi0gICAgT01YX0JTMzIgc1Jvb21IaWdoRnJlcUxldmVsOyAgLyoqPCBBdHRlbnVhdGlvbiBhdCBoaWdoIGZyZXF1ZW5jaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgaW50ZW5zaXR5IGF0IGxvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmNpZXMgaW4gbWlsbGliZWxzICovCi0gICAgT01YX0JTMzIgc1JlZmxlY3Rpb25zTGV2ZWw7ICAgLyoqPCBJbnRlbnNpdHkgbGV2ZWwgb2YgZWFybHkgcmVmbGVjdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWxhdGl2ZSB0byByb29tIHZhbHVlKSwgaW4gbWlsbGliZWxzICovCi0gICAgT01YX0JVMzIgc1JlZmxlY3Rpb25zRGVsYXk7ICAgLyoqPCBEZWxheSB0aW1lIG9mIHRoZSBmaXJzdCByZWZsZWN0aW9uIHJlbGF0aXZlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGRpcmVjdCBwYXRoLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQlMzMiBzUmV2ZXJiTGV2ZWw7ICAgICAgICAvKio8IEludGVuc2l0eSBsZXZlbCBvZiBsYXRlIHJldmVyYmVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHJvb20gbGV2ZWwsIGluIG1pbGxpYmVscyAqLwotICAgIE9NWF9CVTMyIHNSZXZlcmJEZWxheTsgICAgICAgIC8qKjwgVGltZSBkZWxheSBmcm9tIHRoZSBmaXJzdCBlYXJseSByZWZsZWN0aW9uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgT01YX0JVMzIgc0RlY2F5VGltZTsgICAgICAgICAgLyoqPCBMYXRlIHJldmVyYmVyYXRpb24gZGVjYXkgdGltZSBhdCBsb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQlUzMiBuRGVjYXlIaWdoRnJlcVJhdGlvOyAvKio8IFJhdGlvIG9mIGhpZ2ggZnJlcXVlbmN5IGRlY2F5IHRpbWUgcmVsYXRpdmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBsb3cgZnJlcXVlbmN5IGRlY2F5IHRpbWUgaW4gcGVyY2VudCAgKi8KLSAgICBPTVhfVTMyIG5EZW5zaXR5OyAgICAgICAgICAgICAvKio8IE1vZGFsIGRlbnNpdHkgaW4gdGhlIGxhdGUgcmV2ZXJiZXJhdGlvbiBkZWNheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHBlcmNlbnQgKGkuZS4gMCAtIDEwMCkgKi8KLSAgICBPTVhfVTMyIG5EaWZmdXNpb247ICAgICAgICAgICAvKio8IEVjaG8gZGVuc2l0eSBpbiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIGRlY2F5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcGVyY2VudCAoaS5lLiAwIC0gMTAwKSAqLwotICAgIE9NWF9CVTMyIHNSZWZlcmVuY2VIaWdoRnJlcTsgIC8qKjwgUmVmZXJlbmNlIGhpZ2ggZnJlcXVlbmN5IGluIEhlcnR6LiBUaGlzIGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyZXF1ZW5jeSB1c2VkIGFzIHRoZSByZWZlcmVuY2UgZm9yIGFsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoaWdoLWZyZXF1ZW5jeSBzZXR0aW5ncyBhYm92ZSAqLwotCi19IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEU7Ci0KLQotLyoqIFBvc3NpYmxlIHNldHRpbmdzIGZvciB0aGUgRWNobyBDYW5jZWxhdGlvbiBzdHJ1Y3R1cmUgdG8gdXNlIAotICogQGluZ3JvdXAgZWZmZWN0cwotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0VDSE9DQU5UWVBFIHsKLSAgIE9NWF9BVURJT19FY2hvQ2FuT2ZmID0gMCwgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBpcyBkaXNhYmxlZCAqLwotICAgT01YX0FVRElPX0VjaG9DYW5Ob3JtYWwsICAgICAvKio8IEVjaG8gQ2FuY2VsbGF0aW9uIG5vcm1hbCBvcGVyYXRpb24gLSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGZyb20gcGxhc3RpY3MgYW5kIGZhY2UgKi8KLSAgIE9NWF9BVURJT19FY2hvQ2FuSEZyZWUsICAgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBvcHRpbWl6ZWQgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRzIEZyZWUgb3BlcmF0aW9uICovCi0gICBPTVhfQVVESU9fRWNob0NhbkNhcktpdCwgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBvcHRpbWl6ZWQgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhciBLaXQgKGxvbmdlciBlY2hvKSAqLwotICAgT01YX0FVRElPX0VjaG9DYW5LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICBPTVhfQVVESU9fRWNob0NhblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICBPTVhfQVVESU9fRWNob0Nhbk1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0VDSE9DQU5UWVBFOwotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBlY2hvIGNhbmNlbGF0aW9uLCB3aGljaCByZW1vdmVzIHVuZGVzaXJlZCBlY2hvJ3MKLSAqICBmcm9tIHRoZSBhdWRpbwotICogQGluZ3JvdXAgZWZmZWN0cwotICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19FQ0hPQ0FOQ0VMQVRJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQVVESU9fRUNIT0NBTlRZUEUgZUVjaG9DYW5jZWxhdGlvbjsgLyoqPCBFY2hvIGNhbmNlbGF0aW9uIHNldHRpbmdzICovCi19IE9NWF9BVURJT19DT05GSUdfRUNIT0NBTkNFTEFUSU9OVFlQRTsKLQotCi0vKiogRW5hYmxlIC8gRGlzYWJsZSBmb3Igbm9pc2UgcmVkdWN0aW9uLCB3aGljaCB1bmRlc2lyZWQgbm9pc2UgZnJvbQotICogdGhlIGF1ZGlvCi0gKiBAaW5ncm91cCBlZmZlY3RzCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX05PSVNFUkVEVUNUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYk5vaXNlUmVkdWN0aW9uOyAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3Igbm9pc2UgcmVkdWN0aW9uICovCi19IE9NWF9BVURJT19DT05GSUdfTk9JU0VSRURVQ1RJT05UWVBFOwotCi0vKiogQH0gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwotCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9pbmMvT01YX0NvbXBvbmVudC5oIGIvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9Db21wb25lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5NTY0MC4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9pbmMvT01YX0NvbXBvbmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqCi0gKi8KLQotLyoqIE9NWF9Db21wb25lbnQuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBPTVhfQ29tcG9uZW50IGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyB1c2VkIHRvIGRlZmluZQotICogIHRoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIGEgY29tcG9uZW50LiAgVGhpcyBoZWFkZXIgZmlsZSBpcyBpbnRlbmRlZCB0bwotICogIGJlIHVzZWQgYnkgYm90aCB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb21wb25lbnQuCi0gKi8KLQotI2lmbmRlZiBPTVhfQ29tcG9uZW50X2gKLSNkZWZpbmUgT01YX0NvbXBvbmVudF9oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0KLS8qIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKLSAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKLSAqLwotCi0jaW5jbHVkZSA8T01YX0F1ZGlvLmg+Ci0jaW5jbHVkZSA8T01YX1ZpZGVvLmg+Ci0jaW5jbHVkZSA8T01YX0ltYWdlLmg+Ci0jaW5jbHVkZSA8T01YX090aGVyLmg+Ci0KLS8qKiBAaW5ncm91cCBjb21wICovCi10eXBlZGVmIGVudW0gT01YX1BPUlRET01BSU5UWVBFIHsgCi0gICAgT01YX1BvcnREb21haW5BdWRpbywgCi0gICAgT01YX1BvcnREb21haW5WaWRlbywgCi0gICAgT01YX1BvcnREb21haW5JbWFnZSwgCi0gICAgT01YX1BvcnREb21haW5PdGhlciwKLSAgICBPTVhfUG9ydERvbWFpbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfUG9ydERvbWFpblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1BvcnREb21haW5NYXggPSAweDdmZmZmZmYKLX0gT01YX1BPUlRET01BSU5UWVBFOwotCi0vKiogQGluZ3JvdXAgY29tcCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAvKio8IFBvcnQgbnVtYmVyIHRoZSBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9ESVJUWVBFIGVEaXI7ICAgICAgICAgICAgICAvKio8IERpcmVjdGlvbiAoaW5wdXQgb3Igb3V0cHV0KSBvZiB0aGlzIHBvcnQgKi8KLSAgICBPTVhfVTMyIG5CdWZmZXJDb3VudEFjdHVhbDsgICAgLyoqPCBUaGUgYWN0dWFsIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZCBvbiB0aGlzIHBvcnQgKi8KLSAgICBPTVhfVTMyIG5CdWZmZXJDb3VudE1pbjsgICAgICAgLyoqPCBUaGUgbWluaW11bSBudW1iZXIgb2YgYnVmZmVycyB0aGlzIHBvcnQgcmVxdWlyZXMgKi8KLSAgICBPTVhfVTMyIG5CdWZmZXJTaXplOyAgICAgICAgICAgLyoqPCBTaXplLCBpbiBieXRlcywgZm9yIGJ1ZmZlcnMgdG8gYmUgdXNlZCBmb3IgdGhpcyBjaGFubmVsICovCi0gICAgT01YX0JPT0wgYkVuYWJsZWQ7ICAgICAgICAgICAgIC8qKjwgUG9ydHMgZGVmYXVsdCB0byBlbmFibGVkIGFuZCBhcmUgZW5hYmxlZC9kaXNhYmxlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9Db21tYW5kUG9ydEVuYWJsZS9PTVhfQ29tbWFuZFBvcnREaXNhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gZGlzYWJsZWQgYSBwb3J0IGlzIHVucG9wdWxhdGVkLiBBIGRpc2FibGVkIHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgcG9wdWxhdGVkIHdpdGggYnVmZmVycyBvbiBhIHRyYW5zaXRpb24gdG8gSURMRS4gKi8KLSAgICBPTVhfQk9PTCBiUG9wdWxhdGVkOyAgICAgICAgICAgLyoqPCBQb3J0IGlzIHBvcHVsYXRlZCB3aXRoIGFsbCBvZiBpdHMgYnVmZmVycyBhcyBpbmRpY2F0ZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQnVmZmVyQ291bnRBY3R1YWwuIEEgZGlzYWJsZWQgcG9ydCBpcyBhbHdheXMgdW5wb3B1bGF0ZWQuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuIGVuYWJsZWQgcG9ydCBpcyBwb3B1bGF0ZWQgb24gYSB0cmFuc2l0aW9uIHRvIE9NWF9TdGF0ZUlkbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdW5wb3B1bGF0ZWQgb24gYSB0cmFuc2l0aW9uIHRvIGxvYWRlZC4gKi8KLSAgICBPTVhfUE9SVERPTUFJTlRZUEUgZURvbWFpbjsgICAgLyoqPCBEb21haW4gb2YgdGhlIHBvcnQuIERldGVybWluZXMgdGhlIGNvbnRlbnRzIG9mIG1ldGFkYXRhIGJlbG93LiAqLwotICAgIHVuaW9uIHsKLSAgICAgICAgT01YX0FVRElPX1BPUlRERUZJTklUSU9OVFlQRSBhdWRpbzsKLSAgICAgICAgT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRSB2aWRlbzsKLSAgICAgICAgT01YX0lNQUdFX1BPUlRERUZJTklUSU9OVFlQRSBpbWFnZTsKLSAgICAgICAgT01YX09USEVSX1BPUlRERUZJTklUSU9OVFlQRSBvdGhlcjsKLSAgICB9IGZvcm1hdDsKLSAgICBPTVhfQk9PTCBiQnVmZmVyc0NvbnRpZ3VvdXM7Ci0gICAgT01YX1UzMiBuQnVmZmVyQWxpZ25tZW50OwotfSBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFOwotCi0vKiogQGluZ3JvdXAgY29tcCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX1UzMlRZUEUgeyAKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgblUzMjsgICAgICAgICAgICAgICAgICAgICAvKio8IFUzMiB2YWx1ZSAqLwotfSBPTVhfUEFSQU1fVTMyVFlQRTsKLQotLyoqIEBpbmdyb3VwIHJwbSAqLwotdHlwZWRlZiBlbnVtIE9NWF9TVVNQRU5TSU9OUE9MSUNZVFlQRSB7Ci0gICAgT01YX1N1c3BlbnNpb25EaXNhYmxlZCwgLyoqPCBObyBzdXNwZW5zaW9uOyB2MS4wIGJlaGF2aW9yICovCi0gICAgT01YX1N1c3BlbnNpb25FbmFibGVkLCAgLyoqPCBTdXNwZW5zaW9uIGFsbG93ZWQgKi8gICAKLSAgICBPTVhfU3VzcGVuc2lvblBvbGljeUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfU3VzcGVuc2lvblBvbGljeVN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1N1c3BlbnNpb25Qb2xpY3lNYXggPSAweDdmZmZmZmZmCi19IE9NWF9TVVNQRU5TSU9OUE9MSUNZVFlQRTsKLQotLyoqIEBpbmdyb3VwIHJwbSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX1NVU1BFTlNJT05QT0xJQ1lUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgIAotICAgIE9NWF9TVVNQRU5TSU9OUE9MSUNZVFlQRSBlUG9saWN5OwotfSBPTVhfUEFSQU1fU1VTUEVOU0lPTlBPTElDWVRZUEU7Ci0KLS8qKiBAaW5ncm91cCBycG0gKi8KLXR5cGVkZWYgZW51bSBPTVhfU1VTUEVOU0lPTlRZUEUgewotICAgIE9NWF9Ob3RTdXNwZW5kZWQsIC8qKjwgY29tcG9uZW50IGlzIG5vdCBzdXNwZW5kZWQgKi8KLSAgICBPTVhfU3VzcGVuZGVkLCAgICAvKio8IGNvbXBvbmVudCBpcyBzdXNwZW5kZWQgKi8KLSAgICBPTVhfU3VzcGVuc2lvbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfU3VzcGVuc2lvblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1N1c3BlbmRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9TVVNQRU5TSU9OVFlQRTsKLQotLyoqIEBpbmdyb3VwIHJwbSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX1NVU1BFTlNJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgCi0gICAgT01YX1NVU1BFTlNJT05UWVBFIGVUeXBlOyAgICAgICAgICAgICAKLX0gT01YX1BBUkFNX1NVU1BFTlNJT05UWVBFIDsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19CT09MRUFOVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX0JPT0wgYkVuYWJsZWQ7ICAgIAotfSBPTVhfQ09ORklHX0JPT0xFQU5UWVBFOwotCi0vKiBQYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgY29udGVudCB1cmkgdG8gdXNlLiAqLwotLyoqIEBpbmdyb3VwIGNwICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fQ09OVEVOVFVSSVRZUEUKLXsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcywgaW5jbHVkaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwgVVJJIG5hbWUgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTggY29udGVudFVSSVsxXTsgICAgICAgICAgICAgICAvKio8IFRoZSBVUkkgbmFtZSAqLwotfSBPTVhfUEFSQU1fQ09OVEVOVFVSSVRZUEU7Ci0KLS8qIFBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBwaXBlIHRvIHVzZS4gKi8KLS8qKiBAaW5ncm91cCBjcCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0NPTlRFTlRQSVBFVFlQRQotewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfSEFORExFVFlQRSBoUGlwZTsgICAgICAgLyoqPCBUaGUgcGlwZSBoYW5kbGUqLwotfSBPTVhfUEFSQU1fQ09OVEVOVFBJUEVUWVBFOwotCi0vKiogQGluZ3JvdXAgcnBtICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUkVTT1VSQ0VDT05DRUFMTUVOVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX0JPT0wgYlJlc291cmNlQ29uY2VhbG1lbnRGb3JiaWRkZW47IC8qKjwgZGlzYWxsb3cgdGhlIHVzZSBvZiByZXNvdXJjZSBjb25jZWFsbWVudCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcyAobGlrZSBkZWdyYWRpbmcgYWxnb3JpdGhtIHF1YWxpdHkgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyIHJlc291cmNlIGNvbnN1bXB0aW9uIG9yIGZ1bmN0aW9uYWwgYnlwYXNzKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gYSBjb21wb25lbnQgYXMgYSByZXNvbHV0aW9uIHRvIHJlc291cmNlIGNvbmZsaWN0cy4gKi8KLX0gT01YX1JFU09VUkNFQ09OQ0VBTE1FTlRUWVBFOwotCi0KLS8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBlbnVtIE9NWF9NRVRBREFUQUNIQVJTRVRUWVBFIHsKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VW5rbm93biA9IDAsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEFTQ0lJLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRCaW5hcnksCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldENvZGVQYWdlMTI1MiwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VVRGOCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SmF2YUNvbmZvcm1hbnRVVEY4LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEY3LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJbWFwVVRGNywKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VVRGMTZMRSwgCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjE2QkUsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEdCMTIzNDUsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEhaR0IyMzEyLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQjIzMTIsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEdCMTgwMzAsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEdCSywKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0QmlnNSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTEsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkyLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MywKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTQsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk1LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5NiwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTcsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk4LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5OSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTEwLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MTMsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxNCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTE1LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRTaGlmdEpJUywKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPMjAyMkpQLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU08yMDIySlAxLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU09FVUNKUCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0U01TN0JpdCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRUeXBlTWF4PSAweDdGRkZGRkZGCi19IE9NWF9NRVRBREFUQUNIQVJTRVRUWVBFOwotCi0vKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KLXR5cGVkZWYgZW51bSBPTVhfTUVUQURBVEFTQ09QRVRZUEUKLXsKLSAgICBPTVhfTWV0YWRhdGFTY29wZUFsbExldmVscywKLSAgICBPTVhfTWV0YWRhdGFTY29wZVRvcExldmVsLAotICAgIE9NWF9NZXRhZGF0YVNjb3BlUG9ydExldmVsLAotICAgIE9NWF9NZXRhZGF0YVNjb3BlTm9kZUxldmVsLAotICAgIE9NWF9NZXRhZGF0YVNjb3BlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9NZXRhZGF0YVNjb3BlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfTWV0YWRhdGFTY29wZVR5cGVNYXggPSAweDdmZmZmZmZmCi19IE9NWF9NRVRBREFUQVNDT1BFVFlQRTsKLQotLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCi10eXBlZGVmIGVudW0gT01YX01FVEFEQVRBU0VBUkNITU9ERVRZUEUKLXsKLSAgICBPTVhfTWV0YWRhdGFTZWFyY2hWYWx1ZVNpemVCeUluZGV4LAotICAgIE9NWF9NZXRhZGF0YVNlYXJjaEl0ZW1CeUluZGV4LAotICAgIE9NWF9NZXRhZGF0YVNlYXJjaE5leHRJdGVtQnlLZXksCi0gICAgT01YX01ldGFkYXRhU2VhcmNoS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9NZXRhZGF0YVNlYXJjaFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX01ldGFkYXRhU2VhcmNoVHlwZU1heCA9IDB4N2ZmZmZmZmYKLX0gT01YX01FVEFEQVRBU0VBUkNITU9ERVRZUEU7Ci0vKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNQ09VTlRUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX01FVEFEQVRBU0NPUEVUWVBFIGVTY29wZU1vZGU7Ci0gICAgT01YX1UzMiBuU2NvcGVTcGVjaWZpZXI7Ci0gICAgT01YX1UzMiBuTWV0YWRhdGFJdGVtQ291bnQ7Ci19IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNQ09VTlRUWVBFOwotCi0vKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNVFlQRQotewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9NRVRBREFUQVNDT1BFVFlQRSBlU2NvcGVNb2RlOwotICAgIE9NWF9VMzIgblNjb3BlU3BlY2lmaWVyOwotICAgIE9NWF9VMzIgbk1ldGFkYXRhSXRlbUluZGV4OyAgCi0gICAgT01YX01FVEFEQVRBU0VBUkNITU9ERVRZUEUgZVNlYXJjaE1vZGU7Ci0gICAgT01YX01FVEFEQVRBQ0hBUlNFVFRZUEUgZUtleUNoYXJzZXQ7Ci0gICAgT01YX1U4IG5LZXlTaXplVXNlZDsKLSAgICBPTVhfVTggbktleVsxMjhdOwotICAgIE9NWF9NRVRBREFUQUNIQVJTRVRUWVBFIGVWYWx1ZUNoYXJzZXQ7Ci0gICAgT01YX1NUUklORyBzTGFuZ3VhZ2VDb3VudHJ5OwotICAgIE9NWF9VMzIgblZhbHVlTWF4U2l6ZTsKLSAgICBPTVhfVTMyIG5WYWx1ZVNpemVVc2VkOwotICAgIE9NWF9VOCBuVmFsdWVbMV07Ci19IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNVFlQRTsKLQotLyogQGluZ3JvdXAgbWV0YWRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUNPVU5UVFlQRQotewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9CT09MIGJBbGxLZXlzOwotICAgIE9NWF9VMzIgblBhcmVudE5vZGVJRDsKLSAgICBPTVhfVTMyIG5OdW1Ob2RlczsKLX0gT01YX0NPTkZJR19DT05UQUlORVJOT0RFQ09VTlRUWVBFOwotCi0vKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUlEVFlQRQotewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9CT09MIGJBbGxLZXlzOwotICAgIE9NWF9VMzIgblBhcmVudE5vZGVJRDsKLSAgICBPTVhfVTMyIG5Ob2RlSW5kZXg7IAotICAgIE9NWF9VMzIgbk5vZGVJRDsgCi0gICAgT01YX1NUUklORyBjTm9kZU5hbWU7Ci0gICAgT01YX0JPT0wgYklzTGVhZlR5cGU7Ci19IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUlEVFlQRTsKLQotLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFIAoteyAKLSAgICBPTVhfVTMyIG5TaXplOyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IAotICAgIE9NWF9CT09MIGJBbGxLZXlzOwkvKiBpZiB0cnVlIHRoZW4gdGhpcyBzdHJ1Y3R1cmUgcmVmZXJzIHRvIGFsbCBrZXlzIGFuZCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSB0aHJlZSBrZXkgZmllbGRzIGJlbG93IGFyZSBpZ25vcmVkICovCi0gICAgT01YX01FVEFEQVRBQ0hBUlNFVFRZUEUgZUtleUNoYXJzZXQ7Ci0gICAgT01YX1UzMiBuS2V5U2l6ZVVzZWQ7IAotICAgIE9NWF9VOCAgIG5LZXkgWzEyOF07IAotICAgIE9NWF9VMzIgbkxhbmd1YWdlQ291bnRyeVNpemVVc2VkOwotICAgIE9NWF9VOCBuTGFuZ3VhZ2VDb3VudHJ5WzEyOF07Ci0gICAgT01YX0JPT0wgYkVuYWJsZWQ7CS8qIGlmIHRydWUgdGhlbiBrZXkgaXMgcGFydCBvZiBmaWx0ZXIgKGUuZy4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiByZXRhaW5lZCBmb3IgcXVlcnkgbGF0ZXIpLiBJZiBmYWxzZSB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBrZXkgaXMgbm90IHBhcnQgb2YgZmlsdGVyICovCi19IE9NWF9QQVJBTV9NRVRBREFUQUZJTFRFUlRZUEU7IAotCi0vKiogVGhlIE9NWF9IQU5ETEVUWVBFIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb21wb25lbnQgaGFuZGxlLiAgVGhlIGNvbXBvbmVudCAKLSAqICBoYW5kbGUgaXMgdXNlZCB0byBhY2Nlc3MgYWxsIG9mIHRoZSBjb21wb25lbnQncyBwdWJsaWMgbWV0aG9kcyBhbmQgYWxzbwotICogIGNvbnRhaW5zIHBvaW50ZXJzIHRvIHRoZSBjb21wb25lbnQncyBwcml2YXRlIGRhdGEgYXJlYS4gIFRoZSBjb21wb25lbnQKLSAqICBoYW5kbGUgaXMgaW5pdGlhbGl6ZWQgYnkgdGhlIE9NWCBjb3JlICh3aXRoIGhlbHAgZnJvbSB0aGUgY29tcG9uZW50KQotICogIGR1cmluZyB0aGUgcHJvY2VzcyBvZiBsb2FkaW5nIHRoZSBjb21wb25lbnQuICBBZnRlciB0aGUgY29tcG9uZW50IGlzCi0gKiAgc3VjY2Vzc2Z1bGx5IGxvYWRlZCwgdGhlIGFwcGxpY2F0aW9uIGNhbiBzYWZlbHkgYWNjZXNzIGFueSBvZiB0aGUKLSAqICBjb21wb25lbnQncyBwdWJsaWMgZnVuY3Rpb25zIChhbHRob3VnaCBzb21lIG1heSByZXR1cm4gYW4gZXJyb3IgYmVjYXVzZQotICogIHRoZSBzdGF0ZSBpcyBpbmFwcHJvcHJpYXRlIGZvciB0aGUgYWNjZXNzKS4KLSAqIAotICogIEBpbmdyb3VwIGNvbXAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTVBPTkVOVFRZUEUKLXsKLSAgICAvKiogVGhlIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIGJ5dGVzLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5Ci0gICAgICAgIG9mIHRoZSBhbGxvY2F0b3Igb2YgdGhpcyBzdHJ1Y3R1cmUgdG8gZmlsbCBpbiB0aGlzIHZhbHVlLiAgU2luY2UKLSAgICAgICAgdGhpcyBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24sIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gd2lsbCBmaWxsIGluIHRoaXMgdmFsdWUuICovCi0gICAgT01YX1UzMiBuU2l6ZTsKLQotICAgIC8qKiBuVmVyc2lvbiBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgT01YIHNwZWNpZmljYXRpb24gdGhhdCB0aGUgc3RydWN0dXJlIAotICAgICAgICBpcyBidWlsdCBhZ2FpbnN0LiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjcmVhdG9yIG9mIHRoaXMgCi0gICAgICAgIHN0cnVjdHVyZSB0byBpbml0aWFsaXplIHRoaXMgdmFsdWUgYW5kIGV2ZXJ5IHVzZXIgb2YgdGhpcyBzdHJ1Y3R1cmUgCi0gICAgICAgIHNob3VsZCB2ZXJpZnkgdGhhdCBpdCBrbm93cyBob3cgdG8gdXNlIHRoZSBleGFjdCB2ZXJzaW9uIG9mIAotICAgICAgICB0aGlzIHN0cnVjdHVyZSBmb3VuZCBoZXJlaW4uICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotCi0gICAgLyoqIHBDb21wb25lbnRQcml2YXRlIGlzIGEgcG9pbnRlciB0byB0aGUgY29tcG9uZW50IHByaXZhdGUgZGF0YSBhcmVhLiAgCi0gICAgICAgIFRoaXMgbWVtYmVyIGlzIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYnkgdGhlIGNvbXBvbmVudCB3aGVuIHRoZSAKLSAgICAgICAgY29tcG9uZW50IGlzIGZpcnN0IGxvYWRlZC4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGFjY2VzcyB0aGlzIAotICAgICAgICBkYXRhIGFyZWEuICovCi0gICAgT01YX1BUUiBwQ29tcG9uZW50UHJpdmF0ZTsKLQotICAgIC8qKiBwQXBwbGljYXRpb25Qcml2YXRlIGlzIGEgcG9pbnRlciB0aGF0IGlzIGEgcGFyYW1ldGVyIHRvIHRoZSAKLSAgICAgICAgT01YX0dldEhhbmRsZSBtZXRob2QsIGFuZCBjb250YWlucyBhbiBhcHBsaWNhdGlvbiBwcml2YXRlIHZhbHVlIAotICAgICAgICBwcm92aWRlZCBieSB0aGUgSUwgY2xpZW50LiAgVGhpcyBhcHBsaWNhdGlvbiBwcml2YXRlIGRhdGEgaXMgCi0gICAgICAgIHJldHVybmVkIHRvIHRoZSBJTCBDbGllbnQgYnkgT01YIGluIGFsbCBjYWxsYmFja3MgKi8KLSAgICBPTVhfUFRSIHBBcHBsaWNhdGlvblByaXZhdGU7Ci0KLSAgICAvKiogcmVmZXIgdG8gT01YX0dldENvbXBvbmVudFZlcnNpb24gaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBHZXRDb21wb25lbnRWZXJzaW9uIG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqR2V0Q29tcG9uZW50VmVyc2lvbikoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfT1VUIE9NWF9TVFJJTkcgcENvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICBPTVhfT1VUIE9NWF9WRVJTSU9OVFlQRSogcENvbXBvbmVudFZlcnNpb24sCi0gICAgICAgICAgICBPTVhfT1VUIE9NWF9WRVJTSU9OVFlQRSogcFNwZWNWZXJzaW9uLAotICAgICAgICAgICAgT01YX09VVCBPTVhfVVVJRFRZUEUqIHBDb21wb25lbnRVVUlEKTsKLQotICAgIC8qKiByZWZlciB0byBPTVhfU2VuZENvbW1hbmQgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBTZW5kQ29tbWFuZCBtZXRob2QuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKlNlbmRDb21tYW5kKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0NPTU1BTkRUWVBFIENtZCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX1UzMiBuUGFyYW0xLAotICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBDbWREYXRhKTsKLQotICAgIC8qKiByZWZlciB0byBPTVhfR2V0UGFyYW1ldGVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0UGFyYW1ldGVyIG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqR2V0UGFyYW1ldGVyKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgblBhcmFtSW5kZXgsICAKLSAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfUFRSIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOwotCi0KLSAgICAvKiogcmVmZXIgdG8gT01YX1NldFBhcmFtZXRlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFNldFBhcmFtZXRlciBtZXRob2QuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKlNldFBhcmFtZXRlcikoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIAotICAgICAgICAgICAgT01YX0lOICBPTVhfSU5ERVhUWVBFIG5JbmRleCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX1BUUiBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKLQotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRDb25maWcgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBHZXRDb25maWcgbWV0aG9kLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRDb25maWcpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfSU5ERVhUWVBFIG5JbmRleCwgCi0gICAgICAgICAgICBPTVhfSU5PVVQgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKLQotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9TZXRDb25maWcgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBTZXRDb25maWcgbWV0aG9kLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpTZXRDb25maWcpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfSU5ERVhUWVBFIG5JbmRleCwgCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7Ci0KLQotICAgIC8qKiByZWZlciB0byBPTVhfR2V0RXh0ZW5zaW9uSW5kZXggaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBHZXRFeHRlbnNpb25JbmRleCBtZXRob2QuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkdldEV4dGVuc2lvbkluZGV4KSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX1NUUklORyBjUGFyYW1ldGVyTmFtZSwKLSAgICAgICAgICAgIE9NWF9PVVQgT01YX0lOREVYVFlQRSogcEluZGV4VHlwZSk7Ci0KLQotICAgIC8qKiByZWZlciB0byBPTVhfR2V0U3RhdGUgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBHZXRTdGF0ZSBtZXRob2QuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkdldFN0YXRlKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9PVVQgT01YX1NUQVRFVFlQRSogcFN0YXRlKTsKLQotICAgIAotICAgIC8qKiBUaGUgQ29tcG9uZW50VHVubmVsUmVxdWVzdCBtZXRob2Qgd2lsbCBpbnRlcmFjdCB3aXRoIGFub3RoZXIgT01YCi0gICAgICAgIGNvbXBvbmVudCB0byBkZXRlcm1pbmUgaWYgdHVubmVsaW5nIGlzIHBvc3NpYmxlIGFuZCB0byBzZXR1cCB0aGUKLSAgICAgICAgdHVubmVsaW5nLiAgVGhlIHJldHVybiBjb2RlcyBmb3IgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgIGRldGVybWluZSBpZiB0dW5uZWxpbmcgaXMgbm90IHBvc3NpYmxlLCBvciBpZiB0dW5uZWxpbmcgaXMgbm90Ci0gICAgICAgIHN1cHBvcnRlZC4gIAotICAgICAgICAKLSAgICAgICAgQmFzZSBwcm9maWxlIGNvbXBvbmVudHMgKGkuZS4gbm9uLWludGVyb3ApIGRvIG5vdCBzdXBwb3J0IHRoaXMKLSAgICAgICAgbWV0aG9kIGFuZCBzaG91bGQgcmV0dXJuIE9NWF9FcnJvck5vdEltcGxlbWVudGVkIAotCi0gICAgICAgIFRoZSBpbnRlcm9wIHByb2ZpbGUgY29tcG9uZW50IE1VU1Qgc3VwcG9ydCB0dW5uZWxpbmcgdG8gYW5vdGhlciAKLSAgICAgICAgaW50ZXJvcCBwcm9maWxlIGNvbXBvbmVudCB3aXRoIGEgY29tcGF0aWJsZSBwb3J0IHBhcmFtZXRlcnMuICAKLSAgICAgICAgQSBjb21wb25lbnQgbWF5IGFsc28gc3VwcG9ydCBwcm9wcmlldGFyeSBjb21tdW5pY2F0aW9uLgotICAgICAgICAKLSAgICAgICAgSWYgcHJvcHJpZXRhcnkgY29tbXVuaWNhdGlvbiBpcyBzdXBwb3J0ZWQgdGhlIG5lZ290aWF0aW9uIG9mIAotICAgICAgICBwcm9wcmlldGFyeSBjb21tdW5pY2F0aW9uIGlzIGRvbmUgb3V0c2lkZSBvZiBPTVggaW4gYSB2ZW5kb3IgCi0gICAgICAgIHNwZWNpZmljIHdheS4gSXQgaXMgb25seSByZXF1aXJlZCB0aGF0IHRoZSBwcm9wZXIgcmVzdWx0IGJlIAotICAgICAgICByZXR1cm5lZCBhbmQgdGhlIGRldGFpbHMgb2YgaG93IHRoZSBzZXR1cCBpcyBkb25lIGlzIGxlZnQgCi0gICAgICAgIHRvIHRoZSBjb21wb25lbnQgaW1wbGVtZW50YXRpb24uICAKLSAgICAKLSAgICAgICAgV2hlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gblBvcnQgaW4gYW4gb3V0cHV0IHBvcnQsIHRoZQotICAgICAgICBjb21wb25lbnQgd2lsbDoKLSAgICAgICAgMS4gIFBvcHVsYXRlIHRoZSBwVHVubmVsU2V0dXAgc3RydWN0dXJlIHdpdGggdGhlIG91dHB1dCBwb3J0J3MgCi0gICAgICAgICAgICByZXF1aXJlbWVudHMgYW5kIGNvbnN0cmFpbnRzIGZvciB0aGUgdHVubmVsLgotCi0gICAgICAgIFdoZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIG5Qb3J0IGluIGFuIGlucHV0IHBvcnQsIHRoZQotICAgICAgICBjb21wb25lbnQgd2lsbDoKLSAgICAgICAgMS4gIFF1ZXJ5IHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycyBmcm9tIHRoZSBvdXRwdXQgcG9ydCB0byAKLSAgICAgICAgICAgIGRldGVybWluZSBpZiB0aGUgcG9ydHMgYXJlIGNvbXBhdGlibGUgZm9yIHR1bm5lbGluZwotICAgICAgICAyLiAgSWYgdGhlIHBvcnRzIGFyZSBjb21wYXRpYmxlLCB0aGUgY29tcG9uZW50IHNob3VsZCBzdG9yZQotICAgICAgICAgICAgdGhlIHR1bm5lbCBzdGVwIHByb3ZpZGVkIGJ5IHRoZSBvdXRwdXQgcG9ydAotICAgICAgICAzLiAgRGV0ZXJtaW5lIHdoaWNoIHBvcnQgKGVpdGhlciBpbnB1dCBvciBvdXRwdXQpIGlzIHRoZSBidWZmZXIKLSAgICAgICAgICAgIHN1cHBsaWVyLCBhbmQgY2FsbCBPTVhfU2V0UGFyYW1ldGVyIG9uIHRoZSBvdXRwdXQgcG9ydCB0bwotICAgICAgICAgICAgaW5kaWNhdGUgdGhpcyBzZWxlY3Rpb24uCi0gICAgICAgIAotICAgICAgICBUaGUgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgICAgIEBwYXJhbSBbaW5dIGhDb21wCi0gICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZC4KLSAgICAgICAgQHBhcmFtIFtpbl0gblBvcnQKLSAgICAgICAgICAgIG5Qb3J0IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBwb3J0IG9uIHRoZSBjb21wb25lbnQgdG8gYmUgdXNlZAotICAgICAgICAgICAgZm9yIHR1bm5lbGluZy4KLSAgICAgICAgQHBhcmFtIFtpbl0gaFR1bm5lbGVkQ29tcAotICAgICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gdHVubmVsIHdpdGguICBUaGlzIGlzIHRoZSBjb21wb25lbnQgCi0gICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kLiAgV2hlbgotICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgMHgwIHRoZSBjb21wb25lbnQgc2hvdWxkIHNldHVwIHRoZSBwb3J0IGZvcgotICAgICAgICAgICAgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbiAvIElMIENsaWVudC4KLSAgICAgICAgQHBhcmFtIFtpbl0gblBvcnRPdXRwdXQKLSAgICAgICAgICAgIG5Qb3J0T3V0cHV0IGlzIHVzZWQgaW5kaWNhdGUgdGhlIHBvcnQgdGhlIGNvbXBvbmVudCBzaG91bGQKLSAgICAgICAgICAgIHR1bm5lbCB3aXRoLgotICAgICAgICBAcGFyYW0gW2luXSBwVHVubmVsU2V0dXAKLSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHR1bm5lbCBzZXR1cCBzdHJ1Y3R1cmUuICBXaGVuIG5Qb3J0IGlzIGFuIG91dHB1dCBwb3J0Ci0gICAgICAgICAgICB0aGUgY29tcG9uZW50IHNob3VsZCBwb3B1bGF0ZSB0aGUgZmllbGRzIG9mIHRoaXMgc3RydWN0dXJlLiAgV2hlbgotICAgICAgICAgICAgV2hlbiBuUG9ydCBpcyBhbiBpbnB1dCBwb3J0IHRoZSBjb21wb25lbnQgc2hvdWxkIHJldmlldyB0aGUgc2V0dXAKLSAgICAgICAgICAgIHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgd2l0aCB0aGUgb3V0cHV0IHBvcnQuCi0gICAgICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICAgIEBpbmdyb3VwIHR1bgotICAgICovCi0KLSAgICBPTVhfRVJST1JUWVBFICgqQ29tcG9uZW50VHVubmVsUmVxdWVzdCkoCi0gICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgIE9NWF9JTiAgT01YX1UzMiBuUG9ydCwKLSAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoVHVubmVsZWRDb21wLAotICAgICAgICBPTVhfSU4gIE9NWF9VMzIgblR1bm5lbGVkUG9ydCwKLSAgICAgICAgT01YX0lOT1VUICBPTVhfVFVOTkVMU0VUVVBUWVBFKiBwVHVubmVsU2V0dXApOyAKLQotICAgIC8qKiByZWZlciB0byBPTVhfVXNlQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgVXNlQnVmZmVyIG1ldGhvZC4KLSAgICAgICAgQGluZ3JvdXAgYnVmCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKlVzZUJ1ZmZlcikoCi0gICAgICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIHBwQnVmZmVySGRyLAotICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblBvcnRJbmRleCwKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBQcml2YXRlLAotICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblNpemVCeXRlcywKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfVTgqIHBCdWZmZXIpOwotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9BbGxvY2F0ZUJ1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEFsbG9jYXRlQnVmZmVyIG1ldGhvZC4KLSAgICAgICAgQGluZ3JvdXAgYnVmCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkFsbG9jYXRlQnVmZmVyKSgKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogcHBCdWZmZXIsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuUG9ydEluZGV4LAotICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcFByaXZhdGUsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuU2l6ZUJ5dGVzKTsKLQotICAgIC8qKiByZWZlciB0byBPTVhfRnJlZUJ1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEZyZWVCdWZmZXIgbWV0aG9kLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqRnJlZUJ1ZmZlcikoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnRJbmRleCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOwotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9FbXB0eVRoaXNCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBFbXB0eVRoaXNCdWZmZXIgbWV0aG9kLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqRW1wdHlUaGlzQnVmZmVyKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOwotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9GaWxsVGhpc0J1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEZpbGxUaGlzQnVmZmVyIG1ldGhvZC4KLSAgICAgICAgQGluZ3JvdXAgYnVmCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkZpbGxUaGlzQnVmZmVyKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOwotCi0gICAgLyoqIFRoZSBTZXRDYWxsYmFja3MgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIGNvcmUgdG8gc3BlY2lmeSB0aGUgY2FsbGJhY2sKLSAgICAgICAgc3RydWN0dXJlIGZyb20gdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQuICBUaGlzIGlzIGEgYmxvY2tpbmcKLSAgICAgICAgY2FsbC4gIFRoZSBjb21wb25lbnQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgICAgICBAcGFyYW0gW2luXSBwQ2FsbGJhY2tzCi0gICAgICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9DQUxMQkFDS1RZUEUgc3RydWN0dXJlIHVzZWQgdG8gcHJvdmlkZSB0aGUgCi0gICAgICAgICAgICBjYWxsYmFjayBpbmZvcm1hdGlvbiB0byB0aGUgY29tcG9uZW50Ci0gICAgICAgIEBwYXJhbSBbaW5dIHBBcHBEYXRhCi0gICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUuICBJdCBpcyBhbnRpY2lwYXRlZCB0aGF0IAotICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHdpbGwgcGFzcyBhIHBvaW50ZXIgdG8gYSBkYXRhIHN0cnVjdHVyZSBvciBhICJ0aGlzCi0gICAgICAgICAgICBwb2ludGVyIiBpbiB0aGlzIGFyZWEgdG8gYWxsb3cgdGhlIGNhbGxiYWNrIChpbiB0aGUgYXBwbGljYXRpb24pCi0gICAgICAgICAgICB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQgb2YgdGhlIGNhbGwKLSAgICAgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqU2V0Q2FsbGJhY2tzKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0NBTExCQUNLVFlQRSogcENhbGxiYWNrcywgCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9QVFIgcEFwcERhdGEpOwotCi0gICAgLyoqIENvbXBvbmVudERlSW5pdCBtZXRob2QgaXMgdXNlZCB0byBkZWluaXRpYWxpemUgdGhlIGNvbXBvbmVudAotICAgICAgICBwcm92aWRpbmcgYSBtZWFucyB0byBmcmVlIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGF0IGNvbXBvbmVudAotICAgICAgICBpbml0aWFsaXphdGlvbi4gIE5PVEU6ICBBZnRlciB0aGlzIGNhbGwgdGhlIGNvbXBvbmVudCBoYW5kbGUgaXMKLSAgICAgICAgbm90IHZhbGlkIGZvciBmdXJ0aGVyIHVzZS4KLSAgICAgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpDb21wb25lbnREZUluaXQpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKLQotICAgIC8qKiBAaW5ncm91cCBidWYgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqVXNlRUdMSW1hZ2UpKAotICAgICAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqKiBwcEJ1ZmZlckhkciwKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5Qb3J0SW5kZXgsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwUHJpdmF0ZSwKLSAgICAgICAgICAgIE9NWF9JTiB2b2lkKiBlZ2xJbWFnZSk7Ci0KLSAgICBPTVhfRVJST1JUWVBFICgqQ29tcG9uZW50Um9sZUVudW0pKAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLQkJT01YX09VVCBPTVhfVTggKmNSb2xlLAotCQlPTVhfSU4gT01YX1UzMiBuSW5kZXgpOwotCi19IE9NWF9DT01QT05FTlRUWVBFOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYKLS8qIEZpbGUgRU9GICovCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9pbmMvT01YX0NvbnRlbnRQaXBlLmggYi9zZG04NDUvbW0tY29yZS9pbmMvT01YX0NvbnRlbnRQaXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjMxMGMuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9Db250ZW50UGlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqCi0gKi8KLQotLyoqIE9NWF9Db250ZW50UGlwZS5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIE9NWF9Db250ZW50UGlwZSBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCB0byBkZWZpbmUKLSAqICB0aGUgcHVibGljIGludGVyZmFjZSBmb3IgY29udGVudCBwaXBsZXMuICBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVuZGVkIHRvCi0gKiAgYmUgdXNlZCBieSB0aGUgY29tcG9uZW50LgotICovCi0KLSNpZm5kZWYgT01YX0NPTlRFTlRQSVBFX0gKLSNkZWZpbmUgT01YX0NPTlRFTlRQSVBFX0gKLQotI2lmbmRlZiBLRF9FQUNDRVMKLS8qIE9wZW5LT0RFIGVycm9yIGNvZGVzLiBDUFJlc3VsdCB2YWx1ZXMgbWF5IGJlIHplcm8gKGluZGljYXRpbmcgc3VjY2VzcwotICAgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzKSAqLwotI2RlZmluZSBLRF9FQUNDRVMgKDEpCi0jZGVmaW5lIEtEX0VBRERSSU5VU0UgKDIpCi0jZGVmaW5lIEtEX0VBR0FJTiAoNSkKLSNkZWZpbmUgS0RfRUJBREYgKDcpCi0jZGVmaW5lIEtEX0VCVVNZICg4KQotI2RlZmluZSBLRF9FQ09OTlJFRlVTRUQgKDkpCi0jZGVmaW5lIEtEX0VDT05OUkVTRVQgKDEwKQotI2RlZmluZSBLRF9FREVBRExLICgxMSkKLSNkZWZpbmUgS0RfRURFU1RBRERSUkVRICgxMikKLSNkZWZpbmUgS0RfRVJBTkdFICgzNSkKLSNkZWZpbmUgS0RfRUVYSVNUICgxMykKLSNkZWZpbmUgS0RfRUZCSUcgKDE0KQotI2RlZmluZSBLRF9FSE9TVFVOUkVBQ0ggKDE1KQotI2RlZmluZSBLRF9FSU5WQUwgKDE3KQotI2RlZmluZSBLRF9FSU8gKDE4KQotI2RlZmluZSBLRF9FSVNDT05OICgyMCkKLSNkZWZpbmUgS0RfRUlTRElSICgyMSkKLSNkZWZpbmUgS0RfRU1GSUxFICgyMikKLSNkZWZpbmUgS0RfRU5BTUVUT09MT05HICgyMykKLSNkZWZpbmUgS0RfRU5PRU5UICgyNCkKLSNkZWZpbmUgS0RfRU5PTUVNICgyNSkKLSNkZWZpbmUgS0RfRU5PU1BDICgyNikKLSNkZWZpbmUgS0RfRU5PU1lTICgyNykKLSNkZWZpbmUgS0RfRU5PVENPTk4gKDI4KQotI2RlZmluZSBLRF9FUEVSTSAoMzMpCi0jZGVmaW5lIEtEX0VUSU1FRE9VVCAoMzYpCi0jZGVmaW5lIEtEX0VJTFNFUSAoMTkpCi0jZW5kaWYKLQotLyoqIE1hcCB0eXBlcyBmcm9tIE9NWCBzdGFuZGFyZCB0eXBlcyBvbmx5IGhlcmUgc28gaW50ZXJmYWNlIGlzIGFzIGdlbmVyaWMgYXMgcG9zc2libGUuICovCi10eXBlZGVmIE9NWF9VMzIgICAgQ1ByZXN1bHQ7Ci10eXBlZGVmIGNoYXIgKiAgICAgQ1BzdHJpbmc7ICAKLXR5cGVkZWYgdm9pZCAqICAgICBDUGhhbmRsZTsKLXR5cGVkZWYgT01YX1UzMiAgICBDUHVpbnQ7Ci10eXBlZGVmIE9NWF9TMzIgICAgQ1BpbnQ7ICAKLXR5cGVkZWYgY2hhciAgICAgICBDUGJ5dGU7ICAKLXR5cGVkZWYgT01YX0JPT0wgICBDUGJvb2w7Ci0KLS8qKiBlbnVtZXJhdGlvbiBvZiBvcmlnaW4gdHlwZXMgdXNlZCBpbiB0aGUgQ1BfUElQRVRZUEUncyBTZWVrIGZ1bmN0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX09SSUdJTlRZUEUgewotICAgIENQX09yaWdpbkJlZ2luLCAgICAgIAotICAgIENQX09yaWdpbkN1ciwgICAgICAKLSAgICBDUF9PcmlnaW5FbmQsICAgICAgCi0gICAgQ1BfT3JpZ2luS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIENQX09yaWdpblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgQ1BfT3JpZ2luTWF4ID0gMFg3RkZGRkZGRgotfSBDUF9PUklHSU5UWVBFOwotCi0vKiogZW51bWVyYXRpb24gb2YgY29udGFjdCBhY2Nlc3MgdHlwZXMgdXNlZCBpbiB0aGUgQ1BfUElQRVRZUEUncyBPcGVuIGZ1bmN0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX0FDQ0VTU1RZUEUgewotICAgIENQX0FjY2Vzc1JlYWQsICAgICAgCi0gICAgQ1BfQWNjZXNzV3JpdGUsICAKLSAgICBDUF9BY2Nlc3NSZWFkV3JpdGUgLCAgCi0gICAgQ1BfQWNjZXNzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIENQX0FjY2Vzc1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgQ1BfQWNjZXNzTWF4ID0gMFg3RkZGRkZGRgotfSBDUF9BQ0NFU1NUWVBFOwotCi0vKiogZW51bWVyYXRpb24gb2YgcmVzdWx0cyByZXR1cm5lZCBieSB0aGUgQ1BfUElQRVRZUEUncyBDaGVja0F2YWlsYWJsZUJ5dGVzIGZ1bmN0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX0NIRUNLQllURVNSRVNVTFRUWVBFCi17Ci0gICAgQ1BfQ2hlY2tCeXRlc09rLCAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGVyZSBhcmUgYXQgbGVhc3QgdGhlIHJlcXVlc3QgbnVtYmVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLwotICAgIENQX0NoZWNrQnl0ZXNOb3RSZWFkeSwgICAgICAgICAgICAgIC8qKjwgVGhlIHBpcGUgaXMgc3RpbGwgcmV0cmlldmluZyBieXRlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcHJlc2VudGx5IGxhY2tzIHN1ZmZpY2llbnQgYnl0ZXMuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZXkgYXJlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpY2llbnQgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gKi8KLSAgICBDUF9DaGVja0J5dGVzSW5zdWZmaWNpZW50Qnl0ZXMgICwgICAgIC8qKjwgVGhlIHBpcGUgaGFzIHJldHJpZXZlZCBhbGwgYnl0ZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHRob3NlIGF2YWlsYWJsZSBhcmUgbGVzcyB0aGFuIHRob3NlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCAqLwotICAgIENQX0NoZWNrQnl0ZXNBdEVuZE9mU3RyZWFtLCAgICAgICAgIC8qKjwgVGhlIHBpcGUgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm8gbW9yZSBieXRlcyBhcmUgYXZhaWxhYmxlLiAqLwotICAgIENQX0NoZWNrQnl0ZXNPdXRPZkJ1ZmZlcnMsICAgICAgICAgIC8qKjwgQWxsIHJlYWQvd3JpdGUgYnVmZmVycyBhcmUgY3VycmVudGx5IGluIHVzZS4gKi8KLSAgICBDUF9DaGVja0J5dGVzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIENQX0NoZWNrQnl0ZXNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIENQX0NoZWNrQnl0ZXNNYXggPSAwWDdGRkZGRkZGCi19IENQX0NIRUNLQllURVNSRVNVTFRUWVBFOwotCi0vKiogZW51bWVyYXRpb24gb2YgY29udGVudCBwaXBlIGV2ZW50cyBzZW50IHRvIHRoZSBjbGllbnQgY2FsbGJhY2suIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX0VWRU5UVFlQRXsKLSAgICBDUF9CeXRlc0F2YWlsYWJsZSwgICAgICAJICAgIC8qKiBieXRlcyByZXF1ZXN0ZWQgaW4gYSBDaGVja0F2YWlsYWJsZUJ5dGVzIGNhbGwgYXJlIG5vdyBhdmFpbGFibGUqLwotICAgIENQX092ZXJmbG93LCAgCQkgICAgICAgICAgIC8qKiBlbnVtZXJhdGlvbiBvZiBjb250ZW50IHBpcGUgZXZlbnRzIHNlbnQgdG8gdGhlIGNsaWVudCBjYWxsYmFjayovCi0gICAgQ1BfUGlwZURpc2Nvbm5lY3RlZCAgLCAgCQkgICAgLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRlbnQgcGlwZSBldmVudHMgc2VudCB0byB0aGUgY2xpZW50IGNhbGxiYWNrKi8KLSAgICBDUF9FdmVudEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBDUF9FdmVudFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgQ1BfRXZlbnRNYXggPSAwWDdGRkZGRkZGCi19IENQX0VWRU5UVFlQRTsKLQotLyoqIGNvbnRlbnQgcGlwZSBkZWZpbml0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgQ1BfUElQRVRZUEUKLXsKLSAgICAvKiogT3BlbiBhIGNvbnRlbnQgc3RyZWFtIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICovIAotICAgIENQcmVzdWx0ICgqT3BlbikoIENQaGFuZGxlKiBoQ29udGVudCwgQ1BzdHJpbmcgc3pVUkksIENQX0FDQ0VTU1RZUEUgZUFjY2VzcyApOwotCi0gICAgLyoqIENsb3NlIGEgY29udGVudCBzdHJlYW0uICovIAotICAgIENQcmVzdWx0ICgqQ2xvc2UpKCBDUGhhbmRsZSBoQ29udGVudCApOwotCi0gICAgLyoqIENyZWF0ZSBhIGNvbnRlbnQgc291cmNlIGFuZCBvcGVuIGl0IGZvciB3cml0aW5nLiAqLyAKLSAgICBDUHJlc3VsdCAoKkNyZWF0ZSkoIENQaGFuZGxlICpoQ29udGVudCwgQ1BzdHJpbmcgc3pVUkkgKTsKLQotICAgIC8qKiBDaGVjayB0aGUgdGhhdCBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGFyZSBhdmFpbGFibGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyAoZGVwZW5kaW5nIG9uIGFjY2VzcyB0eXBlKS4qLwotICAgIENQcmVzdWx0ICgqQ2hlY2tBdmFpbGFibGVCeXRlcykoIENQaGFuZGxlIGhDb250ZW50LCBDUHVpbnQgbkJ5dGVzUmVxdWVzdGVkLCBDUF9DSEVDS0JZVEVTUkVTVUxUVFlQRSAqZVJlc3VsdCApOwotCi0gICAgLyoqIFNlZWsgdG8gY2VydGFpbiBwb3NpdGlvbiBpbiB0aGUgY29udGVudCByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIG9yaWdpbi4gKi8KLSAgICBDUHJlc3VsdCAoKlNldFBvc2l0aW9uKSggQ1BoYW5kbGUgIGhDb250ZW50LCBDUGludCBuT2Zmc2V0LCBDUF9PUklHSU5UWVBFIGVPcmlnaW4pOwotCi0gICAgLyoqIFJldHJpZXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY29udGVudC4gKi8KLSAgICBDUHJlc3VsdCAoKkdldFBvc2l0aW9uKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQdWludCAqcFBvc2l0aW9uKTsKLQotICAgIC8qKiBSZXRyaWV2ZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBmcm9tIHRoZSBjb250ZW50IHN0cmVhbSAoYWR2YW5jZSBjb250ZW50IHBvaW50ZXIgYnkgc2l6ZSBvZiBkYXRhKS4KLSAgICAgICBOb3RlOiBwaXBlIGNsaWVudCBwcm92aWRlcyBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciBzbWFsbCBoaWdoIGZyZXF1ZW5jeSByZWFkcy4gKi8KLSAgICBDUHJlc3VsdCAoKlJlYWQpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpwRGF0YSwgQ1B1aW50IG5TaXplKTsgCi0KLSAgICAvKiogUmV0cmlldmUgYSBidWZmZXIgYWxsb2NhdGVkIGJ5IHRoZSBwaXBlIHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMuIAotICAgICAgIEJ1ZmZlciBjb250YWlucyB0aGUgbmV4dCBibG9jayBvZiBieXRlcywgYXMgc3BlY2lmaWVkIGJ5IG5TaXplLCBvZiB0aGUgY29udGVudC4gblNpemUgYWxzbwotICAgICAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJsb2NrIGFjdHVhbGx5IHJlYWQuIENvbnRlbnQgcG9pbnRlciBhZHZhbmNlcyB0aGUgYnkgdGhlIHJldHVybmVkIHNpemUuIAotICAgICAgIE5vdGU6IHBpcGUgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgbGFyZ2UgcmVhZHMuIFRoZSBjbGllbnQgbXVzdCBjYWxsIAotICAgICAgIFJlbGVhc2VSZWFkQnVmZmVyIHdoZW4gZG9uZSB3aXRoIGJ1ZmZlci4gCi0KLSAgICAgICBJbiBzb21lIGNhc2VzIHRoZSByZXF1ZXN0ZWQgYmxvY2sgbWF5IG5vdCByZXNpZGUgaW4gY29udGlndW91cyBtZW1vcnkgd2l0aGluIHRoZQotICAgICAgIHBpcGUgaW1wbGVtZW50YXRpb24uIEZvciBpbnN0YW5jZSBpZiB0aGUgcGlwZSBsZXZlcmFnZXMgYSBjaXJjdWxhciBidWZmZXIgdGhlbiB0aGUgcmVxdWVzdGVkIAotICAgICAgIGJsb2NrIG1heSBzdHJhZGRsZSB0aGUgYm91bmRhcnkgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlci4gQnkgZGVmYXVsdCBhIHBpcGUgaW1wbGVtZW50YXRpb24gCi0gICAgICAgcGVyZm9ybXMgYSBjb3B5IGluIHRoaXMgY2FzZSB0byBwcm92aWRlIHRoZSBibG9jayB0byB0aGUgcGlwZSBjbGllbnQgaW4gb25lIGNvbnRpZ3VvdXMgYnVmZmVyLgotICAgICAgIElmLCBob3dldmVyLCB0aGUgY2xpZW50IHNldHMgYkZvcmJpZENvcHksIHRoZW4gdGhlIHBpcGUgcmV0dXJucyBvbmx5IHRob3NlIGJ5dGVzIHByZWNlZGluZyB0aGUgbWVtb3J5IAotICAgICAgIGJvdW5kYXJ5LiBIZXJlIHRoZSBjbGllbnQgbWF5IHJldHJpZXZlIHRoZSBkYXRhIGluIHNlZ21lbnRzIG92ZXIgc3VjY2Vzc2l2ZSBjYWxscy4gKi8KLSAgICBDUHJlc3VsdCAoKlJlYWRCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICoqcHBCdWZmZXIsIENQdWludCAqblNpemUsIENQYm9vbCBiRm9yYmlkQ29weSk7Ci0KLSAgICAvKiogUmVsZWFzZSBhIGJ1ZmZlciBvYnRhaW5lZCBieSBSZWFkQnVmZmVyIGJhY2sgdG8gdGhlIHBpcGUuICovCi0gICAgQ1ByZXN1bHQgKCpSZWxlYXNlUmVhZEJ1ZmZlcikoQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqcEJ1ZmZlcik7Ci0KLSAgICAvKiogV3JpdGUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIHNpemUgdG8gdGhlIGNvbnRlbnQgKGFkdmFuY2UgY29udGVudCBwb2ludGVyIGJ5IHNpemUgb2YgZGF0YSkuCi0gICAgICAgTm90ZTogcGlwZSBjbGllbnQgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3Igc21hbGwgaGlnaCBmcmVxdWVuY3kgd3JpdGVzLiAqLwotICAgIENQcmVzdWx0ICgqV3JpdGUpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpkYXRhLCBDUHVpbnQgblNpemUpOyAKLQotICAgIC8qKiBSZXRyaWV2ZSBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhlIHBpcGUgdXNlZCB0byB3cml0ZSBkYXRhIHRvIHRoZSBjb250ZW50LiAKLSAgICAgICBDbGllbnQgd2lsbCBmaWxsIGJ1ZmZlciB3aXRoIG91dHB1dCBkYXRhLiBOb3RlOiBwaXBlIHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUKLSAgICAgICBmb3IgbGFyZ2Ugd3JpdGVzLiBUaGUgY2xpZW50IG11c3QgY2FsbCBXcml0ZUJ1ZmZlciB3aGVuIGRvbmUgaXQgaGFzIGZpbGxlZCB0aGUgYnVmZmVyIHdpdGggZGF0YS4qLwotICAgIENQcmVzdWx0ICgqR2V0V3JpdGVCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICoqcHBCdWZmZXIsIENQdWludCBuU2l6ZSk7Ci0KLSAgICAvKiogRGVsaXZlciBhIGJ1ZmZlciBvYnRhaW5lZCB2aWEgR2V0V3JpdGVCdWZmZXIgdG8gdGhlIHBpcGUuIFBpcGUgd2lsbCB3cml0ZSB0aGUgCi0gICAgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgdG8gY29udGVudCBhbmQgYWR2YW5jZSBjb250ZW50IHBvaW50ZXIgYnkgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAqLwotICAgIENQcmVzdWx0ICgqV3JpdGVCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpwQnVmZmVyLCBDUHVpbnQgbkZpbGxlZFNpemUpOwotCi0gICAgLyoqIFJlZ2lzdGVyIGEgcGVyLWhhbmRsZSBjbGllbnQgY2FsbGJhY2sgd2l0aCB0aGUgY29udGVudCBwaXBlLiAqLwotICAgIENQcmVzdWx0ICgqUmVnaXN0ZXJDYWxsYmFjaykoIENQaGFuZGxlIGhDb250ZW50LCBDUHJlc3VsdCAoKkNsaWVudENhbGxiYWNrKShDUF9FVkVOVFRZUEUgZUV2ZW50LCBDUHVpbnQgaVBhcmFtKSk7Ci0KLX0gQ1BfUElQRVRZUEU7Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9pbmMvT01YX0NvcmUuaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfQ29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQyMTFmLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfQ29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKgotICovCi0KLS8qKiBPTVhfQ29yZS5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIE9NWF9Db3JlIGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyB1c2VkIGJ5IGJvdGggdGhlCi0gKiAgYXBwbGljYXRpb24gYW5kIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzIGNvbW1vbiBpdGVtcy4KLSAqLwotCi0jaWZuZGVmIE9NWF9Db3JlX2gKLSNkZWZpbmUgT01YX0NvcmVfaAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyogRWFjaCBPTVggaGVhZGVyIHNoYWxsIGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKLSAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKLSAqLwotCi0jaW5jbHVkZSA8T01YX0luZGV4Lmg+Ci0KLQotLyoqIFRoZSBPTVhfQ09NTUFORFRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY3Rpb24gaW4gdGhlCi0gKiAgT01YX1NlbmRDb21tYW5kIG1hY3JvLiAgCi0gKiAgQGluZ3JvdXAgY29yZQotICovCi10eXBlZGVmIGVudW0gT01YX0NPTU1BTkRUWVBFCi17Ci0gICAgT01YX0NvbW1hbmRTdGF0ZVNldCwgICAgLyoqPCBDaGFuZ2UgdGhlIGNvbXBvbmVudCBzdGF0ZSAqLwotICAgIE9NWF9Db21tYW5kRmx1c2gsICAgICAgIC8qKjwgRmx1c2ggdGhlIGRhdGEgcXVldWUocykgb2YgYSBjb21wb25lbnQgKi8KLSAgICBPTVhfQ29tbWFuZFBvcnREaXNhYmxlLCAvKio8IERpc2FibGUgYSBwb3J0IG9uIGEgY29tcG9uZW50LiAqLwotICAgIE9NWF9Db21tYW5kUG9ydEVuYWJsZSwgIC8qKjwgRW5hYmxlIGEgcG9ydCBvbiBhIGNvbXBvbmVudC4gKi8KLSAgICBPTVhfQ29tbWFuZE1hcmtCdWZmZXIsICAvKio8IE1hcmsgYSBjb21wb25lbnQvYnVmZmVyIGZvciBvYnNlcnZhdGlvbiAqLwotICAgIE9NWF9Db21tYW5kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9Db21tYW5kVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQ29tbWFuZE1heCA9IDBYN0ZGRkZGRkYKLX0gT01YX0NPTU1BTkRUWVBFOwotCi0KLQotLyoqIFRoZSBPTVhfU1RBVEVUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgb3IgY2hhbmdlIHRoZSBjb21wb25lbnQKLSAqICBzdGF0ZS4gIFRoaXMgZW51bWVyYXRpb24gcmVmbGVjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbXBvbmVudCB3aGVuCi0gKiAgdXNlZCB3aXRoIHRoZSBPTVhfR2V0U3RhdGUgbWFjcm8gb3IgYmVjb21lcyB0aGUgcGFyYW1ldGVyIGluIGEgc3RhdGUgY2hhbmdlCi0gKiAgY29tbWFuZCB3aGVuIHVzZWQgd2l0aCB0aGUgT01YX1NlbmRDb21tYW5kIG1hY3JvLgotICoKLSAqICBUaGUgY29tcG9uZW50IHdpbGwgYmUgaW4gdGhlIExvYWRlZCBzdGF0ZSBhZnRlciB0aGUgY29tcG9uZW50IGlzIGluaXRpYWxseQotICogIGxvYWRlZCBpbnRvIG1lbW9yeS4gIEluIHRoZSBMb2FkZWQgc3RhdGUsIHRoZSBjb21wb25lbnQgaXMgbm90IGFsbG93ZWQgdG8KLSAqICBhbGxvY2F0ZSBvciBob2xkIHJlc291cmNlcyBvdGhlciB0aGFuIHRvIGJ1aWxkIGl0J3MgaW50ZXJuYWwgcGFyYW1ldGVyCi0gKiAgYW5kIGNvbmZpZ3VyYXRpb24gdGFibGVzLiAgVGhlIGFwcGxpY2F0aW9uIHdpbGwgc2VuZCBvbmUgb3IgbW9yZQotICogIFNldFBhcmFtZXRlcnMvR2V0UGFyYW1ldGVycyBhbmQgU2V0Q29uZmlnL0dldENvbmZpZyBjb21tYW5kcyB0byB0aGUKLSAqICBjb21wb25lbnQgYW5kIHRoZSBjb21wb25lbnQgd2lsbCByZWNvcmQgZWFjaCBvZiB0aGVzZSBwYXJhbWV0ZXIgYW5kCi0gKiAgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGZvciB1c2UgbGF0ZXIuICBXaGVuIHRoZSBhcHBsaWNhdGlvbiBzZW5kcyB0aGUKLSAqICBJZGxlIGNvbW1hbmQsIHRoZSBjb21wb25lbnQgd2lsbCBhY3F1aXJlIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciB0aGUKLSAqICBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBhbmQgd2lsbCB0cmFuc2l0aW9uIHRvIHRoZSBpZGxlIHN0YXRlIGlmIHRoZQotICogIGFsbG9jYXRpb24gaXMgc3VjY2Vzc2Z1bC4gIElmIHRoZSBjb21wb25lbnQgY2Fubm90IHN1Y2Nlc3NmdWxseQotICogIHRyYW5zaXRpb24gdG8gdGhlIGlkbGUgc3RhdGUgZm9yIGFueSByZWFzb24sIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50Ci0gKiAgc2hhbGwgYmUgZnVsbHkgcm9sbGVkIGJhY2sgdG8gdGhlIExvYWRlZCBzdGF0ZSAoZS5nLiBhbGwgYWxsb2NhdGVkIAotICogIHJlc291cmNlcyBzaGFsbCBiZSByZWxlYXNlZCkuICBXaGVuIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgdGhlIGNvbW1hbmQKLSAqICB0byBnbyB0byB0aGUgRXhlY3V0aW5nIHN0YXRlLCBpdCBzaGFsbCBiZWdpbiBwcm9jZXNzaW5nIGJ1ZmZlcnMgYnkKLSAqICBzZW5kaW5nIGFsbCBpbnB1dCBidWZmZXJzIGl0IGhvbGRzIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFdoaWxlCi0gKiAgdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgSWRsZSBzdGF0ZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHNlbmQgdGhlCi0gKiAgUGF1c2UgY29tbWFuZC4gIElmIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgdGhlIHBhdXNlIGNvbW1hbmQgd2hpbGUgaW4gdGhlCi0gKiAgSWRsZSBzdGF0ZSwgdGhlIGNvbXBvbmVudCBzaGFsbCBzZW5kIGFsbCBpbnB1dCBidWZmZXJzIGl0IGhvbGRzIHRvIHRoZSAKLSAqICBhcHBsaWNhdGlvbiwgYnV0IHNoYWxsIG5vdCBiZWdpbiBwcm9jZXNzaW5nIGJ1ZmZlcnMuICBUaGlzIHdpbGwgYWxsb3cgdGhlCi0gKiAgYXBwbGljYXRpb24gdG8gcHJlZmlsbCBidWZmZXJzLgotICogCi0gKiAgQGluZ3JvdXAgY29tcAotICovCi0KLXR5cGVkZWYgZW51bSBPTVhfU1RBVEVUWVBFCi17Ci0gICAgT01YX1N0YXRlSW52YWxpZCwgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgdGhhdCBpdCdzIGludGVybmFsIGRhdGEgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgYXJlIGNvcnJ1cHRlZCB0byB0aGUgcG9pbnQgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBjYW5ub3QgZGV0ZXJtaW5lIGl0J3Mgc3RhdGUgcHJvcGVybHkgKi8KLSAgICBPTVhfU3RhdGVMb2FkZWQsICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGJlZW4gbG9hZGVkIGJ1dCBoYXMgbm90IGNvbXBsZXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbi4gIFRoZSBPTVhfU2V0UGFyYW1ldGVyIG1hY3JvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgT01YX0dldFBhcmFtZXRlciBtYWNybyBhcmUgdGhlIG9ubHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIG1hY3JvcyBhbGxvd2VkIHRvIGJlIHNlbnQgdG8gdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gdGhpcyBzdGF0ZS4gKi8KLSAgICBPTVhfU3RhdGVJZGxlLCAgICAgICAgLyoqPCBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gaGFzIGJlZW4gY29tcGxldGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGNvbXBvbmVudCBpcyByZWFkeSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFydC4gKi8KLSAgICBPTVhfU3RhdGVFeGVjdXRpbmcsICAgLyoqPCBjb21wb25lbnQgaGFzIGFjY2VwdGVkIHRoZSBzdGFydCBjb21tYW5kIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBwcm9jZXNzaW5nIGRhdGEgKGlmIGRhdGEgaXMgYXZhaWxhYmxlKSAqLwotICAgIE9NWF9TdGF0ZVBhdXNlLCAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgcmVjZWl2ZWQgcGF1c2UgY29tbWFuZCAqLwotICAgIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMsIC8qKjwgY29tcG9uZW50IGlzIHdhaXRpbmcgZm9yIHJlc291cmNlcywgZWl0aGVyIGFmdGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVlbXB0aW9uIG9yIGJlZm9yZSBpdCBnZXRzIHRoZSByZXNvdXJjZXMgcmVxdWVzdGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgc3BlY2lmaWNhdGlvbiBmb3IgY29tcGxldGUgZGV0YWlscy4gKi8KLSAgICBPTVhfU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1N0YXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfU3RhdGVNYXggPSAwWDdGRkZGRkZGCi19IE9NWF9TVEFURVRZUEU7Ci0KLS8qKiBUaGUgT01YX0VSUk9SVFlQRSBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBzdGFuZGFyZCBPTVggRXJyb3JzLiAgVGhlc2UgCi0gKiAgZXJyb3JzIHNob3VsZCBjb3ZlciBtb3N0IG9mIHRoZSBjb21tb24gZmFpbHVyZSBjYXNlcy4gIEhvd2V2ZXIsIAotICogIHZlbmRvcnMgYXJlIGZyZWUgdG8gYWRkIGFkZGl0aW9uYWwgZXJyb3IgbWVzc2FnZXMgb2YgdGhlaXIgb3duIGFzIAotICogIGxvbmcgYXMgdGhleSBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0gKiAgMS4gIFZlbmRvciBlcnJvciBtZXNzYWdlcyBzaGFsbCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMHg5MDAwMDAwMCB0bwotICogICAgICAweDkwMDBGRkZGLgotICogIDIuICBWZW5kb3IgZXJyb3IgbWVzc2FnZXMgc2hhbGwgYmUgZGVmaW5lZCBpbiBhIGhlYWRlciBmaWxlIHByb3ZpZGVkCi0gKiAgICAgIHdpdGggdGhlIGNvbXBvbmVudC4gIE5vIGVycm9yIG1lc3NhZ2VzIGFyZSBhbGxvd2VkIHRoYXQgYXJlCi0gKiAgICAgIG5vdCBkZWZpbmVkLgotICovCi10eXBlZGVmIGVudW0gT01YX0VSUk9SVFlQRQotewotICBPTVhfRXJyb3JOb25lID0gMCwKLQotICAvKiogVGhlcmUgd2VyZSBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIHRvIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24gKi8KLSAgT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzID0gKE9NWF9TMzIpIDB4ODAwMDEwMDAsCi0KLSAgLyoqIFRoZXJlIHdhcyBhbiBlcnJvciwgYnV0IHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgY291bGQgbm90IGJlIGRldGVybWluZWQgKi8KLSAgT01YX0Vycm9yVW5kZWZpbmVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMDEsCi0KLSAgLyoqIFRoZSBjb21wb25lbnQgbmFtZSBzdHJpbmcgd2FzIG5vdCB2YWxpZCAqLwotICBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZSA9IChPTVhfUzMyKSAweDgwMDAxMDAyLAotCi0gIC8qKiBObyBjb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgc3RyaW5nIHdhcyBmb3VuZCAqLwotICBPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZCA9IChPTVhfUzMyKSAweDgwMDAxMDAzLAotCi0gIC8qKiBUaGUgY29tcG9uZW50IHNwZWNpZmllZCBkaWQgbm90IGhhdmUgYSAiT01YX0NvbXBvbmVudEluaXQiIG9yCi0gICAgICAiT01YX0NvbXBvbmVudERlSW5pdCBlbnRyeSBwb2ludCAqLwotICBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50ID0gKE9NWF9TMzIpIDB4ODAwMDEwMDQsCi0KLSAgLyoqIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgd2VyZSBub3QgdmFsaWQgKi8KLSAgT01YX0Vycm9yQmFkUGFyYW1ldGVyID0gKE9NWF9TMzIpIDB4ODAwMDEwMDUsCi0KLSAgLyoqIFRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkICovCi0gIE9NWF9FcnJvck5vdEltcGxlbWVudGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMDYsCi0KLSAgLyoqIFRoZSBidWZmZXIgd2FzIGVtcHRpZWQgYmVmb3JlIHRoZSBuZXh0IGJ1ZmZlciB3YXMgcmVhZHkgKi8KLSAgT01YX0Vycm9yVW5kZXJmbG93ID0gKE9NWF9TMzIpIDB4ODAwMDEwMDcsCi0KLSAgLyoqIFRoZSBidWZmZXIgd2FzIG5vdCBhdmFpbGFibGUgd2hlbiBpdCB3YXMgbmVlZGVkICovCi0gIE9NWF9FcnJvck92ZXJmbG93ID0gKE9NWF9TMzIpIDB4ODAwMDEwMDgsCi0KLSAgLyoqIFRoZSBoYXJkd2FyZSBmYWlsZWQgdG8gcmVzcG9uZCBhcyBleHBlY3RlZCAqLwotICBPTVhfRXJyb3JIYXJkd2FyZSA9IChPTVhfUzMyKSAweDgwMDAxMDA5LAotCi0gIC8qKiBUaGUgY29tcG9uZW50IGlzIGluIHRoZSBzdGF0ZSBPTVhfU3RhdGVJbnZhbGlkICovCi0gIE9NWF9FcnJvckludmFsaWRTdGF0ZSA9IChPTVhfUzMyKSAweDgwMDAxMDBBLAotCi0gIC8qKiBTdHJlYW0gaXMgZm91bmQgdG8gYmUgY29ycnVwdCAqLwotICBPTVhfRXJyb3JTdHJlYW1Db3JydXB0ID0gKE9NWF9TMzIpIDB4ODAwMDEwMEIsCi0KLSAgLyoqIFBvcnRzIGJlaW5nIGNvbm5lY3RlZCBhcmUgbm90IGNvbXBhdGlibGUgKi8KLSAgT01YX0Vycm9yUG9ydHNOb3RDb21wYXRpYmxlID0gKE9NWF9TMzIpIDB4ODAwMDEwMEMsCi0KLSAgLyoqIFJlc291cmNlcyBhbGxvY2F0ZWQgdG8gYW4gaWRsZSBjb21wb25lbnQgaGF2ZSBiZWVuCi0gICAgICBsb3N0IHJlc3VsdGluZyBpbiB0aGUgY29tcG9uZW50IHJldHVybmluZyB0byB0aGUgbG9hZGVkIHN0YXRlICovCi0gIE9NWF9FcnJvclJlc291cmNlc0xvc3QgPSAoT01YX1MzMikgMHg4MDAwMTAwRCwKLQotICAvKiogTm8gbW9yZSBpbmRpY2llcyBjYW4gYmUgZW51bWVyYXRlZCAqLwotICBPTVhfRXJyb3JOb01vcmUgPSAoT01YX1MzMikgMHg4MDAwMTAwRSwKLQotICAvKiogVGhlIGNvbXBvbmVudCBkZXRlY3RlZCBhIHZlcnNpb24gbWlzbWF0Y2ggKi8KLSAgT01YX0Vycm9yVmVyc2lvbk1pc21hdGNoID0gKE9NWF9TMzIpIDB4ODAwMDEwMEYsCi0KLSAgLyoqIFRoZSBjb21wb25lbnQgaXMgbm90IHJlYWR5IHRvIHJldHVybiBkYXRhIGF0IHRoaXMgdGltZSAqLwotICBPTVhfRXJyb3JOb3RSZWFkeSA9IChPTVhfUzMyKSAweDgwMDAxMDEwLAotCi0gIC8qKiBUaGVyZSB3YXMgYSB0aW1lb3V0IHRoYXQgb2NjdXJyZWQgKi8KLSAgT01YX0Vycm9yVGltZW91dCA9IChPTVhfUzMyKSAweDgwMDAxMDExLAotCi0gIC8qKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIHRyeWluZyB0byB0cmFuc2l0aW9uIGludG8gdGhlIHN0YXRlIHlvdSBhcmUgYWxyZWFkeSBpbiAqLwotICBPTVhfRXJyb3JTYW1lU3RhdGUgPSAoT01YX1MzMikgMHg4MDAwMTAxMiwKLQotICAvKiogUmVzb3VyY2VzIGFsbG9jYXRlZCB0byBhbiBleGVjdXRpbmcgb3IgcGF1c2VkIGNvbXBvbmVudCBoYXZlIGJlZW4gCi0gICAgICBwcmVlbXB0ZWQsIGNhdXNpbmcgdGhlIGNvbXBvbmVudCB0byByZXR1cm4gdG8gdGhlIGlkbGUgc3RhdGUgKi8KLSAgT01YX0Vycm9yUmVzb3VyY2VzUHJlZW1wdGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMTMsIAotCi0gIC8qKiBBIG5vbi1zdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spIAotICAgICAgZHVyaW5nIHRoZSBhbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgKG9uIGEgdHJhbnNpdGlvbiBmcm9tIHRoZSBMT0FERUQgdG8gdGhlIElETEUgc3RhdGUgb3IKLSAgICAgIG9uIGEgcG9ydCByZXN0YXJ0KSB3aGVuIGl0IGRlZW1zIHRoYXQgaXQgaGFzIHdhaXRlZCBhbiB1bnVzdWFsbHkgbG9uZyB0aW1lIGZvciB0aGUgc3VwcGxpZXIgCi0gICAgICB0byBzZW5kIGl0IGFuIGFsbG9jYXRlZCBidWZmZXIgdmlhIGEgVXNlQnVmZmVyIGNhbGwuICovCi0gIE9NWF9FcnJvclBvcnRVbnJlc3BvbnNpdmVEdXJpbmdBbGxvY2F0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTQsCi0KLSAgLyoqIEEgbm9uLXN1cHBsaWVyIHBvcnQgc2VuZHMgdGhpcyBlcnJvciB0byB0aGUgSUwgY2xpZW50ICh2aWEgdGhlIEV2ZW50SGFuZGxlciBjYWxsYmFjaykgCi0gICAgICBkdXJpbmcgdGhlIGRlYWxsb2NhdGlvbiBvZiBidWZmZXJzIChvbiBhIHRyYW5zaXRpb24gZnJvbSB0aGUgSURMRSB0byBMT0FERUQgc3RhdGUgb3IgCi0gICAgICBvbiBhIHBvcnQgc3RvcCkgd2hlbiBpdCBkZWVtcyB0aGF0IGl0IGhhcyB3YWl0ZWQgYW4gdW51c3VhbGx5IGxvbmcgdGltZSBmb3IgdGhlIHN1cHBsaWVyIAotICAgICAgdG8gcmVxdWVzdCB0aGUgZGVhbGxvY2F0aW9uIG9mIGEgYnVmZmVyIGhlYWRlciB2aWEgYSBGcmVlQnVmZmVyIGNhbGwuICovCi0gIE9NWF9FcnJvclBvcnRVbnJlc3BvbnNpdmVEdXJpbmdEZWFsbG9jYXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxNSwKLQotICAvKiogQSBzdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spIAotICAgICAgZHVyaW5nIHRoZSBzdG9wcGluZyBvZiBhIHBvcnQgKGVpdGhlciBvbiBhIHRyYW5zaXRpb24gZnJvbSB0aGUgSURMRSB0byBMT0FERUQgCi0gICAgICBzdGF0ZSBvciBhIHBvcnQgc3RvcCkgd2hlbiBpdCBkZWVtcyB0aGF0IGl0IGhhcyB3YWl0ZWQgYW4gdW51c3VhbGx5IGxvbmcgdGltZSBmb3IgCi0gICAgICB0aGUgbm9uLXN1cHBsaWVyIHRvIHJldHVybiBhIGJ1ZmZlciB2aWEgYW4gRW1wdHlUaGlzQnVmZmVyIG9yIEZpbGxUaGlzQnVmZmVyIGNhbGwuICovCi0gIE9NWF9FcnJvclBvcnRVbnJlc3BvbnNpdmVEdXJpbmdTdG9wID0gKE9NWF9TMzIpIDB4ODAwMDEwMTYsCi0KLSAgLyoqIEF0dGVtcHRpbmcgYSBzdGF0ZSB0cmFuc3Rpb24gdGhhdCBpcyBub3QgYWxsb3dlZCAqLwotICBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxNywKLQotICAvKiBBdHRlbXB0aW5nIGEgY29tbWFuZCB0aGF0IGlzIG5vdCBhbGxvd2VkIGR1cmluZyB0aGUgcHJlc2VudCBzdGF0ZS4gKi8KLSAgT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxOCwgCi0KLSAgLyoqIFRoZSB2YWx1ZXMgZW5jYXBzdWxhdGVkIGluIHRoZSBwYXJhbWV0ZXIgb3IgY29uZmlnIHN0cnVjdHVyZSBhcmUgbm90IHN1cHBvcnRlZC4gKi8KLSAgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nID0gKE9NWF9TMzIpIDB4ODAwMDEwMTksCi0KLSAgLyoqIFRoZSBwYXJhbWV0ZXIgb3IgY29uZmlnIGluZGljYXRlZCBieSB0aGUgZ2l2ZW4gaW5kZXggaXMgbm90IHN1cHBvcnRlZC4gKi8KLSAgT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleCA9IChPTVhfUzMyKSAweDgwMDAxMDFBLAotCi0gIC8qKiBUaGUgcG9ydCBpbmRleCBzdXBwbGllZCBpcyBpbmNvcnJlY3QuICovCi0gIE9NWF9FcnJvckJhZFBvcnRJbmRleCA9IChPTVhfUzMyKSAweDgwMDAxMDFCLAotCi0gIC8qKiBUaGUgcG9ydCBoYXMgbG9zdCBvbmUgb3IgbW9yZSBvZiBpdHMgYnVmZmVycyBhbmQgaXQgdGh1cyB1bnBvcHVsYXRlZC4gKi8KLSAgT01YX0Vycm9yUG9ydFVucG9wdWxhdGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMUMsCi0KLSAgLyoqIENvbXBvbmVudCBzdXNwZW5kZWQgZHVlIHRvIHRlbXBvcmFyeSBsb3NzIG9mIHJlc291cmNlcyAqLwotICBPTVhfRXJyb3JDb21wb25lbnRTdXNwZW5kZWQgPSAoT01YX1MzMikgMHg4MDAwMTAxRCwKLQotICAvKiogQ29tcG9uZW50IHN1c3BlbmRlZCBkdWUgdG8gYW4gaW5hYmlsaXR5IHRvIGFjcXVpcmUgZHluYW1pYyByZXNvdXJjZXMgKi8KLSAgT01YX0Vycm9yRHluYW1pY1Jlc291cmNlc1VuYXZhaWxhYmxlID0gKE9NWF9TMzIpIDB4ODAwMDEwMUUsCi0KLSAgLyoqIFdoZW4gdGhlIG1hY3JvYmxvY2sgZXJyb3IgcmVwb3J0aW5nIGlzIGVuYWJsZWQgdGhlIGNvbXBvbmVudCByZXR1cm5zIG5ldyBlcnJvciAKLSAgZm9yIGV2ZXJ5IGZyYW1lIHRoYXQgaGFzIGVycm9ycyAqLwotICBPTVhfRXJyb3JNYkVycm9yc0luRnJhbWUgPSAoT01YX1MzMikgMHg4MDAwMTAxRiwKLQotICAvKiogQSBjb21wb25lbnQgcmVwb3J0cyB0aGlzIGVycm9yIHdoZW4gaXQgY2Fubm90IHBhcnNlIG9yIGRldGVybWluZSB0aGUgZm9ybWF0IG9mIGFuIGlucHV0IHN0cmVhbS4gKi8KLSAgT01YX0Vycm9yRm9ybWF0Tm90RGV0ZWN0ZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMCwgCi0KLSAgLyoqIFRoZSBjb250ZW50IG9wZW4gb3BlcmF0aW9uIGZhaWxlZC4gKi8KLSAgT01YX0Vycm9yQ29udGVudFBpcGVPcGVuRmFpbGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjEsCi0KLSAgLyoqIFRoZSBjb250ZW50IGNyZWF0aW9uIG9wZXJhdGlvbiBmYWlsZWQuICovCi0gIE9NWF9FcnJvckNvbnRlbnRQaXBlQ3JlYXRpb25GYWlsZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMiwKLQotICAvKiogU2VwYXJhdGUgdGFibGUgaW5mb3JtYXRpb24gaXMgYmVpbmcgdXNlZCAqLwotICBPTVhfRXJyb3JTZXBlcmF0ZVRhYmxlc1VzZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMywKLQotICAvKiogVHVubmVsaW5nIGlzIHVuc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQqLwotICBPTVhfRXJyb3JUdW5uZWxpbmdVbnN1cHBvcnRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDI0LAotCi0gIE9NWF9FcnJvcktocm9ub3NFeHRlbnNpb25zID0gKE9NWF9TMzIpMHg4RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgT01YX0Vycm9yVmVuZG9yU3RhcnRVbnVzZWQgPSAoT01YX1MzMikweDkwMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgT01YX0Vycm9yTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRVJST1JUWVBFOwotCi0vKiogQGluZ3JvdXAgY29yZSAqLwotdHlwZWRlZiBPTVhfRVJST1JUWVBFICgqIE9NWF9DT01QT05FTlRJTklUVFlQRSkoT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKLQotLyoqIEBpbmdyb3VwIGNvcmUgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT01QT05FTlRSRUdJU1RFUlRZUEUKLXsKLSAgY29uc3QgY2hhciAgICAgICAgICAqIHBOYW1lOyAgICAgICAvKiBDb21wb25lbnQgbmFtZSwgMTI4IGJ5dGUgbGltaXQgKGluY2x1ZGluZyAnXDAnKSBhcHBsaWVzICovCi0gIE9NWF9DT01QT05FTlRJTklUVFlQRSBwSW5pdGlhbGl6ZTsgLyogQ29tcG9uZW50IGluc3RhbmNlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uICovCi19IE9NWF9DT01QT05FTlRSRUdJU1RFUlRZUEU7Ci0KLS8qKiBAaW5ncm91cCBjb3JlICovCi1leHRlcm4gT01YX0NPTVBPTkVOVFJFR0lTVEVSVFlQRSBPTVhfQ29tcG9uZW50UmVnaXN0ZXJlZFtdOwotCi0vKiogQGluZ3JvdXAgcnBtICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUFJJT1JJVFlNR01UVFlQRSB7Ci0gT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSBPTVhfVTMyIG5Hcm91cFByaW9yaXR5OyAgICAgICAgICAgIC8qKjwgUHJpb3JpdHkgb2YgdGhlIGNvbXBvbmVudCBncm91cCAqLwotIE9NWF9VMzIgbkdyb3VwSUQ7ICAgICAgICAgICAgICAgICAgLyoqPCBJRCBvZiB0aGUgY29tcG9uZW50IGdyb3VwICovCi19IE9NWF9QUklPUklUWU1HTVRUWVBFOwotCi0vKiBDb21wb25lbnQgbmFtZSBhbmQgUm9sZSBuYW1lcyBhcmUgbGltaXRlZCB0byAxMjggY2hhcmFjdGVycyBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nICdcMCcuICovCi0jZGVmaW5lIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIDEyOAotCi0vKiogQGluZ3JvdXAgY29tcCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1U4IGNSb2xlW09NWF9NQVhfU1RSSU5HTkFNRV9TSVpFXTsgIC8qKjwgbmFtZSBvZiBzdGFuZGFyZCBjb21wb25lbnQgd2hpY2ggZGVmaW5lcyBjb21wb25lbnQgcm9sZSAqLwotfSBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEU7Ci0KLS8qKiBFbmQgb2YgU3RyZWFtIEJ1ZmZlciBGbGFnOiAKLSAgKgotICAqIEEgY29tcG9uZW50IHNldHMgRU9TIHdoZW4gaXQgaGFzIG5vIG1vcmUgZGF0YSB0byBlbWl0IG9uIGEgcGFydGljdWxhciAKLSAgKiBvdXRwdXQgcG9ydC4gVGh1cyBhbiBvdXRwdXQgcG9ydCBzaGFsbCBzZXQgRU9TIG9uIHRoZSBsYXN0IGJ1ZmZlciBpdCAKLSAgKiBlbWl0cy4gQSBjb21wb25lbnQncyBkZXRlcm1pbmF0aW9uIG9mIHdoZW4gYW4gb3V0cHV0IHBvcnQgc2hvdWxkIAotICAqIGNlYXNlIHNlbmRpbmcgZGF0YSBpcyBpbXBsZW1lbmF0aW9uIHNwZWNpZmljLgotICAqIEBpbmdyb3VwIGJ1ZgotICAqLwotCi0jZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0VPUyAweDAwMDAwMDAxIAotCi0vKiogU3RhcnQgVGltZSBCdWZmZXIgRmxhZzogCi0gKgotICogVGhlIHNvdXJjZSBvZiBhIHN0cmVhbSAoZS5nLiBhIGRlbXV4IGNvbXBvbmVudCkgc2V0cyB0aGUgU1RBUlRUSU1FCi0gKiBmbGFnIG9uIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgc3RhcnRpbmcgdGltZXN0YW1wIGZvciB0aGUKLSAqIHN0cmVhbS4gVGhlIHN0YXJ0aW5nIHRpbWVzdGFtcCBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgZGF0YSB0aGF0Ci0gKiBzaG91bGQgYmUgZGlzcGxheWVkIGF0IHN0YXJ0dXAgb3IgYWZ0ZXIgYSBzZWVrLgotICogVGhlIGZpcnN0IHRpbWVzdGFtcCBvZiB0aGUgc3RyZWFtIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc3RhcnQgdGltZS4KLSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGNhc2Ugb2YgYSBzZWVrIHRvIGEgcGFydGljdWxhciB2aWRlbyBmcmFtZSwgCi0gKiB0aGUgdGFyZ2V0IGZyYW1lIG1heSBiZSBhbiBpbnRlcmZyYW1lLiBUaHVzIHRoZSBmaXJzdCBidWZmZXIgb2YgCi0gKiB0aGUgc3RyZWFtIHdpbGwgYmUgdGhlIGludHJhLWZyYW1lIHByZWNlZGluZyB0aGUgdGFyZ2V0IGZyYW1lIGFuZAotICogdGhlIHN0YXJ0dGltZSB3aWxsIG9jY3VyIHdpdGggdGhlIHRhcmdldCBmcmFtZSAod2l0aCBhbnkgb3RoZXIKLSAqIHJlcXVpcmVkIGZyYW1lcyByZXF1aXJlZCB0byByZWNvbnN0cnVjdCB0aGUgdGFyZ2V0IGludGVydmVuaW5nKS4KLSAqCi0gKiBUaGUgU1RBUlRUSU1FIGZsYWcgaXMgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIncyAKLSAqIHRpbWVzdGFtcCAnIHRodXMgaXRzIGFzc29jaWF0aW9uIHRvIGJ1ZmZlciBkYXRhIGFuZCBpdHMgCi0gKiBwcm9wYWdhdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIHRpbWVzdGFtcCdzLgotICoKLSAqIFdoZW4gYSBTeW5jIENvbXBvbmVudCBjbGllbnQgcmVjZWl2ZXMgYSBidWZmZXIgd2l0aCB0aGUgCi0gKiBTVEFSVFRJTUUgZmxhZyBpdCBzaGFsbCBwZXJmb3JtIGEgU2V0Q29uZmlnIG9uIGl0cyBzeW5jIHBvcnQgCi0gKiB1c2luZyBPTVhfQ29uZmlnVGltZUNsaWVudFN0YXJ0VGltZSBhbmQgcGFzc2luZyB0aGUgYnVmZmVyJ3MKLSAqIHRpbWVzdGFtcC4KLSAqIAotICogQGluZ3JvdXAgYnVmCi0gKi8KLQotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19TVEFSVFRJTUUgMHgwMDAwMDAwMgotCi0gCi0KLS8qKiBEZWNvZGUgT25seSBCdWZmZXIgRmxhZzogCi0gKgotICogVGhlIHNvdXJjZSBvZiBhIHN0cmVhbSAoZS5nLiBhIGRlbXV4IGNvbXBvbmVudCkgc2V0cyB0aGUgREVDT0RFT05MWQotICogZmxhZyBvbiBhbnkgYnVmZmVyIHRoYXQgc2hvdWxkIHNoYWxsIGJlIGRlY29kZWQgYnV0IHNob3VsZCBub3QgYmUKLSAqIGRpc3BsYXllZC4gVGhpcyBmbGFnIGlzIHVzZWQsIGZvciBpbnN0YW5jZSwgd2hlbiBhIHNvdXJjZSBzZWVrcyB0byAKLSAqIGEgdGFyZ2V0IGludGVyZnJhbWUgdGhhdCByZXF1aXJlcyB0aGUgZGVjb2RlIG9mIGZyYW1lcyBwcmVjZWRpbmcgdGhlIAotICogdGFyZ2V0IHRvIGZhY2lsaXRhdGUgdGhlIHRhcmdldCdzIHJlY29uc3RydWN0aW9uLiBJbiB0aGlzIGNhc2UgdGhlIAotICogc291cmNlIHdvdWxkIGVtaXQgdGhlIGZyYW1lcyBwcmVjZWRpbmcgdGhlIHRhcmdldCBkb3duc3RyZWFtIAotICogYnV0IG1hcmsgdGhlbSBhcyBkZWNvZGUgb25seS4KLSAqCi0gKiBUaGUgREVDT0RFT05MWSBpcyBhc3NvY2lhdGVkIHdpdGggYnVmZmVyIGRhdGEgYW5kIHByb3BhZ2F0ZWQgaW4gYSAKLSAqIG1hbm5lciBpZGVudGljYWwgdG8gdGhlIGJ1ZmZlciB0aW1lc3RhbXAuCi0gKgotICogQSBjb21wb25lbnQgdGhhdCByZW5kZXJzIGRhdGEgc2hvdWxkIGlnbm9yZSBhbGwgYnVmZmVycyB3aXRoIAotICogdGhlIERFQ09ERU9OTFkgZmxhZyBzZXQuCi0gKiAKLSAqIEBpbmdyb3VwIGJ1ZgotICovCi0KLSNkZWZpbmUgT01YX0JVRkZFUkZMQUdfREVDT0RFT05MWSAweDAwMDAwMDA0Ci0KLQotLyogRGF0YSBDb3JydXB0IEZsYWc6IFRoaXMgZmxhZyBpcyBzZXQgd2hlbiB0aGUgSUwgY2xpZW50IGJlbGlldmVzIHRoZSBkYXRhIGluIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBpcyBjb3JydXB0IAotICogQGluZ3JvdXAgYnVmCi0gKi8KLQotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19EQVRBQ09SUlVQVCAweDAwMDAwMDA4Ci0KLS8qIEVuZCBvZiBGcmFtZTogVGhlIGJ1ZmZlciBjb250YWlucyBleGFjdGx5IG9uZSBlbmQgb2YgZnJhbWUgYW5kIG5vIGRhdGEKLSAqICBvY2N1cnMgYWZ0ZXIgdGhlIGVuZCBvZiBmcmFtZS4gVGhpcyBmbGFnIGlzIGFuIG9wdGlvbmFsIGhpbnQuIFRoZSBhYnNlbmNlCi0gKiAgb2YgdGhpcyBmbGFnIGRvZXMgbm90IGltcGx5IHRoZSBhYnNlbmNlIG9mIGFuIGVuZCBvZiBmcmFtZSB3aXRoaW4gdGhlIGJ1ZmZlci4gCi0gKiBAaW5ncm91cCBidWYKLSovCi0jZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUgMHgwMDAwMDAxMAotCi0vKiBTeW5jIEZyYW1lIEZsYWc6IFRoaXMgZmxhZyBpcyBzZXQgd2hlbiB0aGUgYnVmZmVyIGNvbnRlbnQgY29udGFpbnMgYSBjb2RlZCBzeW5jIGZyYW1lICcgCi0gKiAgYSBmcmFtZSB0aGF0IGhhcyBubyBkZXBlbmRlbmN5IG9uIGFueSBvdGhlciBmcmFtZSBpbmZvcm1hdGlvbiAKLSAqICBAaW5ncm91cCBidWYKLSAqLwotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19TWU5DRlJBTUUgMHgwMDAwMDAyMAotCi0vKiBFeHRyYSBkYXRhIHByZXNlbnQgZmxhZzogdGhlcmUgaXMgZXh0cmEgZGF0YSBhcHBlbmRlZCB0byB0aGUgZGF0YSBzdHJlYW0KLSAqIHJlc2lkaW5nIGluIHRoZSBidWZmZXIgCi0gKiBAaW5ncm91cCBidWYgIAotICovCi0jZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0VYVFJBREFUQSAweDAwMDAwMDQwCi0KLS8qKiBDb2RlYyBDb25maWcgQnVmZmVyIEZsYWc6IAotKiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRyBpcyBhbiBvcHRpb25hbCBmbGFnIHRoYXQgaXMgc2V0IGJ5IGFuCi0qIG91dHB1dCBwb3J0IHdoZW4gYWxsIGJ5dGVzIGluIHRoZSBidWZmZXIgZm9ybSBwYXJ0IG9yIGFsbCBvZiBhIHNldCBvZgotKiBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGRhdGEuICBFeGFtcGxlcyBpbmNsdWRlIFNQUy9QUFMgbmFsIHVuaXRzCi0qIGZvciBPTVhfVklERU9fQ29kaW5nQVZDIG9yIEF1ZGlvU3BlY2lmaWNDb25maWcgZGF0YSBmb3IKLSogT01YX0FVRElPX0NvZGluZ0FBQy4gIEFueSBjb21wb25lbnQgdGhhdCBmb3IgYSBnaXZlbiBzdHJlYW0gc2V0cyAKLSogT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgc2hhbGwgbm90IG1peCBjb2RlYyBjb25maWd1cmF0aW9uIGJ5dGVzCi0qIHdpdGggZnJhbWUgZGF0YSBpbiB0aGUgc2FtZSBidWZmZXIsIGFuZCBzaGFsbCBzZW5kIGFsbCBidWZmZXJzCi0qIGNvbnRhaW5pbmcgY29kZWMgY29uZmlndXJhdGlvbiBieXRlcyBiZWZvcmUgYW55IGJ1ZmZlcnMgY29udGFpbmluZwotKiBmcmFtZSBkYXRhIHRoYXQgdGhvc2UgY29uZmlndXJhdGlvbnMgYnl0ZXMgZGVzY3JpYmUuCi0qIElmIHRoZSBzdHJlYW0gZm9ybWF0IGZvciBhIHBhcnRpY3VsYXIgY29kZWMgaGFzIGEgZnJhbWUgc3BlY2lmaWMKLSogaGVhZGVyIGF0IHRoZSBzdGFydCBvZiBlYWNoIGZyYW1lLCBmb3IgZXhhbXBsZSBPTVhfQVVESU9fQ29kaW5nTVAzIG9yCi0qIE9NWF9BVURJT19Db2RpbmdBQUMgaW4gQURUUyBtb2RlLCB0aGVuIHRoZXNlIHNoYWxsIGJlIHByZXNlbnRlZCBhcwotKiBub3JtYWwgd2l0aG91dCBzZXR0aW5nIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHLgotICogQGluZ3JvdXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgMHgwMDAwMDA4MAotCi0vKgotKiBPTVhfQlVGRkVSRkxBR19SRUFET05MWTogVGhpcyBmbGFnIGlzIHNldCB3aGVuIGEgY29tcG9uZW50IGVtaXR0aW5nIHRoZQotKiBidWZmZXIgb24gYW4gb3V0cHV0IHBvcnQgb3IgdGhlIElMIGNsaWVudCB3aXNoZXMgdG8gaWRlbnRpZnkgdGhlIGJ1ZmZlcgotKiBwYXlsb2FkIGNvbnRlbnRzIHRvIGJlIHJlYWQtb25seS4gQW4gSUwgY2xpZW50IG9yIGFuIGlucHV0IHBvcnQKLSogc2hhbGwgbm90IGFsdGVyIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyLiBUaGlzIGZsYWcgc2hhbGwgb25seSBiZQotKiBjbGVhcmVkIGJ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBidWZmZXIgd2hlbiB0aGUgYnVmZmVyIGlzIHJldHVybmVkLgotKiBGb3IgdHVubmVsZWQgcG9ydHMsIHRoZSB1c2FnZSBvZiB0aGlzIGZsYWcgc2hhbGwgYmUgYWxsb3dlZCBvbmx5IGlmIHRoZQotKiBjb21wb25lbnRzIG5lZ290aWF0ZWQgYSByZWFkLW9ubHkgdHVubmVsCi0qLwotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19SRUFET05MWSAweDAwMDAwMjAwCi0KLS8qKiBAaW5ncm91cCBidWYgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9CVUZGRVJIRUFERVJUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VOCogcEJ1ZmZlcjsgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gYWN0dWFsIGJsb2NrIG9mIG1lbW9yeSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGlzIGFjdGluZyBhcyB0aGUgYnVmZmVyICovCi0gICAgT01YX1UzMiBuQWxsb2NMZW47ICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCwgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVTMyIG5GaWxsZWRMZW47ICAgICAgICAgLyoqPCBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGluIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKi8KLSAgICBPTVhfVTMyIG5PZmZzZXQ7ICAgICAgICAgICAgLyoqPCBzdGFydCBvZmZzZXQgb2YgdmFsaWQgZGF0YSBpbiBieXRlcyBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KLSAgICBPTVhfUFRSIHBBcHBQcml2YXRlOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCi0gICAgT01YX1BUUiBwUGxhdGZvcm1Qcml2YXRlOyAgIC8qKjwgcG9pbnRlciB0byBhbnkgZGF0YSB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50cyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJ1ZmZlciAqLyAKLSAgICBPTVhfUFRSIHBJbnB1dFBvcnRQcml2YXRlOyAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBpbnB1dCBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudHMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBidWZmZXIgKi8KLSAgICBPTVhfUFRSIHBPdXRwdXRQb3J0UHJpdmF0ZTsgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBvdXRwdXQgcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCi0gICAgT01YX0hBTkRMRVRZUEUgaE1hcmtUYXJnZXRDb21wb25lbnQ7IC8qKjwgVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwgZ2VuZXJhdGUgYSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrIGV2ZW50IHVwb24gcHJvY2Vzc2luZyB0aGlzIGJ1ZmZlci4gKi8KLSAgICBPTVhfUFRSIHBNYXJrRGF0YTsgICAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIGFzc29jaWF0ZWQgd2l0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFyayBzZW50IG9uIGEgbWFyayBldmVudCB0byBkaXNhbWJpZ3VhdGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYXJrIGZyb20gb3RoZXJzLiAqLwotICAgIE9NWF9VMzIgblRpY2tDb3VudDsgICAgICAgICAvKio8IE9wdGlvbmFsIGVudHJ5IHRoYXQgdGhlIGNvbXBvbmVudCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gdXBkYXRlIHdpdGggYSB0aWNrIGNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGV5IGFjY2VzcyB0aGUgY29tcG9uZW50LiAgVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSBpbiBtaWNyb3NlY29uZHMuICBTaW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgYSB2YWx1ZSByZWxhdGl2ZSB0byBhbiBhcmJpdHJhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBwb2ludCwgdGhpcyB2YWx1ZSBjYW5ub3QgYmUgdXNlZCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZXRlcm1pbmUgYWJzb2x1dGUgdGltZS4gIFRoaXMgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBlbnRyeSBhbmQgbm90IGFsbCBjb21wb25lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCB1cGRhdGUgaXQuKi8KLSBPTVhfVElDS1MgblRpbWVTdGFtcDsgICAgICAgICAgLyoqPCBUaW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGUgc2FtcGxlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBsb2dpY2FsIHNhbXBsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSBpbiB0aGUgYnVmZmVyLiBUaW1lc3RhbXBzIG9mIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmUgc2FtcGxlcyB3aXRoaW4gdGhlIGJ1ZmZlciBtYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBpbmZlcnJlZCBieSBhZGRpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcHJlY2VkaW5nIGJ1ZmZlciB0byB0aGUgdGltZXN0YW1wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHByZWNlZGluZyBidWZmZXIuKi8KLSAgT01YX1UzMiAgICAgbkZsYWdzOyAgICAgICAgICAgLyoqPCBidWZmZXIgc3BlY2lmaWMgZmxhZ3MgKi8KLSAgT01YX1UzMiBuT3V0cHV0UG9ydEluZGV4OyAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIG91dHB1dCBwb3J0IChpZiBhbnkpIHVzaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYnVmZmVyICovCi0gIE9NWF9VMzIgbklucHV0UG9ydEluZGV4OyAgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBpbnB1dCBwb3J0IChpZiBhbnkpIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBidWZmZXIgKi8KLX0gT01YX0JVRkZFUkhFQURFUlRZUEU7Ci0KLS8qKiBUaGUgT01YX0VYVFJBREFUQVRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBkZWZpbmUgdGhlIAotICogcG9zc2libGUgZXh0cmEgZGF0YSBwYXlsb2FkIHR5cGVzLgotICogTkI6IHRoaXMgZW51bSBpcyBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJldmlvdXMKLSAqIE9NWF9FWFRSQURBVEFfUVVBTlQgZGVmaW5lLiAgVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aAotICogT01YX0V4dHJhRGF0YVF1YW50aXphdGlvbi4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9FWFRSQURBVEFUWVBFCi17Ci0gICBPTVhfRXh0cmFEYXRhTm9uZSA9IDAsICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGljYXRlcyB0aGF0IG5vIG1vcmUgZXh0cmEgZGF0YSBzZWN0aW9ucyBmb2xsb3cgKi8gICAgICAgIAotICAgT01YX0V4dHJhRGF0YVF1YW50aXphdGlvbiwgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgZGF0YSBwYXlsb2FkIGNvbnRhaW5zIHF1YW50aXphdGlvbiBkYXRhICovCi0gICBPTVhfRXh0cmFEYXRhS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgT01YX0V4dHJhRGF0YVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICBPTVhfRXh0cmFEYXRhTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRVhUUkFEQVRBVFlQRTsKLQotCi10eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgICAgIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfRVhUUkFEQVRBVFlQRSBlVHlwZTsgICAgICAgLyogRXh0cmEgRGF0YSB0eXBlICovCi0gICAgT01YX1UzMiBuRGF0YVNpemU7ICAgLyogU2l6ZSBvZiB0aGUgc3VwcG9ydGluZyBkYXRhIHRvIGZvbGxvdyAqLwotICAgIE9NWF9VOCAgZGF0YVsxXTsgICAgIC8qIFN1cHBvcnRpbmcgZGF0YSBoaW50ICAqLwotfSBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRTsKLQotLyoqIEBpbmdyb3VwIGNvbXAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QT1JUX1BBUkFNX1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0czsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBvcnRzIGZvciB0aGlzIGNvbXBvbmVudCAqLwotICAgIE9NWF9VMzIgblN0YXJ0UG9ydE51bWJlcjsgICAvKiogZmlyc3QgcG9ydCBudW1iZXIgZm9yIHRoaXMgdHlwZSBvZiBwb3J0ICovCi19IE9NWF9QT1JUX1BBUkFNX1RZUEU7IAotCi0vKiogQGluZ3JvdXAgY29tcCAqLwotdHlwZWRlZiBlbnVtIE9NWF9FVkVOVFRZUEUKLXsKLSAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgc3VjZXNzZnVsbHkgY29tcGxldGVkIGEgY29tbWFuZCAqLwotICAgIE9NWF9FdmVudEVycm9yLCAgICAgICAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCBhbiBlcnJvciBjb25kaXRpb24gKi8KLSAgICBPTVhfRXZlbnRNYXJrLCAgICAgICAgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYSBidWZmZXIgbWFyayAqLwotICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIC8qKjwgY29tcG9uZW50IGlzIHJlcG9ydGVkIGEgcG9ydCBzZXR0aW5ncyBjaGFuZ2UgKi8KLSAgICBPTVhfRXZlbnRCdWZmZXJGbGFnLCAgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYW4gRU9TICovIAotICAgIE9NWF9FdmVudFJlc291cmNlc0FjcXVpcmVkLCAgIC8qKjwgY29tcG9uZW50IGhhcyBiZWVuIGdyYW50ZWQgcmVzb3VyY2VzIGFuZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBzdGFydGluZyB0aGUgc3RhdGUgY2hhbmdlIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMgdG8gT01YX1N0YXRlSWRsZS4gKi8KLSAgIE9NWF9FdmVudENvbXBvbmVudFJlc3VtZWQsICAgICAvKio8IENvbXBvbmVudCByZXN1bWVkIGR1ZSB0byByZWFjcXVpc2l0aW9uIG9mIHJlc291cmNlcyAqLwotICAgT01YX0V2ZW50RHluYW1pY1Jlc291cmNlc0F2YWlsYWJsZSwgLyoqPCBDb21wb25lbnQgaGFzIGFjcXVpcmVkIHByZXZpb3VzbHkgdW5hdmFpbGFibGUgZHluYW1pYyByZXNvdXJjZXMgKi8KLSAgIE9NWF9FdmVudFBvcnRGb3JtYXREZXRlY3RlZCwgICAgICAvKio8IENvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYSBzdXBwb3J0ZWQgZm9ybWF0LiAqLwotICAgT01YX0V2ZW50S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgT01YX0V2ZW50VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgIE9NWF9FdmVudE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0VWRU5UVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX0NBTExCQUNLVFlQRQotewotICAgIC8qKiBUaGUgRXZlbnRIYW5kbGVyIG1ldGhvZCBpcyB1c2VkIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gd2hlbiBhbgotICAgICAgICBldmVudCBvZiBpbnRlcmVzdCBvY2N1cnMuICBFdmVudHMgYXJlIGRlZmluZWQgaW4gdGhlIE9NWF9FVkVOVFRZUEUKLSAgICAgICAgZW51bWVyYXRpb24uICBQbGVhc2Ugc2VlIHRoYXQgZW51bWVyYXRpb24gZm9yIGRldGFpbHMgb2Ygd2hhdCB3aWxsCi0gICAgICAgIGJlIHJldHVybmVkIGZvciBlYWNoIHR5cGUgb2YgZXZlbnQuIENhbGxiYWNrcyBzaG91bGQgbm90IHJldHVybgotICAgICAgICBhbiBlcnJvciB0byB0aGUgY29tcG9uZW50LCBzbyBpZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBhcHBsaWNhdGlvbiAKLSAgICAgICAgc2hhbGwgaGFuZGxlIGl0IGludGVybmFsbHkuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KLQotICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjIHRvIGF2b2lkCi0gICAgICAgIGJsb2NraW5nIHRoZSBjb21wb25lbnQgZm9yIGFuIGV4Y2Vzc2l2ZWx5IGxvbmcgcGVyaW9kIG9mIHRpbWUuCi0KLSAgICAgICAgQHBhcmFtIGhDb21wb25lbnQKLSAgICAgICAgICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGFjY2Vzcy4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgICAgIEBwYXJhbSBwQXBwRGF0YQotICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2FzIHByb3ZpZGVkIGluIHRoZSAKLSAgICAgICAgICAgIHBBcHBEYXRhIHBhcmFtZXRlciB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICBUaGlzIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgaXMgcHJvdmlkZWQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gCi0gICAgICAgICAgICBjYW4gaGF2ZSBhIGNvbXBvbmVudCBzcGVjaWZpYyBjb250ZXh0IHdoZW4gcmVjZWl2aW5nIHRoZSBjYWxsYmFjay4KLSAgICAgICAgQHBhcmFtIGVFdmVudAotICAgICAgICAgICAgRXZlbnQgdGhhdCB0aGUgY29tcG9uZW50IHdhbnRzIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gYWJvdXQuCi0gICAgICAgIEBwYXJhbSBuRGF0YTEKLSAgICAgICAgICAgIG5EYXRhIHdpbGwgYmUgdGhlIE9NWF9FUlJPUlRZUEUgZm9yIGFuIGVycm9yIGV2ZW50IGFuZCB3aWxsIGJlIAotICAgICAgICAgICAgYW4gT01YX0NPTU1BTkRUWVBFIGZvciBhIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgYW5kIE9NWF9JTkRFWFRZUEUgZm9yIGEgT01YX1BvcnRTZXR0aW5nc0NoYW5nZWQgZXZlbnQuCi0gICAgICAgICBAcGFyYW0gbkRhdGEyCi0gICAgICAgICAgICBuRGF0YTIgd2lsbCBob2xkIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZXZlbnQuIENhbiBiZSBPTVhfU1RBVEVUWVBFIGZvcgotICAgICAgICAgICAgYSBPTVhfQ29tbWFuZFN0YXRlU2V0IGNvbW1hbmQgb3IgcG9ydCBpbmRleCBmb3IgYSBPTVhfUG9ydFNldHRpbmdzQ2hhbmdlZCBldmVudC4KLSAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgMCBpZiBub3QgdXNlZC4gKQotICAgICAgICBAcGFyYW0gcEV2ZW50RGF0YQotICAgICAgICAgICAgUG9pbnRlciB0byBhZGRpdGlvbmFsIGV2ZW50LXNwZWNpZmljIGRhdGEgKHNlZSBzcGVjIGZvciBtZWFuaW5nKS4KLSAgICAgICovCi0KLSAgIE9NWF9FUlJPUlRZUEUgKCpFdmVudEhhbmRsZXIpKAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCi0gICAgICAgIE9NWF9JTiBPTVhfRVZFTlRUWVBFIGVFdmVudCwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGExLAotICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTIsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpOwotCi0gICAgLyoqIFRoZSBFbXB0eUJ1ZmZlckRvbmUgbWV0aG9kIGlzIHVzZWQgdG8gcmV0dXJuIGVtcHRpZWQgYnVmZmVycyBmcm9tIGFuCi0gICAgICAgIGlucHV0IHBvcnQgYmFjayB0byB0aGUgYXBwbGljYXRpb24gZm9yIHJldXNlLiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgCi0gICAgICAgIHNvIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGF0dGVtcHQgdG8gcmVmaWxsIHRoZSBidWZmZXJzIGR1cmluZyB0aGlzCi0gICAgICAgIGNhbGwsIGJ1dCBzaG91bGQgcXVldWUgdGhlbSBhbmQgcmVmaWxsIHRoZW0gaW4gYW5vdGhlciB0aHJlYWQuICBUaGVyZQotICAgICAgICBpcyBubyBlcnJvciByZXR1cm4sIHNvIHRoZSBhcHBsaWNhdGlvbiBzaGFsbCBoYW5kbGUgYW55IGVycm9ycyBnZW5lcmF0ZWQKLSAgICAgICAgaW50ZXJuYWxseS4gIAotICAgICAgICAKLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAgICAgCi0gICAgICAgIEBwYXJhbSBoQ29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBhY2Nlc3MuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgICAgICBAcGFyYW0gcEFwcERhdGEKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgCi0gICAgICAgICAgICBwQXBwRGF0YSBwYXJhbWV0ZXIgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIAotICAgICAgICAgICAgY2FuIGhhdmUgYSBjb21wb25lbnQgc3BlY2lmaWMgY29udGV4dCB3aGVuIHJlY2VpdmluZyB0aGUgY2FsbGJhY2suCi0gICAgICAgIEBwYXJhbSBwQnVmZmVyCi0gICAgICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKLSAgICAgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyIGluZGljYXRpbmcgdGhlIGJ1ZmZlciB0aGF0IHdhcyBlbXB0aWVkLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqRW1wdHlCdWZmZXJEb25lKSgKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBEYXRhLAotICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOwotCi0gICAgLyoqIFRoZSBGaWxsQnVmZmVyRG9uZSBtZXRob2QgaXMgdXNlZCB0byByZXR1cm4gZmlsbGVkIGJ1ZmZlcnMgZnJvbSBhbgotICAgICAgICBvdXRwdXQgcG9ydCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiBmb3IgZW1wdHlpbmcgYW5kIHRoZW4gcmV1c2UuICAKLSAgICAgICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgc28gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYXR0ZW1wdCB0byAKLSAgICAgICAgZW1wdHkgdGhlIGJ1ZmZlcnMgZHVyaW5nIHRoaXMgY2FsbCwgYnV0IHNob3VsZCBxdWV1ZSB0aGUgYnVmZmVycyAKLSAgICAgICAgYW5kIGVtcHR5IHRoZW0gaW4gYW5vdGhlciB0aHJlYWQuICBUaGVyZSBpcyBubyBlcnJvciByZXR1cm4sIHNvIAotICAgICAgICB0aGUgYXBwbGljYXRpb24gc2hhbGwgaGFuZGxlIGFueSBlcnJvcnMgZ2VuZXJhdGVkIGludGVybmFsbHkuICBUaGUgCi0gICAgICAgIGFwcGxpY2F0aW9uIHNoYWxsIGFsc28gdXBkYXRlIHRoZSBidWZmZXIgaGVhZGVyIHRvIGluZGljYXRlIHRoZQotICAgICAgICBudW1iZXIgb2YgYnl0ZXMgcGxhY2VkIGludG8gdGhlIGJ1ZmZlci4gIAotCi0gICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgICAgIAotICAgICAgICBAcGFyYW0gaENvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KLSAgICAgICAgQHBhcmFtIHBBcHBEYXRhCi0gICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgcHJvdmlkZWQgaW4gdGhlIAotICAgICAgICAgICAgcEFwcERhdGEgcGFyYW1ldGVyIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZCBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgIFRoaXMgYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSBpcyBwcm92aWRlZCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiAKLSAgICAgICAgICAgIGNhbiBoYXZlIGEgY29tcG9uZW50IHNwZWNpZmljIGNvbnRleHQgd2hlbiByZWNlaXZpbmcgdGhlIGNhbGxiYWNrLgotICAgICAgICBAcGFyYW0gcEJ1ZmZlcgotICAgICAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCi0gICAgICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlciBpbmRpY2F0aW5nIHRoZSBidWZmZXIgdGhhdCB3YXMgZmlsbGVkLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqRmlsbEJ1ZmZlckRvbmUpKAotICAgICAgICBPTVhfT1VUIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgIE9NWF9PVVQgT01YX1BUUiBwQXBwRGF0YSwKLSAgICAgICAgT01YX09VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7Ci0KLX0gT01YX0NBTExCQUNLVFlQRTsKLQotLyoqIFRoZSBPTVhfQlVGRkVSU1VQUExJRVJUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gZGljdGF0ZSBwb3J0IHN1cHBsaWVyCi0gICAgcHJlZmVyZW5jZSB3aGVuIHR1bm5lbGluZyBiZXR3ZWVuIHR3byBwb3J0cy4KLSAgICBAaW5ncm91cCB0dW4gYnVmCi0qLwotdHlwZWRlZiBlbnVtIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUKLXsKLSAgICBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQgPSAweDAsIC8qKjwgcG9ydCBzdXBwbHlpbmcgdGhlIGJ1ZmZlcnMgaXMgdW5zcGVjaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG9uJ3QgY2FyZSAqLwotICAgIE9NWF9CdWZmZXJTdXBwbHlJbnB1dCwgICAgICAgICAgICAgLyoqPCBpbnB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCi0gICAgT01YX0J1ZmZlclN1cHBseU91dHB1dCwgICAgICAgICAgICAvKio8IG91dHB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCi0gICAgT01YX0J1ZmZlclN1cHBseUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQnVmZmVyU3VwcGx5VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQnVmZmVyU3VwcGx5TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQlVGRkVSU1VQUExJRVJUWVBFOwotCi0KLS8qKiBidWZmZXIgc3VwcGxpZXIgcGFyYW1ldGVyIAotICogQGluZ3JvdXAgdHVuCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7IC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7IC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQlVGRkVSU1VQUExJRVJUWVBFIGVCdWZmZXJTdXBwbGllcjsgLyoqPCBidWZmZXIgc3VwcGxpZXIgKi8KLX0gT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRTsKLQotCi0vKio8IGluZGljYXRlcyB0aGF0IGJ1ZmZlcnMgcmVjZWl2ZWQgYnkgYW4gaW5wdXQgcG9ydCBvZiBhIHR1bm5lbCAKLSAgICAgbWF5IG5vdCBtb2RpZnkgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlcnMgCi0gICAgIEBpbmdyb3VwIHR1bgotICovCi0jZGVmaW5lIE9NWF9QT1JUVFVOTkVMRkxBR19SRUFET05MWSAweDAwMDAwMDAxIAotCi0KLS8qKiBUaGUgT01YX1RVTk5FTFNFVFVQVFlQRSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGRhdGEgZnJvbSBhbiBvdXRwdXQKLSAgICBwb3J0IHRvIGFuIGlucHV0IHBvcnQgYXMgcGFydCB0aGUgdHdvIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgY2FsbHMKLSAgICByZXN1bHRpbmcgZnJvbSBhIE9NWF9TZXR1cFR1bm5lbCBjYWxsIGZyb20gdGhlIElMIENsaWVudC4gCi0gICAgQGluZ3JvdXAgdHVuCi0gKi8gICAKLXR5cGVkZWYgc3RydWN0IE9NWF9UVU5ORUxTRVRVUFRZUEUKLXsKLSAgICBPTVhfVTMyIG5UdW5uZWxGbGFnczsgICAgICAgICAgICAgLyoqPCBiaXQgZmxhZ3MgZm9yIHR1bm5lbGluZyAqLwotICAgIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUgZVN1cHBsaWVyOyAvKio8IHN1cHBsaWVyIHByZWZlcmVuY2UgKi8KLX0gT01YX1RVTk5FTFNFVFVQVFlQRTsgCi0KLS8qIE9NWCBDb21wb25lbnQgaGVhZGVycyBpcyBpbmNsdWRlZCB0byBlbmFibGUgdGhlIGNvcmUgdG8gdXNlCi0gICBtYWNyb3MgZm9yIGZ1bmN0aW9ucyBpbnRvIHRoZSBjb21wb25lbnQgZm9yIE9NWCByZWxlYXNlIDEuMC4gIAotICAgRGV2ZWxvcGVycyBzaG91bGQgbm90IGFjY2VzcyBhbnkgc3RydWN0dXJlcyBvciBkYXRhIGZyb20gd2l0aGluCi0gICB0aGUgY29tcG9uZW50IGhlYWRlciBkaXJlY3RseSAqLwotLyogVE8gQkUgUkVNT1ZFRCAtICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+ICovCi0KLS8qKiBHZXRDb21wb25lbnRWZXJzaW9uIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wb25lbnQuICAKLSAgICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gIFRoaXMgbWFjcm8gd2lsbCBnbyBkaXJlY3RseSBmcm9tIHRoZQotICAgIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQgKHZpYSBhIGNvcmUgbWFjcm8pLiAgVGhlCi0gICAgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBoYW5kbGUgb2YgY29tcG9uZW50IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICBAcGFyYW0gW291dF0gcENvbXBvbmVudE5hbWUKLSAgICAgICAgcG9pbnRlciB0byBhbiBlbXB0eSBzdHJpbmcgb2YgbGVuZ3RoIDEyOCBieXRlcy4gIFRoZSBjb21wb25lbnQgCi0gICAgICAgIHdpbGwgd3JpdGUgaXRzIG5hbWUgaW50byB0aGlzIHN0cmluZy4gIFRoZSBuYW1lIHdpbGwgYmUgCi0gICAgICAgIHRlcm1pbmF0ZWQgYnkgYSBzaW5nbGUgemVybyBieXRlLiAgVGhlIG5hbWUgb2YgYSBjb21wb25lbnQgd2lsbCAKLSAgICAgICAgYmUgMTI3IGJ5dGVzIG9yIGxlc3MgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIHRyYWlsaW5nIHplcm8gYnl0ZS4gIAotICAgICAgICBBbiBleGFtcGxlIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5BQkMuQ2hhbm5lbE1peGVyXDAiLgotICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50VmVyc2lvbgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWCBWZXJzaW9uIHN0cnVjdHVyZSB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCBmaWxsIAotICAgICAgICBpbi4gIFRoZSBjb21wb25lbnQgd2lsbCBmaWxsIGluIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhlIAotICAgICAgICBjb21wb25lbnQgdmVyc2lvbi4gIE5PVEU6IHRoZSBjb21wb25lbnQgdmVyc2lvbiBpcyBOT1QgdGhlIHNhbWUgCi0gICAgICAgIGFzIHRoZSBPTVggU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIChmb3VuZCBpbiBhbGwgc3RydWN0dXJlcykuICBUaGUgCi0gICAgICAgIGNvbXBvbmVudCB2ZXJzaW9uIGlzIGRlZmluZWQgYnkgdGhlIHZlbmRvciBvZiB0aGUgY29tcG9uZW50IGFuZCAKLSAgICAgICAgaXRzIHZhbHVlIGlzIGVudGlyZWx5IHVwIHRvIHRoZSBjb21wb25lbnQgdmVuZG9yLgotICAgIEBwYXJhbSBbb3V0XSBwU3BlY1ZlcnNpb24KLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVggVmVyc2lvbiBzdHJ1Y3R1cmUgdGhhdCB0aGUgY29tcG9uZW50IHdpbGwgZmlsbCAKLSAgICAgICAgaW4uICBUaGUgU3BlY1ZlcnNpb24gaXMgdGhlIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gdGhhdCB0aGUgCi0gICAgICAgIGNvbXBvbmVudCB3YXMgYnVpbHQgYWdhaW5zdC4gIFBsZWFzZSBub3RlIHRoYXQgdGhpcyB2YWx1ZSBtYXkgb3IgCi0gICAgICAgIG1heSBub3QgbWF0Y2ggdGhlIHN0cnVjdHVyZSdzIHZlcnNpb24uICBGb3IgZXhhbXBsZSwgaWYgdGhlIAotICAgICAgICBjb21wb25lbnQgd2FzIGJ1aWx0IGFnYWluc3QgdGhlIDIuMCBzcGVjaWZpY2F0aW9uLCBidXQgdGhlIAotICAgICAgICBhcHBsaWNhdGlvbiAod2hpY2ggY3JlYXRlcyB0aGUgc3RydWN0dXJlIGlzIGJ1aWx0IGFnYWluc3QgdGhlIAotICAgICAgICAxLjAgc3BlY2lmaWNhdGlvbiB0aGUgdmVyc2lvbnMgd291bGQgYmUgZGlmZmVyZW50LgotICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50VVVJRAotICAgICAgICBwb2ludGVyIHRvIHRoZSBVVUlEIG9mIHRoZSBjb21wb25lbnQgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gYnkgCi0gICAgICAgIHRoZSBjb21wb25lbnQuICBUaGUgVVVJRCBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaXMgc2V0IGF0IAotICAgICAgICBSVU4gdGltZSBmb3IgdGhlIGNvbXBvbmVudCBhbmQgaXMgdW5pcXVlIHRvIGVhY2ggaW5zdGFudGlvbiBvZiAKLSAgICAgICAgdGhlIGNvbXBvbmVudC4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wCi0gKi8KLSNkZWZpbmUgT01YX0dldENvbXBvbmVudFZlcnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudE5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcFNwZWNWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFVVSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0Q29tcG9uZW50VmVyc2lvbiggIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudE5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcFNwZWNWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFVVSUQpICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogU2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbXBvbmVudC4gIFRoaXMgY2FsbCBpcyBhIG5vbi1ibG9ja2luZyBjYWxsLgotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIGNoZWNrIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGVuIHF1ZXVlIHRoZSBjb21tYW5kCi0gICAgdG8gdGhlIGNvbXBvbmVudCB0aHJlYWQgdG8gYmUgZXhlY3V0ZWQuICBUaGUgY29tcG9uZW50IHRocmVhZCBzaGFsbCAKLSAgICBzZW5kIHRoZSBFdmVudEhhbmRsZXIoKSBjYWxsYmFjayBhdCB0aGUgY29uY2x1c2lvbiBvZiB0aGUgY29tbWFuZC4gCi0gICAgVGhpcyBtYWNybyB3aWxsIGdvIGRpcmVjdGx5IGZyb20gdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQgKHZpYQotICAgIGEgY29yZSBtYWNybykuICBUaGUgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgV2hlbiB0aGUgY29tbWFuZCBpcyAiT01YX0NvbW1hbmRTdGF0ZVNldCIgdGhlIGNvbXBvbmVudCB3aWxsIHF1ZXVlIGEKLSAgICBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgc3RhdGUgaWRlbmZpZWQgaW4gblBhcmFtLgotICAgIAotICAgIFdoZW4gdGhlIGNvbW1hbmQgaXMgIk9NWF9Db21tYW5kRmx1c2giLCB0byBmbHVzaCBhIHBvcnQncyBidWZmZXIgcXVldWVzLAotICAgIHRoZSBjb21tYW5kIHdpbGwgZm9yY2UgdGhlIGNvbXBvbmVudCB0byByZXR1cm4gYWxsIGJ1ZmZlcnMgTk9UIENVUlJFTlRMWSAKLSAgICBCRUlORyBQUk9DRVNTRUQgdG8gdGhlIGFwcGxpY2F0aW9uLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGJ1ZmZlcnMgCi0gICAgd2VyZSByZWNlaXZlZC4KLSAgICAKLSAgICBXaGVuIHRoZSBjb21tYW5kIGlzICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIiBvciAKLSAgICAiT01YX0NvbW1hbmRQb3J0RW5hYmxlIiwgdGhlIGNvbXBvbmVudCdzIHBvcnQgKGdpdmVuIGJ5IHRoZSB2YWx1ZSBvZgotICAgIG5QYXJhbSkgd2lsbCBiZSBzdG9wcGVkIG9yIHJlc3RhcnRlZC4gCi0gICAgCi0gICAgV2hlbiB0aGUgY29tbWFuZCAiT01YX0NvbW1hbmRNYXJrQnVmZmVyIiBpcyB1c2VkIHRvIG1hcmsgYSBidWZmZXIsIHRoZQotICAgIHBDbWREYXRhIHdpbGwgcG9pbnQgdG8gYSBPTVhfTUFSS1RZUEUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudAotICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGV4YW1pbmUgdGhlIGJ1ZmZlciBjaGFpbiBmb3IgdGhlIG1hcmsuICBuUGFyYW0xCi0gICAgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBwb3J0IG9uIHdoaWNoIHRoZSBidWZmZXIgbWFyayBpcyBhcHBsaWVkLgotCi0gICAgU3BlY2lmaWNhdGlvbiB0ZXh0IGZvciBtb3JlIGRldGFpbHMuIAotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgaGFuZGxlIG9mIGNvbXBvbmVudCB0byBleGVjdXRlIHRoZSBjb21tYW5kCi0gICAgQHBhcmFtIFtpbl0gQ21kCi0gICAgICAgIENvbW1hbmQgZm9yIHRoZSBjb21wb25lbnQgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSBbaW5dIG5QYXJhbQotICAgICAgICBQYXJhbWV0ZXIgZm9yIHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLiAgV2hlbiBDbWQgaGFzIHRoZSB2YWx1ZSAKLSAgICAgICAgT01YX0NvbW1hbmRTdGF0ZVNldCwgdmFsdWUgaXMgYSBtZW1iZXIgb2YgT01YX1NUQVRFVFlQRS4gIFdoZW4gQ21kIGhhcyAKLSAgICAgICAgdGhlIHZhbHVlIE9NWF9Db21tYW5kRmx1c2gsIHZhbHVlIG9mIG5QYXJhbSBpbmRpY2F0ZXMgd2hpY2ggcG9ydChzKSAKLSAgICAgICAgdG8gZmx1c2guIC0xIGlzIHVzZWQgdG8gZmx1c2ggYWxsIHBvcnRzIGEgc2luZ2xlIHBvcnQgaW5kZXggd2lsbCAKLSAgICAgICAgb25seSBmbHVzaCB0aGF0IHBvcnQuICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIgotICAgICAgICBvciAiT01YX0NvbW1hbmRQb3J0RW5hYmxlIiwgdGhlIGNvbXBvbmVudCdzIHBvcnQgaXMgZ2l2ZW4gYnkgCi0gICAgICAgIHRoZSB2YWx1ZSBvZiBuUGFyYW0uICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiCi0gICAgICAgIHRoZSBjb21wb25lbnRzIHBvdCBpcyBnaXZlbiBieSB0aGUgdmFsdWUgb2YgblBhcmFtLgotICAgIEBwYXJhbSBbaW5dIHBDbWREYXRhCi0gICAgICAgIFBhcmFtZXRlciBwb2ludGluZyB0byB0aGUgT01YX01BUktUWVBFIHN0cnVjdHVyZSB3aGVuIENtZCBoYXMgdGhlIHZhbHVlCi0gICAgICAgICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiLiAgICAgCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9TZW5kQ29tbWFuZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBDbWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBuUGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBwQ21kRGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZW5kQ29tbWFuZCggICAgICAgICBcCi0gICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBDbWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBuUGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBwQ21kRGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBUaGUgT01YX0dldFBhcmFtZXRlciBtYWNybyB3aWxsIGdldCBvbmUgb2YgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIAotICAgIHNldHRpbmdzIGZyb20gdGhlIGNvbXBvbmVudC4gIFRoaXMgbWFjcm8gY2Fubm90IG9ubHkgYmUgaW52b2tlZCB3aGVuIAotICAgIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlIE9NWF9TdGF0ZUludmFsaWQgc3RhdGUuICBUaGUgblBhcmFtSW5kZXgKLSAgICBwYXJhbWV0ZXIgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcmVxdWVzdGVkIGZyb20KLSAgICB0aGUgY29tcG9uZW50LiAgVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGFsbG9jYXRlIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSAKLSAgICBhbmQgc2hhbGwgZmlsbCBpbiB0aGUgc3RydWN0dXJlIHNpemUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gYmVmb3JlIAotICAgIGludm9raW5nIHRoaXMgbWFjcm8uICBXaGVuIHRoZSBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIHBvcnQsIHRoZQotICAgIGNhbGxlciBzaGFsbCBmaWxsIGluIHRoZSBhcHByb3ByaWF0ZSBuUG9ydEluZGV4IHZhbHVlIGluZGljYXRpbmcgdGhlCi0gICAgcG9ydCBvbiB3aGljaCB0aGUgcGFyYW1ldGVyIGFwcGxpZXMuIElmIHRoZSBjb21wb25lbnQgaGFzIG5vdCBoYWQgCi0gICAgYW55IHNldHRpbmdzIGNoYW5nZWQsIHRoZW4gdGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGEgc2V0IG9mIAotICAgIHZhbGlkIERFRkFVTFQgIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21wb25lbnQuICBUaGlzIGlzIGEgYmxvY2tpbmcgCi0gICAgY2FsbC4gIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBuUGFyYW1JbmRleAotICAgICAgICBJbmRleCBvZiB0aGUgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKLSAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4KLSAgICBAcGFyYW0gW2luLG91dF0gcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZQotICAgICAgICBQb2ludGVyIHRvIGFwcGxpY2F0aW9uIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGJ5IHRoZSAKLSAgICAgICAgY29tcG9uZW50LgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAKLSAqLwotI2RlZmluZSBPTVhfR2V0UGFyYW1ldGVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0UGFyYW1ldGVyKCAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfU2V0UGFyYW1ldGVyIG1hY3JvIHdpbGwgc2VuZCBhbiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKLSAgICBzdHJ1Y3R1cmUgdG8gYSBjb21wb25lbnQuICBFYWNoIHN0cnVjdHVyZSBzaGFsbCBiZSBzZW50IG9uZSBhdCBhIHRpbWUsCi0gICAgaW4gYSBzZXBhcmF0ZSBpbnZvY2F0aW9uIG9mIHRoZSBtYWNyby4gIFRoaXMgbWFjcm8gY2FuIG9ubHkgYmUKLSAgICBpbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgT01YX1N0YXRlTG9hZGVkIHN0YXRlLCBvciB0aGUKLSAgICBwb3J0IGlzIGRpc2FibGVkICh3aGVuIHRoZSBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIHBvcnQpLiBUaGUgCi0gICAgblBhcmFtSW5kZXggcGFyYW1ldGVyIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggc3RydWN0dXJlIGlzIGJlaW5nCi0gICAgcGFzc2VkIHRvIHRoZSBjb21wb25lbnQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgYWxsb2NhdGUgdGhlIAotICAgIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhbmQgdmVyc2lvbiAKLSAgICBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyB0aGUgYWN0dWFsIGRhdGEpIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLgotICAgIFRoZSBhcHBsaWNhdGlvbiBpcyBmcmVlIHRvIGRpc3Bvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgYWZ0ZXIgdGhlIGNhbGwKLSAgICBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgVGhpcyAKLSAgICBpcyBhIGJsb2NraW5nIGNhbGwuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgQHBhcmFtIFtpbl0gbkluZGV4Ci0gICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgc2VudC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKLSAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4KLSAgICBAcGFyYW0gW2luXSBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlCi0gICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSB1c2VkIGZvcgotICAgICAgICBpbml0aWFsaXphdGlvbiBieSB0aGUgY29tcG9uZW50LgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAKLSAqLwotI2RlZmluZSBPTVhfU2V0UGFyYW1ldGVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+U2V0UGFyYW1ldGVyKCAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfR2V0Q29uZmlnIG1hY3JvIHdpbGwgZ2V0IG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzIAotICAgIGZyb20gYSBjb21wb25lbnQuICBUaGlzIG1hY3JvIGNhbiBiZSBpbnZva2VkIGFueXRpbWUgYWZ0ZXIgdGhlIAotICAgIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgblBhcmFtSW5kZXggY2FsbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byAKLSAgICBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcmVxdWVzdGVkIGZyb20gdGhlIGNvbXBvbmVudC4gIFRoZSAKLSAgICBhcHBsaWNhdGlvbiBzaGFsbCBhbGxvY2F0ZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIAotICAgIHN0cnVjdHVyZSBzaXplIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLiAgCi0gICAgSWYgdGhlIGNvbXBvbmVudCBoYXMgbm90IGhhZCB0aGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHNlbnQgYmVmb3JlLCAKLSAgICB0aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBhIHNldCBvZiB2YWxpZCBERUZBVUxUIHZhbHVlcyBmb3IgdGhlIAotICAgIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgQHBhcmFtIFtpbl0gbkluZGV4Ci0gICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkLiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQotICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uLgotICAgIEBwYXJhbSBbaW4sb3V0XSBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlCi0gICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgYnkgdGhlIAotICAgICAgICBjb21wb25lbnQuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotKi8gICAgICAgIAotI2RlZmluZSBPTVhfR2V0Q29uZmlnKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0Q29uZmlnKCAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbkNvbmZpZ0luZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfU2V0Q29uZmlnIG1hY3JvIHdpbGwgc2VuZCBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gCi0gICAgc3RydWN0dXJlcyB0byBhIGNvbXBvbmVudC4gIEVhY2ggc3RydWN0dXJlIHNoYWxsIGJlIHNlbnQgb25lIGF0IGEgdGltZSwKLSAgICBlYWNoIGluIGEgc2VwYXJhdGUgaW52b2NhdGlvbiBvZiB0aGUgbWFjcm8uICBUaGlzIG1hY3JvIGNhbiBiZSBpbnZva2VkIAotICAgIGFueXRpbWUgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgCi0gICAgYWxsb2NhdGUgdGhlIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSAKLSAgICBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyB0aGUgYWN0dWFsIGRhdGEpIGJlZm9yZSBpbnZva2luZyAKLSAgICB0aGlzIG1hY3JvLiAgVGhlIGFwcGxpY2F0aW9uIGlzIGZyZWUgdG8gZGlzcG9zZSBvZiB0aGlzIHN0cnVjdHVyZSBhZnRlciAKLSAgICB0aGUgY2FsbCBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgCi0gICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBuQ29uZmlnSW5kZXgKLSAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBzZW50LiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQotICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uIGFib3ZlLgotICAgIEBwYXJhbSBbaW5dIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUKLSAgICAgICAgcG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIHVzZWQgZm9yCi0gICAgICAgIGluaXRpYWxpemF0aW9uIGJ5IHRoZSBjb21wb25lbnQuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9TZXRDb25maWcoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG5Db25maWdJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZXRDb25maWcoICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogVGhlIE9NWF9HZXRFeHRlbnNpb25JbmRleCBtYWNybyB3aWxsIGludm9rZSBhIGNvbXBvbmVudCB0byB0cmFuc2xhdGUgCi0gICAgYSB2ZW5kb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvciBwYXJhbWV0ZXIgc3RyaW5nIGludG8gYW4gT01YIAotICAgIHN0cnVjdHVyZSBpbmRleC4gIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IGZvciB0aGUgdmVuZG9yIHRvIHN1cHBvcnQgCi0gICAgdGhpcyBjb21tYW5kIGZvciB0aGUgaW5kZXhlcyBhbHJlYWR5IGZvdW5kIGluIHRoZSBPTVhfSU5ERVhUWVBFIAotICAgIGVudW1lcmF0aW9uICh0aGlzIGlzIGRvbmUgdG8gc2F2ZSBzcGFjZSBpbiBzbWFsbCBjb21wb25lbnRzKS4gIFRoZSAKLSAgICBjb21wb25lbnQgc2hhbGwgc3VwcG9ydCBhbGwgdmVuZG9yIHN1cHBsaWVkIGV4dGVuc2lvbiBpbmRleGVzIG5vdCBmb3VuZAotICAgIGluIHRoZSBtYXN0ZXIgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBjUGFyYW1ldGVyTmFtZQotICAgICAgICBPTVhfU1RSSU5HIHRoYXQgc2hhbGwgYmUgbGVzcyB0aGFuIDEyOCBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nCi0gICAgICAgIHRoZSB0cmFpbGluZyBudWxsIGJ5dGUuICBUaGlzIGlzIHRoZSBzdHJpbmcgdGhhdCB3aWxsIGdldCAKLSAgICAgICAgdHJhbnNsYXRlZCBieSB0aGUgY29tcG9uZW50IGludG8gYSBjb25maWd1cmF0aW9uIGluZGV4LgotICAgIEBwYXJhbSBbb3V0XSBwSW5kZXhUeXBlCi0gICAgICAgIGEgcG9pbnRlciB0byBhIE9NWF9JTkRFWFRZUEUgdG8gcmVjZWl2ZSB0aGUgaW5kZXggdmFsdWUuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9HZXRFeHRlbnNpb25JbmRleCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNQYXJhbWV0ZXJOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBJbmRleFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkdldEV4dGVuc2lvbkluZGV4KCAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNQYXJhbWV0ZXJOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBJbmRleFR5cGUpICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfR2V0U3RhdGUgbWFjcm8gd2lsbCBpbnZva2UgdGhlIGNvbXBvbmVudCB0byBnZXQgdGhlIGN1cnJlbnQgCi0gICAgc3RhdGUgb2YgdGhlIGNvbXBvbmVudCBhbmQgcGxhY2UgdGhlIHN0YXRlIHZhbHVlIGludG8gdGhlIGxvY2F0aW9uCi0gICAgcG9pbnRlZCB0byBieSBwU3RhdGUuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW291dF0gcFN0YXRlCi0gICAgICAgIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHRvIHJlY2VpdmUgdGhlIHN0YXRlLiAgVGhlIHZhbHVlIHJldHVybmVkCi0gICAgICAgIGlzIG9uZSBvZiB0aGUgT01YX1NUQVRFVFlQRSBtZW1iZXJzIAotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAKLSAqLwotI2RlZmluZSBPTVhfR2V0U3RhdGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwU3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRTdGF0ZSggICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwU3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBUaGUgT01YX1VzZUJ1ZmZlciBtYWNybyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29tcG9uZW50IHVzZQotICAgIGEgYnVmZmVyIChhbmQgYWxsb2NhdGUgaXRzIG93biBidWZmZXIgaGVhZGVyKSBhbHJlYWR5IGFsbG9jYXRlZCAKLSAgICBieSBhbm90aGVyIGNvbXBvbmVudCwgb3IgYnkgdGhlIElMIENsaWVudC4gVGhpcyBpcyBhIGJsb2NraW5nIAotICAgIGNhbGwuCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlIAotICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcCBidWYKLSAqLwotCi0jZGVmaW5lIE9NWF9Vc2VCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5TaXplQnl0ZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPlVzZUJ1ZmZlciggICAgICAgICAgICBcCi0gICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5TaXplQnl0ZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBCdWZmZXIpCi0KLQotLyoqIFRoZSBPTVhfQWxsb2NhdGVCdWZmZXIgbWFjcm8gd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvbXBvbmVudCBhbGxvY2F0ZSAKLSAgICBhIG5ldyBidWZmZXIgYW5kIGJ1ZmZlciBoZWFkZXIuICBUaGUgY29tcG9uZW50IHdpbGwgYWxsb2NhdGUgdGhlIAotICAgIGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBoZWFkZXIgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAKLSAgICBoZWFkZXIuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW291dF0gcHBCdWZmZXIKLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNlaXZlIAotICAgICAgICB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIGhlYWRlcgotICAgIEBwYXJhbSBbaW5dIG5Qb3J0SW5kZXgKLSAgICAgICAgblBvcnRJbmRleCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRoZSBidWZmZXIgd2lsbAotICAgICAgICBiZSB1c2VkIHdpdGguICBUaGUgcG9ydCBjYW4gYmUgZm91bmQgYnkgdXNpbmcgdGhlIG5Qb3J0SW5kZXgKLSAgICAgICAgdmFsdWUgYXMgYW4gaW5kZXggaW50byB0aGUgUG9ydCBEZWZpbml0aW9uIGFycmF5IG9mIHRoZSBjb21wb25lbnQuCi0gICAgQHBhcmFtIFtpbl0gcEFwcFByaXZhdGUKLSAgICAgICAgcEFwcFByaXZhdGUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwQXBwUHJpdmF0ZSBtZW1iZXIgb2YgdGhlIAotICAgICAgICBidWZmZXIgaGVhZGVyIHN0cnVjdHVyZS4KLSAgICBAcGFyYW0gW2luXSBuU2l6ZUJ5dGVzCi0gICAgICAgIHNpemUgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZS4gIFVzZWQgd2hlbiBiQWxsb2NhdGVOZXcgaXMgdHJ1ZS4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wIGJ1ZgotICovICAgIAotI2RlZmluZSBPTVhfQWxsb2NhdGVCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuU2l6ZUJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5BbGxvY2F0ZUJ1ZmZlciggICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuU2l6ZUJ5dGVzKSAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBUaGUgT01YX0ZyZWVCdWZmZXIgbWFjcm8gd2lsbCByZWxlYXNlIGEgYnVmZmVyIGhlYWRlciBmcm9tIHRoZSBjb21wb25lbnQKLSAgICB3aGljaCB3YXMgYWxsb2NhdGVkIHVzaW5nIGVpdGhlciBPTVhfQWxsb2NhdGVCdWZmZXIgb3IgT01YX1VzZUJ1ZmZlci4gSWYgIAotICAgIHRoZSBjb21wb25lbnQgYWxsb2NhdGVkIHRoZSBidWZmZXIgKHNlZSB0aGUgT01YX1VzZUJ1ZmZlciBtYWNybykgdGhlbiAKLSAgICB0aGUgY29tcG9uZW50IHNoYWxsIGZyZWUgdGhlIGJ1ZmZlciBhbmQgYnVmZmVyIGhlYWRlci4gVGhpcyBpcyBhIAotICAgIGJsb2NraW5nIGNhbGwuIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4Ci0gICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKLSAgICAgICAgYmUgdXNlZCB3aXRoLgotICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCi0gICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX0ZyZWVCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RnJlZUJ1ZmZlciggICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogVGhlIE9NWF9FbXB0eVRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGEgYnVmZmVyIGZ1bGwgb2YgZGF0YSB0byBhbiAKLSAgICBpbnB1dCBwb3J0IG9mIGEgY29tcG9uZW50LiAgVGhlIGJ1ZmZlciB3aWxsIGJlIGVtcHRpZWQgYnkgdGhlIGNvbXBvbmVudAotICAgIGFuZCByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBFbXB0eUJ1ZmZlckRvbmUgY2FsbCBiYWNrLgotICAgIFRoaXMgaXMgYSBub24tYmxvY2tpbmcgY2FsbCBpbiB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCByZWNvcmQgdGhlIGJ1ZmZlcgotICAgIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgYW5kIHRoZW4gZW1wdHkgdGhlIGJ1ZmZlciwgbGF0ZXIsIGF0IHRoZSBwcm9wZXIgCi0gICAgdGltZS4gIEFzIGV4cGVjdGVkLCB0aGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIG9ubHkgd2hpbGUgdGhlIGNvbXBvbmVudCAKLSAgICBpcyBpbiB0aGUgT01YX1N0YXRlRXhlY3V0aW5nLiAgSWYgblBvcnRJbmRleCBkb2VzIG5vdCBzcGVjaWZ5IGFuIGlucHV0Ci0gICAgcG9ydCwgdGhlIGNvbXBvbmVudCBzaGFsbCByZXR1cm4gYW4gZXJyb3IuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBwQnVmZmVyCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoIFVzZUJ1ZmZlcgotICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlci4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wIGJ1ZgotICovCi0jZGVmaW5lIE9NWF9FbXB0eVRoaXNCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkVtcHR5VGhpc0J1ZmZlciggICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfRmlsbFRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGFuIGVtcHR5IGJ1ZmZlciB0byBhbiAKLSAgICBvdXRwdXQgcG9ydCBvZiBhIGNvbXBvbmVudC4gIFRoZSBidWZmZXIgd2lsbCBiZSBmaWxsZWQgYnkgdGhlIGNvbXBvbmVudAotICAgIGFuZCByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBGaWxsQnVmZmVyRG9uZSBjYWxsIGJhY2suCi0gICAgVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBjYWxsIGluIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIHJlY29yZCB0aGUgYnVmZmVyCi0gICAgYW5kIHJldHVybiBpbW1lZGlhdGVseSBhbmQgdGhlbiBmaWxsIHRoZSBidWZmZXIsIGxhdGVyLCBhdCB0aGUgcHJvcGVyIAotICAgIHRpbWUuICBBcyBleHBlY3RlZCwgdGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBvbmx5IHdoaWxlIHRoZSBjb21wb25lbnQgCi0gICAgaXMgaW4gdGhlIE9NWF9FeGVjdXRpbmdTdGF0ZS4gIElmIG5Qb3J0SW5kZXggZG9lcyBub3Qgc3BlY2lmeSBhbiBvdXRwdXQKLSAgICBwb3J0LCB0aGUgY29tcG9uZW50IHNoYWxsIHJldHVybiBhbiBlcnJvci4gIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCi0gICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX0ZpbGxUaGlzQnVmZmVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RmlsbFRoaXNCdWZmZXIoICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0KLS8qKiBUaGUgT01YX1VzZUVHTEltYWdlIG1hY3JvIHdpbGwgcmVxdWVzdCB0aGF0IHRoZSBjb21wb25lbnQgdXNlCi0gICAgYSBFR0xJbWFnZSBwcm92aWRlZCBieSBFR0wgKGFuZCBhbGxvY2F0ZSBpdHMgb3duIGJ1ZmZlciBoZWFkZXIpCi0gICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlIAotICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyLiAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgbG9jYXRpb24gdXNlZAotICAgICAgICBmb3IgdGhpcyBidWZmZXIgaXMgTk9UIHZpc2libGUgdG8gdGhlIElMIENsaWVudC4KLSAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4Ci0gICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKLSAgICAgICAgYmUgdXNlZCB3aXRoLiAgVGhlIHBvcnQgY2FuIGJlIGZvdW5kIGJ5IHVzaW5nIHRoZSBuUG9ydEluZGV4Ci0gICAgICAgIHZhbHVlIGFzIGFuIGluZGV4IGludG8gdGhlIFBvcnQgRGVmaW5pdGlvbiBhcnJheSBvZiB0aGUgY29tcG9uZW50LgotICAgIEBwYXJhbSBbaW5dIHBBcHBQcml2YXRlCi0gICAgICAgIHBBcHBQcml2YXRlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcEFwcFByaXZhdGUgbWVtYmVyIG9mIHRoZSAKLSAgICAgICAgYnVmZmVyIGhlYWRlciBzdHJ1Y3R1cmUuCi0gICAgQHBhcmFtIFtpbl0gZWdsSW1hZ2UKLSAgICAgICAgZWdsSW1hZ2UgY29udGFpbnMgdGhlIGhhbmRsZSBvZiB0aGUgRUdMSW1hZ2UgdG8gdXNlIGFzIGEgYnVmZmVyIG9uIHRoZQotICAgICAgICBzcGVjaWZpZWQgcG9ydC4gIFRoZSBjb21wb25lbnQgaXMgZXhwZWN0ZWQgdG8gdmFsaWRhdGUgcHJvcGVydGllcyBvZiAKLSAgICAgICAgdGhlIEVHTEltYWdlIGFnYWluc3QgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBvcnQgdG8gZW5zdXJlIHRoZSBjb21wb25lbnQKLSAgICAgICAgY2FuIHVzZSB0aGUgRUdMSW1hZ2UgYXMgYSBidWZmZXIuICAgICAgICAgIAotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX1VzZUVHTEltYWdlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgZWdsSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+VXNlRUdMSW1hZ2UoICAgICAgICAgIFwKLSAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgZWdsSW1hZ2UpCi0KLS8qKiBUaGUgT01YX0luaXQgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgT01YIGNvcmUuICBJdCBzaGFsbCBiZSB0aGUKLSAgICBmaXJzdCBjYWxsIG1hZGUgaW50byBPTVggYW5kIGl0IHNob3VsZCBvbmx5IGJlIGV4ZWN1dGVkIG9uZSB0aW1lIHdpdGhvdXQKLSAgICBhbiBpbnRlcnZpZW5pbmcgT01YX0RlaW5pdCBjYWxsLiAgCi0gICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLQotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfSW5pdCh2b2lkKTsKLQotCi0vKiogVGhlIE9NWF9EZWluaXQgbWV0aG9kIGlzIHVzZWQgdG8gZGVpbml0aWFsaXplIHRoZSBPTVggY29yZS4gIEl0IHNoYWxsIGJlIAotICAgIHRoZSBsYXN0IGNhbGwgbWFkZSBpbnRvIE9NWC4gSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcmUgZGV0ZXJtaW5lcyB0aGF0IAotICAgIHRoYXJlIGFyZSBjb21wb25lbnRzIGxvYWRlZCB3aGVuIHRoaXMgY2FsbCBpcyBtYWRlLCB0aGUgY29yZSBtYXkgcmV0dXJuIAotICAgIHdpdGggYW4gZXJyb3IgcmF0aGVyIHRoYW4gdHJ5IHRvIHVubG9hZCB0aGUgY29tcG9uZW50cy4KLSAgICAgICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb3JlCi0gKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0RlaW5pdCh2b2lkKTsKLQotCi0vKiogVGhlIE9NWF9Db21wb25lbnROYW1lRW51bSBtZXRob2Qgd2lsbCBlbnVtZXJhdGUgdGhyb3VnaCBhbGwgdGhlIG5hbWVzIG9mCi0gICAgcmVjb2duaXNlZCB2YWxpZCBjb21wb25lbnRzIGluIHRoZSBzeXN0ZW0uIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQKLSAgICBhcyBhIG1lYW5zIHRvIGRldGVjdCBhbGwgdGhlIGNvbXBvbmVudHMgaW4gdGhlIHN5c3RlbSBydW4tdGltZS4gVGhlcmUgaXMKLSAgICBubyBzdHJpY3Qgb3JkZXJpbmcgdG8gdGhlIGVudW1lcmF0aW9uIG9yZGVyIG9mIGNvbXBvbmVudCBuYW1lcywgYWx0aG91Z2gKLSAgICBlYWNoIG5hbWUgd2lsbCBvbmx5IGJlIGVudW1lcmF0ZWQgb25jZS4gIElmIHRoZSBPTVggY29yZSBzdXBwb3J0cyBydW4tdGltZQotICAgIGluc3RhbGxhdGlvbiBvZiBuZXcgY29tcG9uZW50cywgaXQgaXMgb25seSByZXF1cmllZCB0byBkZXRlY3QgbmV3bHkKLSAgICBpbnN0YWxsZWQgY29tcG9uZW50cyB3aGVuIHRoZSBmaXJzdCBjYWxsIHRvIGVudW1lcmF0ZSBjb21wb25lbnQgbmFtZXMKLSAgICBpcyBtYWRlIChpLmUuIHdoZW4gbkluZGV4IGlzIDB4MCkuCi0gICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCBpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbb3V0XSBjQ29tcG9uZW50TmFtZQotICAgICAgICBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyB3aXRoIHRoZSBjb21wb25lbnQgbmFtZS4gIFRoZQotICAgICAgICBuYW1lcyBvZiB0aGUgY29tcG9uZW50cyBhcmUgc3RyaW5ncyBsZXNzIHRoYW4gMTI3IGJ5dGVzIGluIGxlbmd0aAotICAgICAgICBwbHVzIHRoZSB0cmFpbGluZyBudWxsIGZvciBhIG1heGltdW0gc2l6ZSBvZiAxMjggYnl0ZXMuICBBbiBleGFtcGxlIAotICAgICAgICBvZiBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIGlzICJPTVguVEkuQVVESU8uRFNQLk1JWEVSXDAiLiAgTmFtZXMgYXJlIAotICAgICAgICBhc3NpZ25lZCBieSB0aGUgdmVuZG9yLCBidXQgc2hhbGwgc3RhcnQgd2l0aCAiT01YLiIgYW5kIHRoZW4gaGF2ZSAKLSAgICAgICAgdGhlIFZlbmRvciBkZXNpZ25hdGlvbiBuZXh0LgotICAgIEBwYXJhbSBbaW5dIG5OYW1lTGVuZ3RoCi0gICAgICAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBjQ29tcG9uZW50TmFtZSBzdHJpbmcuICBXaXRoIGFsbCAKLSAgICAgICAgY29tcG9uZW50IG5hbWUgc3RyaW5ncyByZXN0cmljdGVkIHRvIGxlc3MgdGhhbiAxMjggY2hhcmFjdGVycyAKLSAgICAgICAgKGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgbnVsbCkgaXQgaXMgcmVjb21lbmRlZCB0aGF0IHRoZSBjYWxsZXIKLSAgICAgICAgcHJvdmlkZSBhIGlucHV0IHN0cmluZyBmb3IgdGhlIGNDb21wb25lbnROYW1lIG9mIDEyOCBjaGFyYWN0ZXJzLgotICAgIEBwYXJhbSBbaW5dIG5JbmRleAotICAgICAgICBudW1iZXIgY29udGFpbmluZyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBjb21wb25lbnQuIAotICAgICAgICBNdWx0aXBsZSBjYWxscyB0byBPTVhfQ29tcG9uZW50TmFtZUVudW0gd2l0aCBpbmNyZWFzaW5nIHZhbHVlcwotICAgICAgICBvZiBuSW5kZXggd2lsbCBlbnVtZXJhdGUgdGhyb3VnaCB0aGUgY29tcG9uZW50IG5hbWVzIGluIHRoZQotICAgICAgICBzeXN0ZW0gdW50aWwgT01YX0Vycm9yTm9Nb3JlIGlzIHJldHVybmVkLiAgVGhlIHZhbHVlIG9mIG5JbmRleAotICAgICAgICBpcyAwIHRvIChOLTEpLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgdmFsaWQgaW5zdGFsbGVkIGNvbXBvbmVudHMKLSAgICAgICAgaW4gdGhlIHN5c3RlbS4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgV2hlbiB0aGUgdmFsdWUgb2YgbkluZGV4IGV4Y2VlZHMgdGhlIG51bWJlciBvZiAKLSAgICAgICAgY29tcG9uZW50cyBpbiB0aGUgc3lzdGVtIG1pbnVzIDEsIE9NWF9FcnJvck5vTW9yZSB3aWxsIGJlCi0gICAgICAgIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfQ29tcG9uZW50TmFtZUVudW0oCi0gICAgT01YX09VVCBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAotICAgIE9NWF9JTiAgT01YX1UzMiBuTmFtZUxlbmd0aCwKLSAgICBPTVhfSU4gIE9NWF9VMzIgbkluZGV4KTsKLQotCi0vKiogVGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIHdpbGwgbG9jYXRlIHRoZSBjb21wb25lbnQgc3BlY2lmaWVkIGJ5IHRoZQotICAgIGNvbXBvbmVudCBuYW1lIGdpdmVuLCBsb2FkIHRoYXQgY29tcG9uZW50IGludG8gbWVtb3J5IGFuZCB0aGVuIGludm9rZQotICAgIHRoZSBjb21wb25lbnQncyBtZXRob2RzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiAgCi0gICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW291dF0gcEhhbmRsZQotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9IQU5ETEVUWVBFIHBvaW50ZXIgdG8gYmUgZmlsbGVkIGluIGJ5IHRoaXMgbWV0aG9kLgotICAgIEBwYXJhbSBbaW5dIGNDb21wb25lbnROYW1lCi0gICAgICAgIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lLiAgVGhlCi0gICAgICAgIG5hbWVzIG9mIHRoZSBjb21wb25lbnRzIGFyZSBzdHJpbmdzIGxlc3MgdGhhbiAxMjcgYnl0ZXMgaW4gbGVuZ3RoCi0gICAgICAgIHBsdXMgdGhlIHRyYWlsaW5nIG51bGwgZm9yIGEgbWF4aW11bSBzaXplIG9mIDEyOCBieXRlcy4gIEFuIGV4YW1wbGUgCi0gICAgICAgIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5USS5BVURJTy5EU1AuTUlYRVJcMCIuICBOYW1lcyBhcmUgCi0gICAgICAgIGFzc2lnbmVkIGJ5IHRoZSB2ZW5kb3IsIGJ1dCBzaGFsbCBzdGFydCB3aXRoICJPTVguIiBhbmQgdGhlbiBoYXZlIAotICAgICAgICB0aGUgVmVuZG9yIGRlc2lnbmF0aW9uIG5leHQuCi0gICAgQHBhcmFtIFtpbl0gcEFwcERhdGEKLSAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2lsbCBiZSByZXR1cm5lZAotICAgICAgICBkdXJpbmcgY2FsbGJhY2tzIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiBpZGVudGlmeSB0aGUgc291cmNlCi0gICAgICAgIG9mIHRoZSBjYWxsYmFjay4KLSAgICBAcGFyYW0gW2luXSBwQ2FsbEJhY2tzCi0gICAgICAgIHBvaW50ZXIgdG8gYSBPTVhfQ0FMTEJBQ0tUWVBFIHN0cnVjdHVyZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZQotICAgICAgICBjb21wb25lbnQgdG8gaW5pdGlhbGl6ZSBpdCB3aXRoLiAgCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29yZQotICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9HZXRIYW5kbGUoCi0gICAgT01YX09VVCBPTVhfSEFORExFVFlQRSogcEhhbmRsZSwgCi0gICAgT01YX0lOICBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAotICAgIE9NWF9JTiAgT01YX1BUUiBwQXBwRGF0YSwKLSAgICBPTVhfSU4gIE9NWF9DQUxMQkFDS1RZUEUqIHBDYWxsQmFja3MpOwotCi0KLS8qKiBUaGUgT01YX0ZyZWVIYW5kbGUgbWV0aG9kIHdpbGwgZnJlZSBhIGhhbmRsZSBhbGxvY2F0ZWQgYnkgdGhlIE9NWF9HZXRIYW5kbGUgCi0gICAgbWV0aG9kLiAgSWYgdGhlIGNvbXBvbmVudCByZWZlcmVuY2UgY291bnQgZ29lcyB0byB6ZXJvLCB0aGUgY29tcG9uZW50IHdpbGwKLSAgICBiZSB1bmxvYWRlZCBmcm9tIG1lbW9yeS4gIAotICAgIAotICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMgd2hlbiB0aGUgY29tcG9uZW50IGlzIAotICAgIGluIHRoZSBPTVhfU3RhdGVMb2FkZWQgc3RhdGUuCi0KLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfRnJlZUhhbmRsZSgKLSAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOwotCi0KLQotLyoqIFRoZSBPTVhfU2V0dXBUdW5uZWwgbWV0aG9kIHdpbGwgaGFuZGxlIHRoZSBuZWNlc3NhcnkgY2FsbHMgdG8gdGhlIGNvbXBvbmVudHMKLSAgICB0byBzZXR1cCB0aGUgc3BlY2lmaWVkIHR1bm5lbCB0aGUgdHdvIGNvbXBvbmVudHMuICBOT1RFOiBUaGlzIGlzCi0gICAgYW4gYWN0dWFsIG1ldGhvZCAobm90IGEgI2RlZmluZSBtYWNybykuICBUaGlzIG1ldGhvZCB3aWxsIG1ha2UgY2FsbHMgaW50bwotICAgIHRoZSBjb21wb25lbnQgQ29tcG9uZW50VHVubmVsUmVxdWVzdCBtZXRob2QgdG8gZG8gdGhlIGFjdHVhbCB0dW5uZWwgCi0gICAgY29ubmVjdGlvbi4gIAotCi0gICAgVGhlIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgbWV0aG9kIG9uIGJvdGggY29tcG9uZW50cyB3aWxsIGJlIGNhbGxlZC4gCi0gICAgVGhpcyBtZXRob2Qgc2hhbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgCi0gICAgT01YX1N0YXRlTG9hZGVkIHN0YXRlIGV4Y2VwdCB3aGVuIHRoZSBwb3J0cyB1c2VkIGZvciB0aGUgdHVubmVsIGFyZQotICAgIGRpc2FibGVkLiBJbiB0aGlzIGNhc2UsIHRoZSBjb21wb25lbnQgbWF5IGJlIGluIHRoZSBPTVhfU3RhdGVFeGVjdXRpbmcsCi0gICAgT01YX1N0YXRlUGF1c2UsIG9yIE9NWF9TdGF0ZUlkbGUgc3RhdGVzLiAKLQotICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaE91dHB1dAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIEFsc28gdGhpcyBpcyB0aGUgaGFuZGxlCi0gICAgICAgIG9mIHRoZSBjb21wb25lbnQgd2hvc2UgcG9ydCwgc3BlY2lmaWVkIGluIHRoZSBuUG9ydE91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBzb3VyY2UgZm9yIHRoZSB0dW5uZWwuIFRoaXMgaXMgdGhlIGNvbXBvbmVudCBoYW5kbGUKLSAgICAgICAgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uICBUaGVyZSBpcyBhIAotICAgICAgICByZXF1aXJlbWVudCB0aGF0IGhPdXRwdXQgYmUgdGhlIHNvdXJjZSBmb3IgdGhlIGRhdGEgd2hlbgotICAgICAgICB0dW5lbGxpbmcgKGkuZS4gblBvcnRPdXRwdXQgaXMgYW4gb3V0cHV0IHBvcnQpLiAgSWYgMHgwLCB0aGUgY29tcG9uZW50Ci0gICAgICAgIHNwZWNpZmllZCBpbiBoSW5wdXQgd2lsbCBoYXZlIGl0J3MgcG9ydCBzcGVjaWZpZWQgaW4gblBvcnRJbnB1dAotICAgICAgICBzZXR1cCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbiAvIElMIGNsaWVudC4KLSAgICBAcGFyYW0gW2luXSBuUG9ydE91dHB1dAotICAgICAgICBuUG9ydE91dHB1dCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgc291cmNlIHBvcnQgb24gY29tcG9uZW50IHRvIGJlCi0gICAgICAgIHVzZWQgaW4gdGhlIHR1bm5lbC4gCi0gICAgQHBhcmFtIFtpbl0gaElucHV0Ci0gICAgICAgIFRoaXMgaXMgdGhlIGNvbXBvbmVudCB0byBzZXR1cCB0aGUgdHVubmVsIHdpdGguIFRoaXMgaXMgdGhlIGhhbmRsZQotICAgICAgICBvZiB0aGUgY29tcG9uZW50IHdob3NlIHBvcnQsIHNwZWNpZmllZCBpbiB0aGUgblBvcnRJbnB1dCBwYXJhbWV0ZXIKLSAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIHR1bm5lbC4gVGhpcyBpcyB0aGUgY29tcG9uZW50IGhhbmRsZQotICAgICAgICByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4gIFRoZXJlIGlzIGEgCi0gICAgICAgIHJlcXVpcmVtZW50IHRoYXQgaElucHV0IGJlIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGRhdGEgd2hlbgotICAgICAgICB0dW5lbGxpbmcgKGkuZS4gblBvcnRJbnV0IGlzIGFuIGlucHV0IHBvcnQpLiAgIElmIDB4MCwgdGhlIGNvbXBvbmVudAotICAgICAgICBzcGVjaWZpZWQgaW4gaE91dHB1dCB3aWxsIGhhdmUgaXQncyBwb3J0IHNwZWNpZmllZCBpbiBuUG9ydFBPdXRwdXQKLSAgICAgICAgc2V0dXAgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBjbGllbnQuCi0gICAgQHBhcmFtIFtpbl0gblBvcnRJbnB1dAotICAgICAgICBuUG9ydElucHV0IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBkZXN0aW5hdGlvbiBwb3J0IG9uIGNvbXBvbmVudCB0byBiZQotICAgICAgICB1c2VkIGluIHRoZSB0dW5uZWwuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICAgIFdoZW4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQgaXMgcmV0dXJuZWQsIG9uZSBvciBib3RoIGNvbXBvbmVudHMgaXMgCi0gICAgICAgIGEgbm9uLWludGVyb3AgY29tcG9uZW50IGFuZCBkb2VzIG5vdCBzdXBwb3J0IHR1bm5lbGluZy4KLSAgICAgICAgCi0gICAgICAgIE9uIGZhaWx1cmUsIHRoZSBwb3J0cyBvZiBib3RoIGNvbXBvbmVudHMgYXJlIHNldHVwIGZvciBjb21tdW5pY2F0aW9uCi0gICAgICAgIHdpdGggdGhlIGFwcGxpY2F0aW9uIC8gSUwgQ2xpZW50LgotICAgIEBpbmdyb3VwIGNvcmUgdHVuCi0gKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX1NldHVwVHVubmVsKAotICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaE91dHB1dCwKLSAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnRPdXRwdXQsCi0gICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoSW5wdXQsCi0gICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0SW5wdXQpOwotICAgIAotLyoqIEBpbmdyb3VwIGNwICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgICBPTVhfR2V0Q29udGVudFBpcGUoCi0gICAgT01YX09VVCBPTVhfSEFORExFVFlQRSAqaFBpcGUsCi0gICAgT01YX0lOIE9NWF9TVFJJTkcgc3pVUkkpOwotCi0vKiogVGhlIE9NWF9HZXRDb21wb25lbnRzT2ZSb2xlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdGhhdCBzdXBwb3J0IHRoZSBnaXZlbgotICAgIHJvbGUgYW5kIChpZiB0aGUgY29tcE5hbWVzIGZpZWxkIGlzIG5vbi1OVUxMKSB0aGUgbmFtZXMgb2YgdGhvc2UgY29tcG9uZW50cy4gVGhlIGNhbGwgd2lsbCBmYWlsIGlmIAotICAgIGFuIGluc3VmZmljaWVudGx5IHNpemVkIGFycmF5IG9mIG5hbWVzIGlzIHN1cHBsaWVkLiBUbyBlbnN1cmUgdGhlIGFycmF5IGlzIHN1ZmZpY2llbnRseSBzaXplZCB0aGUKLSAgICBjbGllbnQgc2hvdWxkOgotICAgICAgICAqIGZpcnN0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBjb21wTmFtZXMgZmllbGQgTlVMTCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjb21wb25lbnQgbmFtZXMKLSAgICAgICAgKiBzZWNvbmQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGNvbXBOYW1lcyBmaWVsZCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBuYW1lcyBhbGxvY2F0ZWQgCi0gICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZpcnN0IGNhbGwuCi0KLSAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gcm9sZQotICAgICAgICBUaGlzIGlzIGdlbmVyaWMgc3RhbmRhcmQgY29tcG9uZW50IG5hbWUgY29uc2lzdGluZyBvbmx5IG9mIGNvbXBvbmVudCBjbGFzcyAKLSAgICAgICAgbmFtZSBhbmQgdGhlIHR5cGUgd2l0aGluIHRoYXQgY2xhc3MgKGUuZy4gJ2F1ZGlvX2RlY29kZXIuYWFjJykuCi0gICAgQHBhcmFtIFtpbm91dF0gcE51bUNvbXBzCi0gICAgICAgIFRoaXMgaXMgdXNlZCBib3RoIGFzIGlucHV0IGFuZCBvdXRwdXQuIAotIAotICAgICAgICBJZiBjb21wTmFtZXMgaXMgTlVMTCwgdGhlIGlucHV0IGlzIGlnbm9yZWQgYW5kIHRoZSBvdXRwdXQgc3BlY2lmaWVzIGhvdyBtYW55IGNvbXBvbmVudHMgc3VwcG9ydAotICAgICAgICB0aGUgZ2l2ZW4gcm9sZS4KLSAgICAgCi0gICAgICAgIElmIGNvbXBOYW1lcyBpcyBub3QgTlVMTCwgb24gaW5wdXQgaXQgYm91bmRzIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzdHJ1Y3R1cmUgYW5kIAotICAgICAgICBvbiBvdXRwdXQsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgc3RyaW5nIG5hbWVzIGxpc3RlZCB3aXRoaW4gdGhlIGNvbXBOYW1lcyBwYXJhbWV0ZXIuCi0gICAgQHBhcmFtIFtpbm91dF0gY29tcE5hbWVzCi0gICAgICAgIElmIE5VTEwgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBJZiBub24tTlVMTCB0aGlzIHBvaW50cyB0byBhbiBhcnJheSBvZiAxMjgtYnl0ZSBzdHJpbmdzIHdoaWNoIGFjY2VwdHMgCi0gICAgICAgIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHBoeXNpY2FsIGNvbXBvbmVudHMgdGhhdCBpbXBsZW1lbnQgdGhlIHNwZWNpZmllZCBzdGFuZGFyZCBjb21wb25lbnQgbmFtZS4gCi0gICAgICAgIEVhY2ggbmFtZSBpcyBOVUxMIHRlcm1pbmF0ZWQuIG51bUNvbXBzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG5hbWVzLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9HZXRDb21wb25lbnRzT2ZSb2xlICggCi0JT01YX0lOICAgICAgT01YX1NUUklORyByb2xlLAotICAgIE9NWF9JTk9VVCAgIE9NWF9VMzIgKnBOdW1Db21wcywKLSAgICBPTVhfSU5PVVQgICBPTVhfVTggICoqY29tcE5hbWVzKTsKLQotLyoqIFRoZSBPTVhfR2V0Um9sZXNPZkNvbXBvbmVudCBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiByb2xlcyBzdXBwb3J0ZWQgYnkgdGhlIGdpdmVuCi0gICAgY29tcG9uZW50IGFuZCAoaWYgdGhlIHJvbGVzIGZpZWxkIGlzIG5vbi1OVUxMKSB0aGUgbmFtZXMgb2YgdGhvc2Ugcm9sZXMuIFRoZSBjYWxsIHdpbGwgZmFpbCBpZiAKLSAgICBhbiBpbnN1ZmZpY2llbnRseSBzaXplZCBhcnJheSBvZiBuYW1lcyBpcyBzdXBwbGllZC4gVG8gZW5zdXJlIHRoZSBhcnJheSBpcyBzdWZmaWNpZW50bHkgc2l6ZWQgdGhlCi0gICAgY2xpZW50IHNob3VsZDoKLSAgICAgICAgKiBmaXJzdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgcm9sZXMgZmllbGQgTlVMTCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiByb2xlIG5hbWVzCi0gICAgICAgICogc2Vjb25kIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSByb2xlcyBmaWVsZCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBuYW1lcyBhbGxvY2F0ZWQgCi0gICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZpcnN0IGNhbGwuCi0KLSAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0KLSAgICBAcGFyYW0gW2luXSBjb21wTmFtZQotICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgcXVlcmllZCBhYm91dC4KLSAgICBAcGFyYW0gW2lub3V0XSBwTnVtUm9sZXMKLSAgICAgICAgVGhpcyBpcyB1c2VkIGJvdGggYXMgaW5wdXQgYW5kIG91dHB1dC4gCi0gCi0gICAgICAgIElmIHJvbGVzIGlzIE5VTEwsIHRoZSBpbnB1dCBpcyBpZ25vcmVkIGFuZCB0aGUgb3V0cHV0IHNwZWNpZmllcyBob3cgbWFueSByb2xlcyB0aGUgY29tcG9uZW50IHN1cHBvcnRzLgotICAgICAKLSAgICAgICAgSWYgY29tcE5hbWVzIGlzIG5vdCBOVUxMLCBvbiBpbnB1dCBpdCBib3VuZHMgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cnVjdHVyZSBhbmQgCi0gICAgICAgIG9uIG91dHB1dCwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygcm9sZXMgc3RyaW5nIG5hbWVzIGxpc3RlZCB3aXRoaW4gdGhlIHJvbGVzIHBhcmFtZXRlci4KLSAgICBAcGFyYW0gW291dF0gcm9sZXMKLSAgICAgICAgSWYgTlVMTCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIElmIG5vbi1OVUxMIHRoaXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mIDEyOC1ieXRlIHN0cmluZ3MgCi0gICAgICAgIHdoaWNoIGFjY2VwdHMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgc3RhbmRhcmQgY29tcG9uZW50cyByb2xlcyBpbXBsZW1lbnRlZCBvbiB0aGUgCi0gICAgICAgIHNwZWNpZmllZCBjb21wb25lbnQgbmFtZS4gbnVtQ29tcHMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbmFtZXMuCi0gICAgQGluZ3JvdXAgY29yZQotICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0dldFJvbGVzT2ZDb21wb25lbnQgKCAKLQlPTVhfSU4gICAgICBPTVhfU1RSSU5HIGNvbXBOYW1lLCAKLSAgICBPTVhfSU5PVVQgICBPTVhfVTMyICpwTnVtUm9sZXMsCi0gICAgT01YX09VVCAgICAgT01YX1U4ICoqcm9sZXMpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYKLS8qIEZpbGUgRU9GICovCi0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfQ29yZUV4dC5oIGIvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9Db3JlRXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzE0YjAuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9Db3JlRXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICovCi0KLS8qKiBPTVhfQ29yZUV4dC5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiBUaGUgT01YX0NvcmVFeHQgaGVhZGVyIGZpbGUgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgZGVmaW5pdGlvbnMgdXNlZAotICogYnkgYm90aCB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzIGNvbW1vbiBpdGVtcy4KLSAqLwotCi0jaWZuZGVmIE9NWF9Db3JlRXh0X2gKLSNkZWZpbmUgT01YX0NvcmVFeHRfaAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qIEVhY2ggT01YIGhlYWRlciBzaGFsbCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5Ci0gKi8KLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotCi0KLS8qKiBFdmVudCB0eXBlIGV4dGVuc2lvbnMuICovCi10eXBlZGVmIGVudW0gT01YX0VWRU5URVhUVFlQRQotewotICAgIE9NWF9FdmVudEluZGV4U2V0dGluZ0NoYW5nZWQgPSBPTVhfRXZlbnRLaHJvbm9zRXh0ZW5zaW9ucywgLyoqPCBjb21wb25lbnQgc2lnbmFscyB0aGUgSUwgY2xpZW50IG9mIGEgY2hhbmdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGEgcGFyYW0sIGNvbmZpZywgb3IgZXh0ZW5zaW9uICovCi0gICAgT01YX0V2ZW50RXh0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRVZFTlRFWFRUWVBFOwotCi0KLS8qKiBFbmFibGUgb3IgZGlzYWJsZSBhIGNhbGxiYWNrIGV2ZW50LiAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DQUxMQkFDS1JFUVVFU1RUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfSU5ERVhUWVBFIG5JbmRleDsgICAgICAgLyoqPCB0aGUgaW5kZXggdGhlIGNhbGxiYWNrIGlzIHJlcXVlc3RlZCBmb3IgKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAgLyoqPCBlbmFibGUgKE9NWF9UUlVFKSBvciBkaXNhYmxlIChPTVhfRkFMU0UpIHRoZSBjYWxsYmFjayAqLwotfSBPTVhfQ09ORklHX0NBTExCQUNLUkVRVUVTVFRZUEU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBPTVhfQ29yZUV4dF9oICovCi0vKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9JVkNvbW1vbi5oIGIvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9JVkNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzcxNzU2Li4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfSVZDb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDkzMyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAotICoKLSAqLwotCi0vKiogCi0gKiBAZmlsZSBPTVhfSVZDb21tb24uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBWaWRlbyBhbmQgSW1hZ2UgY29tcG9uZW50cyB0byBleGNoYW5nZQotICogIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIHRoZSBjb21wb25lbnRzLgotICovCi0jaWZuZGVmIE9NWF9JVkNvbW1vbl9oCi0jZGVmaW5lIE9NWF9JVkNvbW1vbl9oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotLyoqCi0gKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlIGhlYWRlcgotICogdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgaGVhZGVyCi0gKiBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAotICovCi0KLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotCi0vKiogQGRlZmdyb3VwIGl2IE9wZW5NQVggSUwgSW1hZ2luZyBhbmQgVmlkZW8gRG9tYWluCi0gKiBDb21tb24gc3RydWN0dXJlcyBmb3IgT3Blbk1BWCBJTCBJbWFnaW5nIGFuZCBWaWRlbyBkb21haW5zCi0gKiBAewotICovCi0KLQotLyoqIAotICogRW51bWVyYXRpb24gZGVmaW5pbmcgcG9zc2libGUgdW5jb21wcmVzc2VkIGltYWdlL3ZpZGVvIGZvcm1hdHMuIAotICoKLSAqIEVOVU1TOgotICogIFVudXNlZCAgICAgICAgICAgICAgICAgOiBQbGFjZWhvbGRlciB2YWx1ZSB3aGVuIGZvcm1hdCBpcyBOL0EKLSAqICBNb25vY2hyb21lICAgICAgICAgICAgIDogYmxhY2sgYW5kIHdoaXRlCi0gKiAgOGJpdFJHQjMzMiAgICAgICAgICAgICA6IFJlZCA3OjUsIEdyZWVuIDQ6MiwgQmx1ZSAxOjAKLSAqICAxMmJpdFJHQjQ0NCAgICAgICAgICAgIDogUmVkIDExOjgsIEdyZWVuIDc6NCwgQmx1ZSAzOjAKLSAqICAxNmJpdEFSR0I0NDQ0ICAgICAgICAgIDogQWxwaGEgMTU6MTIsIFJlZCAxMTo4LCBHcmVlbiA3OjQsIEJsdWUgMzowCi0gKiAgMTZiaXRBUkdCMTU1NSAgICAgICAgICA6IEFscGhhIDE1LCBSZWQgMTQ6MTAsIEdyZWVuIDk6NSwgQmx1ZSA0OjAKLSAqICAxNmJpdFJHQjU2NSAgICAgICAgICAgIDogUmVkIDE1OjExLCBHcmVlbiAxMDo1LCBCbHVlIDQ6MAotICogIDE2Yml0QkdSNTY1ICAgICAgICAgICAgOiBCbHVlIDE1OjExLCBHcmVlbiAxMDo1LCBSZWQgNDowCi0gKiAgMThiaXRSR0I2NjYgICAgICAgICAgICA6IFJlZCAxNzoxMiwgR3JlZW4gMTE6NiwgQmx1ZSA1OjAKLSAqICAxOGJpdEFSR0IxNjY1ICAgICAgICAgIDogQWxwaGEgMTcsIFJlZCAxNjoxMSwgR3JlZW4gMTA6NSwgQmx1ZSA0OjAKLSAqICAxOWJpdEFSR0IxNjY2ICAgICAgICAgIDogQWxwaGEgMTgsIFJlZCAxNzoxMiwgR3JlZW4gMTE6NiwgQmx1ZSA1OjAKLSAqICAyNGJpdFJHQjg4OCAgICAgICAgICAgIDogUmVkIDI0OjE2LCBHcmVlbiAxNTo4LCBCbHVlIDc6MAotICogIDI0Yml0QkdSODg4ICAgICAgICAgICAgOiBCbHVlIDI0OjE2LCBHcmVlbiAxNTo4LCBSZWQgNzowCi0gKiAgMjRiaXRBUkdCMTg4NyAgICAgICAgICA6IEFscGhhIDIzLCBSZWQgMjI6MTUsIEdyZWVuIDE0OjcsIEJsdWUgNjowCi0gKiAgMjViaXRBUkdCMTg4OCAgICAgICAgICA6IEFscGhhIDI0LCBSZWQgMjM6MTYsIEdyZWVuIDE1OjgsIEJsdWUgNzowCi0gKiAgMzJiaXRCR1JBODg4OCAgICAgICAgICA6IEJsdWUgMzE6MjQsIEdyZWVuIDIzOjE2LCBSZWQgMTU6OCwgQWxwaGEgNzowCi0gKiAgMzJiaXRBUkdCODg4OCAgICAgICAgICA6IEFscGhhIDMxOjI0LCBSZWQgMjM6MTYsIEdyZWVuIDE1OjgsIEJsdWUgNzowCi0gKiAgWVVWNDExUGxhbmFyICAgICAgICAgICA6IFUsWSBhcmUgc3Vic2FtcGxlZCBieSBhIGZhY3RvciBvZiA0IGhvcml6b250YWxseQotICogIFlVVjQxMVBhY2tlZFBsYW5hciAgICAgOiBwYWNrZWQgcGVyIHBheWxvYWQgaW4gcGxhbmFyIHNsaWNlcwotICogIFlVVjQyMFBsYW5hciAgICAgICAgICAgOiBUaHJlZSBhcnJheXMgWSxVLFYuCi0gKiAgWVVWNDIwUGFja2VkUGxhbmFyICAgICA6IHBhY2tlZCBwZXIgcGF5bG9hZCBpbiBwbGFuYXIgc2xpY2VzCi0gKiAgWVVWNDIwU2VtaVBsYW5hciAgICAgICA6IFR3byBhcnJheXMsIG9uZSBpcyBhbGwgWSwgdGhlIG90aGVyIGlzIFUgYW5kIFYKLSAqICBZVVY0MjJQbGFuYXIgICAgICAgICAgIDogVGhyZWUgYXJyYXlzIFksVSxWLgotICogIFlVVjQyMlBhY2tlZFBsYW5hciAgICAgOiBwYWNrZWQgcGVyIHBheWxvYWQgaW4gcGxhbmFyIHNsaWNlcwotICogIFlVVjQyMlNlbWlQbGFuYXIgICAgICAgOiBUd28gYXJyYXlzLCBvbmUgaXMgYWxsIFksIHRoZSBvdGhlciBpcyBVIGFuZCBWCi0gKiAgWUNiWUNyICAgICAgICAgICAgICAgICA6IE9yZ2FuaXplZCBhcyAxNmJpdCBZVVlWIChpLmUuIFlDYllDcikKLSAqICBZQ3JZQ2IgICAgICAgICAgICAgICAgIDogT3JnYW5pemVkIGFzIDE2Yml0IFlWWVUgKGkuZS4gWUNyWUNiKQotICogIENiWUNyWSAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgVVlWWSAoaS5lLiBDYllDclkpCi0gKiAgQ3JZQ2JZICAgICAgICAgICAgICAgICA6IE9yZ2FuaXplZCBhcyAxNmJpdCBWWVVZIChpLmUuIENyWUNiWSkKLSAqICBZVVY0NDRJbnRlcmxlYXZlZCAgICAgIDogRWFjaCBwaXhlbCBjb250YWlucyBlcXVhbCBwYXJ0cyBZVVYKLSAqICBSYXdCYXllcjhiaXQgICAgICAgICAgIDogU01JQSBjYW1lcmEgb3V0cHV0IGZvcm1hdAotICogIFJhd0JheWVyMTBiaXQgICAgICAgICAgOiBTTUlBIGNhbWVyYSBvdXRwdXQgZm9ybWF0Ci0gKiAgUmF3QmF5ZXI4Yml0Y29tcHJlc3NlZCA6IFNNSUEgY2FtZXJhIG91dHB1dCBmb3JtYXQKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9DT0xPUl9GT1JNQVRUWVBFIHsKLSAgICBPTVhfQ09MT1JfRm9ybWF0VW51c2VkLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRNb25vY2hyb21lLAotICAgIE9NWF9DT0xPUl9Gb3JtYXQ4Yml0UkdCMzMyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MTZiaXRBUkdCNDQ0NCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MTZiaXRBUkdCMTU1NSwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QkdSNTY1LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQxOGJpdFJHQjY2NiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MThiaXRBUkdCMTY2NSwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MTliaXRBUkdCMTY2NiwgCi0gICAgT01YX0NPTE9SX0Zvcm1hdDI0Yml0UkdCODg4LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQyNGJpdEJHUjg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MjRiaXRBUkdCMTg4NywKLSAgICBPTVhfQ09MT1JfRm9ybWF0MjViaXRBUkdCMTg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDExUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MTFQYWNrZWRQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFBsYW5hciwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hciwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WUNiWUNyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZQ3JZQ2IsCi0gICAgT01YX0NPTE9SX0Zvcm1hdENiWUNyWSwKLSAgICBPTVhfQ09MT1JfRm9ybWF0Q3JZQ2JZLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0NDRJbnRlcmxlYXZlZCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjEwYml0LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXRjb21wcmVzc2VkLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRMMiwgCi0gICAgT01YX0NPTE9SX0Zvcm1hdEw0LCAKLSAgICBPTVhfQ09MT1JfRm9ybWF0TDgsIAotICAgIE9NWF9DT0xPUl9Gb3JtYXRMMTYsIAotICAgIE9NWF9DT0xPUl9Gb3JtYXRMMjQsIAotICAgIE9NWF9DT0xPUl9Gb3JtYXRMMzIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE4Qml0QkdSNjY2LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQyNEJpdEFSR0I2NjY2LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQyNEJpdEFCR1I2NjY2LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0NPTE9SX0Zvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgLyoqPFJlc2VydmVkIGFuZHJvaWQgb3BhcXVlIGNvbG9yZm9ybWF0LiBUZWxscyB0aGUgZW5jb2RlciB0aGF0Ci0gICAgICogdGhlIGFjdHVhbCBjb2xvcmZvcm1hdCB3aWxsIGJlICByZWxheWVkIGJ5IHRoZQotICAgICAqIEdyYWxsb2MgQnVmZmVycy4KLSAgICAgKiBGSVhNRTogSW4gdGhlIHByb2Nlc3Mgb2YgcmVzZXJ2aW5nIHNvbWUgZW51bSB2YWx1ZXMgZm9yCi0gICAgICogQW5kcm9pZC1zcGVjaWZpYyBPTVggSUwgY29sb3Jmb3JtYXRzLiBDaGFuZ2UgdGhpcyBlbnVtIHRvCi0gICAgICogYW4gYWNjZXB0YWJsZSByYW5nZSBvbmNlIHRoYXQgaXMgZG9uZS4KLSAgICAgKiAqLwotICAgIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlID0gMHg3RjAwMDc4OSwKLSAgICBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciA9IDB4N0YwMDAxMDAsCi0gICAgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDAsCi0gICAgT01YX1FDT01fQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjY0eDMyVGlsZTJtOGthID0gMHg3RkEzMEMwMywKLSAgICBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZCA9IDB4N0ZDMDAwMDIsCi0gICAgT01YX1FDT01fQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybSA9IDB4N0ZBMzBDMDQsCi0gICAgT01YX0NPTE9SX0Zvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0NPTE9SX0ZPUk1BVFRZUEU7Ci0KLQotLyoqIAotICogRGVmaW5lcyB0aGUgbWF0cml4IGZvciBjb252ZXJzaW9uIGZyb20gUkdCIHRvIFlVViBvciB2aWNlIHZlcnNhLgotICogaUNvbG9yTWF0cml4IHNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBmaXhlZCBwb2ludCB2YWx1ZXMgCi0gKiB1c2VkIGluIGNvbnZlcnRpbmcgYmV0d2VlbiBmb3JtYXRzLgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SQ09OVkVSU0lPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3QgYXBwbGllcyB0byAqLwotICAgIE9NWF9TMzIgeENvbG9yTWF0cml4WzNdWzNdOyAvKio8IFN0b3JlZCBpbiBzaWduZWQgUTE2IGZvcm1hdCAqLwotICAgIE9NWF9TMzIgeENvbG9yT2Zmc2V0WzRdOyAgICAvKio8IFN0b3JlZCBpbiBzaWduZWQgUTE2IGZvcm1hdCAqLwotfU9NWF9DT05GSUdfQ09MT1JDT05WRVJTSU9OVFlQRTsKLQotCi0vKiogCi0gKiBTdHJ1Y3R1cmUgZGVmaW5pbmcgcGVyY2VudCB0byBzY2FsZSBlYWNoIGZyYW1lIGRpbWVuc2lvbi4gIEZvciBleGFtcGxlOiAgCi0gKiBUbyBtYWtlIHRoZSB3aWR0aCA1MCUgbGFyZ2VyLCB1c2UgZldpZHRoID0gMS41IGFuZCB0byBtYWtlIHRoZSB3aWR0aAotICogMS8yIHRoZSBvcmlnaW5hbCBzaXplLCB1c2UgZldpZHRoID0gMC41Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0IGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfUzMyIHhXaWR0aDsgICAgICAgICAgIC8qKjwgRml4ZWQgcG9pbnQgdmFsdWUgc3RvcmVkIGFzIFExNiAqLwotICAgIE9NWF9TMzIgeEhlaWdodDsgICAgICAgICAgLyoqPCBGaXhlZCBwb2ludCB2YWx1ZSBzdG9yZWQgYXMgUTE2ICovCi19T01YX0NPTkZJR19TQ0FMRUZBQ1RPUlRZUEU7Ci0KLQotLyoqIAotICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgaW1hZ2UgZmlsdGVyIHR5cGVzIAotICovCi10eXBlZGVmIGVudW0gT01YX0lNQUdFRklMVEVSVFlQRSB7Ci0gICAgT01YX0ltYWdlRmlsdGVyTm9uZSwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJOb2lzZSwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJFbWJvc3MsCi0gICAgT01YX0ltYWdlRmlsdGVyTmVnYXRpdmUsCi0gICAgT01YX0ltYWdlRmlsdGVyU2tldGNoLAotICAgIE9NWF9JbWFnZUZpbHRlck9pbFBhaW50LAotICAgIE9NWF9JbWFnZUZpbHRlckhhdGNoLAotICAgIE9NWF9JbWFnZUZpbHRlckdwZW4sCi0gICAgT01YX0ltYWdlRmlsdGVyQW50aWFsaWFzLCAKLSAgICBPTVhfSW1hZ2VGaWx0ZXJEZVJpbmcsICAgICAgIAotICAgIE9NWF9JbWFnZUZpbHRlclNvbGFyaXplLAotICAgIE9NWF9JbWFnZUZpbHRlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfSW1hZ2VGaWx0ZXJWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9JbWFnZUZpbHRlck1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0lNQUdFRklMVEVSVFlQRTsKLQotCi0vKiogCi0gKiBJbWFnZSBmaWx0ZXIgY29uZmlndXJhdGlvbiAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgCi0gKiAgblZlcnNpb24gICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvIAotICogIGVJbWFnZUZpbHRlciA6IEltYWdlIGZpbHRlciB0eXBlIGVudW1lcmF0aW9uICAgICAgCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfSU1BR0VGSUxURVJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0lNQUdFRklMVEVSVFlQRSBlSW1hZ2VGaWx0ZXI7Ci19IE9NWF9DT05GSUdfSU1BR0VGSUxURVJUWVBFOwotCi0KLS8qKiAKLSAqIEN1c3RvbWl6ZWQgVSBhbmQgViBmb3IgY29sb3IgZW5oYW5jZW1lbnQgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCi0gKiAgblBvcnRJbmRleCAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGJDb2xvckVuaGFuY2VtZW50IDogRW5hYmxlL2Rpc2FibGUgY29sb3IgZW5oYW5jZW1lbnQKLSAqICBuQ3VzdG9taXplZFUgICAgICA6IFByYWN0aWNhbCB2YWx1ZXM6IDE2LTI0MCwgcmFuZ2U6IDAtMjU1LCB2YWx1ZSBzZXQgZm9yIAotICogICAgICAgICAgICAgICAgICAgICAgVSBjb21wb25lbnQKLSAqICBuQ3VzdG9taXplZFYgICAgICA6IFByYWN0aWNhbCB2YWx1ZXM6IDE2LTI0MCwgcmFuZ2U6IDAtMjU1LCB2YWx1ZSBzZXQgZm9yIAotICogICAgICAgICAgICAgICAgICAgICAgViBjb21wb25lbnQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUkVOSEFOQ0VNRU5UVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiQ29sb3JFbmhhbmNlbWVudDsKLSAgICBPTVhfVTggbkN1c3RvbWl6ZWRVOwotICAgIE9NWF9VOCBuQ3VzdG9taXplZFY7Ci19IE9NWF9DT05GSUdfQ09MT1JFTkhBTkNFTUVOVFRZUEU7Ci0KLQotLyoqIAotICogRGVmaW5lIGNvbG9yIGtleSBhbmQgY29sb3Iga2V5IG1hc2sgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5BUkdCQ29sb3IgOiAzMmJpdCBBbHBoYSwgUmVkLCBHcmVlbiwgQmx1ZSBDb2xvcgotICogIG5BUkdCTWFzayAgOiAzMmJpdCBNYXNrIGZvciBBbHBoYSwgUmVkLCBHcmVlbiwgQmx1ZSBjaGFubmVscwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SS0VZVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkFSR0JDb2xvcjsKLSAgICBPTVhfVTMyIG5BUkdCTWFzazsKLX0gT01YX0NPTkZJR19DT0xPUktFWVRZUEU7Ci0KLQotLyoqIAotICogTGlzdCBvZiBjb2xvciBibGVuZCB0eXBlcyBmb3IgcHJlL3Bvc3QgcHJvY2Vzc2luZyAKLSAqCi0gKiBFTlVNUzoKLSAqICBOb25lICAgICAgICAgIDogTm8gY29sb3IgYmxlbmRpbmcgcHJlc2VudAotICogIEFscGhhQ29uc3RhbnQgOiBGdW5jdGlvbiBpcyAoYWxwaGFfY29uc3RhbnQgKiBzcmMpICsgCi0gKiAgICAgICAgICAgICAgICAgICgxIC0gYWxwaGFfY29uc3RhbnQpICogZHN0KQotICogIEFscGhhUGVyUGl4ZWwgOiBGdW5jdGlvbiBpcyAoYWxwaGEgKiBzcmMpICsgKDEgLSBhbHBoYSkgKiBkc3QpCi0gKiAgQWx0ZXJuYXRlICAgICA6IEZ1bmN0aW9uIGlzIGFsdGVybmF0aW5nIHBpeGVscyBmcm9tIHNyYyBhbmQgZHN0Ci0gKiAgQW5kICAgICAgICAgICA6IEZ1bmN0aW9uIGlzIChzcmMgJiBkc3QpCi0gKiAgT3IgICAgICAgICAgICA6IEZ1bmN0aW9uIGlzIChzcmMgfCBkc3QpCi0gKiAgSW52ZXJ0ICAgICAgICA6IEZ1bmN0aW9uIGlzIH5zcmMKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9DT0xPUkJMRU5EVFlQRSB7Ci0gICAgT01YX0NvbG9yQmxlbmROb25lLAotICAgIE9NWF9Db2xvckJsZW5kQWxwaGFDb25zdGFudCwKLSAgICBPTVhfQ29sb3JCbGVuZEFscGhhUGVyUGl4ZWwsCi0gICAgT01YX0NvbG9yQmxlbmRBbHRlcm5hdGUsCi0gICAgT01YX0NvbG9yQmxlbmRBbmQsCi0gICAgT01YX0NvbG9yQmxlbmRPciwKLSAgICBPTVhfQ29sb3JCbGVuZEludmVydCwKLSAgICBPTVhfQ29sb3JCbGVuZEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQ29sb3JCbGVuZFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0NvbG9yQmxlbmRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9DT0xPUkJMRU5EVFlQRTsKLQotCi0vKiogCi0gKiBDb2xvciBibGVuZCBjb25maWd1cmF0aW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgblZlcnNpb24gICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgIAotICogIG5Qb3J0SW5kZXggICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgICAgICAgICAgICAgICAgCi0gKiAgblJHQkFscGhhQ29uc3RhbnQgOiBDb25zdGFudCBnbG9iYWwgYWxwaGEgdmFsdWVzIHdoZW4gZ2xvYmFsIGFscGhhIGlzIHVzZWQKLSAqICBlQ29sb3JCbGVuZCAgICAgICA6IENvbG9yIGJsZW5kIHR5cGUgZW51bWVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09MT1JCTEVORFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5SR0JBbHBoYUNvbnN0YW50OwotICAgIE9NWF9DT0xPUkJMRU5EVFlQRSAgZUNvbG9yQmxlbmQ7Ci19IE9NWF9DT05GSUdfQ09MT1JCTEVORFRZUEU7Ci0KLQotLyoqIAotICogSG9sZCBmcmFtZSBkaW1lbnNpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgIAotICogIG5XaWR0aCAgICAgOiBGcmFtZSB3aWR0aCBpbiBwaXhlbHMgICAgICAgICAgICAgICAgIAotICogIG5IZWlnaHQgICAgOiBGcmFtZSBoZWlnaHQgaW4gcGl4ZWxzICAgICAgICAgICAgICAgIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfRlJBTUVTSVpFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbldpZHRoOwotICAgIE9NWF9VMzIgbkhlaWdodDsKLX0gT01YX0ZSQU1FU0laRVRZUEU7Ci0KLQotLyoqCi0gKiBSb3RhdGlvbiBjb25maWd1cmF0aW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAgICAgCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuUm90YXRpb24gIDogKy8tIGludGVnZXIgcm90YXRpb24gdmFsdWUgICAgICAgICAgICAgICAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19ST1RBVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyIG5Sb3RhdGlvbjsgCi19IE9NWF9DT05GSUdfUk9UQVRJT05UWVBFOwotCi0KLS8qKiAKLSAqIFBvc3NpYmxlIG1pcnJvcmluZyBkaXJlY3Rpb25zIGZvciBwcmUvcG9zdCBwcm9jZXNzaW5nIAotICoKLSAqIEVOVU1TOgotICogIE5vbmUgICAgICAgOiBObyBtaXJyb3JpbmcgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgVmVydGljYWwgICA6IFZlcnRpY2FsIG1pcnJvcmluZywgZmxpcCBvbiBYIGF4aXMgICAKLSAqICBIb3Jpem9udGFsIDogSG9yaXpvbnRhbCBtaXJyb3JpbmcsIGZsaXAgb24gWSBheGlzICAKLSAqICBCb3RoICAgICAgIDogQm90aCB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBtaXJyb3JpbmcKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9NSVJST1JUWVBFIHsKLSAgICBPTVhfTWlycm9yTm9uZSA9IDAsCi0gICAgT01YX01pcnJvclZlcnRpY2FsLAotICAgIE9NWF9NaXJyb3JIb3Jpem9udGFsLAotICAgIE9NWF9NaXJyb3JCb3RoLCAKLSAgICBPTVhfTWlycm9yS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9NaXJyb3JWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9NaXJyb3JNYXggPSAweDdGRkZGRkZGICAgCi19IE9NWF9NSVJST1JUWVBFOwotCi0KLS8qKiAKLSAqIE1pcnJvcmluZyBjb25maWd1cmF0aW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgCi0gKiAgZU1pcnJvciAgICA6IE1pcnJvciB0eXBlIGVudW1lcmF0aW9uICAgICAgICAgICAgICAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NSVJST1JUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9NSVJST1JUWVBFICBlTWlycm9yOwotfSBPTVhfQ09ORklHX01JUlJPUlRZUEU7Ci0KLQotLyoqIAotICogUG9zaXRpb24gaW5mb3JtYXRpb24gb25seSAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAgICAgCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuWCAgICAgICAgIDogWCBjb29yZGluYXRlIGZvciB0aGUgcG9pbnQgICAgICAgICAgICAgICAgICAgICAKLSAqICBuWSAgICAgICAgIDogWSBjb29yZGluYXRlIGZvciB0aGUgcG9pbnQgCi0gKi8gICAgICAgICAgICAgICAgICAgICAgCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1BPSU5UVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TMzIgblg7Ci0gICAgT01YX1MzMiBuWTsKLX0gT01YX0NPTkZJR19QT0lOVFRZUEU7Ci0KLQotLyoqIAotICogRnJhbWUgc2l6ZSBwbHVzIHBvc2l0aW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgIAotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICAgICAgCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAgIAotICogIG5MZWZ0ICAgICAgOiBYIENvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCi0gKiAgblRvcCAgICAgICA6IFkgQ29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKLSAqICBuV2lkdGggICAgIDogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogIG5IZWlnaHQgICAgOiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUkVDVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAKLSAgICBPTVhfUzMyIG5MZWZ0OyAKLSAgICBPTVhfUzMyIG5Ub3A7Ci0gICAgT01YX1UzMiBuV2lkdGg7Ci0gICAgT01YX1UzMiBuSGVpZ2h0OwotfSBPTVhfQ09ORklHX1JFQ1RUWVBFOwotCi0KLS8qKiAKLSAqIERlYmxvY2tpbmcgc3RhdGU7IGl0IGlzIHJlcXVpcmVkIHRvIGJlIHNldCB1cCBiZWZvcmUgc3RhcnRpbmcgdGhlIGNvZGVjIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgCi0gKiAgblZlcnNpb24gICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiRGVibG9ja2luZyA6IEVuYWJsZS9kaXNhYmxlIGRlYmxvY2tpbmcgbW9kZSAgICAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0RFQkxPQ0tJTkdUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkRlYmxvY2tpbmc7Ci19IE9NWF9QQVJBTV9ERUJMT0NLSU5HVFlQRTsKLQotCi0vKiogCi0gKiBTdGFiaWxpemF0aW9uIHN0YXRlIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAgCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gICAgCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAgCi0gKiAgYlN0YWIgICAgICA6IEVuYWJsZS9kaXNhYmxlIGZyYW1lIHN0YWJpbGl6YXRpb24gc3RhdGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19GUkFNRVNUQUJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYlN0YWI7Ci19IE9NWF9DT05GSUdfRlJBTUVTVEFCVFlQRTsKLQotCi0vKiogCi0gKiBXaGl0ZSBCYWxhbmNlIGNvbnRyb2wgdHlwZSAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBTdW5MaWdodCA6IFJlZmVyZW5jZWQgaW4gSlNSLTIzNAotICogIEZsYXNoICAgIDogT3B0aW1hbCBmb3IgZGV2aWNlJ3MgaW50ZWdyYXRlZCBmbGFzaAotICovCi10eXBlZGVmIGVudW0gT01YX1dISVRFQkFMQ09OVFJPTFRZUEUgewotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xPZmYgPSAwLAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xBdXRvLAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xTdW5MaWdodCwKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sQ2xvdWR5LAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xTaGFkZSwKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sVHVuZ3N0ZW4sCi0gICAgT01YX1doaXRlQmFsQ29udHJvbEZsdW9yZXNjZW50LAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xJbmNhbmRlc2NlbnQsCi0gICAgT01YX1doaXRlQmFsQ29udHJvbEZsYXNoLAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xIb3Jpem9uLAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1doaXRlQmFsQ29udHJvbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1doaXRlQmFsQ29udHJvbE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1dISVRFQkFMQ09OVFJPTFRZUEU7Ci0KLQotLyoqIAotICogV2hpdGUgQmFsYW5jZSBjb250cm9sIGNvbmZpZ3VyYXRpb24gCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAKLSAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgICAgICAgICAgICAgICAgCi0gKiAgZVdoaXRlQmFsQ29udHJvbCA6IFdoaXRlIGJhbGFuY2UgZW51bWVyYXRpb24gICAgICAgICAgICAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19XSElURUJBTENPTlRST0xUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1dISVRFQkFMQ09OVFJPTFRZUEUgZVdoaXRlQmFsQ29udHJvbDsKLX0gT01YX0NPTkZJR19XSElURUJBTENPTlRST0xUWVBFOwotCi0KLS8qKiAKLSAqIEV4cG9zdXJlIGNvbnRyb2wgdHlwZSAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9FWFBPU1VSRUNPTlRST0xUWVBFIHsKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sT2ZmID0gMCwKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sQXV0bywKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sTmlnaHQsCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbEJhY2tMaWdodCwKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sU3BvdExpZ2h0LAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xTcG9ydHMsCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbFNub3csCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbEJlYWNoLAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xMYXJnZUFwZXJ0dXJlLAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xTbWFsbEFwcGVydHVyZSwKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xNYXggPSAweDdGRkZGRkZGCi19IE9NWF9FWFBPU1VSRUNPTlRST0xUWVBFOwotCi0KLS8qKiAKLSAqIFdoaXRlIEJhbGFuY2UgY29udHJvbCBjb25maWd1cmF0aW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAKLSAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgICAgICAgICAgICAgICAKLSAqICBlRXhwb3N1cmVDb250cm9sIDogRXhwb3N1cmUgY29udHJvbCBlbnVtZXJhdGlvbiAgICAgICAgIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0VYUE9TVVJFQ09OVFJPTFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfRVhQT1NVUkVDT05UUk9MVFlQRSBlRXhwb3N1cmVDb250cm9sOwotfSBPTVhfQ09ORklHX0VYUE9TVVJFQ09OVFJPTFRZUEU7Ci0KLQotLyoqIAotICogRGVmaW5lcyBzZW5zb3Igc3VwcG9ydGVkIG1vZGUuIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAgIAotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvIAotICogIG5GcmFtZVJhdGUgOiBTaW5nbGUgc2hvdCBtb2RlIGlzIGluZGljYXRlZCBieSBhIDAgICAgIAotICogIGJPbmVTaG90ICAgOiBFbmFibGUgZm9yIHNpbmdsZSBzaG90LCBkaXNhYmxlIGZvciBzdHJlYW1pbmcKLSAqICBzRnJhbWVTaXplIDogRnJhbWVzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TRU5TT1JNT0RFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkZyYW1lUmF0ZTsKLSAgICBPTVhfQk9PTCBiT25lU2hvdDsKLSAgICBPTVhfRlJBTUVTSVpFVFlQRSBzRnJhbWVTaXplOwotfSBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEU7Ci0KLQotLyoqIAotICogRGVmaW5lcyBjb250cmFzdCBsZXZlbCAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gICAgICAgICAgICAgICAgCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAgICAgICAgICAgICAgICAKLSAqICBuQ29udHJhc3QgIDogVmFsdWVzIGFsbG93ZWQgZm9yIGNvbnRyYXN0IC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zIG5vIGNoYW5nZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTlRSQVNUVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TMzIgbkNvbnRyYXN0OwotfSBPTVhfQ09ORklHX0NPTlRSQVNUVFlQRTsKLQotCi0vKiogCi0gKiBEZWZpbmVzIGJyaWdodG5lc3MgbGV2ZWwgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAgCi0gKiAgblZlcnNpb24gICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCi0gKiAgbkJyaWdodG5lc3MgOiAwLTEwMCUgICAgICAgIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0JSSUdIVE5FU1NUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuQnJpZ2h0bmVzczsKLX0gT01YX0NPTkZJR19CUklHSFRORVNTVFlQRTsKLQotCi0vKiogCi0gKiBEZWZpbmVzIGJhY2tsaWdodCBsZXZlbCBjb25maWd1cmF0aW9uIGZvciBhIHZpZGVvIHNpbmssIGUuZy4gTENEIHBhbmVsIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuQmFja2xpZ2h0IDogVmFsdWVzIGFsbG93ZWQgZm9yIGJhY2tsaWdodCAwLTEwMCUKLSAqICBuVGltZW91dCAgIDogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgYmFja2xpZ2h0IGF1dG9tYXRpY2FsbHkgdHVybnMgCi0gKiAgICAgICAgICAgICAgIG9mZi4gIEEgdmFsdWUgb2YgMHgwIGRpc2FibGVzIGJhY2tpZ2h0IHRpbWVvdXQgCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQkFDS0xJR0hUVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkJhY2tsaWdodDsKLSAgICBPTVhfVTMyIG5UaW1lb3V0OwotfSBPTVhfQ09ORklHX0JBQ0tMSUdIVFRZUEU7Ci0KLQotLyoqIAotICogRGVmaW5lcyBzZXR0aW5nIGZvciBHYW1tYSAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkdhbW1hICAgICA6IFZhbHVlcyBhbGxvd2VkIGZvciBnYW1tYSAtMTAwIHRvIDEwMCwgemVybyBtZWFucyBubyBjaGFuZ2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19HQU1NQVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyIG5HYW1tYTsKLX0gT01YX0NPTkZJR19HQU1NQVRZUEU7Ci0KLQotLyoqIAotICogRGVmaW5lIGZvciBzZXR0aW5nIHNhdHVyYXRpb24gCi0gKiAKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5TYXR1cmF0aW9uIDogVmFsdWVzIGFsbG93ZWQgZm9yIHNhdHVyYXRpb24gLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgCi0gKiAgICAgICAgICAgICAgICBubyBjaGFuZ2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19TQVRVUkFUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TMzIgblNhdHVyYXRpb247Ci19IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEU7Ci0KLQotLyoqIAotICogRGVmaW5lIGZvciBzZXR0aW5nIExpZ2h0bmVzcyAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuTGlnaHRuZXNzIDogVmFsdWVzIGFsbG93ZWQgZm9yIGxpZ2h0bmVzcyAtMTAwIHRvIDEwMCwgemVybyBtZWFucyBubyAKLSAqICAgICAgICAgICAgICAgY2hhbmdlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TMzIgbkxpZ2h0bmVzczsKLX0gT01YX0NPTkZJR19MSUdIVE5FU1NUWVBFOwotCi0KLS8qKiAKLSAqIFBsYW5lIGJsZW5kIGNvbmZpZ3VyYXRpb24gCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBJbmRleCBvZiBpbnB1dCBwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGxhbmUuCi0gKiAgbkRlcHRoICAgICA6IERlcHRoIG9mIHRoZSBwbGFuZSBpbiByZWxhdGlvbiB0byB0aGUgc2NyZWVuLiBIaWdoZXIgCi0gKiAgICAgICAgICAgICAgIG51bWJlcmVkIGRlcHRocyBhcmUgImJlaGluZCIgbG93ZXIgbnVtYmVyIGRlcHRocy4gIAotICogICAgICAgICAgICAgICBUaGlzIG51bWJlciBkZWZhdWx0cyB0byB0aGUgUG9ydCBJbmRleCBudW1iZXIuCi0gKiAgbkFscGhhICAgICA6IFRyYW5zcGFyZW5jeSBibGVuZGluZyBjb21wb25lbnQgZm9yIHRoZSBlbnRpcmUgcGxhbmUuICAKLSAqICAgICAgICAgICAgICAgU2VlIGJsZW5kaW5nIG1vZGVzIGZvciBtb3JlIGRldGFpbC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19QTEFORUJMRU5EVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkRlcHRoOwotICAgIE9NWF9VMzIgbkFscGhhOwotfSBPTVhfQ09ORklHX1BMQU5FQkxFTkRUWVBFOwotCi0KLS8qKiAKLSAqIERlZmluZSBpbnRlcmxhY2UgdHlwZQotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAKLSAqICBuVmVyc2lvbiAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgYkVuYWJsZSAgICAgICAgICAgICAgIDogRW5hYmxlIGNvbnRyb2wgdmFyaWFibGUgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIGJlbG93KQotICogIG5JbnRlcmxlYXZlUG9ydEluZGV4ICA6IEluZGV4IG9mIGlucHV0IG9yIG91dHB1dCBwb3J0IGFzc29jaWF0ZWQgd2l0aCAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGludGVybGVhdmVkIHBsYW5lLiAKLSAqICBwUGxhbmFyUG9ydEluZGV4ZXNbNF0gOiBJbmRleCBvZiBpbnB1dCBvciBvdXRwdXQgcGxhbmFyIHBvcnRzLgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fSU5URVJMRUFWRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRW5hYmxlOwotICAgIE9NWF9VMzIgbkludGVybGVhdmVQb3J0SW5kZXg7Ci19IE9NWF9QQVJBTV9JTlRFUkxFQVZFVFlQRTsKLQotCi0vKiogCi0gKiBEZWZpbmVzIHRoZSBwaWN0dXJlIGVmZmVjdCB1c2VkIGZvciBhbiBpbnB1dCBwaWN0dXJlIAotICovCi10eXBlZGVmIGVudW0gT01YX1RSQU5TSVRJT05FRkZFQ1RUWVBFIHsKLSAgICBPTVhfRWZmZWN0Tm9uZSwKLSAgICBPTVhfRWZmZWN0RmFkZUZyb21CbGFjaywKLSAgICBPTVhfRWZmZWN0RmFkZVRvQmxhY2ssCi0gICAgT01YX0VmZmVjdFVuc3BlY2lmaWVkVGhyb3VnaENvbnN0YW50Q29sb3IsCi0gICAgT01YX0VmZmVjdERpc3NvbHZlLAotICAgIE9NWF9FZmZlY3RXaXBlLAotICAgIE9NWF9FZmZlY3RVbnNwZWNpZmllZE1peE9mVHdvU2NlbmVzLAotICAgIE9NWF9FZmZlY3RLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0VmZmVjdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0VmZmVjdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1RSQU5TSVRJT05FRkZFQ1RUWVBFOwotCi0KLS8qKiAKLSAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbmZpZ3VyZSBjdXJyZW50IHRyYW5zaXRpb24gZWZmZWN0IAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCi0gKiBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqIGVFZmZlY3QgICAgOiBFZmZlY3QgdG8gZW5hYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfVFJBTlNJVElPTkVGRkVDVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVFJBTlNJVElPTkVGRkVDVFRZUEUgZUVmZmVjdDsKLX0gT01YX0NPTkZJR19UUkFOU0lUSU9ORUZGRUNUVFlQRTsKLQotCi0vKiogCi0gKiBEZWZpbmVzIHBvc3NpYmxlIGRhdGEgdW5pdCB0eXBlcyBmb3IgZW5jb2RlZCB2aWRlbyBkYXRhLiBUaGUgZGF0YSB1bml0IAotICogdHlwZXMgYXJlIHVzZWQgYm90aCBmb3IgZW5jb2RlZCB2aWRlbyBpbnB1dCBmb3IgcGxheWJhY2sgYXMgd2VsbCBhcwotICogZW5jb2RlZCB2aWRlbyBvdXRwdXQgZnJvbSByZWNvcmRpbmcuIAotICovCi10eXBlZGVmIGVudW0gT01YX0RBVEFVTklUVFlQRSB7Ci0gICAgT01YX0RhdGFVbml0Q29kZWRQaWN0dXJlLAotICAgIE9NWF9EYXRhVW5pdFZpZGVvU2VnbWVudCwKLSAgICBPTVhfRGF0YVVuaXRTZXZlcmFsU2VnbWVudHMsCi0gICAgT01YX0RhdGFVbml0QXJiaXRyYXJ5U3RyZWFtU2VjdGlvbiwKLSAgICBPTVhfRGF0YVVuaXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0RhdGFVbml0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRGF0YVVuaXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9EQVRBVU5JVFRZUEU7Ci0KLQotLyoqIAotICogRGVmaW5lcyBwb3NzaWJsZSBlbmNhcHN1bGF0aW9uIHR5cGVzIGZvciBjb2RlZCB2aWRlbyBkYXRhIHVuaXQuIFRoZSAKLSAqIGVuY2Fwc3VsYXRpb24gaW5mb3JtYXRpb24gaXMgdXNlZCBib3RoIGZvciBlbmNvZGVkIHZpZGVvIGlucHV0IGZvciAKLSAqIHBsYXliYWNrIGFzIHdlbGwgYXMgZW5jb2RlZCB2aWRlbyBvdXRwdXQgZnJvbSByZWNvcmRpbmcuIAotICovCi10eXBlZGVmIGVudW0gT01YX0RBVEFVTklURU5DQVBTVUxBVElPTlRZUEUgewotICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvbkVsZW1lbnRhcnlTdHJlYW0sCi0gICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uR2VuZXJpY1BheWxvYWQsCi0gICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uUnRwUGF5bG9hZCwKLSAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25NYXggPSAweDdGRkZGRkZGCi19IE9NWF9EQVRBVU5JVEVOQ0FQU1VMQVRJT05UWVBFOwotCi0KLS8qKiAKLSAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHlwZSBvZiBiZWluZyBkZWNvZGVkL2VuY29kZWQgCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9EQVRBVU5JVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfREFUQVVOSVRUWVBFIGVVbml0VHlwZTsKLSAgICBPTVhfREFUQVVOSVRFTkNBUFNVTEFUSU9OVFlQRSBlRW5jYXBzdWxhdGlvblR5cGU7Ci19IE9NWF9QQVJBTV9EQVRBVU5JVFRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIGRpdGhlciB0eXBlcyAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9ESVRIRVJUWVBFIHsKLSAgICBPTVhfRGl0aGVyTm9uZSwKLSAgICBPTVhfRGl0aGVyT3JkZXJlZCwKLSAgICBPTVhfRGl0aGVyRXJyb3JEaWZmdXNpb24sCi0gICAgT01YX0RpdGhlck90aGVyLAotICAgIE9NWF9EaXRoZXJLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0RpdGhlclZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0RpdGhlck1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0RJVEhFUlRZUEU7Ci0KLQotLyoqIAotICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIGN1cnJlbnQgdHlwZSBvZiBkaXRoZXJpbmcgCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRElUSEVSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9ESVRIRVJUWVBFIGVEaXRoZXI7ICAgLyoqPCBUeXBlIG9mIGRpdGhlcmluZyB0byB1c2UgKi8KLX0gT01YX0NPTkZJR19ESVRIRVJUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NBUFRVUkVNT0RFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJDb250aW51b3VzOyAgIC8qKjwgSWYgdHJ1ZSB0aGVuIGlnbm9yZSBmcmFtZSByYXRlIGFuZCBlbWl0IGNhcHR1cmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBkYXRhIGFzIGZhc3QgYXMgcG9zc2libGUgKG90aGVyd2lzZSBvYmV5IHBvcnQncyBmcmFtZSByYXRlKS4gKi8KLSAgICBPTVhfQk9PTCBiRnJhbWVMaW1pdGVkOyAvKio8IElmIHRydWUgdGhlbiB0ZXJtaW5hdGUgY2FwdHVyZSBhZnRlciB0aGUgcG9ydCBlbWl0cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzcGVjaWZpZWQgbnVtYmVyIG9mIGZyYW1lcyAob3RoZXJ3aXNlIHRoZSBwb3J0IGRvZXMgbm90IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGVybWluYXRlIHRoZSBjYXB0dXJlIHVudGlsIGluc3RydWN0ZWQgdG8gZG8gc28gYnkgdGhlIGNsaWVudCkuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgRXZlbiBpZiBzZXQsIHRoZSBjbGllbnQgbWF5IG1hbnVhbGx5IHRlcm1pbmF0ZSB0aGUgY2FwdHVyZSBwcmlvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRvIHJlYWNoaW5nIHRoZSBsaW1pdC4gKi8KLSAgICBPTVhfVTMyIG5GcmFtZUxpbWl0OyAgICAgIC8qKjwgTGltaXQgb24gbnVtYmVyIG9mIGZyYW1lcyBlbWl0dGVkIGR1cmluZyBhIGNhcHR1cmUgKG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsaWQgaWYgYkZyYW1lTGltaXRlZCBpcyBzZXQpLiAqLwotfSBPTVhfQ09ORklHX0NBUFRVUkVNT0RFVFlQRTsKLQotdHlwZWRlZiBlbnVtIE9NWF9NRVRFUklOR1RZUEUgewotIAotICAgIE9NWF9NZXRlcmluZ01vZGVBdmVyYWdlLCAgICAgLyoqPCBDZW50ZXItd2VpZ2h0ZWQgYXZlcmFnZSBtZXRlcmluZy4gKi8KLSAgICBPTVhfTWV0ZXJpbmdNb2RlU3BvdCwgIAkgICAgICAvKio8IFNwb3QgKHBhcnRpYWwpIG1ldGVyaW5nLiAqLwotICAgIE9NWF9NZXRlcmluZ01vZGVNYXRyaXgsICAgICAgLyoqPCBNYXRyaXggb3IgZXZhbHVhdGl2ZSBtZXRlcmluZy4gKi8KLSAKLSAgICBPTVhfTWV0ZXJpbmdLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX01ldGVyaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRVZNb2RlTWF4ID0gMHg3ZmZmZmZmZgotfSBPTVhfTUVURVJJTkdUWVBFOwotIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19FWFBPU1VSRVZBTFVFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9NRVRFUklOR1RZUEUgZU1ldGVyaW5nOwotICAgIE9NWF9TMzIgeEVWQ29tcGVuc2F0aW9uOyAgICAgIC8qKjwgRml4ZWQgcG9pbnQgdmFsdWUgc3RvcmVkIGFzIFExNiAqLwotICAgIE9NWF9VMzIgbkFwZXJ0dXJlRk51bWJlcjsgICAgIC8qKjwgZS5nLiBuQXBlcnR1cmVGTnVtYmVyID0gMiBpbXBsaWVzICJmLzIiIC0gUTE2IGZvcm1hdCAqLwotICAgIE9NWF9CT09MIGJBdXRvQXBlcnR1cmU7CQkvKio8IFdoZXRoZXIgYXBlcnR1cmUgbnVtYmVyIGlzIGRlZmluZWQgYXV0b21hdGljYWxseSAqLwotICAgIE9NWF9VMzIgblNodXR0ZXJTcGVlZE1zZWM7ICAgIC8qKjwgU2h1dHRlcnNwZWVkIGluIG1pbGxpc2Vjb25kcyAqLyAKLSAgICBPTVhfQk9PTCBiQXV0b1NodXR0ZXJTcGVlZDsJLyoqPCBXaGV0aGVyIHNodXR0ZXIgc3BlZWQgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovIAotICAgIE9NWF9VMzIgblNlbnNpdGl2aXR5OyAgICAgICAgIC8qKjwgZS5nLiBuU2Vuc2l0aXZpdHkgPSAxMDAgaW1wbGllcyAiSVNPIDEwMCIgKi8KLSAgICBPTVhfQk9PTCBiQXV0b1NlbnNpdGl2aXR5OwkvKio8IFdoZXRoZXIgc2Vuc2l0aXZpdHkgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCi19IE9NWF9DT05GSUdfRVhQT1NVUkVWQUxVRVRZUEU7Ci0KLS8qKiAKLSAqIEZvY3VzIHJlZ2lvbiBjb25maWd1cmF0aW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGJDZW50ZXIgICAgICAgICA6IFVzZSBjZW50ZXIgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJMZWZ0ICAgICAgICAgICA6IFVzZSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiUmlnaHQgICAgICAgICAgOiBVc2UgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJUb3AgICAgICAgICAgICA6IFVzZSB0b3AgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJCb3R0b20gICAgICAgICA6IFVzZSBib3R0b20gcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJUb3BMZWZ0ICAgICAgICA6IFVzZSB0b3AgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYlRvcFJpZ2h0ICAgICAgIDogVXNlIHRvcCByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYkJvdHRvbUxlZnQgICAgIDogVXNlIGJvdHRvbSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiQm90dG9tUmlnaHQgICAgOiBVc2UgYm90dG9tIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19GT0NVU1JFR0lPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiQ2VudGVyOwotICAgIE9NWF9CT09MIGJMZWZ0OwotICAgIE9NWF9CT09MIGJSaWdodDsKLSAgICBPTVhfQk9PTCBiVG9wOwotICAgIE9NWF9CT09MIGJCb3R0b207Ci0gICAgT01YX0JPT0wgYlRvcExlZnQ7Ci0gICAgT01YX0JPT0wgYlRvcFJpZ2h0OwotICAgIE9NWF9CT09MIGJCb3R0b21MZWZ0OwotICAgIE9NWF9CT09MIGJCb3R0b21SaWdodDsKLX0gT01YX0NPTkZJR19GT0NVU1JFR0lPTlRZUEU7Ci0KLS8qKiAKLSAqIEZvY3VzIFN0YXR1cyB0eXBlIAotICovCi10eXBlZGVmIGVudW0gT01YX0ZPQ1VTU1RBVFVTVFlQRSB7Ci0gICAgT01YX0ZvY3VzU3RhdHVzT2ZmID0gMCwKLSAgICBPTVhfRm9jdXNTdGF0dXNSZXF1ZXN0LAotICAgIE9NWF9Gb2N1c1N0YXR1c1JlYWNoZWQsCi0gICAgT01YX0ZvY3VzU3RhdHVzVW5hYmxlVG9SZWFjaCwKLSAgICBPTVhfRm9jdXNTdGF0dXNMb3N0LAotICAgIE9NWF9Gb2N1c1N0YXR1c0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfRm9jdXNTdGF0dXNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9Gb2N1c1N0YXR1c01heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0ZPQ1VTU1RBVFVTVFlQRTsKLQotLyoqIAotICogRm9jdXMgc3RhdHVzIGNvbmZpZ3VyYXRpb24gCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUZvY3VzU3RhdHVzICAgICAgICA6IFNwZWNpZmllcyB0aGUgZm9jdXMgc3RhdHVzCi0gKiAgYkNlbnRlclN0YXR1cyAgICAgICA6IFVzZSBjZW50ZXIgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJMZWZ0U3RhdHVzICAgICAgICAgOiBVc2UgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYlJpZ2h0U3RhdHVzICAgICAgICA6IFVzZSByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYlRvcFN0YXR1cyAgICAgICAgICA6IFVzZSB0b3AgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJCb3R0b21TdGF0dXMgICAgICAgOiBVc2UgYm90dG9tIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiVG9wTGVmdFN0YXR1cyAgICAgIDogVXNlIHRvcCBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiVG9wUmlnaHRTdGF0dXMgICAgIDogVXNlIHRvcCByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYkJvdHRvbUxlZnRTdGF0dXMgICA6IFVzZSBib3R0b20gbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYkJvdHRvbVJpZ2h0U3RhdHVzICA6IFVzZSBib3R0b20gcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fRk9DVVNTVEFUVVNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0ZPQ1VTU1RBVFVTVFlQRSBlRm9jdXNTdGF0dXM7Ci0gICAgT01YX0JPT0wgYkNlbnRlclN0YXR1czsKLSAgICBPTVhfQk9PTCBiTGVmdFN0YXR1czsKLSAgICBPTVhfQk9PTCBiUmlnaHRTdGF0dXM7Ci0gICAgT01YX0JPT0wgYlRvcFN0YXR1czsKLSAgICBPTVhfQk9PTCBiQm90dG9tU3RhdHVzOwotICAgIE9NWF9CT09MIGJUb3BMZWZ0U3RhdHVzOwotICAgIE9NWF9CT09MIGJUb3BSaWdodFN0YXR1czsKLSAgICBPTVhfQk9PTCBiQm90dG9tTGVmdFN0YXR1czsKLSAgICBPTVhfQk9PTCBiQm90dG9tUmlnaHRTdGF0dXM7Ci19IE9NWF9QQVJBTV9GT0NVU1NUQVRVU1RZUEU7Ci0KLS8qKiBAfSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYKLS8qIEZpbGUgRU9GICovCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9pbmMvT01YX0ltYWdlLmggYi9zZG04NDUvbW0tY29yZS9pbmMvT01YX0ltYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZDQ2NjYuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9JbWFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKi8KLQotLyoqIAotICogQGZpbGUgT01YX0ltYWdlLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBJbWFnZSBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgYW5kIAotICogY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlIGNvbXBvbmVudHMuCi0gKi8KLSNpZm5kZWYgT01YX0ltYWdlX2gKLSNkZWZpbmUgT01YX0ltYWdlX2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qKgotICogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZSAKLSAqIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZCAgCi0gKiBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKLSAqLwotCi0jaW5jbHVkZSA8T01YX0lWQ29tbW9uLmg+Ci0KLS8qKiBAZGVmZ3JvdXAgaW1hZ2luZyBPcGVuTUFYIElMIEltYWdpbmcgRG9tYWluCi0gKiBAaW5ncm91cCBpdgotICogU3RydWN0dXJlcyBmb3IgT3Blbk1BWCBJTCBJbWFnaW5nIGRvbWFpbgotICogQHsKLSAqLwotCi0vKiogCi0gKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcG9zc2libGUgaW1hZ2UgY29tcHJlc3Npb24gY29kaW5nLiAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9DT0RJTkdUWVBFIHsKLSAgICBPTVhfSU1BR0VfQ29kaW5nVW51c2VkLCAgICAgIC8qKjwgVmFsdWUgd2hlbiBmb3JtYXQgaXMgTi9BICovCi0gICAgT01YX0lNQUdFX0NvZGluZ0F1dG9EZXRlY3QsICAvKio8IEF1dG8gZGV0ZWN0aW9uIG9mIGltYWdlIGZvcm1hdCAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdKUEVHLCAgICAgICAgLyoqPCBKUEVHL0pGSUYgaW1hZ2UgZm9ybWF0ICovCi0gICAgT01YX0lNQUdFX0NvZGluZ0pQRUcySywgICAgICAvKio8IEpQRUcgMjAwMCBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nRVhJRiwgICAgICAgIC8qKjwgRVhJRiBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nVElGRiwgICAgICAgIC8qKjwgVElGRiBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nR0lGLCAgICAgICAgIC8qKjwgR3JhcGhpY3MgaW1hZ2UgZm9ybWF0ICovCi0gICAgT01YX0lNQUdFX0NvZGluZ1BORywgICAgICAgICAvKio8IFBORyBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nTFpXLCAgICAgICAgIC8qKjwgTFpXIGltYWdlIGZvcm1hdCAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdCTVAsICAgICAgICAgLyoqPCBXaW5kb3dzIEJpdG1hcCBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9JTUFHRV9Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdNYXggPSAweDdGRkZGRkZGCi19IE9NWF9JTUFHRV9DT0RJTkdUWVBFOwotCi0KLS8qKgotICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYW4gaW1hZ2UgcGF0aC4gVGhlIG51bWJlciBvZiBpbWFnZSBwYXRocyAKLSAqIGZvciBpbnB1dCBhbmQgb3V0cHV0IHdpbGwgdmFyeSBieSB0eXBlIG9mIHRoZSBpbWFnZSBjb21wb25lbnQuICAKLSAqIAotICogIElucHV0IChha2EgU291cmNlKSA6IFplcm8gSW5wdXRzLCBvbmUgT3V0cHV0LAotICogIFNwbGl0dGVyICAgICAgICAgICA6IE9uZSBJbnB1dCwgMiBvciBtb3JlIE91dHB1dHMsCi0gKiAgUHJvY2Vzc2luZyBFbGVtZW50IDogT25lIElucHV0LCBvbmUgb3V0cHV0LAotICogIE1peGVyICAgICAgICAgICAgICA6IDIgb3IgbW9yZSBpbnB1dHMsIG9uZSBvdXRwdXQsCi0gKiAgT3V0cHV0IChha2EgU2luaykgIDogT25lIElucHV0LCB6ZXJvIG91dHB1dHMuCi0gKiAKLSAqIFRoZSBQb3J0RGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZWZpbmUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIAotICogbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQgIAotICogaW1hZ2UgcGF0aC4gIElmIGFkZGl0aW9uYWwgdmVuZG9yIHNwZWNpZmljIGRhdGEgaXMgcmVxdWlyZWQsIGl0IHNob3VsZCAgCi0gKiBiZSB0cmFuc21pdHRlZCB0byB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBDdXN0b21Db21tYW5kIGZ1bmN0aW9uLiAgIAotICogQ29tcGxpYW50IGNvbXBvbmVudHMgd2lsbCBwcmVwb3B1bGF0ZSB0aGlzIHN0cnVjdHVyZSB3aXRoIG9wdGltYWwgIAotICogdmFsdWVzIGR1cmluZyB0aGUgT01YX0dldFBhcmFtZXRlcigpIGNvbW1hbmQuCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgY01JTUVUeXBlICAgICAgICAgICAgIDogTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0Ci0gKiAgcE5hdGl2ZVJlbmRlciAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIGRpc3BsYXkgaWYgYSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAwCi0gKiAgbkZyYW1lV2lkdGggICAgICAgICAgIDogV2lkdGggb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBwb3J0IGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gIFVzZSAwIGZvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLCBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCi0gKiAgbkZyYW1lSGVpZ2h0ICAgICAgICAgIDogSGVpZ2h0IG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gcG9ydCBpZiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuIFVzZSAwIGZvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLCBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCi0gKiAgblN0cmlkZSAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIGJ5dGVzIHBlciBzcGFuIG9mIGFuIGltYWdlIChpLmUuIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdldCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbiBOIHRvIHNwYW4gTisxLCB3aGVyZSBuZWdhdGl2ZSBzdHJpZGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBpbWFnZSBpcyBib3R0b20gdXAKLSAqICBuU2xpY2VIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgdXNlZCB3aGVuIGVuY29kaW5nIGluIHNsaWNlcwotICogIGJGbGFnRXJyb3JDb25jZWFsbWVudCA6IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIHN1cHBvcnRlZCBieSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgT01YIGNvbXBvbmVudAotICogIGVDb21wcmVzc2lvbkZvcm1hdCAgICA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21wb25lbnQuIFdoZW4gT01YX0lNQUdFX0NvZGluZ1VudXNlZCBpcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQsIGVDb2xvckZvcm1hdCBpcyB2YWxpZAotICogIGVDb2xvckZvcm1hdCAgICAgICAgICA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAotICogIHBOYXRpdmVXaW5kb3cgICAgICAgICA6IFBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZSBmb3IgYSB3aW5kb3cgb2JqZWN0IGlmIGEgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBzaW5rICwgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMHgwLiAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BPUlRERUZJTklUSU9OVFlQRSB7Ci0gICAgT01YX1NUUklORyBjTUlNRVR5cGU7Ci0gICAgT01YX05BVElWRV9ERVZJQ0VUWVBFIHBOYXRpdmVSZW5kZXI7Ci0gICAgT01YX1UzMiBuRnJhbWVXaWR0aDsgCi0gICAgT01YX1UzMiBuRnJhbWVIZWlnaHQ7Ci0gICAgT01YX1MzMiBuU3RyaWRlOyAgICAgCi0gICAgT01YX1UzMiBuU2xpY2VIZWlnaHQ7Ci0gICAgT01YX0JPT0wgYkZsYWdFcnJvckNvbmNlYWxtZW50OwotICAgIE9NWF9JTUFHRV9DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsKLSAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBlQ29sb3JGb3JtYXQ7Ci0gICAgT01YX05BVElWRV9XSU5ET1dUWVBFIHBOYXRpdmVXaW5kb3c7Ci19IE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEU7Ci0KLQotLyoqICAKLSAqIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlIHRoZSB2YXJpb3VzIAotICogZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KLSAqIAotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICA6IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldAotICogIG5JbmRleCAgICAgICAgICAgICA6IEluZGljYXRlcyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBmb3JtYXQgZnJvbSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAweDAgdG8gTi0xCi0gKiAgZUNvbXByZXNzaW9uRm9ybWF0IDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9JTUFHRV9Db2RpbmdVbnVzZWQgaXMgc3BlY2lmaWVkLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBlQ29sb3JGb3JtYXQgaXMgdmFsaWQKLSAqICBlQ29sb3JGb3JtYXQgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuSW5kZXg7Ci0gICAgT01YX0lNQUdFX0NPRElOR1RZUEUgZUNvbXByZXNzaW9uRm9ybWF0OwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKLX0gT01YX0lNQUdFX1BBUkFNX1BPUlRGT1JNQVRUWVBFOwotCi0KLS8qKiAKLSAqIEZsYXNoIGNvbnRyb2wgdHlwZSAKLSAqCi0gKiBFTlVNUwotICogIFRvcmNoIDogRmxhc2ggZm9yY2VkIGNvbnN0YW50bHkgb24KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9GTEFTSENPTlRST0xUWVBFIHsKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sT24gPSAwLAotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xPZmYsCi0gICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbEF1dG8sCi0gICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbFJlZEV5ZVJlZHVjdGlvbiwKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sRmlsbGluLAotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xUb3JjaCwKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xNYXggPSAweDdGRkZGRkZGCi19IE9NWF9JTUFHRV9GTEFTSENPTlRST0xUWVBFOwotCi0KLS8qKiAKLSAqIEZsYXNoIGNvbnRyb2wgY29uZmlndXJhdGlvbiAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlRmxhc2hDb250cm9sIDogRmxhc2ggY29udHJvbCB0eXBlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0lNQUdFX0ZMQVNIQ09OVFJPTFRZUEUgZUZsYXNoQ29udHJvbDsKLX0gT01YX0lNQUdFX1BBUkFNX0ZMQVNIQ09OVFJPTFRZUEU7Ci0KLQotLyoqIAotICogRm9jdXMgY29udHJvbCB0eXBlIAotICovCi10eXBlZGVmIGVudW0gT01YX0lNQUdFX0ZPQ1VTQ09OVFJPTFRZUEUgewotICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xPbiA9IDAsCi0gICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbE9mZiwKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sQXV0bywKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sQXV0b0xvY2ssCi0gICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfSU1BR0VfRk9DVVNDT05UUk9MVFlQRTsKLQotIAotLyoqIAotICogRm9jdXMgY29udHJvbCBjb25maWd1cmF0aW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVGb2N1c0NvbnRyb2wgICA6IEZvY3VzIGNvbnRyb2wKLSAqICBuRm9jdXNTdGVwcyAgICAgOiBGb2N1cyBjYW4gdGFrZSBvbiB2YWx1ZXMgZnJvbSAwIG1tIHRvIGluZmluaXR5LiAKLSAqICAgICAgICAgICAgICAgICAgICBJbnRlcmVzdCBpcyBvbmx5IGluIG51bWJlciBvZiBzdGVwcyBvdmVyIHRoaXMgcmFuZ2UuCi0gKiAgbkZvY3VzU3RlcEluZGV4IDogQ3VycmVudCBmb2N1cyBzdGVwIGluZGV4Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9DT05GSUdfRk9DVVNDT05UUk9MVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9JTUFHRV9GT0NVU0NPTlRST0xUWVBFIGVGb2N1c0NvbnRyb2w7Ci0gICAgT01YX1UzMiBuRm9jdXNTdGVwczsKLSAgICBPTVhfVTMyIG5Gb2N1c1N0ZXBJbmRleDsKLX0gT01YX0lNQUdFX0NPTkZJR19GT0NVU0NPTlRST0xUWVBFOwotCi0KLS8qKiAKLSAqIFEgRmFjdG9yIGZvciBKUEVHIGNvbXByZXNzaW9uLCB3aGljaCBjb250cm9scyB0aGUgdHJhZGVvZmYgYmV0d2VlbiBpbWFnZQotICogcXVhbGl0eSBhbmQgc2l6ZS4gIFEgRmFjdG9yIHByb3ZpZGVzIGEgbW9yZSBzaW1wbGUgbWVhbnMgb2YgY29udHJvbGxpbmcKLSAqIEpQRUcgY29tcHJlc3Npb24gcXVhbGl0eSwgd2l0aG91dCBkaXJlY3RseSBwcm9ncmFtbWluZyBRdWFudGl6YXRpb24KLSAqIHRhYmxlcyBmb3IgY2hyb21hIGFuZCBsdW1hIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCi0gKiAgblFGYWN0b3IgICA6IEpQRUcgUSBmYWN0b3IgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIDEtMTAwLiBBIGZhY3RvciBvZiAxIAotICogICAgICAgICAgICAgICBwcm9kdWNlcyB0aGUgc21hbGxlc3QsIHdvcnN0IHF1YWxpdHkgaW1hZ2VzLCBhbmQgYSBmYWN0b3IgCi0gKiAgICAgICAgICAgICAgIG9mIDEwMCBwcm9kdWNlcyB0aGUgbGFyZ2VzdCwgYmVzdCBxdWFsaXR5IGltYWdlcy4gIEEgCi0gKiAgICAgICAgICAgICAgIHR5cGljYWwgZGVmYXVsdCBpcyA3NSBmb3Igc21hbGwgZ29vZCBxdWFsaXR5IGltYWdlcyAgICAgICAgICAgICAgIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUEFSQU1fUUZBQ1RPUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAotICAgIE9NWF9VMzIgblFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfSBPTVhfSU1BR0VfUEFSQU1fUUZBQ1RPUlRZUEU7Ci0KLS8qKiAKLSAqIFF1YW50aXphdGlvbiB0YWJsZSB0eXBlIAotICovCi0KLXR5cGVkZWYgZW51bSBPTVhfSU1BR0VfUVVBTlRJWkFUSU9OVEFCTEVUWVBFIHsKLSAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVMdW1hID0gMCwKLSAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVDaHJvbWEsCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hQ2IsCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hQ3IsCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfSU1BR0VfUVVBTlRJWkFUSU9OVEFCTEVUWVBFOwotCi0vKiogCi0gKiBKUEVHIHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIERDVCBjb21wcmVzc2lvbiBmb3IKLSAqIFlVViBkYXRhLCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nIFEgZmFjdG9yLCBwcm92aWRpbmcgZXhhY3QgCi0gKiBjb250cm9sIG9mIGNvbXByZXNzaW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlUXVhbnRpemF0aW9uVGFibGUgICAgICA6IFF1YW50aXphdGlvbiB0YWJsZSB0eXBlCi0gKiAgblF1YW50aXphdGlvbk1hdHJpeFs2NF0gOiBKUEVHIHF1YW50aXphdGlvbiB0YWJsZSBvZiBjb2VmZmljaWVudHMgc3RvcmVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW5jcmVhc2luZyBjb2x1bW5zIHRoZW4gYnkgcm93cyBvZiBkYXRhIChpLmUuIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDEsIC4uLiByb3cgOCkuIFF1YW50aXphdGlvbiB2YWx1ZXMgYXJlIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhbmdlIDAtMjU1IGFuZCBzdG9yZWQgaW4gbGluZWFyIG9yZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiB0aGUgY29tcG9uZW50IHdpbGwgemlnLXphZyB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24gdGFibGUgZGF0YSBpZiByZXF1aXJlZCBpbnRlcm5hbGx5KSAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9JTUFHRV9RVUFOVElaQVRJT05UQUJMRVRZUEUgZVF1YW50aXphdGlvblRhYmxlOwotICAgIE9NWF9VOCBuUXVhbnRpemF0aW9uTWF0cml4WzY0XTsKLX0gT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRTsKLQotCi0vKiogCi0gKiBIdWZmbWFuIHRhYmxlIHR5cGUsIHRoZSBzYW1lIEh1ZmZtYW4gdGFibGUgaXMgYXBwbGllZCBmb3IgY2hyb21hIGFuZCAKLSAqIGx1bWEgY29tcG9uZW50IAotICovCi10eXBlZGVmIGVudW0gT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEUgewotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVBQyA9IDAsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZURDLAotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVBQ0x1bWEsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZUFDQ2hyb21hLAotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVEQ0x1bWEsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZURDQ2hyb21hLAotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEU7Ci0KLS8qKiAKLSAqIEpQRUcgSHVmZm1hbiB0YWJsZSAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlSHVmZm1hblRhYmxlICAgICAgICAgICAgICAgICAgICA6IEh1ZmZtYW4gdGFibGUgdHlwZQotICogIG5OdW1iZXJPZkh1ZmZtYW5Db2RlT2ZMZW5ndGhbMTZdIDogMC0xNiwgbnVtYmVyIG9mIEh1ZmZtYW4gY29kZXMgb2YgZWFjaCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGxlbmd0aAotICogIG5IdWZmbWFuVGFibGVbMjU2XSAgICAgICAgICAgICAgIDogMC0yNTUsIHRoZSBzaXplIHVzZWQgZm9yIEFDIGFuZCBEQyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZSBhcmUgMTYgYW5kIDE2MiAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX0hVRkZNQU5UVEFCTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEUgZUh1ZmZtYW5UYWJsZTsKLSAgICBPTVhfVTggbk51bWJlck9mSHVmZm1hbkNvZGVPZkxlbmd0aFsxNl07Ci0gICAgT01YX1U4IG5IdWZmbWFuVGFibGVbMjU2XTsKLX1PTVhfSU1BR0VfUEFSQU1fSFVGRk1BTlRUQUJMRVRZUEU7Ci0KLS8qKiBAfSAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9JbmRleC5oIGIvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9JbmRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMxYTVmLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfSW5kZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKgotICovCi0KLS8qKiBAZmlsZSBPTVhfSW5kZXguaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBPTVhfSW5kZXggaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciBib3RoIGFwcGxpY2F0aW9ucwotICogIGFuZCBjb21wb25lbnRzIC4KLSAqLwotCi0KLSNpZm5kZWYgT01YX0luZGV4X2gKLSNkZWZpbmUgT01YX0luZGV4X2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKLSAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKLSAqLwotI2luY2x1ZGUgPE9NWF9UeXBlcy5oPgotCi0KLS8qKiBUaGUgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIHNlbGVjdCBhIHN0cnVjdHVyZSB3aGVuIGVpdGhlcgotICogIGdldHRpbmcgb3Igc2V0dGluZyBwYXJhbWV0ZXJzIGFuZC9vciBjb25maWd1cmF0aW9uIGRhdGEuICBFYWNoIGVudHJ5IGluIAotICogIHRoaXMgZW51bWVyYXRpb24gbWFwcyB0byBhbiBPTVggc3BlY2lmaWVkIHN0cnVjdHVyZS4gIFdoZW4gdGhlIAotICogIE9NWF9HZXRQYXJhbWV0ZXIsIE9NWF9TZXRQYXJhbWV0ZXIsIE9NWF9HZXRDb25maWcgb3IgT01YX1NldENvbmZpZyBtZXRob2RzCi0gKiAgYXJlIHVzZWQsIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHdpbGwgYWx3YXlzIGJlIGFuIGVudHJ5IGZyb20gdGhpcyBlbnVtZXJhdGlvbgotICogIGFuZCB0aGUgdGhpcmQgZW50cnkgd2lsbCBiZSB0aGUgc3RydWN0dXJlIHNob3duIGluIHRoZSBjb21tZW50cyBmb3IgdGhlIGVudHJ5LgotICogIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gaXMgaW5pdGlhbGl6aW5nIGEgY3JvcHBpbmcgZnVuY3Rpb24sIHRoZSAKLSAqICBPTVhfU2V0Q29uZmlnIGNvbW1hbmQgd291bGQgaGF2ZSBPTVhfSW5kZXhDb25maWdDb21tb25JbnB1dENyb3AgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgCi0gKiAgYW5kIHdvdWxkIHNlbmQgYSBwb2ludGVyIHRvIGFuIGluaXRpYWxpemVkIE9NWF9SRUNUVFlQRSBzdHJ1Y3R1cmUgYXMgdGhlIAotICogIHRoaXJkIHBhcmFtZXRlci4KLSAqICAKLSAqICBUaGUgZW51bWVyYXRpb24gZW50cmllcyBuYW1lZCB3aXRoIHRoZSBPTVhfQ29uZmlnIHByZWZpeCBhcmUgc2VudCB1c2luZwotICogIHRoZSBPTVhfU2V0Q29uZmlnIGNvbW1hbmQgYW5kIHRoZSBlbnVtZXJhdGlvbiBlbnRyaWVzIG5hbWVkIHdpdGggdGhlCi0gKiAgT01YX1BBUkFNXyBwcmVmaXggYXJlIHNlbnQgdXNpbmcgdGhlIE9NWF9TZXRQYXJhbWV0ZXIgY29tbWFuZC4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9JTkRFWFRZUEUgewotCi0gICAgT01YX0luZGV4Q29tcG9uZW50U3RhcnRVbnVzZWQgPSAweDAxMDAwMDAwLAotICAgIE9NWF9JbmRleFBhcmFtUHJpb3JpdHlNZ210LCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BSSU9SSVRZTUdNVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvSW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUltYWdlSW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvSW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbU90aGVySW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbU51bUF2YWlsYWJsZVN0cmVhbXMsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9VMzJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BY3RpdmVTdHJlYW0sICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fVTMyVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtU3VzcGVuc2lvblBvbGljeSwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1NVU1BFTlNJT05QT0xJQ1lUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1Db21wb25lbnRTdXNwZW5kZWQsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fU1VTUEVOU0lPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDYXB0dXJpbmcsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgKi8gCi0gICAgT01YX0luZGV4Q29uZmlnQ2FwdHVyZU1vZGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NBUFRVUkVNT0RFVFlQRSAqLyAKLSAgICBPTVhfSW5kZXhBdXRvUGF1c2VBZnRlckNhcHR1cmUsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgKi8gCi0gICAgT01YX0luZGV4UGFyYW1Db250ZW50VVJJLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09OVEVOVFVSSVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUN1c3RvbUNvbnRlbnRQaXBlLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9DT05URU5UUElQRVRZUEUgKi8gCi0gICAgT01YX0luZGV4UGFyYW1EaXNhYmxlUmVzb3VyY2VDb25jZWFsbWVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ01ldGFkYXRhSXRlbUNvdW50LCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NRVRBREFUQUlURU1DT1VOVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb250YWluZXJOb2RlQ291bnQsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUNPVU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ01ldGFkYXRhSXRlbSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NRVRBREFUQUlURU1UWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ291bnRlck5vZGVJRCwgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbU1ldGFkYXRhRmlsdGVyVHlwZSwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9NRVRBREFUQUZJTFRFUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbU1ldGFkYXRhS2V5RmlsdGVyLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9NRVRBREFUQUZJTFRFUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdQcmlvcml0eU1nbXQsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QUklPUklUWU1HTVRUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGUsICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKi8KLQotICAgIE9NWF9JbmRleFBvcnRTdGFydFVudXNlZCA9IDB4MDIwMDAwMDAsCi0gICAgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1Db21wQnVmZmVyU3VwcGxpZXIsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFICovIAotICAgIE9NWF9JbmRleFJlc2VydmVkU3RhcnRVbnVzZWQgPSAweDAzMDAwMDAwLAotCi0gICAgLyogQXVkaW8gcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KLSAgICBPTVhfSW5kZXhBdWRpb1N0YXJ0VW51c2VkID0gMHgwNDAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0FhYywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUmEsICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9SQVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvTXAzLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9NUDNUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0FkcGNtLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fQURQQ01UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0c3MjMsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRzcyM1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvRzcyOSwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9HNzI5VFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BbXIsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvV21hLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9XTUFUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1NiYywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fU0JDVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9NaWRpLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX01JRElUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0dzbV9GUiwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fR1NNRlJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb01pZGlMb2FkVXNlclNvdW5kLCAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fTUlESUxPQURVU0VSU09VTkRUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0c3MjYsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRzcyNlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvR3NtX0VGUiwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9HU01FRlJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0dzbV9IUiwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fR1NNSFJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1BkY19GUiwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUERDRlJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1BkY19FRlIsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUERDRUZSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QZGNfSFIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BEQ0hSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9UZG1hX0ZSLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1RETUFGUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvVGRtYV9FRlIsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9URE1BRUZSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9RY2VscDgsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1FDRUxQOFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUWNlbHAxMywgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9RQ0VMUDEzVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9FdnJjLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0VWUkNUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1NtdiwgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fU01WVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Wb3JiaXMsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvRzcxMSwgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRzcxMVRZUEUgKi8KLQotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaUltbWVkaWF0ZUV2ZW50LCAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJSU1NRURJQVRFRVZFTlRUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9NaWRpQ29udHJvbCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01JRElDT05UUk9MVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaVNvdW5kQmFua1Byb2dyYW0sIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01JRElTT1VOREJBTktQUk9HUkFNVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaVN0YXR1cywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJU1RBVFVTVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaU1ldGFFdmVudCwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaU1ldGFFdmVudERhdGEsICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UREFUQVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb1ZvbHVtZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfVk9MVU1FVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQmFsYW5jZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19CQUxBTkNFVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQ2hhbm5lbE11dGUsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19DSEFOTkVMTVVURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb011dGUsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTVVURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb0xvdWRuZXNzLCAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTE9VRE5FU1NUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9FY2hvQ2FuY2VsYXRpb24sICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0VDSE9DQU5DRUxBVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb05vaXNlUmVkdWN0aW9uLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTk9JU0VSRURVQ1RJT05UWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9CYXNzLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0JBU1NUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9UcmVibGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1RSRUJMRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb1N0ZXJlb1dpZGVuaW5nLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfU1RFUkVPV0lERU5JTkdUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9DaG9ydXMsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0NIT1JVU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb0VxdWFsaXplciwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfRVFVQUxJWkVSVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvUmV2ZXJiZXJhdGlvbiwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19SRVZFUkJFUkFUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQ2hhbm5lbFZvbHVtZSwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19DSEFOTkVMVk9MVU1FVFlQRSAqLwotCi0gICAgLyogSW1hZ2Ugc3BlY2lmaWMgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KLSAgICBPTVhfSW5kZXhJbWFnZVN0YXJ0VW51c2VkID0gMHgwNTAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbUltYWdlUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9QT1JURk9STUFUVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtRmxhc2hDb250cm9sLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX0ZMQVNIQ09OVFJPTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdGb2N1c0NvbnRyb2wsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9DT05GSUdfRk9DVVNDT05UUk9MVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtUUZhY3RvciwgICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX1FGQUNUT1JUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1RdWFudGl6YXRpb25UYWJsZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fUVVBTlRJWkFUSU9OVEFCTEVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1IdWZmbWFuVGFibGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fSFVGRk1BTlRUQUJMRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdGbGFzaENvbnRyb2wsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFICovCi0KLSAgICAvKiBWaWRlbyBzcGVjaWZpYyBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9ucyAqLwotICAgIE9NWF9JbmRleFZpZGVvU3RhcnRVbnVzZWQgPSAweDA2MDAwMDAwLAotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb1F1YW50aXphdGlvbiwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9GYXN0VXBkYXRlLCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1ZJREVPRkFTVFVQREFURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Nb3Rpb25WZWN0b3IsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX01PVElPTlZFQ1RPUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvSW50cmFSZWZyZXNoLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbiwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9WQlNNQywgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1ZCU01DVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnMiwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX01QRUcyVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNCwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9XbXYsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1dNVlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUnYsICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9SVlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0gyNjMsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQsIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50LCAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdWaWRlb0JpdHJhdGUsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdWaWRlb0ZyYW1lcmF0ZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYU1CUmVmcmVzaCwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01BQ1JPQkxPQ0tFUlJPUk1BUFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdWaWRlb01CRXJyb3JSZXBvcnRpbmcsICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUJFUlJPUlJFUE9SVElOR1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTWFjcm9ibG9ja3NQZXJGcmFtZSwgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9NQUNST0JMT0NLU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdWaWRlb01hY3JvQmxvY2tFcnJvck1hcCwgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUFDUk9CTE9DS0VSUk9STUFQVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9TbGljZUZNTywgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1PICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9BVkNJbnRyYVBlcmlvZCwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9OYWxTaXplLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX05BTFNJWkUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25EZWludGVybGFjZSwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19DT05GSUdfREVJTlRFUkxBQ0UgKi8KLQotICAgIC8qIEltYWdlICYgVmlkZW8gY29tbW9uIENvbmZpZ3VyYXRpb25zICovCi0gICAgT01YX0luZGV4Q29tbW9uU3RhcnRVbnVzZWQgPSAweDA3MDAwMDAwLAotICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uRGVibG9ja2luZywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0RFQkxPQ0tJTkdUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1Db21tb25TZW5zb3JNb2RlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUNvbW1vbkludGVybGVhdmUsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9JTlRFUkxFQVZFVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yRm9ybWF0Q29udmVyc2lvbiwgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09MT1JDT05WRVJTSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblNjYWxlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19TQ0FMRUZBQ1RPUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25JbWFnZUZpbHRlciwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfSU1BR0VGSUxURVJUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29sb3JFbmhhbmNlbWVudCwgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTE9SRU5IQU5DRU1FTlRUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29sb3JLZXksICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTE9SS0VZVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yQmxlbmQsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUkJMRU5EVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkZyYW1lU3RhYmlsaXNhdGlvbiwvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19GUkFNRVNUQUJUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk1pcnJvciwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NSVJST1JUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0UG9zaXRpb24sICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1BPSU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbklucHV0Q3JvcCwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19SRUNUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19SRUNUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkRpZ2l0YWxab29tLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19TQ0FMRUZBQ1RPUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25PcHRpY2FsWm9vbSwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25XaGl0ZUJhbGFuY2UsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkV4cG9zdXJlLCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19FWFBPU1VSRUNPTlRST0xUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29udHJhc3QsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTlRSQVNUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkJyaWdodG5lc3MsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19CUklHSFRORVNTVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkJhY2tsaWdodCwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19CQUNLTElHSFRUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uR2FtbWEsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0dBTU1BVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblNhdHVyYXRpb24sICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19TQVRVUkFUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkxpZ2h0bmVzcywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19MSUdIVE5FU1NUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRXhjbHVzaW9uUmVjdCwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1JFQ1RUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRGl0aGVyaW5nLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0RJVEhFUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25QbGFuZUJsZW5kLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUExBTkVCTEVORFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25FeHBvc3VyZVZhbHVlLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRVhQT1NVUkVWQUxVRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRTaXplLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9GUkFNRVNJWkVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1Db21tb25FeHRyYVF1YW50RGF0YSwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkZvY3VzUmVnaW9uLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19GT0NVU1JFR0lPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25Gb2N1c1N0YXR1cywgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9GT0NVU1NUQVRVU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25UcmFuc2l0aW9uRWZmZWN0LCAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfVFJBTlNJVElPTkVGRkVDVFRZUEUgKi8KLQotICAgIC8qIFJlc2VydmVkIENvbmZpZ3VyYXRpb24gcmFuZ2UgKi8KLSAgICBPTVhfSW5kZXhPdGhlclN0YXJ0VW51c2VkID0gMHgwODAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbU90aGVyUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9PVEhFUl9QQVJBTV9QT1JURk9STUFUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ090aGVyUG93ZXIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX09USEVSX0NPTkZJR19QT1dFUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdPdGhlclN0YXRzLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9PVEhFUl9DT05GSUdfU1RBVFNUWVBFICovCi0KLQotICAgIC8qIFJlc2VydmVkIFRpbWUgcmFuZ2UgKi8KLSAgICBPTVhfSW5kZXhUaW1lU3RhcnRVbnVzZWQgPSAweDA5MDAwMDAwLAotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVTY2FsZSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1NDQUxFVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDbG9ja1N0YXRlLCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVGltZUFjdGl2ZVJlZkNsb2NrLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfQUNUSVZFUkVGQ0xPQ0tUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRNZWRpYVRpbWUsICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAocmVhZCBvbmx5KSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50V2FsbFRpbWUsICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHJlYWQgb25seSkgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlLCAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHdyaXRlIG9ubHkpICovCi0gICAgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRWaWRlb1JlZmVyZW5jZSwgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICh3cml0ZSBvbmx5KSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVNZWRpYVRpbWVSZXF1ZXN0LCAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFICh3cml0ZSBvbmx5KSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWUsICAgICAvKio8cmVmZXJlbmNlOiAgT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHdyaXRlIG9ubHkpICovCi0gICAgT01YX0luZGV4Q29uZmlnVGltZVBvc2l0aW9uLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVTZWVrTW9kZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRSAqLwotCi0KLSAgICBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgLyogVmVuZG9yIHNwZWNpZmljIGFyZWEgKi8KLSAgICBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsCi0gICAgLyogVmVuZG9yIHNwZWNpZmljIHN0cnVjdHVyZXMgc2hvdWxkIGJlIGluIHRoZSByYW5nZSBvZiAweDdGMDAwMDAwIAotICAgICAgIHRvIDB4N0ZGRkZGRkUuICBUaGlzIHJhbmdlIGlzIG5vdCBicm9rZW4gb3V0IGJ5IHZlbmRvciwgc28KLSAgICAgICBwcml2YXRlIGluZGV4ZXMgYXJlIG5vdCBndWFyYW50ZWVkIHVuaXF1ZSBhbmQgdGhlcmVmb3JlIHNob3VsZAotICAgICAgIG9ubHkgYmUgc2VudCB0byB0aGUgYXBwcm9wcmlhdGUgY29tcG9uZW50LiAqLwotCi0gICAgT01YX0luZGV4TWF4ID0gMHg3RkZGRkZGRgotCi19IE9NWF9JTkRFWFRZUEU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZgotLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfSW5kZXhFeHQuaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfSW5kZXhFeHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1Y2MwOS4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9pbmMvT01YX0luZGV4RXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICoKLSAqLwotCi0vKiogQGZpbGUgT01YX0luZGV4RXh0LmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqIFRoZSBPTVhfSW5kZXhFeHQgaGVhZGVyIGZpbGUgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgZGVmaW5pdGlvbnMKLSAqIGZvciBib3RoIGFwcGxpY2F0aW9ucyBhbmQgY29tcG9uZW50cyAuCi0gKi8KLQotI2lmbmRlZiBPTVhfSW5kZXhFeHRfaAotI2RlZmluZSBPTVhfSW5kZXhFeHRfaAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qIEVhY2ggT01YIGhlYWRlciBzaGFsbCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5Ci0gKi8KLSNpbmNsdWRlIDxPTVhfSW5kZXguaD4KLQotCi0vKiogS2hyb25vcyBzdGFuZGFyZCBleHRlbnNpb24gaW5kaWNlcy4KLQotVGhpcyBlbnVtIGxpc3RzIHRoZSBjdXJyZW50IEtocm9ub3MgZXh0ZW5zaW9uIGluZGljZXMgdG8gT3Blbk1BWCBJTC4KLSovCi10eXBlZGVmIGVudW0gT01YX0lOREVYRVhUVFlQRSB7Ci0KLSAgICAvKiBDb21wb25lbnQgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KLSAgICBPTVhfSW5kZXhFeHRDb21wb25lbnRTdGFydFVudXNlZCA9IE9NWF9JbmRleEtocm9ub3NFeHRlbnNpb25zICsgMHgwMDEwMDAwMCwKLSAgICBPTVhfSW5kZXhDb25maWdDYWxsYmFja1JlcXVlc3QsICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DQUxMQkFDS1JFUVVFU1RUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbWl0TW9kZSwgICAgICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09NTUlUTU9ERVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21taXQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT01NSVRUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQW5kcm9pZFZlbmRvckV4dGVuc2lvbiwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfVkVORE9SX0VYVEVOU0lPTlRZUEUgKi8KLQotICAgIC8qIFBvcnQgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KLSAgICBPTVhfSW5kZXhFeHRQb3J0U3RhcnRVbnVzZWQgPSBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyArIDB4MDAyMDAwMDAsCi0KLSAgICAvKiBBdWRpbyBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9ucyAqLwotICAgIE9NWF9JbmRleEV4dEF1ZGlvU3RhcnRVbnVzZWQgPSBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyArIDB4MDA0MDAwMDAsCi0KLSAgICAvKiBJbWFnZSBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9ucyAqLwotICAgIE9NWF9JbmRleEV4dEltYWdlU3RhcnRVbnVzZWQgPSBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyArIDB4MDA1MDAwMDAsCi0KLSAgICAvKiBWaWRlbyBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9ucyAqLwotICAgIE9NWF9JbmRleEV4dFZpZGVvU3RhcnRVbnVzZWQgPSBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyArIDB4MDA2MDAwMDAsCi0gICAgT01YX0luZGV4UGFyYW1OYWxTdHJlYW1Gb3JtYXRTdXBwb3J0ZWQsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9OQUxTVFJFQU1GT1JNQVRUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1OYWxTdHJlYW1Gb3JtYXQsICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9OQUxTVFJFQU1GT1JNQVRUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1OYWxTdHJlYW1Gb3JtYXRTZWxlY3QsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9OQUxTVFJFQU1GT1JNQVRUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb1ZwOCwgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9WUDhUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9WcDhSZWZlcmVuY2VGcmFtZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19WUDhSRUZFUkVOQ0VGUkFNRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdWaWRlb1ZwOFJlZmVyZW5jZUZyYW1lVHlwZSwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1ZQOFJFRkVSRU5DRUZSQU1FSU5GT1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUmVzZXJ2ZWQsICAgICAgICAgICAgICAgICAgICAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgaW5kZXggKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvSGV2YywgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0hFVkNUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1TbGljZVNlZ21lbnRzLCAgICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19TTElDRVNFR01FTlRTVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0FuZHJvaWRJbnRyYVJlZnJlc2gsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX0FORFJPSURfSU5UUkFSRUZSRVNIVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQW5kcm9pZFZpZGVvVGVtcG9yYWxMYXllcmluZywgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0FuZHJvaWRWaWRlb1RlbXBvcmFsTGF5ZXJpbmcsICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1RZUEUgKi8KLQotICAgIC8qIEltYWdlICYgVmlkZW8gY29tbW9uIGNvbmZpZ3VyYXRpb25zICovCi0gICAgT01YX0luZGV4RXh0Q29tbW9uU3RhcnRVbnVzZWQgPSBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyArIDB4MDA3MDAwMDAsCi0KLSAgICAvKiBPdGhlciBjb25maWd1cmF0aW9ucyAqLwotICAgIE9NWF9JbmRleEV4dE90aGVyU3RhcnRVbnVzZWQgPSBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyArIDB4MDA4MDAwMDAsCi0gICAgT01YX0luZGV4Q29uZmlnQXV0b0ZyYW1lcmF0ZUNvbnZlcnNpb24sICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdQcmlvcml0eSwgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1UzMlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdPcGVyYXRpbmdSYXRlLCAgICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1UzMlRZUEUgaW4gUTE2IGZvcm1hdCBmb3IgdmlkZW8gYW5kIGluIEh6IGZvciBhdWRpbyAqLwotCi0gICAgLyogVGltZSBjb25maWd1cmF0aW9ucyAqLwotICAgIE9NWF9JbmRleEV4dFRpbWVTdGFydFVudXNlZCA9IE9NWF9JbmRleEtocm9ub3NFeHRlbnNpb25zICsgMHgwMDkwMDAwMCwKLQotICAgIE9NWF9JbmRleEV4dE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0lOREVYRVhUVFlQRTsKLSNkZWZpbmUgT01YX01BWF9TVFJJTkdWQUxVRV9TSVpFIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFCi0jZGVmaW5lIE9NWF9NQVhfQU5EUk9JRF9WRU5ET1JfUEFSQU1DT1VOVCAzMgotCi10eXBlZGVmIGVudW0gT01YX0FORFJPSURfVkVORE9SX1ZBTFVFVFlQRSB7Ci0gICAgT01YX0FuZHJvaWRWZW5kb3JWYWx1ZUludDMyID0gMCwgICAvKjw8IGludDMyX3QgdmFsdWUgKi8KLSAgICBPTVhfQW5kcm9pZFZlbmRvclZhbHVlSW50NjQsICAgICAgIC8qPDwgaW50NjRfdCB2YWx1ZSAqLwotICAgIE9NWF9BbmRyb2lkVmVuZG9yVmFsdWVTdHJpbmcsICAgICAgLyo8PCBzdHJpbmcgdmFsdWUgKi8KLSAgICBPTVhfQW5kcm9pZFZlbmRvclZhbHVlRW5kVW51c2VkLAotfSBPTVhfQU5EUk9JRF9WRU5ET1JfVkFMVUVUWVBFOwotCi0vKioKLSAqCi0gKiAgY0tleSAgICAgICAgOiBwYXJhbWV0ZXIgdmFsdWUgbmFtZS4KLSAqICBlVmFsdWVUeXBlICA6IHBhcmFtZXRlciB2YWx1ZSB0eXBlCi0gKiAgYlNldCAgICAgICAgOiBpZiBmYWxzZSwgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2V0IChmb3IgT01YX0dldENvbmZpZykgb3IgaXMgdW5zZXQgKE9NWF9TZXRDb25maWcpCi0gKiAgICAgICAgICAgICAgICBpZiB0cnVlLCB0aGUgcGFyYW1ldGVyIGlzIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBiZWxvdwotICogIG5JbnQzMiAgICAgIDogaW50MzIgdmFsdWUKLSAqICBuSW50NjQgICAgICA6IGludDY0IHZhbHVlCi0gKiAgY1N0cmluZyAgICAgOiBzdHJpbmcgdmFsdWUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9QQVJBTVRZUEUgewotICAgIE9NWF9VOCBjS2V5W09NWF9NQVhfU1RSSU5HTkFNRV9TSVpFXTsKLSAgICBPTVhfQU5EUk9JRF9WRU5ET1JfVkFMVUVUWVBFIGVWYWx1ZVR5cGU7Ci0gICAgT01YX0JPT0wgYlNldDsKLSAgICB1bmlvbiB7Ci0gICAgICAgIE9NWF9TMzIgbkludDMyOwotICAgICAgICBPTVhfUzY0IG5JbnQ2NDsKLSAgICAgICAgT01YX1U4IGNTdHJpbmdbT01YX01BWF9TVFJJTkdWQUxVRV9TSVpFXTsKLSAgICB9OwotfSBPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX1BBUkFNVFlQRTsKLQotLyoqCi0gKiAgblNpemUgICAgICAgOiBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBjTmFtZSAgICAgICA6IG5hbWUgb2YgdmVuZG9yIGV4dGVuc2lvbgotICogIG5QYXJhbUNvdW50IDogdGhlIG51bWJlciBvZiBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyB2ZW5kb3IgZXh0ZW5zaW9uCi0gKiAgblBhcmFtU2l6ZVVzZWQgOiB0aGUgc2l6ZSBvZiBuUGFyYW0KLSAqICAgICAgICAgICAgICAgIChtdXN0IGJlIGF0IGxlYXN0IDEgYW5kIGF0IG1vc3QgT01YX01BWF9BTkRST0lEX1ZFTkRPUl9QQVJBTUNPVU5UKQotICogIG5QYXJhbSAgICAgIDogdGhlIHBhcmFtZXRlciB2YWx1ZXMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5JbmRleDsKLSAgICBPTVhfVTggIGNOYW1lW09NWF9NQVhfU1RSSU5HTkFNRV9TSVpFXTsKLSAgICBPTVhfRElSVFlQRSBlRGlyOwotICAgIE9NWF9VMzIgblBhcmFtQ291bnQ7Ci0gICAgT01YX1UzMiBuUGFyYW1TaXplVXNlZDsKLSAgICBPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX1BBUkFNVFlQRSBuUGFyYW1bMV07Ci19IE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogT01YX0luZGV4RXh0X2ggKi8KLS8qIEZpbGUgRU9GICovCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9pbmMvT01YX090aGVyLmggYi9zZG04NDUvbW0tY29yZS9pbmMvT01YX090aGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjdmMzguLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9PdGhlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqCi0gKi8KLQotLyoqIEBmaWxlIE9NWF9PdGhlci5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIHN0cnVjdHVyZXMgbmVlZGVkIGJ5IE90aGVyIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKLSAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW50cy4KLSAqLwotCi0jaWZuZGVmIE9NWF9PdGhlcl9oCi0jZGVmaW5lIE9NWF9PdGhlcl9oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCi0gKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCi0gKi8KLQotI2luY2x1ZGUgPE9NWF9Db3JlLmg+Ci0KLQotLyoqIAotICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgZGF0YSB0eXBlcyB3aGljaCBtYXRjaCB0byBtdWx0aXBsZSBkb21haW5zIG9yIG5vCi0gKiBkb21haW4gYXQgYWxsLiAgRm9yIHR5cGVzIHdoaWNoIGFyZSB2ZW5kb3Igc3BlY2lmaWMsIGEgdmFsdWUgYWJvdmUKLSAqIE9NWF9PVEhFUl9WRU5ET1JUU1RBUlQgc2hvdWxkIGJlIHVzZWQuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfT1RIRVJfRk9STUFUVFlQRSB7Ci0gICAgT01YX09USEVSX0Zvcm1hdFRpbWUgPSAwLCAvKio8IFRyYW5zbWlzc2lvbiBvZiB2YXJpb3VzIHRpbWVzdGFtcHMsIGVsYXBzZWQgdGltZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgZGVsdGFzLCBldGMgKi8KLSAgICBPTVhfT1RIRVJfRm9ybWF0UG93ZXIsICAgIC8qKjwgUGVyaGFwcyB1c2VkIGZvciBlbmFibGluZy9kaXNhYmxpbmcgcG93ZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQsIHNldHRpbmcgY2xvY2tzPyAqLwotICAgIE9NWF9PVEhFUl9Gb3JtYXRTdGF0cywgICAgLyoqPCBDb3VsZCBiZSB0aGluZ3Mgc3VjaCBhcyBmcmFtZSByYXRlLCBmcmFtZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsIGV0YyAqLwotICAgIE9NWF9PVEhFUl9Gb3JtYXRCaW5hcnksICAgLyoqPCBBcmJpdHJhcnkgYmluYXJ5IGRhdGEgKi8KLSAgICBPTVhfT1RIRVJfRm9ybWF0VmVuZG9yUmVzZXJ2ZWQgPSAxMDAwLCAvKio8IFN0YXJ0aW5nIHZhbHVlIGZvciB2ZW5kb3Igc3BlY2lmaWMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzICovCi0KLSAgICBPTVhfT1RIRVJfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9PVEhFUl9Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9PVEhFUl9Gb3JtYXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9PVEhFUl9GT1JNQVRUWVBFOwotCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBvZiBzZWVrIG1vZGVzLgotICovCi10eXBlZGVmIGVudW0gT01YX1RJTUVfU0VFS01PREVUWVBFIHsKLSAgICBPTVhfVElNRV9TZWVrTW9kZUZhc3QgPSAwLCAvKio8IFByZWZlciBzZWVraW5nIHRvIGFuIGFwcHJveGltYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24gb3ZlciAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBhY3R1YWwgc2VlayBwb3NpdGlvbiBpZiBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlc3VsdHMgaW4gYSBmYXN0ZXIgc2Vlay4gKi8KLSAgICBPTVhfVElNRV9TZWVrTW9kZUFjY3VyYXRlLCAvKio8IFByZWZlciBzZWVraW5nIHRvIHRoZSBhY3R1YWwgc2VlayAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwb3NpdGlvbiBvdmVyIGFuIGFwcHJveGltYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24gZXZlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIGl0IHJlc3VsdHMgaW4gYSBzbG93ZXIgc2Vlay4gKi8KLSAgICBPTVhfVElNRV9TZWVrTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVElNRV9TZWVrTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1RJTUVfU2Vla01vZGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9USU1FX1NFRUtNT0RFVFlQRTsKLQotLyogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgc2Vla21vZGUgb2YgdGhlIGNvbXBvbmVudCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1RJTUVfU0VFS01PREVUWVBFIGVUeXBlOyAgICAvKio8IFRoZSBzZWVrIG1vZGUgKi8KLX0gT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRTsKLQotLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSB0aW1lIHN0YW1wIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmZpZ3MgCi0gKiBvbiB0aGUgQ2xvY2sgQ29tcG9uZW50IChDQyk6Ci0gKiAKLSAqIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50V2FsbFRpbWU6IHF1ZXJ5IG9mIHRoZSBDQ5JzIGN1cnJlbnQgd2FsbCAgCi0gKiAgICAgdGltZQotICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRNZWRpYVRpbWU6IHF1ZXJ5IG9mIHRoZSBDQ5JzIGN1cnJlbnQgbWVkaWEKLSAqICAgICB0aW1lCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlIGFuZCAgCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFZpZGVvUmVmZXJlbmNlOiBhdWRpby92aWRlbyByZWZlcmVuY2UgCi0gKiAgICAgY2xvY2sgc2VuZGluZyBTQyBpdHMgcmVmZXJlbmNlIHRpbWUKLSAqIE9NWF9JbmRleENvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWU6IGEgQ2xvY2sgQ29tcG9uZW50IGNsaWVudCBzZW5kcyAKLSAqICAgICB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZyBvbiBpdHMgCi0gKiAgICAgY2xpZW50IHBvcnQgd2hlbiBpdCByZWNlaXZlcyBhIGJ1ZmZlciB3aXRoCi0gKiAgICAgT01YX0JVRkZFUkZMQUdfU1RBUlRUSU1FIHNldC4gSXQgbXVzdCB1c2UgdGhlIHRpbWVzdGFtcAotICogICAgIHNwZWNpZmllZCBieSB0aGF0IGJ1ZmZlciBmb3IgblN0YXJ0VGltZXN0YW1wLiAKLSAqCi0gKiBJdJJzIGFsc28gdXNlZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29uZmlnIG9uIGNvbXBvbmVudHMgaW4gZ2VuZXJhbDoKLSAqCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lUG9zaXRpb246IElMIGNsaWVudCBxdWVyeWluZyBjb21wb25lbnQgcG9zaXRpb24gCi0gKiAoR2V0Q29uZmlnKSBvciBjb21tYW5kaW5nIGEgY29tcG9uZW50IHRvIHNlZWsgdG8gdGhlIGdpdmVuIGxvY2F0aW9uCi0gKiAoU2V0Q29uZmlnKQotICovCQotdHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVElDS1MgblRpbWVzdGFtcDsgIAkgICAgIC8qKjwgdGltZXN0YW1wIC4qLyAKLX0gT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEU7ICAKLQotLyoqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHJlZmVyZW5jZSBjbG9ja3MgdG8gdGhlIG1lZGlhIHRpbWUuICovCi10eXBlZGVmIGVudW0gT01YX1RJTUVfVVBEQVRFVFlQRSB7Ci0gICAgICBPTVhfVElNRV9VcGRhdGVSZXF1ZXN0RnVsZmlsbG1lbnQsICAgIC8qKjwgVXBkYXRlIGlzIHRoZSBmdWxmaWxsbWVudCBvZiBhIG1lZGlhIHRpbWUgcmVxdWVzdC4gKi8KLSAgICAgIE9NWF9USU1FX1VwZGF0ZVNjYWxlQ2hhbmdlZCwJICAgICAgICAvKio8IFVwZGF0ZSB3YXMgZ2VuZXJhdGVkIGJlY2F1c2UgdGhlIHNjYWxlIGNoYWduZWQuICovCi0gICAgICBPTVhfVElNRV9VcGRhdGVDbG9ja1N0YXRlQ2hhbmdlZCwgICAgIC8qKjwgVXBkYXRlIHdhcyBnZW5lcmF0ZWQgYmVjYXVzZSB0aGUgY2xvY2sgc3RhdGUgY2hhbmdlZC4gKi8KLSAgICAgIE9NWF9USU1FX1VwZGF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICAgIE9NWF9USU1FX1VwZGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgICBPTVhfVElNRV9VcGRhdGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9USU1FX1VQREFURVRZUEU7Ci0KLS8qKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByZWZlcmVuY2UgY2xvY2tzIHRvIHRoZSBtZWRpYSB0aW1lLiAqLwotdHlwZWRlZiBlbnVtIE9NWF9USU1FX1JFRkNMT0NLVFlQRSB7Ci0gICAgICBPTVhfVElNRV9SZWZDbG9ja05vbmUsICAgIC8qKjwgVXNlIG5vIHJlZmVyZW5jZXMuICovCi0gICAgICBPTVhfVElNRV9SZWZDbG9ja0F1ZGlvLAkvKio8IFVzZSByZWZlcmVuY2VzIHNlbnQgdGhyb3VnaCBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlICovCi0gICAgICBPTVhfVElNRV9SZWZDbG9ja1ZpZGVvLCAgIC8qKjwgVXNlIHJlZmVyZW5jZXMgc2VudCB0aHJvdWdoIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50VmlkZW9SZWZlcmVuY2UgKi8KLSAgICAgIE9NWF9USU1FX1JlZkNsb2NrS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgICAgT01YX1RJTUVfUmVmQ2xvY2tWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgICAgT01YX1RJTUVfUmVmQ2xvY2tNYXggPSAweDdGRkZGRkZGCi19IE9NWF9USU1FX1JFRkNMT0NLVFlQRTsKLQotLyoqIEVudW1lcmF0aW9uIG9mIGNsb2NrIHN0YXRlcy4gKi8KLXR5cGVkZWYgZW51bSBPTVhfVElNRV9DTE9DS1NUQVRFIHsKLSAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVSdW5uaW5nLCAgICAgICAgICAgICAvKio8IENsb2NrIHJ1bm5pbmcuICovCi0gICAgICBPTVhfVElNRV9DbG9ja1N0YXRlV2FpdGluZ0ZvclN0YXJ0VGltZSwgLyoqPCBDbG9jayB3YWl0aW5nIHVudGlsIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHByZXNjcmliZWQgY2xpZW50cyBlbWl0IHRoZWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzdGFydCB0aW1lLiAqLwotICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVN0b3BwZWQsICAgICAgICAgICAgIC8qKjwgQ2xvY2sgc3RvcHBlZC4gKi8KLSAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgICBPTVhfVElNRV9DbG9ja1N0YXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9USU1FX0NMT0NLU1RBVEU7Ci0KLS8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgbWVkaWEgdGltZSByZXF1ZXN0IHRvIHRoZSBjbG9jayBjb21wb25lbnQuCi0gKgotICogIEEgY2xpZW50IGNvbXBvbmVudCBzZW5kcyB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZwotICogIG9uIGl0cyBjbGllbnQgcG9ydCB0byBzcGVjaWZ5IGEgbWVkaWEgdGltZXN0YW1wIHRoZSBDbG9jayBDb21wb25lbnQKLSAqICBzaG91bGQgZW1pdC4gIFRoZSBDbG9jayBDb21wb25lbnQgc2hvdWxkIGZ1bGZpbGwgdGhlIHJlcXVlc3QgYnkgc2VuZGluZyBhCi0gKiAgT01YX1RJTUVfTUVESUFUSU1FVFlQRSB3aGVuIGl0cyBtZWRpYSBjbG9jayBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgCi0gKiAgdGltZXN0YW1wLgotICoKLSAqICBUaGUgY2xpZW50IG1heSByZXF1aXJlIGEgbWVkaWEgdGltZSByZXF1ZXN0IGJlIGZ1bGZpbGxlZCBzbGlnaHRseQotICogIGVhcmxpZXIgdGhhbiB0aGUgbWVkaWEgdGltZSBzcGVjaWZpZWQuIEluIHRoaXMgY2FzZSB0aGUgY2xpZW50IHNwZWNpZmllcyAKLSAqICBhbiBvZmZzZXQgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3YWxsIHRpbWUgY29ycmVzcG9uZGluZyAKLSAqICB0byB0aGUgcmVxdWVzdGVkIG1lZGlhIHRpbWUgYW5kIHRoZSB3YWxsIHRpbWUgd2hlbiBpdCB3aWxsIGJlIAotICogIGZ1bGZpbGxlZC4gCi0gKgotICogIEEgY2xpZW50IGNvbXBvbmVudCBtYXkgdXNlcyB0aGVzZSByZXF1ZXN0cyBhbmQgdGhlIE9NWF9USU1FX01FRElBVElNRVRZUEUgdG8KLSAqICB0aW1lIGV2ZW50cyBhY2NvcmRpbmcgdG8gdGltZXN0YW1wcy4gSWYgYSBjbGllbnQgbXVzdCBwZXJmb3JtIGFuIG9wZXJhdGlvbiBPIGF0Ci0gKiAgYSB0aW1lIFQgKGUuZy4gZGVsaXZlciBhIHZpZGVvIGZyYW1lIGF0IGl0cyBjb3JyZXNwb25kaW5nIHRpbWVzdGFtcCksIGl0IG1ha2VzIGEgCi0gKiAgbWVkaWEgdGltZSByZXF1ZXN0IGF0IFQgKHBlcmhhcHMgc3BlY2lmeWluZyBhbiBvZmZzZXQgdG8gZW5zdXJlIHRoZSByZXF1ZXN0IGZ1bGZpbGxtZW50Ci0gKiAgaXMgYSBsaXR0bGUgZWFybHkpLiBXaGVuIHRoZSBjbG9jayBjb21wb25lbnQgcGFzc2VzIHRoZSByZXN1bHRpbmcgT01YX1RJTUVfTUVESUFUSU1FVFlQRQotICogIHN0cnVjdHVyZSBiYWNrIHRvIHRoZSBjbGllbnQgY29tcG9uZW50LCB0aGUgY2xpZW50IG1heSBwZXJmb3JtIG9wZXJhdGlvbiBPIChwZXJoYXBzIGhhdmluZwotICogIHRvIHdhaXQgYSBzbGlnaHQgYW1vdW50IG1vcmUgdGltZSBpdHNlbGYgYXMgc3BlY2lmaWVkIGJ5IHRoZSByZXR1cm4gdmFsdWVzKS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfTUVESUFUSU1FUkVRVUVTVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9QVFIgcENsaWVudFByaXZhdGU7ICAgICAvKio8IENsaWVudCBwcml2YXRlIGRhdGEgdG8gZGlzYWJpZ3VhdGUgdGhpcyBtZWRpYSB0aW1lIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZyb20gb3RoZXJzIChlLmcuIHRoZSBudW1iZXIgb2YgdGhlIGZyYW1lIHRvIGRlbGl2ZXIpLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBEdXBsaWNhdGVkIGluIHRoZSBtZWRpYSB0aW1lIHN0cnVjdHVyZSB0aGF0IGZ1bGZpbGxzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoaXMgcmVxdWVzdC4gQSB2YWx1ZSBvZiB6ZXJvIGlzIHJlc2VydmVkIGZvciB0aW1lIHNjYWxlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHVwZGF0ZXMuICovCi0gICAgT01YX1RJQ0tTIG5NZWRpYVRpbWVzdGFtcDsgIC8qKjwgTWVkaWEgdGltZXN0YW1wIHJlcXVlc3RlZC4qLyAKLSAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgLyoqPCBBbW91bnQgb2Ygd2FsbCBjbG9jayB0aW1lIGJ5IHdoaWNoIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0IHNob3VsZCBiZSBmdWxmaWxsZWQgZWFybHkgKi8KLX0gT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFOwotCi0vKio8IFN0cnVjdHVyZSBzZW50IGZyb20gdGhlIGNsb2NrIGNvbXBvbmVudCBjbGllbnQgZWl0aGVyIHdoZW4gZnVsZmlsbGluZyAKLSAqICAgYSBtZWRpYSB0aW1lIHJlcXVlc3Qgb3Igd2hlbiB0aGUgdGltZSBzY2FsZSBoYXMgY2hhbmdlZC4gCi0gKgotICogICBJbiB0aGUgZm9ybWVyIGNhc2UgdGhlIENsb2NrIENvbXBvbmVudCBmaWxscyB0aGlzIHN0cnVjdHVyZSBhbmQgdGltZXMgaXRzIGVtaXNzaW9uIAotICogICB0byBhIGNsaWVudCBjb21wb25lbnQgKHZpYSB0aGUgY2xpZW50IHBvcnQpIGFjY29yZGluZyB0byB0aGUgY29ycmVzcG9uZGluZyBtZWRpYSAKLSAqICAgdGltZSByZXF1ZXN0IHNlbnQgYnkgdGhlIGNsaWVudC4gVGhlIENsb2NrIENvbXBvbmVudCBzaG91bGQgdGltZSB0aGUgZW1pc3Npb24gdG8gb2NjdXIKLSAqICAgd2hlbiB0aGUgcmVxdWVzdGVkIHRpbWVzdGFtcCBtYXRjaGVzIHRoZSBDbG9jayBDb21wb25lbnQncyBtZWRpYSB0aW1lIGJ1dCBhbHNvIHRoZSAKLSAqICAgcHJlc2NyaWJlZCBvZmZzZXQgZWFybHkuIAotICoKLSAqICAgVXBvbiBzY2FsZSBjaGFuZ2VzIHRoZSBjbG9jayBjb21wb25lbnQgY2xlYXJzIHRoZSBuQ2xpZW50UHJpdmF0ZSBkYXRhLCBzZW5kcyB0aGUgY3VycmVudAotICogICBtZWRpYSB0aW1lIGFuZCBzZXRzIHRoZSBuU2NhbGUgdG8gdGhlIG5ldyBzY2FsZSB2aWEgdGhlIGNsaWVudCBwb3J0LiBJdCBlbWl0cyBhIAotICogICBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHRvIGFsbCBjbGllbnRzIGluZGVwZW5kZW50IG9mIGFueSByZXF1ZXN0cy4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byAKLSAqICAgYWx0ZXIgcHJvY2Vzc2luZyB0byBhY2NvbW9kYXRlIHNjYWxpbmcuIEZvciBpbnN0YW5jZSBhIHZpZGVvIGNvbXBvbmVudCBtaWdodCBza2lwIGludGVyLWZyYW1lcyAKLSAqICAgaW4gdGhlIGNhc2Ugb2YgZXh0cmVtZSBmYXN0Zm9yd2FyZC4gTGlrZXdpc2UgYW4gYXVkaW8gY29tcG9uZW50IG1pZ2h0IGFkZCBvciByZW1vdmUgc2FtcGxlcyAKLSAqICAgZnJvbSBhbiBhdWRpbyBmcmFtZSB0byBzY2FsZSBhdWRpbyBkYXRhLiAKLSAqCi0gKiAgIEl0IGlzIGV4cGVjdGVkIHRoYXQgc29tZSBjbG9jayBjb21wb25lbnRzIG1heSBub3QgYmUgYWJsZSB0byBmdWxmaWxsIHJlcXVlc3RzCi0gKiAgIGF0IGV4YWN0bHkgdGhlIHByZXNjcmliZWQgdGltZS4gVGhpcyBpcyBhY2NlcHRhYmxlIHNvIGxvbmcgYXMgdGhlIHJlcXVlc3QgaXMgCi0gKiAgIGZ1bGZpbGxlZCBhdCBsZWFzdCBhcyBlYXJseSBhcyBkZXNjcmliZWQgYW5kIG5vdCBsYXRlci4gVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgCi0gKiAgIGZpZWxkcyB0aGUgY2xpZW50IG1heSB1c2UgdG8gd2FpdCBmb3IgdGhlIHJlbWFpbmluZyB0aW1lLgotICoKLSAqICAgVGhlIGNsaWVudCBtYXkgdXNlIGVpdGhlciB0aGUgbk9mZnNldCBvciBuV2FsbFRpbWVBdE1lZGlhIGZpZWxkcyB0byBkZXRlcm1pbmUgdGhlIAotICogICB3YWxsIHRpbWUgdW50aWwgdGhlIG5NZWRpYVRpbWVzdGFtcCBhY3R1YWxseSBvY2N1cnMuIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUKLSAqICAgY2xpZW50IGNhbiBnZXQgYSBtb3JlIGFjY3VyYXRlIHZhbHVlIGZvciBvZmZzZXQgYnkgZ2V0dGluZyB0aGUgY3VycmVudCB3YWxsCi0gKiAgIGZyb20gdGhlIGNsb2MgY29tcG9uZW50IGFuZCBzdWJ0cmFjdGluZyBpdCBmcm9tIG5XYWxsVGltZUF0TWVkaWEuIAotICovCi0KLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX01FRElBVElNRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgbkNsaWVudFByaXZhdGU7ICAgICAgICAgLyoqPCBDbGllbnQgcHJpdmF0ZSBkYXRhIHRvIGRpc2FiaWd1YXRlIHRoaXMgbWVkaWEgdGltZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZnJvbSBvdGhlcnMuIENvcGllZCBmcm9tIHRoZSBtZWRpYSB0aW1lIHJlcXVlc3QuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBBIHZhbHVlIG9mIHplcm8gaXMgcmVzZXJ2ZWQgZm9yIHRpbWUgc2NhbGUgdXBkYXRlcy4gKi8KLSAgICBPTVhfVElNRV9VUERBVEVUWVBFIGVVcGRhdGVUeXBlOyAvKio8IFJlYXNvbiBmb3IgdGhlIHVwZGF0ZSAqLwotICAgIE9NWF9USUNLUyBuTWVkaWFUaW1lc3RhbXA7ICAgICAgLyoqPCBNZWRpYSB0aW1lIHJlcXVlc3RlZC4gSWYgbm8gbWVkaWEgdGltZSB3YXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHJlcXVlc3RlZCB0aGVuIHRoaXMgaXMgdGhlIGN1cnJlbnQgbWVkaWEgdGltZS4gKi8gCi0gICAgT01YX1RJQ0tTIG5PZmZzZXQ7ICAgICAgICAgICAgICAvKio8IEFtb3VudCBvZiB3YWxsIGNsb2NrIHRpbWUgYnkgd2hpY2ggdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0IHdhcyBhY3R1YWxseSBmdWxmaWxsZWQgZWFybHkgKi8KLQotICAgIE9NWF9USUNLUyBuV2FsbFRpbWVBdE1lZGlhVGltZTsgLyoqPCBXYWxsIHRpbWUgY29ycmVzcG9uZGluZyB0byBuTWVkaWFUaW1lU3RhbXAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEEgY2xpZW50IG1heSBjb21wYXJlIHRoaXMgdmFsdWUgdG8gY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBtZWRpYSB0aW1lIG9idGFpbmVkIGZyb20gdGhlIENsb2NrIENvbXBvbmVudCB0byBkZXRlcm1pbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGhlIHdhbGwgdGltZSB1bnRpbCB0aGUgbWVkaWEgdGltZXN0YW1wIGlzIHJlYWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjdXJyZW50LiAqLwotICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgaW4gUTE2IGZvcm1hdC4gKi8KLSAgICBPTVhfVElNRV9DTE9DS1NUQVRFIGVTdGF0ZTsgICAgIC8qIFNlZWtpbmcgQ2hhbmdlLiBBZGRlZCA3LzEyLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXRlIG9mIHRoZSBtZWRpYSB0aW1lLiAqLwotfSBPTVhfVElNRV9NRURJQVRJTUVUWVBFOyAgCi0KLS8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgZmFjdG9yLiBBcHBsaWNhYmxlIG9ubHkgdG8gY2xvY2sgCi0gKiAgY29tcG9uZW50LCBvdGhlciBjb21wb25lbnRzIHNlZSBzY2FsZSBjaGFuZ2VzIHZpYSBPTVhfVElNRV9NRURJQVRJTUVUWVBFIGJ1ZmZlcnMgc2VudCB2aWEKLSAqICB0aGUgY2xvY2sgY29tcG9uZW50IGNsaWVudCBwb3J0cy4gVXBvbiByZWNpZXZpbmcgdGhpcyBjb25maWcgdGhlIGNsb2NrIGNvbXBvbmVudCBjaGFuZ2VzIAotICogIHRoZSByYXRlIGJ5IHdoaWNoIHRoZSBtZWRpYSB0aW1lIGluY3JlYXNlcyBvciBkZWNyZWFzZXMgZWZmZWN0aXZlbHkgaW1wbGVtZW50aW5nIHRyaWNrIG1vZGVzLiAKLSAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19TQ0FMRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBUaGlzIGlzIGEgdmFsdWUgaW4gUTE2IGZvcm1hdCB3aGljaCBpcyB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2NhbGluZyB0aGUgbWVkaWEgdGltZSAqLwotfSBPTVhfVElNRV9DT05GSUdfU0NBTEVUWVBFOwotIAotLyoqIEJpdHMgdXNlZCB0byBpZGVudGlmeSBhIGNsb2NrIHBvcnQuIFVzZWQgaW4gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFknMgbldhaXRNYXNrIGZpZWxkICovCi0jZGVmaW5lIE9NWF9DTE9DS1BPUlQwIDB4MDAwMDAwMDEKLSNkZWZpbmUgT01YX0NMT0NLUE9SVDEgMHgwMDAwMDAwMgotI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMiAweDAwMDAwMDA0Ci0jZGVmaW5lIE9NWF9DTE9DS1BPUlQzIDB4MDAwMDAwMDgKLSNkZWZpbmUgT01YX0NMT0NLUE9SVDQgMHgwMDAwMDAxMAotI2RlZmluZSBPTVhfQ0xPQ0tQT1JUNSAweDAwMDAwMDIwCi0jZGVmaW5lIE9NWF9DTE9DS1BPUlQ2IDB4MDAwMDAwNDAKLSNkZWZpbmUgT01YX0NMT0NLUE9SVDcgMHgwMDAwMDA4MAotCi0vKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtb2RlIG9mIHRoZSBtZWRpYSBjbG9jay4gCi0gKiAgSUwgQ2xpZW50IHVzZXMgdGhpcyBjb25maWcgdG8gY2hhbmdlIG9yIHF1ZXJ5IHRoZSBtb2RlIG9mIHRoZSAKLSAqICBtZWRpYSBjbG9jayBvZiB0aGUgY2xvY2sgY29tcG9uZW50LiBBcHBsaWNhYmxlIG9ubHkgdG8gY2xvY2sKLSAqICBjb21wb25lbnQuIAotICogIAotICogIE9uIGEgU2V0Q29uZmlnIGlmIGVTdGF0ZSBpcyBPTVhfVElNRV9DbG9ja1N0YXRlUnVubmluZyBtZWRpYSB0aW1lCi0gKiAgc3RhcnRzIGltbWVkaWF0ZWx5IGF0IHRoZSBwcmVzY3JpYmVkIHN0YXJ0IHRpbWUuIElmCi0gKiAgT01YX1RJTUVfQ2xvY2tTdGF0ZVdhaXRpbmdGb3JTdGFydFRpbWUgdGhlIENsb2NrIENvbXBvbmVudCBpZ25vcmVzCi0gKiAgdGhlIGdpdmVuIG5TdGFydFRpbWUgYW5kIHdhaXRzIGZvciBhbGwgY2xpZW50cyBzcGVjaWZpZWQgaW4gdGhlIAotICogIG5XYWl0TWFzayB0byBzZW5kIHN0YXJ0dGltZXMgKHZpYSAKLSAqICBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lKS4gVGhlIENsb2NrIENvbXBvbmVudCB0aGVuIHN0YXJ0cyAKLSAqICB0aGUgbWVkaWEgY2xvY2sgdXNpbmcgdGhlIGVhcmxpZXN0IHN0YXJ0IHRpbWUgc3VwcGxpZWQuICovICAgIAotdHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGluZm9ybWF0aW9uICovCi0gICAgT01YX1RJTUVfQ0xPQ0tTVEFURSBlU3RhdGU7IC8qKjwgU3RhdGUgb2YgdGhlIG1lZGlhIHRpbWUuICovCi0gICAgT01YX1RJQ0tTIG5TdGFydFRpbWU7ICAgICAgIC8qKjwgU3RhcnQgdGltZSBvZiB0aGUgbWVkaWEgdGltZS4gKi8KLSAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgLyoqPCBUaW1lIHRvIG9mZnNldCB0aGUgbWVkaWEgdGltZSBieSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGUuZy4gcHJlcm9sbCkuIE1lZGlhIHRpbWUgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXBvcnRlZCB0byBiZSBuT2Zmc2V0IHRpY2tzIGVhcmxpZXIuICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YX1UzMiBuV2FpdE1hc2s7ICAgICAgICAgIC8qKjwgTWFzayBvZiBPTVhfQ0xPQ0tQT1JUIHZhbHVlcy4gKi8KLX0gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFOwotCi0vKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgcmVmZXJlbmNlIGNsb2NrIGN1cnJlbnRseSBiZWluZyB1c2VkIHRvCi0gKiAgY29tcHV0ZSBtZWRpYSB0aW1lLiBJTCBjbGllbnQgdXNlcyB0aGlzIGNvbmZpZyB0byBjaGFuZ2Ugb3IgcXVlcnkgdGhlIAotICogIGNsb2NrIGNvbXBvbmVudCdzIGFjdGl2ZSByZWZlcmVuY2UgY2xvY2sgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19BQ1RJVkVSRUZDTE9DS1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9USU1FX1JFRkNMT0NLVFlQRSBlQ2xvY2s7ICAgLyoqPCBSZWZlcmVuY2UgY2xvY2sgdXNlZCB0byBjb21wdXRlIG1lZGlhIHRpbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAKLX0gT01YX1RJTUVfQ09ORklHX0FDVElWRVJFRkNMT0NLVFlQRTsKLQotLyoqIERlc2NyaXB0b3IgZm9yIHNldHRpbmcgc3BlY2lmaWNzIG9mIHBvd2VyIHR5cGUuCi0gKiAgTm90ZTogdGhpcyBzdHJ1Y3R1cmUgaXMgbGlzdGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9DT05GSUdfUE9XRVJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlUE07ICAgICAgIC8qKjwgRmxhZyB0byBlbmFibGUgUG93ZXIgTWFuYWdlbWVudCAqLwotfSBPTVhfT1RIRVJfQ09ORklHX1BPV0VSVFlQRTsKLQotCi0vKiogRGVzY3JpcHRvciBmb3Igc2V0dGluZyBzcGVjaWZpY3Mgb2Ygc3RhdHMgdHlwZS4KLSAqICBOb3RlOiB0aGlzIHN0cnVjdHVyZSBpcyBsaXN0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX09USEVSX0NPTkZJR19TVEFUU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIC8qIHdoYXQgZ29lcyBoZXJlICovCi19IE9NWF9PVEhFUl9DT05GSUdfU1RBVFNUWVBFOwotCi0KLS8qKgotICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCi0gKiBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCBvdGhlciAKLSAqIHBhdGguCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEUgewotICAgIE9NWF9PVEhFUl9GT1JNQVRUWVBFIGVGb3JtYXQ7ICAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyBjaGFubmVsICovCi19IE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEU7Ci0KLS8qKiAgUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUKLSAgKiAgdGhlIHZhcmlvdXMgZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KLSAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9QQVJBTV9QT1JURk9STUFUVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQgKi8KLSAgICBPTVhfVTMyIG5JbmRleDsgLyoqPCBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gMHgwIHRvIE4tMSAqLwotICAgIE9NWF9PVEhFUl9GT1JNQVRUWVBFIGVGb3JtYXQ7IC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIGNoYW5uZWwgKi8KLX0gT01YX09USEVSX1BBUkFNX1BPUlRGT1JNQVRUWVBFOyAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9RQ09NRXh0bnMuaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfUUNPTUV4dG5zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjU2ZWMuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9RQ09NRXh0bnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNzEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDA5LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgX19PTVhfUUNPTV9FWFRFTlNJT05TX0hfXwotI2RlZmluZSBfX09NWF9RQ09NX0VYVEVOU0lPTlNfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLy8qKiBAZmlsZSBPTVhfUUNPTUV4dG5zLmgKLSAgVGhpcyBoZWFkZXIgY29udGFpbnMgY29uc3RhbnRzIGFuZCB0eXBlIGRlZmluaXRpb25zIHRoYXQgc3BlY2lmeSB0aGUKLSAgZXh0ZW5zaW9ucyBhZGRlZCB0byB0aGUgT3Blbk1BWCBWZW5kb3Igc3BlY2lmaWMgQVBJcy4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgRmlsZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNpbmNsdWRlICJPTVhfQ29yZS5oIgotI2luY2x1ZGUgIk9NWF9WaWRlby5oIgotCi0jZGVmaW5lIE9NWF9WSURFT19NQVhfSFBfTEFZRVJTIDYKLQotLyoqCi0gKiBUaGVzZSBNQUNST1MgdXNlZCBieSBDYW1lcmEgYW5kIFZpZGVvIHRvIGRlY2lkZSBidWZmZXIgY291bnQuCi0gKiBUaGlzIGlzIHRvIGF2b2lkIG1pc21hdGNoIG9mIGJ1ZmZlciBjb3VudCBiZXR3ZWVuIENhbWVyYSBhbmQgVmlkZW8uCi0gKiBJbiBNZXRhIG1vZGUsIHJlYWQgdGhpcyBjb3VudCBhcyBidWZmZXIgY291bnQgaW4gQ2FtZXJhIGFuZCBIZWFkZXIKLSAqIGNvdW50IGluIFZpZGVvLgotICogMSkgTnVtYmVyIG9mIGJ1ZmZlcnMgaW4gTm9uLURDVlMgbW9kZS4KLSAqIDIpIERDVlMgcmVzb2x1dGlvbi4KLSAqIDMpIEJ1ZmZlciBjb3VudCB3aGVuIEN1cnJlbnQgcmVzb2x1dGlvbiBpcyBncmVhdGVyIHRoYW4gRENWUyByZXNvbHV0aW9uCi0gKiBkZWZpbmVkIGluIDIpCi0gKi8KLQotI2RlZmluZSBPTVhfVklERU9fTUlOX0NBTUVSQV9CVUZGRVJTIDkKLSNkZWZpbmUgT01YX1ZJREVPX0VOQ19EQ1ZTX1JFU09MVVRJT04gMzg0MCAqIDIxNjAKLSNkZWZpbmUgT01YX1ZJREVPX01JTl9DQU1FUkFfQlVGRkVSU19EQ1ZTIDExCi0KLS8qKgotICogVGhpcyBjb3VudCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBJbnRzIGluIHRoZSBsZWdhY3kgQ2FtZXJhIHBheWxvYWQKLSAqIHVzZWQgZm9yIEhBTDEKLSAqLwotCi0jZGVmaW5lIFZJREVPX01FVEFEQVRBX05VTV9DT01NT05fSU5UUyAxCi0KLS8qKgotICogVGhpcyBleHRlbnNpb24gaXMgdXNlZCB0byByZWdpc3RlciBtYXBwaW5nIG9mIGEgdmlydHVhbAotICogYWRkcmVzcyB0byBhIHBoeXNpY2FsIGFkZHJlc3MuIFRoaXMgZXh0ZW5zaW9uIGlzIGEgcGFyYW1ldGVyCi0gKiB3aGljaCBjYW4gYmUgc2V0IHVzaW5nIHRoZSBPTVhfU2V0UGFyYW1ldGVyIG1hY3JvLiBUaGUgZGF0YQotICogcG9pbnRlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZXh0ZW5zaW9uIGlzCi0gKiBPTVhfUUNPTV9NZW1NYXBFbnRyeS4gVGhpcyBwYXJhbWV0ZXIgaXMgYSAnd3JpdGUgb25seScKLSAqIHBhcmFtZXRlciAoQ3VycmVudCB2YWx1ZSBjYW5ub3QgYmUgcXVlcmllZCB1c2luZwotICogT01YX0dldFBhcmFtZXRlciBtYWNybykuCi0gKi8KLSNkZWZpbmUgT01YX1FDT01fRVhUTl9SRUdJU1RFUl9NTUFQICAgICAiT01YLlFDT00uaW5kZXgucGFyYW0ucmVnaXN0ZXJfbW1hcCIKLQotLyoqCi0gKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGRhdGEgcG9pbnRlciBjb3JyZXNwb25kaW5nIHRvCi0gKiB0aGUgT01YX1FDT01fTU1BUF9SRUdJU1RFUl9FWFROIGV4dGVuc2lvbi4gVGhpcyBwYXJhbWV0ZXIKLSAqIG11c3QgYmUgc2V0IG9ubHkgJ2FmdGVyJyBwb3B1bGF0aW5nIGEgcG9ydCB3aXRoIGEgYnVmZmVyCi0gKiB1c2luZyBPTVhfVXNlQnVmZmVyLCB3aGVyZWluIHRoZSBkYXRhIHBvaW50ZXIgb2YgdGhlIGJ1ZmZlcgotICogY29ycmVzcG9uZHMgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBhcyBzcGVjaWZpZWQgaW4gdGhpcwotICogc3RydWN0dXJlLgotICovCi1zdHJ1Y3QgT01YX1FDT01fUEFSQU1fTUVNTUFQRU5UUllUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBudW1iZXIgdGhlIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0KLSAgICAvKioKLSAgICAgKiBUaGUgdmlydHVhbCBhZGRyZXNzIG9mIG1lbW9yeSBibG9jawotICAgICAqLwotICAgIE9NWF9VNjQgblZpcnR1YWxBZGRyZXNzOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0aGUgdmlydHVhbCBhZGRyZXNzLiBUaGUgcGh5c2ljYWwKLSAgICAgKiBhZGRyZXNzIGlzIGNvbnRpZ3VvdXMgZm9yIHRoZSBlbnRpcmUgdmFsaWQgcmFuZ2Ugb2YgdGhlIHZpcnR1YWwKLSAgICAgKiBhZGRyZXNzLgotICAgICAqLwotICAgIE9NWF9VNjQgblBoeXNpY2FsQWRkcmVzczsKLX07Ci0KLSNkZWZpbmUgUU9NWF9WSURFT19JbnRyYVJlZnJlc2hSYW5kb20gKE9NWF9WSURFT19JbnRyYVJlZnJlc2hWZW5kb3JTdGFydFVudXNlZCArIDApCi0KLS8qIFRoaXMgZXJyb3IgZXZlbnQgaXMgdXNlZCBmb3IgSC4yNjQgbG9uZy10ZXJtIHJlZmVyZW5jZSAoTFRSKSBlbmNvZGluZy4KLSAqIFdoZW4gSUwgY2xpZW50IHNwZWNpZmllcyBhbiBMVFIgZnJhbWUgd2l0aCBpdHMgaWRlbnRpZmllciB2aWEKLSAqIE9NWF9RQ09NX0lOREVYX0NPTkZJR19WSURFT19MVFJVU0UgdG8gdGhlIGVuY29kZXIsIGlmIHRoZSBzcGVjaWZpZWQKLSAqIExUUiBmcmFtZSBjYW4gbm90IGJlIGxvY2F0ZWQgYnkgdGhlIGVuY29kZXIgaW4gaXRzIExUUiBsaXN0LCB0aGUgZW5jb2RlcgotICogaXNzdWVzIHRoaXMgZXJyb3IgZXZlbnQgdG8gSUwgY2xpZW50IHRvIG5vdGlmeSB0aGUgZmFpbHVyZSBvZiBMVFJVc2UgY29uZmlnLgotICovCi0jZGVmaW5lIFFPTVhfRXJyb3JMVFJVc2VGYWlsZWQgICAgICAgIChPTVhfRXJyb3JWZW5kb3JTdGFydFVudXNlZCArIDEpCi0KLS8qCi0gKiBUaGlzIHJhdGUgY29udHJvbCB3aWxsIGJlIHVzZWQgZm9yIGxvdyBiaXRyYXRlIGFwcGxpY2F0aW9ucyB0byBnZXQgYmV0dGVyCi0gKiB2aWRlbyBxdWFsaXR5IGZvciBhIGdpdmVuIGJpdHJhdGUuCi0gKi8KLSNkZWZpbmUgUU9NWF9WaWRlb19Db250cm9sUmF0ZU1heEJpdHJhdGUgKE9NWF9WaWRlb19Db250cm9sUmF0ZVZlbmRvclN0YXJ0VW51c2VkICsgMSkKLQotI2RlZmluZSBRT01YX1ZpZGVvX0NvbnRyb2xSYXRlTWF4Qml0cmF0ZVNraXBGcmFtZXMgKE9NWF9WaWRlb19Db250cm9sUmF0ZVZlbmRvclN0YXJ0VW51c2VkICsgMikKLQotI2RlZmluZSBRT01YX1ZJREVPX0JVRkZFUkZMQUdfQkZSQU1FIDB4MDAxMDAwMDAKLQotI2RlZmluZSBRT01YX1ZJREVPX0JVRkZFUkZMQUdfRU9TRVEgIDB4MDAyMDAwMDAKLQotI2RlZmluZSBRT01YX1ZJREVPX0JVRkZFUkZMQUdfTUJBRkYgIDB4MDA0MDAwMDAKLQotI2RlZmluZSBRT01YX1ZJREVPX0JVRkZFUkZMQUdfQ0FOQ0VMIDB4MDA4MDAwMDAKLQotI2RlZmluZSBPTVhfUUNPTV9QT1JUREVGTl9FWFROICAgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnBvcnRkZWZuIgotLyogQWxsb3dlZCBBUElzIG9uIHRoZSBhYm92ZSBJbmRleDogT01YX0dldFBhcmFtZXRlcigpIGFuZCBPTVhfU2V0UGFyYW1ldGVyKCkgKi8KLQotdHlwZWRlZiBlbnVtIE9NWF9RQ09NTWVtb3J5UmVnaW9uCi17Ci0gICAgT01YX1FDT01fTWVtUmVnaW9uSW52YWxpZCwKLSAgICBPTVhfUUNPTV9NZW1SZWdpb25FQkkxLAotICAgIE9NWF9RQ09NX01lbVJlZ2lvblNNSSwKLSAgICBPTVhfUUNPTV9NZW1SZWdpb25NYXggPSAwWDdGRkZGRkZGCi19IE9NWF9RQ09NTWVtb3J5UmVnaW9uOwotCi10eXBlZGVmIGVudW0gT01YX1FDT01DYWNoZUF0dHIKLXsKLSAgICBPTVhfUUNPTV9DYWNoZUF0dHJOb25lLAotICAgIE9NWF9RQ09NX0NhY2hlQXR0cldyaXRlQmFjaywKLSAgICBPTVhfUUNPTV9DYWNoZUF0dHJXcml0ZVRocm91Z2gsCi0gICAgT01YX1FDT01fQ2FjaGVBdHRyTUFYID0gMFg3RkZGRkZGRgotfSBPTVhfUUNPTUNhY2hlQXR0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1FDT01SZWN0YW5nbGUKLXsKLSAgIE9NWF9TMzIgeDsKLSAgIE9NWF9TMzIgeTsKLSAgIE9NWF9TMzIgZHg7Ci0gICBPTVhfUzMyIGR5OwotfSBPTVhfUUNPTVJlY3RhbmdsZTsKLQotLyoqIE9NWF9RQ09NRnJhbWVQYWNraW5nRm9ybWF0Ci0gICogSW5wdXQgb3Igb3V0cHV0IGJ1ZmZlciBmb3JtYXQKLSAgKi8KLXR5cGVkZWYgZW51bSBPTVhfUUNPTUZyYW1lUGFja2luZ0Zvcm1hdAotewotICAvKiAwIC0gdW5zcGVjaWZpZWQKLSAgICovCi0gIE9NWF9RQ09NX0ZyYW1lUGFja2luZ19VbnNwZWNpZmllZCwKLQotICAvKiAgMSAtIFBhcnRpYWwgZnJhbWVzIG1heSBiZSBwcmVzZW50IE9NWCBJTCAxLjEuMSBGaWd1cmUgMi0xMDoKLSAgICogIENhc2UgMT8/RWFjaCBCdWZmZXIgRmlsbGVkIEluIFdob2xlIG9yIEluIFBhcnQKLSAgICovCi0gIE9NWF9RQ09NX0ZyYW1lUGFja2luZ19BcmJpdHJhcnksCi0KLSAgLyogIDIgLSBNdWx0aXBsZSBjb21wbGV0ZSBmcmFtZXMgcGVyIGJ1ZmZlciAoaW50ZWdlciBudW1iZXIpCi0gICAqICBPTVggSUwgMS4xLjEgRmlndXJlIDItMTE6IENhc2UgMi1FYWNoIEJ1ZmZlciBGaWxsZWQgd2l0aAotICAgKiAgT25seSBDb21wbGV0ZSBGcmFtZXMgb2YgRGF0YQotICAgKi8KLSAgT01YX1FDT01fRnJhbWVQYWNraW5nX0NvbXBsZXRlRnJhbWVzLAotCi0gIC8qICAzIC0gT25seSBvbmUgY29tcGxldGUgZnJhbWUgcGVyIGJ1ZmZlciwgbm8gcGFydGlhbCBmcmFtZQotICAgKiAgT01YIElMIDEuMS4xIEZpZ3VyZSAyLTEyOiBDYXNlIDMtRWFjaCBCdWZmZXIgRmlsbGVkIHdpdGgKLSAgICogIE9ubHkgT25lIEZyYW1lIG9mIENvbXByZXNzZWQgRGF0YS4gVXN1YWxseSBhdCBsZWFzdCBvbmUKLSAgICogIGNvbXBsZXRlIHVuaXQgb2YgZGF0YSB3aWxsIGJlIGRlbGl2ZXJlZCBpbiBhIGJ1ZmZlciBmb3IKLSAgICogIHVuY29tcHJlc3NlZCBkYXRhIGZvcm1hdHMuCi0gICAqLwotICBPTVhfUUNPTV9GcmFtZVBhY2tpbmdfT25seU9uZUNvbXBsZXRlRnJhbWUsCi0KLSAgLyogIDQgLSBPbmx5IG9uZSBjb21wbGV0ZSBzdWJmcmFtZSBwZXIgYnVmZmVyLCBubyBwYXJ0aWFsIHN1YmZyYW1lCi0gICAqICBFeGFtcGxlOiBJbiBIMjY0LCBvbmUgY29tcGxldGUgTkFMIHBlciBidWZmZXIsIHdoZXJlIG9uZSBmcmFtZQotICAgKiAgY2FuIGNvbnRhdGluIG11bHRpcGxlIE5BTAotICAgKi8KLSAgT01YX1FDT01fRnJhbWVQYWNraW5nX09ubHlPbmVDb21wbGV0ZVN1YkZyYW1lLAotCi0gIE9NWF9RQ09NX0ZyYW1lUGFja2luZ19NQVggPSAwWDdGRkZGRkZGCi19IE9NWF9RQ09NRnJhbWVQYWNraW5nRm9ybWF0OwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgewotIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAvKiogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOy8qKiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gT01YX1UzMiBuUG9ydEluZGV4OyAgICAvKiogUG9ydGluZGV4IHdoaWNoIGlzIGV4dGVuZGVkIGJ5IHRoaXMgc3RydWN0dXJlICovCi0KLSAvKiogUGxhdGZvcm0gc3BlY2lmaWMgbWVtb3J5IHJlZ2lvbiBFQkkxLCBTTUksIGV0Yy4sKi8KLSBPTVhfUUNPTU1lbW9yeVJlZ2lvbiBuTWVtUmVnaW9uOwotCi0gT01YX1FDT01DYWNoZUF0dHIgbkNhY2hlQXR0cjsgLyoqIENhY2hlIGF0dHJpYnV0ZXMgKi8KLQotIC8qKiBJbnB1dCBvciBvdXRwdXQgYnVmZmVyIGZvcm1hdCAqLwotIE9NWF9VMzIgbkZyYW1lUGFja2luZ0Zvcm1hdDsKLQotfSBPTVhfUUNPTV9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX1ZJREVPX0NPTkZJR19RUCB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgblFQOwotfSBPTVhfUUNPTV9WSURFT19DT05GSUdfUVA7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX1ZJREVPX1BBUkFNX0lQQl9RUFJBTkdFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbWluSVFQOwotICAgIE9NWF9VMzIgbWF4SVFQOwotICAgIE9NWF9VMzIgbWluUFFQOwotICAgIE9NWF9VMzIgbWF4UFFQOwotICAgIE9NWF9VMzIgbWluQlFQOwotICAgIE9NWF9VMzIgbWF4QlFQOwotfSBPTVhfUUNPTV9WSURFT19QQVJBTV9JUEJfUVBSQU5HRVRZUEU7Ci0KLSNkZWZpbmUgT01YX1FDT01fUExBVEZPUk1QVlRfRVhUTiAgICJPTVguUUNPTS5pbmRleC5wYXJhbS5wbGF0Zm9ybXByaXZhdGUiCi0vKiogQWxsb3dlZCBBUElzIG9uIHRoZSBhYm92ZSBJbmRleDogT01YX1NldFBhcmFtZXRlcigpICovCi0KLXR5cGVkZWYgZW51bSBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0VOVFJZX1RZUEUKLXsKLSAgICAvKiogRW51bSBmb3IgUE1FTSBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfUE1FTSA9IDB4MQotfSBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0VOVFJZX1RZUEU7Ci0KLS8qKiBJTCBjbGllbnQgd2lsbCBzZXQgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUuIEEgZmFpbHVyZQotICogIGNvZGUgd2lsbCBiZSByZXR1cm5lZCBpZiBjb21wb25lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUKLSAqICB2YWx1ZSBwcm92aWRlZCBmb3IgJ3R5cGUnLgotICovCi1zdHJ1Y3QgT01YX1FDT01fUExBVEZPUk1QUklWQVRFX0VYVE4KLXsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgLyoqIFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqIE9NWCBzcGVjIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAvKiogUG9ydCBudW1iZXIgb24gd2hpY2ggdXNlYnVmZmVyIGV4dG4gaXMgYXBwbGllZCAqLwotCi0gICAgLyoqIFR5cGUgb2YgZXh0ZW5zaW9ucyBzaG91bGQgbWF0Y2ggYW4gZW50cnkgZnJvbQotICAgICBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0VOVFJZX1RZUEUKLSAgICAqLwotICAgIE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfRU5UUllfVFlQRSB0eXBlOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9QTUVNX0lORk8KLXsKLSAgICAvKiogcG1lbSBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICB1bnNpZ25lZCBsb25nIHBtZW1fZmQ7Ci0gICAgLyoqIE9mZnNldCBmcm9tIHBtZW0gZGV2aWNlIGJhc2UgYWRkcmVzcyAqLwotICAgIE9NWF9VMzIgb2Zmc2V0OwotICAgIE9NWF9VMzIgc2l6ZTsKLSAgICBPTVhfVTMyIG1hcHBlZF9zaXplOwotICAgIE9NWF9QVFIgYnVmZmVyOwotfU9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfUE1FTV9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0VOVFJZCi17Ci0gICAgLyoqIEVudHJ5IHR5cGUgKi8KLSAgICBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0VOVFJZX1RZUEUgdHlwZTsKLQotICAgIC8qKiBQb2ludGVyIHRvIHBsYXRmb3JtIHNwZWNpZmljIGVudHJ5ICovCi0gICAgT01YX1BUUiBlbnRyeTsKLX1PTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0xJU1QKLXsKLSAgICAvKiogTnVtYmVyIG9mIGVudHJpZXMgKi8KLSAgICBPTVhfVTMyIG5FbnRyaWVzOwotCi0gICAgLyoqIFBvaW50ZXIgdG8gYXJyYXkgb2YgcGxhdGZvcm0gc3BlY2lmaWMgZW50cmllcyAqCi0gICAgICogQ29udGlndW91cyBibG9jayBvZiBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0VOVFJZIGVsZW1lbnQKLSAgICAqLwotICAgIE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfRU5UUlkqIGVudHJ5TGlzdDsKLX1PTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0xJU1Q7Ci0KLSNkZWZpbmUgT01YX1FDT01fRlJBTUVfUEFDS0lOR19GT1JNQVQgICAiT01YLlFDT00uaW5kZXgucGFyYW0uZnJhbWVwYWNrZm10IgotLyogQWxsb3dlZCBBUEkgY2FsbDogT01YX0dldFBhcmFtZXRlcigpICovCi0vKiBJTCBjbGllbnQgY2FuIHVzZSB0aGlzIGluZGV4IHRvIHJlcmlldmUgdGhlIGxpc3Qgb2YgZnJhbWUgZm9ybWF0cyAqCi0gKiBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudCAqLwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9GUkFNRV9QQUNLSU5HRk9STUFUX1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5JbmRleDsKLSAgICBPTVhfUUNPTUZyYW1lUGFja2luZ0Zvcm1hdCBlZnJhbWVQYWNraW5nRm9ybWF0OwotfSBPTVhfUUNPTV9GUkFNRV9QQUNLSU5HRk9STUFUX1RZUEU7Ci0KLQotLyoqCi0gKiBGb2xsb3dpbmcgaXMgdGhlIGVudW0gZm9yIGNvbG9yIGZvcm1hdHMgc3VwcG9ydGVkIG9uIFF1YWxjb21tCi0gKiBNU01zIFlWVTQyMFNlbWlQbGFuYXIgY29sb3IgZm9ybWF0IGlzIG5vdCBkZWZpbmVkIGluIE9wZW5NQVgKLSAqIDEuMS4xIGFuZCBwcmlvciB2ZXJzaW9ucyBvZiBPcGVuTUFYIHNwZWNpZmljYXRpb24uCi0gKi8KLQotZW51bSBPTVhfUUNPTV9DT0xPUl9GT1JNQVRUWVBFCi17Ci0KLS8qKiBZVlU0MjBTZW1pUGxhbmFyOiBZVlUgcGxhbmFyIGZvcm1hdCwgb3JnYW5pemVkIHdpdGggYSBmaXJzdAotICogIHBsYW5lIGNvbnRhaW5pbmcgWSBwaXhlbHMsIGFuZCBhIHNlY29uZCBwbGFuZSBjb250YWluaW5nCi0gKiAgaW50ZXJsZWF2ZWQgViBhbmQgVSBwaXhlbHMuIFYgYW5kIFUgcGl4ZWxzIGFyZSBzdWItc2FtcGxlZAotICogIGJ5IGEgZmFjdG9yIG9mIHR3byBib3RoIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseS4KLSAqLwotICAgIFFPTVhfQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDAsCi0gICAgUU9NWF9DT0xPUl9Gb3JtYXRZVlU0MjBQYWNrZWRTZW1pUGxhbmFyMzJtNGthLAotICAgIFFPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjE2bTJrYSwKLSAgICBRT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI2NHgzMlRpbGUybThrYSwKLSAgICBRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm0sCi0gICAgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtTXVsdGlWaWV3LAotICAgIFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybUNvbXByZXNzZWQsCi0gICAgUU9NWF9DT0xPUl9Gb3JtYXQzMmJpdFJHQkE4ODg4LAotICAgIFFPTVhfQ09MT1JfRm9ybWF0MzJiaXRSR0JBODg4OENvbXByZXNzZWQsCi0gICAgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtMTBiaXRDb21wcmVzc2VkLAotICAgIFFPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSkgT01YX0NPTE9SX0Zvcm1hdFZlbmRvclN0YXJ0VW51c2VkICArIDB4Nzg5LAotfTsKLQotZW51bSBPTVhfUUNPTV9WSURFT19DT0RJTkdUWVBFCi17Ci0vKiogQ29kZWNzIHN1cHBvcnQgYnkgcXVhbGNvbW0gd2hpY2ggYXJlIG5vdCBsaXN0ZWQgaW4gT01YIDEuMS54Ci0gKiAgc3BlYwotICogICAqLwotICAgIE9NWF9RQ09NX1ZJREVPX0NvZGluZ1ZDMSAgPSAweDdGQTMwQzAwICwKLSAgICBPTVhfUUNPTV9WSURFT19Db2RpbmdXTVY5ID0gMHg3RkEzMEMwMSwKLSAgICBRT01YX1ZJREVPX0NvZGluZ0RpdnggPSAweDdGQTMwQzAyLCAgICAgLyoqPCBWYWx1ZSB3aGVuIGNvZGluZyBpcyBEaXZ4ICovCi0gICAgUU9NWF9WSURFT19Db2RpbmdTcGFyayA9IDB4N0ZBMzBDMDMsICAgICAvKio8IFZhbHVlIHdoZW4gY29kaW5nIGlzIFNvcmVuc29uIFNwYXJrICovCi0gICAgUU9NWF9WSURFT19Db2RpbmdWcCA9IDB4N0ZBMzBDMDQsCi0gICAgUU9NWF9WSURFT19Db2RpbmdWcDggPSBPTVhfVklERU9fQ29kaW5nVlA4LCAgIC8qKjwga2VlcGluZyBvbGQgZW51bSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqLwotICAgIFFPTVhfVklERU9fQ29kaW5nSGV2YyA9IE9NWF9WSURFT19Db2RpbmdIRVZDLCAvKio8IGtlZXBpbmcgb2xkIGVudW0gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki8KLSAgICBRT01YX1ZJREVPX0NvZGluZ01WQyA9IDB4N0ZBMzBDMDcsCi0gICAgUU9NWF9WSURFT19Db2RpbmdWcDkgPSBPTVhfVklERU9fQ29kaW5nVlA5LCAgIC8qKjwga2VlcGluZyBvbGQgZW51bSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqLwotfTsKLQotZW51bSBPTVhfUUNPTV9FWFROX0lOREVYVFlQRQotewotICAgIC8qKiBRY29tIHByb3ByaWV0YXJ5IGV4dGVuc2lvbiBpbmRleCBsaXN0ICovCi0KLSAgICAvKiAiT01YLlFDT00uaW5kZXgucGFyYW0ucmVnaXN0ZXJfbW1hcCIgKi8KLSAgICBPTVhfUWNvbUluZGV4UmVnbW1hcCA9IDB4N0YwMDAwMDAsCi0KLSAgICAvKiAiT01YLlFDT00uaW5kZXgucGFyYW0ucGxhdGZvcm1wcml2YXRlIiAqLwotICAgIE9NWF9RY29tSW5kZXhQbGF0Zm9ybVB2dCA9IDB4N0YwMDAwMDEsCi0KLSAgICAvKiAiT01YLlFDT00uaW5kZXgucGFyYW0ucG9ydGRlZm4iICovCi0gICAgT01YX1Fjb21JbmRleFBvcnREZWZuID0gMHg3RjAwMDAwMiwKLQotICAgIC8qICJPTVguUUNPTS5pbmRleC5wYXJhbS5mcmFtZXBhY2tpbmdmb3JtYXQiICovCi0gICAgT01YX1Fjb21JbmRleFBvcnRGcmFtZVBhY2tGbXQgPSAweDdGMDAwMDAzLAotCi0gICAgLyoiT01YLlFDT00uaW5kZXgucGFyYW0uSW50ZXJsYWNlZCAqLwotICAgIE9NWF9RY29tSW5kZXhQYXJhbUludGVybGFjZWQgPSAweDdGMDAwMDA0LAotCi0gICAgLyoiT01YLlFDT00uaW5kZXguY29uZmlnLmludGVybGFjZWZvcm1hdCAqLwotICAgIE9NWF9RY29tSW5kZXhDb25maWdJbnRlcmxhY2VkID0gMHg3RjAwMDAwNSwKLQotICAgIC8qIk9NWC5RQ09NLmluZGV4LnBhcmFtLnN5bnRheGhkciIgKi8KLSAgICBRT01YX0luZGV4UGFyYW1WaWRlb1N5bnRheEhkciA9IDB4N0YwMDAwMDYsCi0KLSAgICAvKiJPTVguUUNPTS5pbmRleC5jb25maWcuaW50cmFwZXJpb2QiICovCi0gICAgUU9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFwZXJpb2QgPSAweDdGMDAwMDA3LAotCi0gICAgLyoiT01YLlFDT00uaW5kZXguY29uZmlnLnJhbmRvbUludHJhcmVmcmVzaCIgKi8KLSAgICBRT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVJlZnJlc2ggPSAweDdGMDAwMDA4LAotCi0gICAgLyoiT01YLlFDT00uaW5kZXguY29uZmlnLnZpZGVvLlRlbXBvcmFsU3BhdGlhbFRyYWRlT2ZmIiAqLwotICAgIFFPTVhfSW5kZXhDb25maWdWaWRlb1RlbXBvcmFsU3BhdGlhbFRyYWRlT2ZmID0gMHg3RjAwMDAwOSwKLQotICAgIC8qIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLkVuY29kZXJNb2RlIiAqLwotICAgIFFPTVhfSW5kZXhQYXJhbVZpZGVvRW5jb2Rlck1vZGUgPSAweDdGMDAwMDBBLAotCi0gICAgLyoiT01YLlFDT00uaW5kZXgucGFyYW0uRGl2eHR5cGUgKi8KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0RpdnggPSAweDdGMDAwMDBCLAotCi0gICAgLyoiT01YLlFDT00uaW5kZXgucGFyYW0uU3Bhcmt0eXBlICovCi0gICAgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9TcGFyayA9IDB4N0YwMDAwMEMsCi0KLSAgICAvKiJPTVguUUNPTS5pbmRleC5wYXJhbS5WcHR5cGUgKi8KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb1ZwID0gMHg3RjAwMDAwRCwKLQotICAgIE9NWF9RY29tSW5kZXhRdWVyeU51bWJlck9mVmlkZW9EZWNJbnN0YW5jZSA9IDB4N0YwMDAwMEUsCi0KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb1N5bmNGcmFtZURlY29kaW5nTW9kZSA9IDB4N0YwMDAwMEYsCi0KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0RlY29kZXJQaWN0dXJlT3JkZXIgPSAweDdGMDAwMDEwLAotCi0gICAgLyogIk9NWC5RQ09NLmluZGV4LmNvbmZpZy52aWRlby5GcmFtZVBhY2tpbmdJbmZvIiAqLwotICAgIE9NWF9RY29tSW5kZXhDb25maWdWaWRlb0ZyYW1lUGFja2luZ0FycmFuZ2VtZW50ID0gMHg3RjAwMDAxMSwKLQotICAgIE9NWF9RY29tSW5kZXhQYXJhbUNvbmNlYWxNQk1hcEV4dHJhRGF0YSA9IDB4N0YwMDAwMTIsCi0KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1GcmFtZUluZm9FeHRyYURhdGEgPSAweDdGMDAwMDEzLAotCi0gICAgT01YX1Fjb21JbmRleFBhcmFtSW50ZXJsYWNlRXh0cmFEYXRhID0gMHg3RjAwMDAxNCwKLQotICAgIE9NWF9RY29tSW5kZXhQYXJhbUgyNjRUaW1lSW5mbyA9IDB4N0YwMDAwMTUsCi0KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1JbmRleEV4dHJhRGF0YVR5cGUgPSAweDdGMDAwMDE2LAotCi0gICAgT01YX0dvb2dsZUFuZHJvaWRJbmRleEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzID0gMHg3RjAwMDAxNywKLQotICAgIE9NWF9Hb29nbGVBbmRyb2lkSW5kZXhVc2VBbmRyb2lkTmF0aXZlQnVmZmVyID0gMHg3RjAwMDAxOCwKLQotICAgIE9NWF9Hb29nbGVBbmRyb2lkSW5kZXhHZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2UgPSAweDdGMDAwMDE5LAotCi0gICAgLyoiT01YLlFDT00uaW5kZXgucGFyYW0uRW5hYmxlVGltZVN0YW1wUmVvZGVyIiovCi0gICAgT01YX1Fjb21JbmRleFBhcmFtRW5hYmxlVGltZVN0YW1wUmVvcmRlciA9IDB4N0YwMDAwMUIsCi0KLSAgICAvKiJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIqLwotICAgIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvTWV0YUJ1ZmZlck1vZGUgPSAweDdGMDAwMDFDLAotCi0gICAgLyoiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnVzZUFuZHJvaWROYXRpdmVCdWZmZXIyIiovCi0gICAgT01YX0dvb2dsZUFuZHJvaWRJbmRleFVzZUFuZHJvaWROYXRpdmVCdWZmZXIyID0gMHg3RjAwMDAxRCwKLQotICAgIC8qIk9NWC5RQ09NLmluZGV4LnBhcmFtLlZpZGVvTWF4QWxsb3dlZEJpdHJhdGVDaGVjayIqLwotICAgIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvTWF4QWxsb3dlZEJpdHJhdGVDaGVjayA9IDB4N0YwMDAwMUUsCi0KLSAgICBPTVhfUWNvbUluZGV4RW5hYmxlU2xpY2VEZWxpdmVyeU1vZGUgPSAweDdGMDAwMDFGLAotCi0gICAgLyogIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLkV4dG5Vc2VyRXh0cmFEYXRhIiAqLwotICAgIE9NWF9RY29tSW5kZXhFbmFibGVFeHRuVXNlckRhdGEgPSAweDdGMDAwMDIwLAotCi0gICAgLyoiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uRW5hYmxlU21vb3RoU3RyZWFtaW5nIiovCi0gICAgT01YX1Fjb21JbmRleFBhcmFtRW5hYmxlU21vb3RoU3RyZWFtaW5nID0gMHg3RjAwMDAyMSwKLQotICAgIE9NWF9RY29tSW5kZXhFbmFibGVIMjYzUGx1c1BUeXBlID0gMHg3RjAwMDAyMywKLQotICAgIC8qIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLkxUUkNvdW50UmFuZ2VTdXBwb3J0ZWQiKi8KLSAgICBRT01YX0luZGV4UGFyYW1WaWRlb0xUUkNvdW50UmFuZ2VTdXBwb3J0ZWQgPSAweDdGMDAwMDI0LAotCi0gICAgLyoiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uTFRSTW9kZSIqLwotICAgIFFPTVhfSW5kZXhQYXJhbVZpZGVvTFRSTW9kZSA9IDB4N0YwMDAwMjUsCi0KLSAgICAvKiJPTVguUUNPTS5pbmRleC5wYXJhbS52aWRlby5MVFJDb3VudCIqLwotICAgIFFPTVhfSW5kZXhQYXJhbVZpZGVvTFRSQ291bnQgPSAweDdGMDAwMDI2LAotCi0gICAgLyoiT01YLlFDT00uaW5kZXguY29uZmlnLnZpZGVvLkxUUlBlcmlvZCIqLwotICAgIFFPTVhfSW5kZXhDb25maWdWaWRlb0xUUlBlcmlvZCA9IDB4N0YwMDAwMjcsCi0KLSAgICAvKiJPTVguUUNPTS5pbmRleC5jb25maWcudmlkZW8uTFRSVXNlIiovCi0gICAgUU9NWF9JbmRleENvbmZpZ1ZpZGVvTFRSVXNlID0gMHg3RjAwMDAyOCwKLQotICAgIC8qIk9NWC5RQ09NLmluZGV4LmNvbmZpZy52aWRlby5MVFJNYXJrIiovCi0gICAgUU9NWF9JbmRleENvbmZpZ1ZpZGVvTFRSTWFyayA9IDB4N0YwMDAwMjksCi0KLSAgICAvKiBPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgucHJlcGVuZFNQU1BQU1RvSURSRnJhbWVzICovCi0gICAgT01YX1Fjb21JbmRleFBhcmFtU2VxdWVuY2VIZWFkZXJXaXRoSURSID0gMHg3RjAwMDAyQSwKLQotICAgIE9NWF9RY29tSW5kZXhQYXJhbUFVRGVsaW1pdGVyID0gMHg3RjAwMDAyQiwKLQotICAgIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvRG93blNjYWxhciA9IDB4N0YwMDAwMkMsCi0KLSAgICAvKiAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uRnJhbWVQYWNraW5nRXh0cmFkYXRhIiAqLwotICAgIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvRnJhbWVQYWNraW5nRXh0cmFkYXRhID0gMHg3RjAwMDAyRCwKLQotICAgIC8qICJPTVguUUNPTS5pbmRleC5jb25maWcuYWN0aXZlcmVnaW9uZGV0ZWN0aW9uIiAqLwotICAgIE9NWF9RY29tSW5kZXhDb25maWdBY3RpdmVSZWdpb25EZXRlY3Rpb24gPSAweDdGMDAwMDJFLAotCi0gICAgLyogIk9NWC5RQ09NLmluZGV4LmNvbmZpZy5hY3RpdmVyZWdpb25kZXRlY3Rpb25zdGF0dXMiICovCi0gICAgT01YX1Fjb21JbmRleENvbmZpZ0FjdGl2ZVJlZ2lvbkRldGVjdGlvblN0YXR1cyA9IDB4N0YwMDAwMkYsCi0KLSAgICAvKiAiT01YLlFDT00uaW5kZXguY29uZmlnLnNjYWxpbmdtb2RlIiAqLwotICAgIE9NWF9RY29tSW5kZXhDb25maWdTY2FsaW5nTW9kZSA9IDB4N0YwMDAwMzAsCi0KLSAgICAvKiAiT01YLlFDT00uaW5kZXguY29uZmlnLm5vaXNlcmVkdWN0aW9uIiAqLwotICAgIE9NWF9RY29tSW5kZXhDb25maWdOb2lzZVJlZHVjdGlvbiA9IDB4N0YwMDAwMzEsCi0KLSAgICAvKiAiT01YLlFDT00uaW5kZXguY29uZmlnLmltYWdlZW5oYW5jZW1lbnQiICovCi0gICAgT01YX1Fjb21JbmRleENvbmZpZ0ltYWdlRW5oYW5jZW1lbnQgPSAweDdGMDAwMDMyLAotCi0gICAgLyogZ29vZ2xlIHNtb290aC1zdHJlYW1pbmcgc3VwcG9ydCAqLwotICAgIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvQWRhcHRpdmVQbGF5YmFja01vZGUgPSAweDdGMDAwMDMzLAotCi0gICAgLyogSC4yNjQgTVZDIGNvZGVjIGluZGV4ICovCi0gICAgUU9NWF9JbmRleFBhcmFtVmlkZW9NdmMgPSAweDdGMDAwMDM0LAotCi0gICAgLyogIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLlFQRXh0cmFkYXRhIiAqLwotICAgIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvUVBFeHRyYURhdGEgPSAweDdGMDAwMDM1LAotCi0gICAgLyogIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLklucHV0Qml0c0luZm9FeHRyYWRhdGEiICovCi0gICAgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9JbnB1dEJpdHNJbmZvRXh0cmFEYXRhID0gMHg3RjAwMDAzNiwKLQotICAgIC8qIFZQOCBIaWVyYXJjaGljYWwgUCBzdXBwb3J0ICovCi0gICAgT01YX1Fjb21JbmRleEhpZXJhcmNoaWNhbFN0cnVjdHVyZSA9IDB4N0YwMDAwMzcsCi0KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1IMjY0VlVJVGltaW5nSW5mbyA9IDB4N0YwMDAwMzksCi0KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1QZWFrQml0cmF0ZSA9IDB4N0YwMDAwM0EsCi0KLSAgICAvKiBFbmFibGUgSW5pdGlhbFFQIDogUU9NWF9FWFROSU5ERVhfVklERU9fSU5JVElBTFFQICovCi0gICAgUU9NWF9JbmRleFBhcmFtVmlkZW9Jbml0aWFsUXAgPSAweDdGMDAwMDNCLAotCi0gICAgT01YX1Fjb21JbmRleFBhcmFtU2V0TVZTZWFyY2hyYW5nZSA9IDB4N0YwMDAwM0MsCi0KLSAgICAvKiBOb3RlOiBUaGlzIHdpbGwgZ2V0IGRlcHJlY2F0ZWQgKi8KLSAgICBPTVhfUWNvbUluZGV4Q29uZmlnUGVyZkxldmVsID0gMHg3RjAwMDAzRCwKLQotICAgIC8qIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLkxUUkNvdW50IiovCi0gICAgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9MVFJDb3VudCA9IFFPTVhfSW5kZXhQYXJhbVZpZGVvTFRSQ291bnQsCi0KLSAgICAvKiJPTVguUUNPTS5pbmRleC5jb25maWcudmlkZW8uTFRSVXNlIiovCi0gICAgT01YX1Fjb21JbmRleENvbmZpZ1ZpZGVvTFRSVXNlID0gUU9NWF9JbmRleENvbmZpZ1ZpZGVvTFRSVXNlLAotCi0gICAgLyoiT01YLlFDT00uaW5kZXguY29uZmlnLnZpZGVvLkxUUk1hcmsiKi8KLSAgICBPTVhfUWNvbUluZGV4Q29uZmlnVmlkZW9MVFJNYXJrID0gUU9NWF9JbmRleENvbmZpZ1ZpZGVvTFRSTWFyaywKLQotICAgIC8qIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLkN1c3RvbUJ1ZmZlclNpemUiKi8KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0N1c3RvbUJ1ZmZlclNpemUgPSAweDdGMDAwMDNFLAotCi0gICAgLyogTWF4IEhpZXJhcmNoaWNhbCBQIGxheWVycyAqLwotICAgIE9NWF9RY29tSW5kZXhNYXhIaWVyYXJjaGljYWxsYXllcnMgPSAweDdGMDAwMDQxLAotCi0gICAgLyogU2V0IEh5YnJpZCBIaWVyLXAgbGF5ZXJzICovCi0gICAgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9IeWJyaWRIaWVycE1vZGUgPSAweDdGMDAwMDQzLAotCi0gICAgT01YX1Fjb21JbmRleEZsZXhpYmxlWVVWRGVzY3JpcHRpb24gPSAweDdGMDAwMDQ0LAotCi0gICAgLyogVnBwIEhxdiBDb250cm9sIFR5cGUgKi8KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1WcHBIcXZDb250cm9sID0gMHg3RjAwMDA0NSwKLQotICAgIC8qIEVuYWJsZSBWUFAgKi8KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1FbmFibGVWcHAgPSAweDdGMDAwMDQ2LAotCi0gICAgLyogTUJJIHN0YXRpc3RpY3MgbW9kZSAqLwotICAgIE9NWF9RY29tSW5kZXhQYXJhbU1CSVN0YXRpc3RpY3NNb2RlID0gMHg3RjAwMDA0NywKLQotICAgIC8qIFNldCBQaWN0dXJlVHlwZURlY29kZSAqLwotICAgIE9NWF9RY29tSW5kZXhDb25maWdQaWN0dXJlVHlwZURlY29kZSA9IDB4N0YwMDAwNDgsCi0KLSAgICBPTVhfUWNvbUluZGV4Q29uZmlnSDI2NEVudHJvcHlDb2RpbmdDYWJhYyA9IDB4N0YwMDAwNDksCi0KLSAgICAvKiAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uSW5wdXRCYXRjaCIgKi8KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1CYXRjaFNpemUgPSAweDdGMDAwMDRBLAotCi0gICAgT01YX1Fjb21JbmRleENvbmZpZ051bUhpZXJQTGF5ZXJzID0gMHg3RjAwMDA0QiwKLQotICAgIE9NWF9RY29tSW5kZXhDb25maWdSZWN0VHlwZSA9IDB4N0YwMDAwNEMsCi0KLSAgICBPTVhfUWNvbUluZGV4Q29uZmlnQmFzZUxheWVySWQgPSAweDdGMDAwMDRFLAotCi0gICAgT01YX1Fjb21JbmRleFBhcmFtRHJpdmVyVmVyc2lvbiA9IDB4N0YwMDAwNEYsCi0KLSAgICAvKiBSZWZlcmVuY2UgOiBPTVhfUUNPTV9WSURFT19DT05GSUdfUVAgKi8KLSAgICBPTVhfUWNvbUluZGV4Q29uZmlnUXAgPSAweDdGMDAwMDUwLAotCi0gICAgT01YX1Fjb21JbmRleFBhcmFtVmVuY0FzcGVjdFJhdGlvID0gMHg3RjAwMDA1MSwKLQotICAgIE9NWF9RVElJbmRleFBhcmFtVlFaaXBTRUlFeHRyYURhdGEgPSAweDdGMDAwMDUyLAotCi0gICAgLyogRW5hYmxlIFZRWklQIFNFSSBOQUwgdHlwZSAqLwotICAgIE9NWF9RVElJbmRleFBhcmFtVlFaSVBTRUlUeXBlID0gMHg3RjAwMDA1MywKLQotICAgIE9NWF9RVElJbmRleFBhcmFtUGFzc0lucHV0QnVmZmVyRmQgPSAweDdGMDAwMDU0LAotCi0gICAgLyogU2V0IFByZWZlci1hZGFwdGl2ZSBwbGF5YmFjayovCi0gICAgLyogIk9NWC5RVEkuaW5kZXgucGFyYW0udmlkZW8uUHJlZmVyQWRhcHRpdmVQbGF5YmFjayIgKi8KLSAgICBPTVhfUVRJSW5kZXhQYXJhbVZpZGVvUHJlZmVyQWRhcHRpdmVQbGF5YmFjayA9IDB4N0YwMDAwNTUsCi0KLSAgICAvKiBTZXQgdGltZSBwYXJhbXMgKi8KLSAgICBPTVhfUVRJSW5kZXhDb25maWdTZXRUaW1lRGF0YSA9IDB4N0YwMDAwNTYsCi0gICAgLyogRm9yY2UgQ29tcHJlc3NlZCBmb3JtYXQgZm9yIERQQiB3aGVuIHJlc29sdXRpb24gPD0xMDgwcAotICAgICAqIGFuZCBPUEIgaXMgY3B1X2FjY2VzcyAqLwotICAgIC8qIE9NWC5RVEkuaW5kZXgucGFyYW0udmlkZW8uRm9yY2VDb21wcmVzc2VkRm9yRFBCICovCi0gICAgT01YX1FUSUluZGV4UGFyYW1Gb3JjZUNvbXByZXNzZWRGb3JEUEIgPSAweDdGMDAwMDU3LAotCi0gICAgLyogRW5hYmxlIFJPSSBpbmZvICovCi0gICAgT01YX1FUSUluZGV4UGFyYW1WaWRlb0VuYWJsZVJvaUluZm8gPSAweDdGMDAwMDU4LAotCi0gICAgLyogQ29uZmlndXJlIFJPSSBpbmZvICovCi0gICAgT01YX1FUSUluZGV4Q29uZmlnVmlkZW9Sb2lJbmZvID0gMHg3RjAwMDA1OSwKLQotICAgIC8qIFNldCBMb3cgTGF0ZW5jeSBNb2RlICovCi0gICAgT01YX1FUSUluZGV4UGFyYW1Mb3dMYXRlbmN5TW9kZSA9IDB4N0YwMDAwNUIsCi0KLSAgICAvKiBGb3JjZSBPUEIgdG8gVW5Db21wcmVzc2VkIG1vZGUgKi8KLSAgICBPTVhfUVRJSW5kZXhQYXJhbUZvcmNlVW5Db21wcmVzc2VkRm9yT1BCID0gMHg3RjAwMDA1QywKLQotICAgIC8qIE9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5hbGxvY2F0ZU5hdGl2ZUhhbmRsZSAqLwotICAgIE9NWF9Hb29nbGVBbmRyb2lkSW5kZXhBbGxvY2F0ZU5hdGl2ZUhhbmRsZSA9IDB4N0YwMDAwNUQsCi0KLSAgICAvKiBDb25maWd1cmUgQkxVUiByZXNvbHV0aW9uIGZvciBlbmNvZGUgKi8KLSAgICBPTVhfUVRJSW5kZXhDb25maWdWaWRlb0JsdXJSZXNvbHV0aW9uID0gMHg3RjAwMDA1RSwKLQotICAgIC8qIFFQIHJhbmdlIGZvciBJL1AvQiBmcmFtZXMgOiBPTVhfUUNPTV9WSURFT19QQVJBTV9JUEJfUVBSQU5HRVRZUEUgKi8KLSAgICBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0lQQlFQUmFuZ2UgPSAweDdGMDAwMDVGLAotCi0gICAgLyogRW5hYmxlIGNsaWVudCBleHRyYWRhdGEgKi8KLSAgICBPTVhfUVRJSW5kZXhQYXJhbVZpZGVvQ2xpZW50RXh0cmFkYXRhID0gMHg3RjAwMDA2MCwKLQotICAgIC8qIEgyNjQgdHJhbnNmb3JtIDh4OCBtb2RlICovCi0gICAgT01YX1Fjb21JbmRleENvbmZpZ0gyNjRUcmFuc2Zvcm04eDggPSAweDdGMDAwMDYxLAotCi0gICAgLyoiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlQ29sb3JBc3BlY3RzIiovCi0gICAgT01YX1FUSUluZGV4Q29uZmlnRGVzY3JpYmVDb2xvckFzcGVjdHMgPSAweDdGMDAwMDYyLAotCi0gICAgT01YX1FUSUluZGV4UGFyYW1WVUlFeHRyYURhdGFFeHRyYURhdGEgPSAweDdGMDAwMDYzLAotCi0gICAgT01YX1FUSUluZGV4UGFyYW1NUEVHMlNlcURpc3BFeHRyYURhdGEgPSAweDdGMDAwMDY0LAotCi0gICAgT01YX1FUSUluZGV4UGFyYW1WQzFTZXFEaXNwRXh0cmFEYXRhID0gMHg3RjAwMDA2NSwKLQotICAgIE9NWF9RVElJbmRleFBhcmFtVlBYQ29sb3JTcGFjZUV4dHJhRGF0YSA9IDB4N0YwMDAwNjYsCi0KLSAgICAvKiJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFJTdGF0aWNJbmZvIiovCi0gICAgT01YX1FUSUluZGV4Q29uZmlnRGVzY3JpYmVIRFJDb2xvckluZm8gPSAweDdGMDAwMDY3LAotCi0gICAgLyogQ29uZmlndXJlIHRvIGRpc2FibGUgUFEqLwotICAgIE9NWF9RVElJbmRleFBhcmFtRGlzYWJsZVBRID0gMHg3RjAwMDA2OCwKLQotICAgIC8qIERpdGhlciBjb250cm9sIGZvciAxMGJpdCAqLwotICAgIE9NWF9RVElJbmRleFBhcmFtRGl0aGVyQ29udHJvbCA9IDB4N0YwMDAwNjksCi0KLSAgICAvKiBTdWdnZXN0IGhvdyBiaWcgSWZyYW1lIHNpemVzIHNob3VsZCBiZSAqLwotICAgIE9NWF9RVElJbmRleFBhcmFtSWZyYW1lU2l6ZVR5cGUgPSAweDdGMDAwMDcwLAotCi0gICAgLyogdXNlIGF2LXRpbWVyIHRpY2tzIGFzIHRpbWVzdGFtcCAodXNlZCBieSBWVC1jbGllbnQpICovCi0gICAgT01YX1FUSUluZGV4UGFyYW1FbmFibGVBVlRpbWVyVGltZXN0YW1wcyA9IDB4N0YwMDAwNzEsCi0KLSAgICAvKiBPdXRwdXQgQ3JvcCBleHRyYWRhdGEgKGluY2x1ZGVzIE1JU1IpICovCi0gICAgT01YX1Fjb21JbmRleFBhcmFtT3V0cHV0Q3JvcEV4dHJhRGF0YSA9IDB4N0YwMDAwNzIsCi19OwotCi0vKioKLSogVGhpcyBpcyBjdXN0b20gZXh0ZW5zaW9uIHRvIGNvbmZpZ3VyZSBMb3cgTGF0ZW5jeSBNb2RlLgotKgotKiBTVFJVQ1QgTUVNQkVSUwotKgotKiBuU2l6ZSAgICAgICAgIDogU2l6ZSBvZiBTdHJ1Y3R1cmUgaW4gYnl0ZXMKLSogblZlcnNpb24gICAgICA6IE9wZW5NQVggSUwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0qIGJFbmFibGVMb3dMYXRlbmN5TW9kZSAgIDogRW5hYmxlL0Rpc2FibGUgTG93IExhdGVuY3kgbW9kZQotKiBuTnVtRnJhbWVzICAgIDogTGF0ZW5jeSBpbiB0ZXJtcyBvZiBudW0gb2YgZnJhbWVzCi0qICAgICAgICAgICAgICAgICAwOiBNaW5pbXVtIHBvc3NpYmxlIGxhdGVuY3ksCi0qICAgICAgICAgICAgICAgICBuOiBuLWZyYW1lIGxhdGVuY3kKLSogICAgICAgICAgICAgICAgIFZhbGlkIHdoZW4gYkVuYWJsZUxvd0xhdGVuY3lNb2RlIGlzIFRSVUUKLSovCi0KLXR5cGVkZWYgc3RydWN0IFFPTVhfRVhUTklOREVYX1ZJREVPX0xPV19MQVRFTkNZX01PREUKLXsKLSAgIE9NWF9VMzIgblNpemU7Ci0gICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICBPTVhfQk9PTCBiRW5hYmxlTG93TGF0ZW5jeU1vZGU7Ci0gICBPTVhfVTMyICBuTnVtRnJhbWVzOwotfSBRT01YX0VYVE5JTkRFWF9WSURFT19MT1dfTEFURU5DWV9NT0RFOwotCi0vKioKLSogVGhpcyBpcyBjdXN0b20gZXh0ZW5zaW9uIHRvIGNvbmZpZ3VyZSBMb3cgTGF0ZW5jeSBNb2RlLgotKiBOb3RlOiBUaGlzIHN0cnVjdCB3aWxsIGdldCBkZXByZWNhdGVkLgotKgotKiBTVFJVQ1QgTUVNQkVSUwotKgotKiBuU2l6ZSAgICAgICAgIDogU2l6ZSBvZiBTdHJ1Y3R1cmUgaW4gYnl0ZXMKLSogblZlcnNpb24gICAgICA6IE9wZW5NQVggSUwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0qIGJMb3dMYXRlbmN5TW9kZSAgIDogRW5hYmxlL0Rpc2FibGUgTG93IExhdGVuY3kgbW9kZQotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9FWFROSU5ERVhfVklERU9fVkVOQ19MT1dfTEFURU5DWV9NT0RFCi17Ci0gICBPTVhfVTMyIG5TaXplOwotICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgT01YX0JPT0wgYkxvd0xhdGVuY3lNb2RlOwotfSBRT01YX0VYVE5JTkRFWF9WSURFT19WRU5DX0xPV19MQVRFTkNZX01PREU7Ci0KLS8qKgotKiBUaGlzIGlzIGN1c3RvbSBleHRlbnNpb24gdG8gY29uZmlndXJlIEVuY29kZXIgQXNwZWN0IFJhdGlvLgotKgotKiBTVFJVQ1QgTUVNQkVSUwotKgotKiBuU2l6ZSAgICAgICAgIDogU2l6ZSBvZiBTdHJ1Y3R1cmUgaW4gYnl0ZXMKLSogblZlcnNpb24gICAgICA6IE9wZW5NQVggSUwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0qIG5TQVJXaWR0aCAgICAgOiBIb3Jpem9udGFsIGFzcGVjdCBzaXplCi0qIG5TQVJIZWlnaHQgICAgOiBWZXJ0aWNhbCBhc3BlY3Qgc2l6ZQotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9FWFROSU5ERVhfVklERU9fVkVOQ19TQVIKLXsKLSAgIE9NWF9VMzIgblNpemU7Ci0gICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICBPTVhfVTMyIG5TQVJXaWR0aDsKLSAgIE9NWF9VMzIgblNBUkhlaWdodDsKLX0gUU9NWF9FWFROSU5ERVhfVklERU9fVkVOQ19TQVI7Ci0KLS8qKgotKiBUaGlzIGlzIGN1c3RvbSBleHRlbnNpb24gdG8gY29uZmlndXJlIEhpZXItcCBsYXllcnMuCi0qIFRoaXMgbW9kZSBjb25maWd1cmVzIEhpZXItcCBsYXllcnMgZHluYW1pY2FsbHkuCi0qCi0qIFNUUlVDVCBNRU1CRVJTCi0qCi0qIG5TaXplICAgICAgICAgOiBTaXplIG9mIFN0cnVjdHVyZSBpbiBieXRlcwotKiBuVmVyc2lvbiAgICAgIDogT3Blbk1BWCBJTCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSogbk51bUhpZXJMYXllcnM6IFNldCB0aGUgbnVtYmVyIG9mIEhpZXItcCBsYXllcnMgZm9yIHRoZSBzZXNzaW9uCi0qICAgICAgICAgICAgICAgICAgLSBUaGlzIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIE1BWCBIaWVyLVAKLSogICAgICAgICAgICAgICAgICAgIGxheWVycyBzZXQgZm9yIHRoZSBzZXNzaW9uLgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9FWFROSU5ERVhfVklERU9fSElFUl9QX0xBWUVSUyB7Ci0gICBPTVhfVTMyIG5TaXplOwotICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgT01YX1UzMiBuTnVtSGllckxheWVyczsKLX0gUU9NWF9FWFROSU5ERVhfVklERU9fSElFUl9QX0xBWUVSUzsKLQotCi0vKioKLSogVGhpcyBpcyBjdXN0b20gZXh0ZW5zaW9uIHRvIGNvbmZpZ3VyZSBIeWJyaWQgSGllci1wIHNldHRpbmdzLgotKiBUaGlzIG1vZGUgaXMgZGlmZmVyZW50IGZyb20gZW5hYmxpbmcgSGllci1wIG1vZGUuIFRoaXMKLSogcHJvcGVydHkgZW5hYmxlcyBIaWVyLXAgZW5jb2Rpbmcgd2l0aCBMVFIgcmVmZXJlbmNpbmcgaW4gZWFjaAotKiBzdWItR09QLgotKgotKiBTVFJVQ1QgTUVNQkVSUwotKgotKiBuU2l6ZSAgICAgICAgIDogU2l6ZSBvZiBTdHJ1Y3R1cmUgaW4gYnl0ZXMKLSogblZlcnNpb24gICAgICA6IE9wZW5NQVggSUwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0qIG5LZXlGcmFtZUludGVydmFsIDogSW5kaWNhdGVzIHRoZSBJIGZyYW1lIGludGVydmFsCi0qIG5IcExheWVycyAgICAgOiBTZXQgdGhlIG51bWJlciBvZiBIaWVyLXAgbGF5ZXJzIGZvciB0aGUgc2Vzc2lvbgotKiAgICAgICAgICAgICAgICAgIC0gVGhpcyBzaG91bGQgYmUgPD0gNi4gKDEgQmFzZSBsYXllciArCi0qICAgICAgICAgICAgICAgICAgICA1IEVuaGFuY2VtZW50IGxheWVycykKLSogblRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bT01YX1ZJREVPX01BWF9IUF9MQVlFUlNdIDogQml0cmF0ZSB0bwotKiAgICAgICAgICAgICAgICAgICAgYmUgc2V0IGZvciBlYWNoIGVuaGFuY2VtZW50IGxheWVyCi0qIG5NaW5RdWFudGl6ZXIgIDogbWluaW11bSBzZXNzaW9uIFFQCi0qIG5NYXhRdWFudGl6ZXIgIDogTWF4aW11biBzZXNzaW9uIFFQCi0qLwotCi10eXBlZGVmIHN0cnVjdCBRT01YX0VYVE5JTkRFWF9WSURFT19IWUJSSURfSFBfTU9ERSB7Ci0gICBPTVhfVTMyIG5TaXplOwotICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgT01YX1UzMiBuS2V5RnJhbWVJbnRlcnZhbDsKLSAgIE9NWF9VMzIgblRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bT01YX1ZJREVPX01BWF9IUF9MQVlFUlNdOwotICAgT01YX1UzMiBuTWluUXVhbnRpemVyOwotICAgT01YX1UzMiBuTWF4UXVhbnRpemVyOwotICAgT01YX1UzMiBuSHBMYXllcnM7Ci19IFFPTVhfRVhUTklOREVYX1ZJREVPX0hZQlJJRF9IUF9NT0RFOwotCi0vKioKLSAqIEluaXRpYWwgUVAgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbmFibGUKLSAqIHZlbmRvciBzcGVjaWZpYyBleHRlbnNpb24gdG8gbGV0IGNsaWVudCBlbmFibGUgc2V0dGluZwotICogaW5pdGlhbCBRUCB2YWx1ZXMgdG8gSSBQIEIgRnJhbWVzCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiBTdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPcGVuTUFYIElMIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICA6IEluZGV4IG9mIHRoZSBwb3J0IHRvIHdoaWNoIHRoaXMgc3RydWN0dXJlIGFwcGxpZXMKLSAqICBPTVhfVTMyIG5RcEkgICAgICAgOiBGaXJzdCBJZnJhbWUgUVAKLSAqICBPTVhfVTMyIG5RcFAgICAgICAgOiBGaXJzdCBQZnJhbWUgUVAKLSAqICBPTVhfVTMyIG5RcEIgICAgICAgOiBGaXJzdCBCZnJhbWUgUVAKLSAqICBPTVhfVTMyIGJFbmFibGVJbml0UXAgOiBCaXQgZmllbGQgaW5kaWNhdGluZyB3aGljaCBmcmFtZSB0eXBlKHMpIHNoYWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBRUC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMDogRW5hYmxlIGluaXRpYWwgUVAgZm9yIEkvSURSCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2UgdmFsdWUgc3BlY2lmaWVkIGluIG5Jbml0UXBJCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDE6IEVuYWJsZSBpbml0aWFsIFFQIGZvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlIHZhbHVlIHNwZWNpZmllZCBpbiBuSW5pdFFwUAotICogICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAyOiBFbmFibGUgaW5pdGlhbCBRUCBmb3IgQgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlIHZhbHVlIHNwZWNpZmllZCBpbiBuSW5pdFFwQgotICovCi10eXBlZGVmIHN0cnVjdCBRT01YX0VYVE5JTkRFWF9WSURFT19JTklUSUFMUVAgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5RcEk7Ci0gICAgT01YX1UzMiBuUXBQOwotICAgIE9NWF9VMzIgblFwQjsKLSAgICBPTVhfVTMyIGJFbmFibGVJbml0UXA7Ci19IFFPTVhfRVhUTklOREVYX1ZJREVPX0lOSVRJQUxRUDsKLQotLyoqCi0gKiBFeHRlbnNpb24gaW5kZXggcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbmFibGUKLSAqIHZlbmRvciBzcGVjaWZpYyBleHRlbnNpb24gb24gaW5wdXQvb3V0cHV0IHBvcnQgYW5kCi0gKiB0byBwYXNzIHRoZSByZXF1aXJlZCBmbGFncyBhbmQgZGF0YSwgaWYgYW55LgotICogVGhlIGZvcm1hdCBvZiBmbGFncyBhbmQgZGF0YSBiZWluZyBwYXNzZWQgaXMga25vd24gdG8KLSAqIHRoZSBjbGllbnQgYW5kIGNvbXBvbmVudCBhcHJpb3JpLgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICA6IFNpemUgb2YgU3RydWN0dXJlIHBsdXMgcERhdGEgc2l6ZQotICogIG5WZXJzaW9uICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICAgOiBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQKLSAqICBiRW5hYmxlICAgICAgICAgICAgOiBFeHRlbnNpb24gaW5kZXggZW5hYmxlICgxKSBvciBkaXNhYmxlICgwKQotICogIG5GbGFncyAgICAgICAgICAgICA6IEV4dGVuc2lvbiBpbmRleCBmbGFncywgaWYgYW55Ci0gKiAgbkRhdGFTaXplICAgICAgICAgIDogU2l6ZSBvZiB0aGUgZXh0ZW5zaW9uIGluZGV4IGRhdGEgdG8gZm9sbG93Ci0gKiAgcERhdGEgICAgICAgICAgICAgIDogRXh0ZW5zaW9uIGluZGV4IGRhdGEsIGlmIHByZXNlbnQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfRVhUTklOREVYX1BBUkFNVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJFbmFibGU7Ci0gICAgT01YX1UzMiBuRmxhZ3M7Ci0gICAgT01YX1UzMiBuRGF0YVNpemU7Ci0gICAgT01YX1BUUiBwRGF0YTsKLX0gUU9NWF9FWFROSU5ERVhfUEFSQU1UWVBFOwotCi0vKioKLSAqIFJhbmdlIGluZGV4IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW5hYmxlCi0gKiB2ZW5kb3Igc3BlY2lmaWMgZXh0ZW5zaW9uIG9uIGlucHV0L291dHB1dCBwb3J0IGFuZAotICogdG8gcGFzcyB0aGUgcmVxdWlyZWQgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIFN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICA6IE9wZW5NQVggSUwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgIDogSW5kZXggb2YgdGhlIHBvcnQgdG8gd2hpY2ggdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcwotICogIG5NaW4gICAgICAgICAgICAgICA6IE1pbmltdW0gdmFsdWUKLSAqICBuTWF4ICAgICAgICAgICAgICAgOiBNYXhpbXVtIHZhbHVlCi0gKiAgblN0ZVNpemUgICAgICAgICAgIDogU3RlcCBzaXplCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfRVhUTklOREVYX1JBTkdFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TMzIgbk1pbjsKLSAgICBPTVhfUzMyIG5NYXg7Ci0gICAgT01YX1MzMiBuU3RlcFNpemU7Ci19IFFPTVhfRVhUTklOREVYX1JBTkdFVFlQRTsKLQotLyoqCi0gKiAgIFNwZWNpZmllcyBMVFIgbW9kZSB0eXBlcy4KLSAqLwotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fTFRSTU9ERVRZUEUKLXsKLSAgICBRT01YX1ZJREVPX0xUUk1vZGVfRGlzYWJsZSAgICA9IDB4MCwgLyoqPCBMVFIgZW5jb2RpbmcgaXMgZGlzYWJsZWQgKi8KLSAgICBRT01YX1ZJREVPX0xUUk1vZGVfTWFudWFsICAgICA9IDB4MSwgLyoqPCBJbiB0aGlzIG1vZGUsIElMIGNsaWVudCBjb25maWd1cmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogIHRoZSBlbmNvZGVyIHRoZSBMVFIgY291bnQgYW5kIG1hbnVhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogIGNvbnRyb2xzIHRoZSBtYXJraW5nIGFuZCB1c2Ugb2YgTFRSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogIGZyYW1lcyBkdXJpbmcgdmlkZW8gZW5jb2RpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBRT01YX1ZJREVPX0xUUk1vZGVfQXV0byAgICAgICA9IDB4MiwgLyoqPCBJbiB0aGlzIG1vZGUsIElMIGNsaWVudCBjb25maWd1cmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogIHRoZSBlbmNvZGVyIHRoZSBMVFIgY291bnQgYW5kIExUUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqICBwZXJpb2QuIFRoZSBlbmNvZGVyIG1hcmtzIExUUiBmcmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiAgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgTFRSIHBlcmlvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqICBkdXJpbmcgdmlkZW8gZW5jb2RpbmcuIElMIGNsaWVudCBjb250cm9scwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqICB0aGUgdXNlIG9mIExUUiBmcmFtZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBRT01YX1ZJREVPX0xUUk1vZGVfTUFYICAgID0gMHg3RkZGRkZGRiAvKiogTWF4aW11bSBMVFIgTW9kZSB0eXBlICovCi19IFFPTVhfVklERU9fTFRSTU9ERVRZUEU7Ci0KLS8qKgotICogTFRSIG1vZGUgaW5kZXggcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZAotICogdG8gZW5hYmxlIHZlbmRvciBzcGVjaWZpYyBleHRlbnNpb24gb24gb3V0cHV0IHBvcnQKLSAqIHRvIHBhc3MgdGhlIExUUiBtb2RlIGluZm9ybWF0aW9uLgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICA6IFNpemUgb2YgU3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgIDogT3Blbk1BWCBJTCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICAgOiBJbmRleCBvZiB0aGUgcG9ydCB0byB3aGljaCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzCi0gKiAgZUxUUk1vZGUgICAgICAgICAgIDogU3BlY2lmaWVzIHRoZSBMVFIgbW9kZSB1c2VkIGluIGVuY29kZXIKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9WSURFT19QQVJBTV9MVFJNT0RFX1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBRT01YX1ZJREVPX0xUUk1PREVUWVBFIGVMVFJNb2RlOwotfSBRT01YX1ZJREVPX1BBUkFNX0xUUk1PREVfVFlQRTsKLQotLyoqCi0gKiBMVFIgY291bnQgaW5kZXggcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZAotICogdG8gZW5hYmxlIHZlbmRvciBzcGVjaWZpYyBleHRlbnNpb24gb24gb3V0cHV0IHBvcnQKLSAqIHRvIHBhc3MgdGhlIExUUiBjb3VudCBpbmZvcm1hdGlvbi4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIFN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICA6IE9wZW5NQVggSUwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgIDogSW5kZXggb2YgdGhlIHBvcnQgdG8gd2hpY2ggdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcwotICogIG5Db3VudCAgICAgICAgICAgICA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIExUUiBmcmFtZXMgc3RvcmVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgY29tcG9uZW50Ci0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fUEFSQU1fTFRSQ09VTlRfVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkNvdW50OwotfSBRT01YX1ZJREVPX1BBUkFNX0xUUkNPVU5UX1RZUEU7Ci0KLQotLyoqCi0gKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggT01YX1Fjb21JbmRleFBhcmFtVmlkZW9MVFJDb3VudCBleHRlbnNpb24uCi0gKi8KLXR5cGVkZWYgUU9NWF9WSURFT19QQVJBTV9MVFJDT1VOVF9UWVBFIE9NWF9RQ09NX1ZJREVPX1BBUkFNX0xUUkNPVU5UX1RZUEU7Ci0KLS8qKgotICogTFRSIHBlcmlvZCBpbmRleCBwYXJhbWV0ZXIuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkCi0gKiB0byBlbmFibGUgdmVuZG9yIHNwZWNpZmljIGV4dGVuc2lvbiBvbiBvdXRwdXQgcG9ydAotICogdG8gcGFzcyB0aGUgTFRSIHBlcmlvZCBpbmZvcm1hdGlvbi4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIFN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICA6IE9wZW5NQVggSUwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgIDogSW5kZXggb2YgdGhlIHBvcnQgdG8gd2hpY2ggdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcwotICogIG5GcmFtZXMgICAgICAgICAgICA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZQotICogICAgICAgICAgICAgICAgICAgICAgIExUUiBmcmFtZXMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fQ09ORklHX0xUUlBFUklPRF9UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuRnJhbWVzOwotfSBRT01YX1ZJREVPX0NPTkZJR19MVFJQRVJJT0RfVFlQRTsKLQotLyoqCi0gKiBNYXJrcyB0aGUgbmV4dCBlbmNvZGVkIGZyYW1lIGFzIGFuIExUUiBmcmFtZS4KLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICA6IFNpemUgb2YgU3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgIDogT3Blbk1BWCBJTCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICAgOiBJbmRleCBvZiB0aGUgcG9ydCB0byB3aGljaCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzCi0gKiAgbklEICAgICAgICAgICAgICAgIDogU3BlY2lmaWVzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBMVFIgZnJhbWUgdG8gYmUgbWFya2VkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgYXMgcmVmZXJlbmNlIGZyYW1lIGZvciBlbmNvZGluZyBzdWJzZXF1ZW50IGZyYW1lcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9WSURFT19DT05GSUdfTFRSTUFSS19UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuSUQ7Ci19IFFPTVhfVklERU9fQ09ORklHX0xUUk1BUktfVFlQRTsKLQotLyoqCi0gKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggT01YX1Fjb21JbmRleENvbmZpZ1ZpZGVvTFRSTWFyayBleHRlbnNpb24uCi0gKi8KLXR5cGVkZWYgUU9NWF9WSURFT19DT05GSUdfTFRSTUFSS19UWVBFIE9NWF9RQ09NX1ZJREVPX0NPTkZJR19MVFJNQVJLX1RZUEU7Ci0KLS8qKgotICogU3BlY2lmaWVzIGFuIExUUiBmcmFtZSB0byBlbmNvZGUgc3Vic2VxdWVudCBmcmFtZXMuCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIFN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICA6IE9wZW5NQVggSUwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgIDogSW5kZXggb2YgdGhlIHBvcnQgdG8gd2hpY2ggdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcwotICogIG5JRCAgICAgICAgICAgICAgICA6IFNwZWNpZmllcyB0aGUgaWRlbnRpZmllciBvZiB0aGUgTFRSIGZyYW1lIHRvIGJlIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcyByZWZlcmVuY2UgZnJhbWUgZm9yIGVuY29kaW5nIHN1YnNlcXVlbnQgZnJhbWVzLgotICogIG5GcmFtZXMgICAgICAgICAgICA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN1YnNlcXVlbnQgZnJhbWVzIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCB1c2luZyB0aGUgTFRSIGZyYW1lIHdpdGggaXRzIGlkZW50aWZpZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICBuSUQgYXMgcmVmZXJlbmNlIGZyYW1lLiBTaG9ydC10ZXJtIHJlZmVyZW5jZSBmcmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgdGhlcmVhZnRlci4gVGhlIHZhbHVlIG9mIDB4RkZGRkZGRkYKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhhdCBhbGwgc3Vic2VxdWVudCBmcmFtZXMgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWR1c2luZyB0aGlzIExUUiBmcmFtZSBhcyByZWZlcmVuY2UgZnJhbWUuCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fQ09ORklHX0xUUlVTRV9UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuSUQ7Ci0gICAgT01YX1UzMiBuRnJhbWVzOwotfSBRT01YX1ZJREVPX0NPTkZJR19MVFJVU0VfVFlQRTsKLQotLyoqCi0gKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggT01YX1Fjb21JbmRleENvbmZpZ1ZpZGVvTFRSVXNlIGV4dGVuc2lvbi4KLSAqLwotdHlwZWRlZiBRT01YX1ZJREVPX0NPTkZJR19MVFJVU0VfVFlQRSBPTVhfUUNPTV9WSURFT19DT05GSUdfTFRSVVNFX1RZUEU7Ci0KLS8qKgotICogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgdGhlIHZpZGVvIGVuY29kZXIgbW9kZXMKLSAqCi0gKiBFTlVNUzoKLSAqICBFbmNvZGVyTW9kZURlZmF1bHQgOiBEZWZhdWx0IHZpZGVvIHJlY29yZGluZyBtb2RlLgotICogICAgICAgICAgICAgICAgICAgICAgIEFsbCBlbmNvZGVyIHNldHRpbmdzIG1hZGUgdGhyb3VnaAotICogICAgICAgICAgICAgICAgICAgICAgIE9NWF9TZXRQYXJhbWV0ZXIvT01YX1NldENvbmZpZyBhcmUgYXBwbGllZC4gTm8KLSAqICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgb3ZlcnJpZGRlbi4KLSAqICBFbmNvZGVyTW9kZU1NUyA6IFZpZGVvIHJlY29yZGluZyBtb2RlIGZvciBNTVMgKE11bHRpbWVkaWEgTWVzc2FnaW5nCi0gKiAgICAgICAgICAgICAgICAgICBTZXJ2aWNlKS4gVGhpcyBtb2RlIGlzIHNpbWlsYXIgdG8gRW5jb2Rlck1vZGVEZWZhdWx0Ci0gKiAgICAgICAgICAgICAgICAgICBleGNlcHQgdGhhdCBoZXJlIHRoZSBSYXRlIGNvbnRyb2wgbW9kZSBpcyBvdmVycmlkZGVuCi0gKiAgICAgICAgICAgICAgICAgICBpbnRlcm5hbGx5IGFuZCBzZXQgYXMgYSB2YXJpYW50IG9mIHZhcmlhYmxlIGJpdHJhdGUgd2l0aAotICogICAgICAgICAgICAgICAgICAgdmFyaWFibGUgZnJhbWUgcmF0ZS4gQWZ0ZXIgdGhpcyBtb2RlIGlzIHNldCBpZiB0aGUgSUwKLSAqICAgICAgICAgICAgICAgICAgIGNsaWVudCB0cmllcyB0byBzZXQgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSB2aWEKLSAqICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlIHRoYXQgd291bGQgYmUgcmVqZWN0ZWQuIEZvcgotICogICAgICAgICAgICAgICAgICAgdGhpcywgY2xpZW50IHNob3VsZCBzZXQgbW9kZSBiYWNrIHRvIEVuY29kZXJNb2RlRGVmYXVsdAotICogICAgICAgICAgICAgICAgICAgZmlyc3QgYW5kIHRoZW4gY2hhbmdlIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUuCi0gKi8KLXR5cGVkZWYgZW51bSBRT01YX1ZJREVPX0VOQ09ERVJNT0RFVFlQRQotewotICAgIFFPTVhfVklERU9fRW5jb2Rlck1vZGVEZWZhdWx0ICAgICAgICA9IDB4MDAsCi0gICAgUU9NWF9WSURFT19FbmNvZGVyTW9kZU1NUyAgICAgICAgICAgID0gMHgwMSwKLSAgICBRT01YX1ZJREVPX0VuY29kZXJNb2RlTWF4ICAgICAgICAgICAgPSAweDdGRkZGRkZGCi19IFFPTVhfVklERU9fRU5DT0RFUk1PREVUWVBFOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc2V0IHRoZSB2aWRlbyBlbmNvZGVyIG1vZGUuCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuTW9kZSA6IGRlZmluZXMgdGhlIHZpZGVvIGVuY29kZXIgbW9kZQotICovCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX1BBUkFNX0VOQ09ERVJNT0RFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIFFPTVhfVklERU9fRU5DT0RFUk1PREVUWVBFIG5Nb2RlOwotfSBRT01YX1ZJREVPX1BBUkFNX0VOQ09ERVJNT0RFVFlQRTsKLQotLyoqCi0gKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZyB0byB0aGUKLSAqIFFPTVhfVklERU9fU1lOVEFYSERSVFlQRSBleHRlbnNpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBxdWVyaWVkCi0gKiBkdXJpbmcgdGhlIGxvYWRlZCBzdGF0ZS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX1NZTlRBWEhEUlRZUEUKLXsKLSAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAvKiogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247LyoqIE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAvKiogUG9ydGluZGV4IHdoaWNoIGlzIGV4dGVuZGVkIGJ5IHRoaXMgc3RydWN0dXJlICovCi0gICBPTVhfVTMyIG5CeXRlczsgICAgICAgICAgLyoqIFRoZSBudW1iZXIgb2YgYnl0ZXMgZmlsbGVkIGluIHRvIHRoZSBidWZmZXIgKi8KLSAgIE9NWF9VOCBkYXRhWzFdOyAgICAgICAgICAvKiogQnVmZmVyIHRvIHN0b3JlIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLX0gUU9NWF9WSURFT19TWU5UQVhIRFJUWVBFOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHRoZQotICogUU9NWF9WSURFT19URU1QT1JBTFNQQVRJQUxUWVBFIGV4dGVuc2lvbi4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldAotICogZHluYW1pY2FsbHkgZHVyaW5nIGFueSBzdGF0ZSBleGNlcHQgdGhlIHN0YXRlIGludmFsaWQuICBUaGlzIGlzIHByaW1hcmlseQotICogdXNlZCBmb3Igc2V0dGluZyBNYXhRUCBmcm9tIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgaXMgc2V0IG9uIHRoZSBvdXQgcG9ydC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX1RFTVBPUkFMU1BBVElBTFRZUEUKLXsKLSAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAvKiogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247LyoqIE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAvKiogUG9ydGluZGV4IHdoaWNoIGlzIGV4dGVuZGVkIGJ5IHRoaXMgc3RydWN0dXJlICovCi0gICBPTVhfVTMyIG5UU0ZhY3RvcjsgICAgICAgLyoqIFRlbW9yYWwgc3BhdGlhbCB0cmFkZW9mZiBmYWN0b3IgdmFsdWUgaW4gMC0xMDAgKi8KLX0gUU9NWF9WSURFT19URU1QT1JBTFNQQVRJQUxUWVBFOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHRoZQotICogT01YX1FDT01fVklERU9fQ09ORklHX0lOVFJBUEVSSU9EVFlQRSBleHRlbnNpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQKLSAqIGR5bmFtaWNhbGx5IGR1cmluZyBhbnkgc3RhdGUgZXhjZXB0IHRoZSBzdGF0ZSBpbnZhbGlkLiAgVGhpcyBpcyBzZXQgb24gdGhlIG91dCBwb3J0LgotICovCi0KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fSU5UUkFQRVJJT0RUWVBFCi17Ci0gICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgLyoqIFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOy8qKiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgLyoqIFBvcnRpbmRleCB3aGljaCBpcyBleHRlbmRlZCBieSB0aGlzIHN0cnVjdHVyZSAqLwotICAgT01YX1UzMiBuSURSUGVyaW9kOyAgICAgIC8qKiBUaGlzIHNwZWNpZmllcyBjb2RpbmcgYSBmcmFtZSBhcyBJRFIgYWZ0ZXIgZXZlcnkgblBGcmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgaW50cmEgZnJhbWVzLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gMCwgb25seSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgZnJhbWUgb2YgdGhlIGVuY29kZSBzZXNzaW9uIGlzIGFuIElEUiBmcmFtZS4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpcyBpZ25vcmVkIGZvciBub24tQVZDIGNvZGVjcyBhbmQgaXMgdXNlZCBvbmx5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MgdGhhdCBzdXBwb3J0IElEUiBQZXJpb2QgKi8KLSAgIE9NWF9VMzIgblBGcmFtZXM7ICAgICAgICAgLyoqIFRoZSBudW1iZXIgb2YgIlAiIGZyYW1lcyBiZXR3ZWVuIHR3byAiSSIgZnJhbWVzICovCi0gICBPTVhfVTMyIG5CRnJhbWVzOyAgICAgICAgIC8qKiBUaGUgbnVtYmVyIG9mICJCIiBmcmFtZXMgYmV0d2VlbiB0d28gIkkiIGZyYW1lcyAqLwotfSBRT01YX1ZJREVPX0lOVFJBUEVSSU9EVFlQRTsKLQotLyoqCi0gKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZyB0byB0aGUKLSAqIE9NWF9RQ09NX1ZJREVPX0NPTkZJR19VTEJVRkZFUk9DQ1VQQU5DWVRZUEUgZXh0ZW5zaW9uLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0Ci0gKiBkeW5hbWljYWxseSBkdXJpbmcgYW55IHN0YXRlIGV4Y2VwdCB0aGUgc3RhdGUgaW52YWxpZC4gVGhpcyBpcyB1c2VkIGZvciB0aGUgYnVmZmVyIG5lZ290aWF0aW9uCi0gKiB3aXRoIG90aGVyIGNsaWVudHMuICBUaGlzIGlzIHNldCBvbiB0aGUgb3V0IHBvcnQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX1ZJREVPX0NPTkZJR19VTEJVRkZFUk9DQ1VQQU5DWVRZUEUKLXsKLSAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqIFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKiogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKiogUG9ydGluZGV4IHdoaWNoIGlzIGV4dGVuZGVkIGJ5IHRoaXMgc3RydWN0dXJlICovCi0gICBPTVhfVTMyIG5CdWZmZXJPY2N1cGFuY3k7IC8qKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHNldCBmb3IgdGhlIGJ1ZmZlciBvY2N1cGFuY3kgKi8KLX0gT01YX1FDT01fVklERU9fQ09ORklHX1VMQlVGRkVST0NDVVBBTkNZVFlQRTsKLQotLyoqCi0gKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZyB0byB0aGUKLSAqIE9NWF9RQ09NX1ZJREVPX0NPTkZJR19SQU5ET01JTlRSQVJFRlJFU0hUWVBFIGV4dGVuc2lvbi4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldAotICogZHluYW1pY2FsbHkgZHVyaW5nIGFueSBzdGF0ZSBleGNlcHQgdGhlIHN0YXRlIGludmFsaWQuIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIHRoZSBkeW5hbWljL3JhbmRvbQotICogaW50cmFyZWZyZXNoLiAgVGhpcyBpcyBzZXQgb24gdGhlIG91dCBwb3J0LgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9WSURFT19DT05GSUdfUkFORE9NSU5UUkFSRUZSRVNIVFlQRQotewotICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgIC8qKiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsvKiogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgIC8qKiBQb3J0aW5kZXggd2hpY2ggaXMgZXh0ZW5kZWQgYnkgdGhpcyBzdHJ1Y3R1cmUgKi8KLSAgIE9NWF9VMzIgblJpck1CczsgICAgICAgICAvKiogVGhlIG51bWJlciBvZiBNQnMgdG8gYmUgc2V0IGZvciBpbnRyYXJlZnJlc2ggKi8KLX0gT01YX1FDT01fVklERU9fQ09ORklHX1JBTkRPTUlOVFJBUkVGUkVTSFRZUEU7Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUKLSAqIE9NWF9RY29tSW5kZXhQYXJhbUFVRGVsaW1pdGVyIGV4dGVuc2lvbi4gSXQgZW5hYmxlcy9kaXNhYmxlcwotICogdGhlIEFVIGRlbGltaXRlcnMgaW4gSDI2NC9IRVZDIHN0cmVhbS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1FDT01fVklERU9fQ09ORklHX0FVRAotewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAvKiogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOy8qKiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgIC8qKiBFbmFibGUvZGlzYWJsZSB0aGUgc2V0dGluZyAqLwotfSBPTVhfUUNPTV9WSURFT19DT05GSUdfQVVEOwotCi0jZGVmaW5lIFFPTVhfVklERU9fSElHSF9QRVJGX09QRVJBVElOR19NT0RFICAgIChVSU5UX01BWCA8PCAxNikKLQotLyoqCi0gKiBOb3RlOiBUaGlzIHdpbGwgZ2V0IGRlcHJlY2F0ZWQKLSAqLwotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fUEVSRl9MRVZFTAotewotICAgIE9NWF9RQ09NX1BlcmZMZXZlbE5vbWluYWwsCi0gICAgT01YX1FDT01fUGVyZkxldmVsVHVyYm8KLX0gUU9NWF9WSURFT19QRVJGX0xFVkVMOwotCi0vKioKLSAgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZwotICAqIHRvIE9NWF9RY29tSW5kZXhQYXJhbVBlcmZMZXZlbCBleHRlbnNpb24uIEl0IHdpbGwgc2V0Ci0gICogdGhlIHBlcmZvcm1hbmNlIG1vZGUgc3BlY2lmaWVkIGFzIFFPTVhfVklERU9fUEVSRl9MRVZFTC4KLSAgKiBOb3RlOiBUaGlzIHdpbGwgZ2V0IGRlcHJlY2F0ZWQKLSAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX1ZJREVPX1BBUkFNX1BFUkZfTEVWRUwgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgIC8qKiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAvKiogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIFFPTVhfVklERU9fUEVSRl9MRVZFTCBlUGVyZkxldmVsOyAgIC8qKiBQZXJmb3JtYW5jZSBsZXZlbCAqLwotfSBPTVhfUUNPTV9WSURFT19QQVJBTV9QRVJGX0xFVkVMOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nCi0gKiB0byBPTVhfUWNvbUluZGV4Q29uZmlnUGVyZkxldmVsIGV4dGVuc2lvbi4gSXQgd2lsbCBzZXQKLSAqIHRoZSBwZXJmb3JtYW5jZSBtb2RlIHNwZWNpZmllZCBhcyBRT01YX1ZJREVPX1BFUkZfTEVWRUwuCi0gKiBOb3RlOiBUaGlzIHdpbGwgZ2V0IGRlcHJlY2F0ZWQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1FDT01fVklERU9fQ09ORklHX1BFUkZfTEVWRUwgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgIC8qKiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAvKiogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIFFPTVhfVklERU9fUEVSRl9MRVZFTCBlUGVyZkxldmVsOyAgIC8qKiBQZXJmb3JtYW5jZSBsZXZlbCAqLwotfSBPTVhfUUNPTV9WSURFT19DT05GSUdfUEVSRl9MRVZFTDsKLQotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fUElDVFVSRV9UWVBFX0RFQ09ERQotewotICAgIE9NWF9RQ09NX1BpY3R5cGVEZWNvZGVfSVBCLAotICAgIE9NWF9RQ09NX1BpY3R5cGVEZWNvZGVfSQotfSBRT01YX1ZJREVPX1BJQ1RVUkVfVFlQRV9ERUNPREU7Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBwYXJhbWV0ZXJzIGNvcnJlc3BvbmRpbmcKLSAqIHRvIE9NWF9RY29tSW5kZXhDb25maWdQaWN0dXJlVHlwZURlY29kZSBleHRlbnNpb24uIEl0Ci0gKiB3aWxsIHNldCB0aGUgcGljdHVyZSB0eXBlIGRlY29kZSBzcGVjaWZpZWQgYnkgZURlY29kZVR5cGUuCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX1ZJREVPX0NPTkZJR19QSUNUVVJFX1RZUEVfREVDT0RFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgICAgICAvKiogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgLyoqIE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBRT01YX1ZJREVPX1BJQ1RVUkVfVFlQRV9ERUNPREUgZURlY29kZVR5cGU7ICAgLyoqIERlY29kZSB0eXBlICovCi19IE9NWF9RQ09NX1ZJREVPX0NPTkZJR19QSUNUVVJFX1RZUEVfREVDT0RFOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nCi0gKiB0byBPTVhfUWNvbUluZGV4UGFyYW1IMjY0VlVJVGltaW5nSW5mbyBleHRlbnNpb24uIEl0Ci0gKiB3aWxsIGVuYWJsZS9kaXNhYmxlIHRoZSBWVUkgdGltaW5nIGluZm8uCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX1ZJREVPX1BBUkFNX1ZVSV9USU1JTkdfSU5GTyB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqIE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAgLyoqIEVuYWJsZS9kaXNhYmxlIHRoZSBzZXR0aW5nICovCi19IE9NWF9RQ09NX1ZJREVPX1BBUkFNX1ZVSV9USU1JTkdfSU5GTzsKLQotLyoqCi0gKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZwotICogdG8gT01YX1Fjb21JbmRleFBhcmFtVlFaSVBTRUlUeXBlIGV4dGVuc2lvbi4gSXQKLSAqIHdpbGwgZW5hYmxlL2Rpc2FibGUgdGhlIFZRWklQIFNFSSBpbmZvLgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUVRJX1ZJREVPX1BBUkFNX1ZRWklQX1NFSV9UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqIFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKiogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgICAvKiogRW5hYmxlL2Rpc2FibGUgdGhlIHNldHRpbmcgKi8KLX0gT01YX1FUSV9WSURFT19QQVJBTV9WUVpJUF9TRUlfVFlQRTsKLQotLyoqCi0gKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZwotICogdG8gT01YX1Fjb21JbmRleFBhcmFtUGVha0JpdHJhdGUgZXh0ZW5zaW9uLiBJdCB3aWxsCi0gKiBzZXQgdGhlIHBlYWsgYml0cmF0ZSBzcGVjaWZpZWQgYnkgblBlYWtCaXRyYXRlLgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9WSURFT19QQVJBTV9QRUFLX0JJVFJBVEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKiogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUGVha0JpdHJhdGU7ICAgICAgIC8qKiBQZWFrIGJpdHJhdGUgdmFsdWUgKi8KLX0gT01YX1FDT01fVklERU9fUEFSQU1fUEVBS19CSVRSQVRFOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nCi0gKiB0byBPTVhfUVRJSW5kZXhQYXJhbUZvcmNlQ29tcHJlc3NlZEZvckRQQiBleHRlbnNpb24uIEVuYWJsaW5nCi0gKiB0aGlzIGV4dGVuc2lvbiB3aWxsIGZvcmNlIHRoZSBzcGxpdCBtb2RlIERQQihjb21wcmVzc2VkKS9PUEIoTGluZWFyKQotICogZm9yIGFsbCByZXNvbHV0aW9ucy5PbiBzb21lIGNoaXBzZXRzIHByZWZlcnJlZCBtb2RlIHdvdWxkIGJlIGNvbWJpbmVkCi0gKiBMaW5lYXIgZm9yIGJvdGggRFBCL09QQiB0byBzYXZlIG1lbW9yeS4gRm9yIGV4YW1wbGUgb24gODk5NiBwcmVmZXJyZWQgbW9kZQotICogd291bGQgYmUgY29tYmluZWQgbGluZWFyIGZvciByZXNvbHV0aW9ucyA8PSAxMDgwcCAuCi0gKiBFbmFibGluZyB0aGlzIG1pZ2h0IHNhdmUgcG93ZXIgYnV0IHdpdGggdGhlIGNvc3QKLSAqIG9mIGluY3JlYXNlZCBtZW1vcnkgaS5lIGFsbW9zdCBkb3VibGUgdGhlIG51bWJlciBvbiBvdXRwdXQgWVVWIGJ1ZmZlcnMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9RVElfVklERU9fUEFSQU1fRk9SQ0VfQ09NUFJFU1NFRF9GT1JfRFBCX1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKiogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgIC8qKiBFbmFibGUvZGlzYWJsZSB0aGUgc2V0dGluZyAqLwotfSBPTVhfUVRJX1ZJREVPX1BBUkFNX0ZPUkNFX0NPTVBSRVNTRURfRk9SX0RQQl9UWVBFOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nCi0gKiB0byBPTVhfUVRJSW5kZXhQYXJhbUZvcmNlVW5Db21wcmVzc2VkRm9yT1BCIGV4dGVuc2lvbi4gRW5hYmxpbmcgdGhpcwotICogZXh0ZW5zaW9uIHdpbGwgZm9yY2UgdGhlIE9QQiB0byBiZSBsaW5lYXIgZm9yIHRoZSBjdXJyZW50IHZpZGVvIHNlc3Npb24uCi0gKiBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzZXQsIHRoZW4gdGhlIE9QQiB3aWxsIGJlIHNldCB0byBsaW5lYXIgb3IgY29tcHJlc3NlZAotICogYmFzZWQgb24gcmVzb2x1dGlvbiBzZWxlY3RlZCBhbmQvb3IgaWYgY3B1IGFjY2VzcyBpcyByZXF1ZXN0ZWQgb24gdGhlCi0gKiBPUEIgYnVmZmVyLgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUVRJX1ZJREVPX1BBUkFNX0ZPUkNFX1VOQ09NUFJFU1NFRF9GT1JfT1BCX1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKiogU2l6ZW8gZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgIC8qKiBFbmFibGUvZGlzYWJsZSB0aGUgc2V0dGluZyAqLwotfSBPTVhfUVRJX1ZJREVPX1BBUkFNX0ZPUkNFX1VOQ09NUFJFU1NFRF9GT1JfT1BCX1RZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9WRU5ET1JfRVhUUkFEQVRBVFlQRSAgewotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5EYXRhU2l6ZTsKLSAgICBPTVhfVTggICpwRGF0YTsgICAgIC8vIGNkYXRhIChjb2RlY19kYXRhL2V4dHJhZGF0YSkKLX0gT01YX1ZFTkRPUl9FWFRSQURBVEFUWVBFOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHRoZQotICogT01YX1ZFTkRPUl9WSURFT0ZSQU1FUkFURSBleHRlbnNpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQKLSAqIGR5bmFtaWNhbGx5IGR1cmluZyBhbnkgc3RhdGUgZXhjZXB0IHRoZSBzdGF0ZSBpbnZhbGlkLiBUaGlzIGlzCi0gKiB1c2VkIGZvciBmcmFtZSByYXRlIHRvIGJlIHNldCBmcm9tIHRoZSBhcHBsaWNhdGlvbi4gVGhpcwotICogaXMgc2V0IG9uIHRoZSBpbiBwb3J0LgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVkVORE9SX1ZJREVPRlJBTUVSQVRFICB7Ci0gICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgLyoqIFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOy8qKiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgLyoqIFBvcnRpbmRleCB3aGljaCBpcyBleHRlbmRlZCBieSB0aGlzIHN0cnVjdHVyZSAqLwotICAgT01YX1UzMiBuRnBzOyAgICAgICAgICAgIC8qKiBGcmFtZSByYXRlIHZhbHVlICovCi0gICBPTVhfQk9PTCBiRW5hYmxlZDsgICAgICAgLyoqIEZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgY2xpZW50J3MgZnJhbWUgcmF0ZSB2YWx1ZSAqLwotfSBPTVhfVkVORE9SX1ZJREVPRlJBTUVSQVRFOwotCi10eXBlZGVmIGVudW0gT01YX0lOREVYVkVORE9SVFlQRSB7Ci0gICAgT01YX0luZGV4VmVuZG9yRmlsZVJlYWRJbnB1dEZpbGVuYW1lID0gMHhGRjAwMDAwMSwKLSAgICBPTVhfSW5kZXhWZW5kb3JQYXJzZXIzZ3BJbnB1dEZpbGVuYW1lID0gMHhGRjAwMDAwMiwKLSAgICBPTVhfSW5kZXhWZW5kb3JWaWRlb0V4dHJhRGF0YSA9IDB4RkYwMDAwMDMsCi0gICAgT01YX0luZGV4VmVuZG9yQXVkaW9FeHRyYURhdGEgPSAweEZGMDAwMDA0LAotICAgIE9NWF9JbmRleFZlbmRvclZpZGVvRnJhbWVSYXRlID0gMHhGRjAwMDAwNSwKLX0gT01YX0lOREVYVkVORE9SVFlQRTsKLQotdHlwZWRlZiBlbnVtIE9NWF9RQ09NX1ZDMVJFU09MVVRJT05UWVBFCi17Ci0gICBPTVhfUUNPTV9WQzFfUElDVFVSRV9SRVNfMXgxLAotICAgT01YX1FDT01fVkMxX1BJQ1RVUkVfUkVTXzJ4MSwKLSAgIE9NWF9RQ09NX1ZDMV9QSUNUVVJFX1JFU18xeDIsCi0gICBPTVhfUUNPTV9WQzFfUElDVFVSRV9SRVNfMngyCi19IE9NWF9RQ09NX1ZDMVJFU09MVVRJT05UWVBFOwotCi10eXBlZGVmIGVudW0gT01YX1FDT01fSU5URVJMQUNFVFlQRQotewotICAgIE9NWF9RQ09NX0ludGVybGFjZUZyYW1lUHJvZ3Jlc3NpdmUsCi0gICAgT01YX1FDT01fSW50ZXJsYWNlSW50ZXJsZWF2ZUZyYW1lVG9wRmllbGRGaXJzdCwKLSAgICBPTVhfUUNPTV9JbnRlcmxhY2VJbnRlcmxlYXZlRnJhbWVCb3R0b21GaWVsZEZpcnN0LAotICAgIE9NWF9RQ09NX0ludGVybGFjZUZyYW1lVG9wRmllbGRGaXJzdCwKLSAgICBPTVhfUUNPTV9JbnRlcmxhY2VGcmFtZUJvdHRvbUZpZWxkRmlyc3QsCi0gICAgT01YX1FDT01fSW50ZXJsYWNlRmllbGRUb3AsCi0gICAgT01YX1FDT01fSW50ZXJsYWNlRmllbGRCb3R0b20KLX1PTVhfUUNPTV9JTlRFUkxBQ0VUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9QQVJBTV9WSURFT19JTlRFUkxBQ0VUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgIC8qKiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247LyoqIE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgIC8qKiBQb3J0aW5kZXggd2hpY2ggaXMgZXh0ZW5kZWQgYnkgdGhpcyBzdHJ1Y3R1cmUgKi8KLSAgICBPTVhfQk9PTCBiSW50ZXJsYWNlOyAgLyoqIEludGVybGFjZSBjb250ZW50ICoqLwotfU9NWF9RQ09NX1BBUkFNX1ZJREVPX0lOVEVSTEFDRVRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX0NPTkZJR19JTlRFUkxBQ0VUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkluZGV4OwotICAgIE9NWF9RQ09NX0lOVEVSTEFDRVRZUEUgZUludGVybGFjZVR5cGU7Ci19T01YX1FDT01fQ09ORklHX0lOVEVSTEFDRVRZUEU7Ci0KLSNkZWZpbmUgTUFYX1BBTl9TQ0FOX1dJTkRPV1MgNAotCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9NSVNSX0lORk8gewotICAgIE9NWF9VMzIgbWlzcl9kcGJfbHVtYTsKLSAgICBPTVhfVTMyIG1pc3JfZHBiX2Nocm9tYTsKLSAgICBPTVhfVTMyIG1pc3Jfb3BiX2x1bWE7Ci0gICAgT01YX1UzMiBtaXNyX29wYl9jaHJvbWE7Ci19IE9NWF9RQ09NX01JU1JfSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1FDT01fT1VUUFVUX0NST1AgewotICAgIE9NWF9VMzIgc2l6ZTsKLSAgICBPTVhfVTMyIHZlcnNpb247Ci0gICAgT01YX1UzMiBwb3J0X2luZGV4OwotICAgIE9NWF9VMzIgbGVmdDsKLSAgICBPTVhfVTMyIHRvcDsKLSAgICBPTVhfVTMyIGRpc3BsYXlfd2lkdGg7Ci0gICAgT01YX1UzMiBkaXNwbGF5X2hlaWdodDsKLSAgICBPTVhfVTMyIHdpZHRoOwotICAgIE9NWF9VMzIgaGVpZ2h0OwotICAgIE9NWF9VMzIgZnJhbWVfbnVtOwotICAgIE9NWF9VMzIgYml0X2RlcHRoX3k7Ci0gICAgT01YX1UzMiBiaXRfZGVwdGhfYzsKLSAgICBPTVhfUUNPTV9NSVNSX0lORk8gbWlzcl9pbmZvWzJdOwotfSBPTVhfUUNPTV9PVVRQVVRfQ1JPUDsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1FDT01fUEFOU0NBTgotewotICAgT01YX1UzMiBudW1XaW5kb3dzOwotICAgT01YX1FDT01SZWN0YW5nbGUgd2luZG93W01BWF9QQU5fU0NBTl9XSU5ET1dTXTsKLX0gT01YX1FDT01fUEFOU0NBTjsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1FDT01fQVNQRUNUX1JBVElPCi17Ci0gICBPTVhfVTMyIGFzcGVjdFJhdGlvWDsKLSAgIE9NWF9VMzIgYXNwZWN0UmF0aW9ZOwotfSBPTVhfUUNPTV9BU1BFQ1RfUkFUSU87Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX0RJU1BMQVlfQVNQRUNUX1JBVElPCi17Ci0gICBPTVhfVTMyIGRpc3BsYXlWZXJ0aWNhbFNpemU7Ci0gICBPTVhfVTMyIGRpc3BsYXlIb3Jpem9udGFsU2l6ZTsKLX0gT01YX1FDT01fRElTUExBWV9BU1BFQ1RfUkFUSU87Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX0ZSQU1FX1BBQ0tfQVJSQU5HRU1FTlQKLXsKLSAgT01YX1UzMiBuU2l6ZTsKLSAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gIE9NWF9VMzIgaWQ7Ci0gIE9NWF9VMzIgY2FuY2VsX2ZsYWc7Ci0gIE9NWF9VMzIgdHlwZTsKLSAgT01YX1UzMiBxdWluY3VueF9zYW1wbGluZ19mbGFnOwotICBPTVhfVTMyIGNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZTsKLSAgT01YX1UzMiBzcGF0aWFsX2ZsaXBwaW5nX2ZsYWc7Ci0gIE9NWF9VMzIgZnJhbWUwX2ZsaXBwZWRfZmxhZzsKLSAgT01YX1UzMiBmaWVsZF92aWV3c19mbGFnOwotICBPTVhfVTMyIGN1cnJlbnRfZnJhbWVfaXNfZnJhbWUwX2ZsYWc7Ci0gIE9NWF9VMzIgZnJhbWUwX3NlbGZfY29udGFpbmVkX2ZsYWc7Ci0gIE9NWF9VMzIgZnJhbWUxX3NlbGZfY29udGFpbmVkX2ZsYWc7Ci0gIE9NWF9VMzIgZnJhbWUwX2dyaWRfcG9zaXRpb25feDsKLSAgT01YX1UzMiBmcmFtZTBfZ3JpZF9wb3NpdGlvbl95OwotICBPTVhfVTMyIGZyYW1lMV9ncmlkX3Bvc2l0aW9uX3g7Ci0gIE9NWF9VMzIgZnJhbWUxX2dyaWRfcG9zaXRpb25feTsKLSAgT01YX1UzMiByZXNlcnZlZF9ieXRlOwotICBPTVhfVTMyIHJlcGV0aXRpb25fcGVyaW9kOwotICBPTVhfVTMyIGV4dGVuc2lvbl9mbGFnOwotfSBPTVhfUUNPTV9GUkFNRV9QQUNLX0FSUkFOR0VNRU5UOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9FWFRSQURBVEFfUVAKLXsKLSAgIE9NWF9VMzIgICAgICAgIG5RUDsKLX0gT01YX1FDT01fRVhUUkFEQVRBX1FQOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9FWFRSQURBVEFfQklUU19JTkZPCi17Ci0gICBPTVhfVTMyIGhlYWRlcl9iaXRzOwotICAgT01YX1UzMiBmcmFtZV9iaXRzOwotfSBPTVhfUUNPTV9FWFRSQURBVEFfQklUU19JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9FWFRSQURBVEFfVVNFUkRBVEEgewotICAgT01YX1UzMiB0eXBlOwotICAgT01YX1UzMiBkYXRhWzFdOwotfSBPTVhfUUNPTV9FWFRSQURBVEFfVVNFUkRBVEE7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX0VYVFJBREFUQV9GUkFNRUlORk8KLXsKLSAgIC8vIGNvbW1vbiBmcmFtZSBtZXRhIGRhdGEuIGludGVybGFjZSByZWxhdGVkIGluZm8gcmVtb3ZlZAotICAgT01YX1ZJREVPX1BJQ1RVUkVUWVBFICBlUGljVHlwZTsKLSAgIE9NWF9RQ09NX0lOVEVSTEFDRVRZUEUgaW50ZXJsYWNlVHlwZTsKLSAgIE9NWF9RQ09NX1BBTlNDQU4gICAgICAgcGFuU2NhbjsKLSAgIE9NWF9RQ09NX0FTUEVDVF9SQVRJTyAgYXNwZWN0UmF0aW87Ci0gICBPTVhfUUNPTV9ESVNQTEFZX0FTUEVDVF9SQVRJTyBkaXNwbGF5QXNwZWN0UmF0aW87Ci0gICBPTVhfVTMyICAgICAgICAgICAgICAgIG5Db25jZWFsZWRNYWNyb2Jsb2NrczsKLSAgIE9NWF9VMzIgICAgICAgICAgICAgICAgblJlY292ZXJ5U2VpRmxhZzsKLSAgIE9NWF9VMzIgICAgICAgICAgICAgICAgbkZyYW1lUmF0ZTsKLSAgIE9NWF9USUNLUyAgICAgICAgICAgICAgblRpbWVTdGFtcDsKLX0gT01YX1FDT01fRVhUUkFEQVRBX0ZSQU1FSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1FDT01fRVhUUkFEQVRBX0ZSQU1FRElNRU5TSU9OCi17Ci0gICAvKiogRnJhbWUgRGltZW5zaW9ucyBhZGRlZCB0byBlYWNoIFlVViBidWZmZXIgKi8KLSAgIE9NWF9VMzIgICBuRGVjV2lkdGg7ICAvKiogV2lkdGggIHJvdW5kZWQgdG8gbXVsdGlwbGUgb2YgMTYgKi8KLSAgIE9NWF9VMzIgICBuRGVjSGVpZ2h0OyAvKiogSGVpZ2h0IHJvdW5kZWQgdG8gbXVsdGlwbGUgb2YgMTYgKi8KLSAgIE9NWF9VMzIgICBuQWN0dWFsV2lkdGg7IC8qKiBBY3R1YWwgRnJhbWUgV2lkdGggKi8KLSAgIE9NWF9VMzIgICBuQWN0dWFsSGVpZ2h0OyAvKiogQWN0dWFsIEZyYW1lIEhlaWdodCAqLwotCi19IE9NWF9RQ09NX0VYVFJBREFUQV9GUkFNRURJTUVOU0lPTjsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1FDT01fSDI2NEVYVFJBREFUQQotewotICAgT01YX1U2NCBzZWlUaW1lU3RhbXA7Ci19IE9NWF9RQ09NX0gyNjRFWFRSQURBVEE7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX1ZDMUVYVFJBREFUQQotewotICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgIG5WQzFSYW5nZVk7Ci0gICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgblZDMVJhbmdlVVY7Ci0gICBPTVhfUUNPTV9WQzFSRVNPTFVUSU9OVFlQRSBlVkMxUGljUmVzb2x1dGlvbjsKLX0gT01YX1FDT01fVkMxRVhUUkFEQVRBOwotCi10eXBlZGVmIHVuaW9uIE9NWF9RQ09NX0VYVFJBREFUQV9DT0RFQ19EQVRBCi17Ci0gICBPTVhfUUNPTV9IMjY0RVhUUkFEQVRBIGgyNjRFeHRyYURhdGE7Ci0gICBPTVhfUUNPTV9WQzFFWFRSQURBVEEgdmMxRXh0cmFEYXRhOwotfSBPTVhfUUNPTV9FWFRSQURBVEFfQ09ERUNfREFUQTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1FDT01fRVhUUkFEQVRBX01CSU5GTwotewotICAgT01YX1UzMiBuRm9ybWF0OwotICAgT01YX1UzMiBuRGF0YVNpemU7Ci0gICBPTVhfVTggIGRhdGFbMF07Ci19IE9NWF9RQ09NX0VYVFJBREFUQV9NQklORk87Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9RQ09NX0VYVFJBREFUQV9WUVpJUFNFSSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVTggZGF0YVswXTsKLX0gT01YX1FDT01fRVhUUkFEQVRBX1ZRWklQU0VJOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUVRJX1ZJREVPX1BBUkFNX0VOQUJMRV9ST0lJTkZPIHsKLSAgICBPTVhfVTMyICAgICAgICAgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgICAgICAgICBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MICAgICAgICBiRW5hYmxlUm9pSW5mbzsKLX0gT01YX1FUSV9WSURFT19QQVJBTV9FTkFCTEVfUk9JSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1FUSV9WSURFT19DT05GSUdfUk9JSU5GTyB7Ci0gICAgT01YX1UzMiAgICAgICAgIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyICAgICAgICAgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyICAgICAgICAgblVwcGVyUXBPZmZzZXQ7Ci0gICAgT01YX1MzMiAgICAgICAgIG5Mb3dlclFwT2Zmc2V0OwotICAgIE9NWF9CT09MICAgICAgICBiVXNlUm9pSW5mbzsKLSAgICBPTVhfUzMyICAgICAgICAgblJvaU1CSW5mb1NpemU7Ci0gICAgT01YX1BUUiAgICAgICAgIHBSb2lNQkluZm87Ci19IE9NWF9RVElfVklERU9fQ09ORklHX1JPSUlORk87Ci0KLXR5cGVkZWYgZW51bSBPTVhfUVRJX1ZJREVPX0JMVVJfUkVTT0xVVElPTiB7Ci0gICAgQkxVUl9SRVNPTF9ESVNBQkxFRCA9IDAsCi0gICAgQkxVUl9SRVNPTF8yNDAgICAgICA9IDEsCi0gICAgQkxVUl9SRVNPTF80ODAgICAgICA9IDIsCi0gICAgQkxVUl9SRVNPTF83MjAgICAgICA9IDMsCi0gICAgQkxVUl9SRVNPTF8xMDgwICAgICA9IDQsCi19IE9NWF9RVElfVklERU9fQkxVUl9SRVNPTFVUSU9OOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUVRJX1ZJREVPX0NPTkZJR19CTFVSSU5GTyB7Ci0gICAgT01YX1UzMiAgICAgICAgIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyICAgICAgICAgblBvcnRJbmRleDsKLSAgICBPTVhfUVRJX1ZJREVPX0JMVVJfUkVTT0xVVElPTiBlVGFyZ2V0UmVzb2w7Ci19IE9NWF9RVElfVklERU9fQ09ORklHX0JMVVJJTkZPOwotCi10eXBlZGVmIGVudW0gT01YX1FDT01fRVhUUkFEQVRBVFlQRQotewotICAgIE9NWF9FeHRyYURhdGFGcmFtZUluZm8gPSAgICAgICAgICAgICAgIDB4N0YwMDAwMDEsCi0gICAgT01YX0V4dHJhRGF0YUgyNjQgPSAgICAgICAgICAgICAgICAgICAgMHg3RjAwMDAwMiwKLSAgICBPTVhfRXh0cmFEYXRhVkMxID0gICAgICAgICAgICAgICAgICAgICAweDdGMDAwMDAzLAotICAgIE9NWF9FeHRyYURhdGFGcmFtZURpbWVuc2lvbiA9ICAgICAgICAgIDB4N0YwMDAwMDQsCi0gICAgT01YX0V4dHJhRGF0YVZpZGVvRW5jb2RlclNsaWNlSW5mbyA9ICAgMHg3RjAwMDAwNSwKLSAgICBPTVhfRXh0cmFEYXRhQ29uY2VhbE1CID0gICAgICAgICAgICAgICAweDdGMDAwMDA2LAotICAgIE9NWF9FeHRyYURhdGFJbnRlcmxhY2VGb3JtYXQgPSAgICAgICAgIDB4N0YwMDAwMDcsCi0gICAgT01YX0V4dHJhRGF0YVBvcnREZWYgPSAgICAgICAgICAgICAgICAgMHg3RjAwMDAwOCwKLSAgICBPTVhfRXh0cmFEYXRhTVAyRXh0bkRhdGEgPSAgICAgICAgICAgICAweDdGMDAwMDA5LAotICAgIE9NWF9FeHRyYURhdGFNUDJVc2VyRGF0YSA9ICAgICAgICAgICAgIDB4N0YwMDAwMGEsCi0gICAgT01YX0V4dHJhRGF0YVZpZGVvTFRSSW5mbyA9ICAgICAgICAgICAgMHg3RjAwMDAwYiwKLSAgICBPTVhfRXh0cmFEYXRhRnJhbWVQYWNraW5nQXJyYW5nZW1lbnQgPSAweDdGMDAwMDBjLAotICAgIE9NWF9FeHRyYURhdGFRUCA9ICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDAwMGQsCi0gICAgT01YX0V4dHJhRGF0YUlucHV0Qml0c0luZm8gPSAgICAgICAgICAgMHg3RjAwMDAwZSwKLSAgICBPTVhfRXh0cmFEYXRhVmlkZW9FbmNvZGVyTUJJbmZvID0gICAgICAweDdGMDAwMDBmLAotICAgIE9NWF9FeHRyYURhdGFWUVppcFNFSSAgPSAgICAgICAgICAgICAgIDB4N0YwMDAwMTAsCi0gICAgT01YX0V4dHJhRGF0YURpc3BsYXlDb2xvdXJTRUkgPSAgICAgICAgMHg3RjAwMDAxMSwKLSAgICBPTVhfRXh0cmFEYXRhTGlnaHRMZXZlbFNFSSA9ICAgICAgICAgICAweDdGMDAwMDEyLAotICAgIE9NWF9FeHRyYURhdGFFbmNvZGVyT3ZlcnJpZGVRUEluZm8gPSAgIDB4N0YwMDAwMTMsCi0gICAgT01YX0V4dHJhRGF0YU91dHB1dENyb3BJbmZvID0gICAgICAgICAgMHg3RjAwMDAxNCwKLX0gT01YX1FDT01fRVhUUkFEQVRBVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgIE9NWF9TVFJFQU1JTlRFUkxBQ0VGT1JNQVRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkludGVybGFjZUZvcm1hdDsKLSAgICBPTVhfVTMyIG5JbnRlcmxhY2VGb3JtYXRzOwotfSBPTVhfU1RSRUFNSU5URVJMQUNFRk9STUFUOwotCi10eXBlZGVmIGVudW0gT01YX0lOVEVSTEFDRVRZUEUKLXsKLSAgIE9NWF9JbnRlcmxhY2VGcmFtZVByb2dyZXNzaXZlLAotICAgT01YX0ludGVybGFjZUludGVybGVhdmVGcmFtZVRvcEZpZWxkRmlyc3QsCi0gICBPTVhfSW50ZXJsYWNlSW50ZXJsZWF2ZUZyYW1lQm90dG9tRmllbGRGaXJzdCwKLSAgIE9NWF9JbnRlcmxhY2VGcmFtZVRvcEZpZWxkRmlyc3QsCi0gICBPTVhfSW50ZXJsYWNlRnJhbWVCb3R0b21GaWVsZEZpcnN0Ci19IE9NWF9JTlRFUkxBQ0VTOwotCi10eXBlZGVmIGVudW0gUU9NWF9WSURFT19SRUNPVkVSWVNFSVRZUEUgewotLyoKLSAqIDA6IEZyYW1lIHJlY29uc3RydWN0aW9uIGlzIGluY29ycmVjdAotICogICBhKSBPcGVuIEdvcCwgZnJhbWVzIGJlZm9yZSByZWNvdmVyeSBwb2ludCBTRUkKLSAqIDE6IEZyYW1lIHJlY29uc3RydWN0aW9uIGlzIGNvcnJlY3QuCi0gKiAgIGEpIENsb3NlZCBHb3AsIFdoZW4gZGVjb2Rpbmcgc3RhcnRzIGZyb20gdGhlIHRvcCBvZiBjbG9zZWQgR09QIGF0IElEUgotICogICBiKSBPcGVuIEdvcCwgT3V0cHV0IGF0IGFuZCBzdWJzZXF1ZW50IHRvIHJlY292ZXJ5IHBvaW50IFNFSSB3aXRoCi0gKiAgICAgIGV4YWN0X21hdGNoX2ZsYWcgPSB0cnVlCi0gKiAyOiBGcmFtZSByZWNvbnN0cnVjdGlvbiBpcyBhcHByb3hpbWF0ZWx5IGNvcnJlY3Q6Ci0gKiAgIGEpIENsb3NlZCBHb3AsIFdoZW4gZGVjb2Rpbmcgc3RhcnRzIGZyb20gYSBQL0IvSSBmcmFtZXMgd2lodG91dAotICogICAgICBhbnkgcmVjb3ZlcnkgcG9pbnQgU0VJIGluZm9ybWF0aW9uCi0gKiAgIGIpIE9wZW4gR29wLCBPdXRwdXQgYXQgYW5kIHN1YnNlcXVlbnQgdG8gcmVjb3ZlcnkgcG9pbnQgU0VJIHdpdGgKLSAqICAgICAgZXhhY3RfbWF0Y2hfZmxhZyA9IGZhbHNlCi0gKiBJbiBjYXNlIGZsYWcgaXMgc2V0IHRvIDAgb3IgMiwgREFUQUNPUlJVUFQgc2hhbGwgYmUgZW5hYmxlZAotICogZm9yIGJ1ZmZlciAobkZsYWdzKSBpbiBGSUxMX0JVRkZFUl9ET05FCi0gKi8KLSAgICBPTVhfRlJBTUVfUkVDT05TVFJVQ1RJT05fSU5DT1JSRUNUID0gMCwKLSAgICBPTVhfRlJBTUVfUkVDT05TVFJVQ1RJT05fQ09SUkVDVCA9IDEsCi0gICAgT01YX0ZSQU1FX1JFQ09OU1RSVUNUSU9OX0FQUFJPWElNQVRFTFlfQ09SUkVDVCA9IDIKLX0gUU9NWF9WSURFT19SRUNPVkVSWVNFSTsKLQotI2RlZmluZSBPTVhfRVhUUkFEQVRBX0hFQURFUl9TSVpFIDIwCi0KLS8qKgotICogQVZDIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cwotICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KLSAqLwotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgewotICAgIFFPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lICAgICAgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLAotICAgIFFPTVhfVklERU9fQVZDUHJvZmlsZU1haW4gICAgICAgICAgPSBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sCi0gICAgUU9NWF9WSURFT19BVkNQcm9maWxlRXh0ZW5kZWQgICAgICA9IE9NWF9WSURFT19BVkNQcm9maWxlRXh0ZW5kZWQsCi0gICAgUU9NWF9WSURFT19BVkNQcm9maWxlSGlnaCAgICAgICAgICA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwKLSAgICBRT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoMTAgICAgICAgID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoMTAsCi0gICAgUU9NWF9WSURFT19BVkNQcm9maWxlSGlnaDQyMiAgICAgICA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDQyMiwKLSAgICBRT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDQ0ICAgICAgID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDQ0LAotICAgIC8qIFFDb20gc3BlY2lmaWMgcHJvZmlsZSBpbmRleGVzICovCi0gICAgUU9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWQgICAgICAgICAgID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVWZW5kb3JTdGFydFVudXNlZCwKLSAgICBRT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lLAotICAgIFFPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCwKLX0gUU9NWF9WSURFT19BVkNQUk9GSUxFVFlQRTsKLQotCi0vKioKLSAqIEguMjY0IE1WQyBQcm9maWxlcwotICAqLwotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fTVZDUFJPRklMRVRZUEUgewotICAgIFFPTVhfVklERU9fTVZDUHJvZmlsZVN0ZXJlb0hpZ2ggPSAweDEsCi0gICAgUU9NWF9WSURFT19NVkNQcm9maWxlTXVsdGlWaWV3SGlnaCA9IDB4MiwKLSAgICBRT01YX1ZJREVPX01WQ1Byb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsCi0gICAgUU9NWF9WSURFT19NVkNQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLAotICAgIFFPTVhfVklERU9fTVZDUHJvZmlsZU1heCA9IDB4N0ZGRkZGRkYKLX0gUU9NWF9WSURFT19NVkNQUk9GSUxFVFlQRTsKLQotLyoqCi0gKiBILjI2NCBNVkMgTGV2ZWxzCi0gICovCi10eXBlZGVmIGVudW0gUU9NWF9WSURFT19NVkNMRVZFTFRZUEUgewotICAgIFFPTVhfVklERU9fTVZDTGV2ZWwxICAgPSAweDAxLCAgICAgLyoqPCBMZXZlbCAxICovCi0gICAgUU9NWF9WSURFT19NVkNMZXZlbDFiICA9IDB4MDIsICAgICAvKio8IExldmVsIDFiICovCi0gICAgUU9NWF9WSURFT19NVkNMZXZlbDExICA9IDB4MDQsICAgICAvKio8IExldmVsIDEuMSAqLwotICAgIFFPTVhfVklERU9fTVZDTGV2ZWwxMiAgPSAweDA4LCAgICAgLyoqPCBMZXZlbCAxLjIgKi8KLSAgICBRT01YX1ZJREVPX01WQ0xldmVsMTMgID0gMHgxMCwgICAgIC8qKjwgTGV2ZWwgMS4zICovCi0gICAgUU9NWF9WSURFT19NVkNMZXZlbDIgICA9IDB4MjAsICAgICAvKio8IExldmVsIDIgKi8KLSAgICBRT01YX1ZJREVPX01WQ0xldmVsMjEgID0gMHg0MCwgICAgIC8qKjwgTGV2ZWwgMi4xICovCi0gICAgUU9NWF9WSURFT19NVkNMZXZlbDIyICA9IDB4ODAsICAgICAvKio8IExldmVsIDIuMiAqLwotICAgIFFPTVhfVklERU9fTVZDTGV2ZWwzICAgPSAweDEwMCwgICAgLyoqPCBMZXZlbCAzICovCi0gICAgUU9NWF9WSURFT19NVkNMZXZlbDMxICA9IDB4MjAwLCAgICAvKio8IExldmVsIDMuMSAqLwotICAgIFFPTVhfVklERU9fTVZDTGV2ZWwzMiAgPSAweDQwMCwgICAgLyoqPCBMZXZlbCAzLjIgKi8KLSAgICBRT01YX1ZJREVPX01WQ0xldmVsNCAgID0gMHg4MDAsICAgIC8qKjwgTGV2ZWwgNCAqLwotICAgIFFPTVhfVklERU9fTVZDTGV2ZWw0MSAgPSAweDEwMDAsICAgLyoqPCBMZXZlbCA0LjEgKi8KLSAgICBRT01YX1ZJREVPX01WQ0xldmVsNDIgID0gMHgyMDAwLCAgIC8qKjwgTGV2ZWwgNC4yICovCi0gICAgUU9NWF9WSURFT19NVkNMZXZlbDUgICA9IDB4NDAwMCwgICAvKio8IExldmVsIDUgKi8KLSAgICBRT01YX1ZJREVPX01WQ0xldmVsNTEgID0gMHg4MDAwLCAgIC8qKjwgTGV2ZWwgNS4xICovCi0gICAgUU9NWF9WSURFT19NVkNMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwKLSAgICBRT01YX1ZJREVPX01WQ0xldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLAotICAgIFFPTVhfVklERU9fTVZDTGV2ZWxNYXggPSAweDdGRkZGRkZGCi19IFFPTVhfVklERU9fTVZDTEVWRUxUWVBFOwotCi0vKioKLSAqIERpdlggVmVyc2lvbnMKLSAqLwotdHlwZWRlZiBlbnVtICBRT01YX1ZJREVPX0RJVlhGT1JNQVRUWVBFIHsKLSAgICBRT01YX1ZJREVPX0RJVlhGb3JtYXRVbnVzZWQgPSAweDAxLCAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLwotICAgIFFPTVhfVklERU9fRElWWEZvcm1hdDMxMSAgICA9IDB4MDIsIC8qKjwgRGl2WCAzLjExICovCi0gICAgUU9NWF9WSURFT19ESVZYRm9ybWF0NCAgICAgID0gMHgwNCwgLyoqPCBEaXZYIDQgKi8KLSAgICBRT01YX1ZJREVPX0RJVlhGb3JtYXQ1ICAgICAgPSAweDA4LCAvKio8IERpdlggNSAqLwotICAgIFFPTVhfVklERU9fRElWWEZvcm1hdDYgICAgICA9IDB4MTAsIC8qKjwgRGl2WCA2ICovCi0gICAgUU9NWF9WSURFT19ESVZYRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLAotICAgIFFPTVhfVklERU9fRElWWEZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwKLSAgICBRT01YX1ZJREVPX0RJVlhGb3JtYXRNYXggPSAweDdGRkZGRkZGCi19IFFPTVhfVklERU9fRElWWEZPUk1BVFRZUEU7Ci0KLS8qKgotICogRGl2WCBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yCi0gKiB2YXJpb3VzIHBlcmZvcm1hbmNlIGJvdW5kcy4KLSAqLwotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fRElWWFBST0ZJTEVUWVBFIHsKLSAgICBRT01YX1ZJREVPX0RpdlhQcm9maWxlcU1vYmlsZSA9IDB4MDEsIC8qKjwgcU1vYmlsZSBQcm9maWxlICovCi0gICAgUU9NWF9WSURFT19EaXZYUHJvZmlsZU1vYmlsZSAgPSAweDAyLCAvKio8IE1vYmlsZSBQcm9maWxlICovCi0gICAgUU9NWF9WSURFT19EaXZYUHJvZmlsZU1UICAgICAgPSAweDA0LCAvKio8IE1vYmlsZSBUaGVhdHJlIFByb2ZpbGUgKi8KLSAgICBRT01YX1ZJREVPX0RpdlhQcm9maWxlSFQgICAgICA9IDB4MDgsIC8qKjwgSG9tZSBUaGVhdHJlIFByb2ZpbGUgKi8KLSAgICBRT01YX1ZJREVPX0RpdlhQcm9maWxlSEQgICAgICA9IDB4MTAsIC8qKjwgSGlnaCBEZWZpbml0aW9uIFByb2ZpbGUgKi8KLSAgICBRT01YX1ZJREVPX0RJVlhQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLAotICAgIFFPTVhfVklERU9fRElWWFByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsCi0gICAgUU9NWF9WSURFT19ESVZYUHJvZmlsZU1heCA9IDB4N0ZGRkZGRkYKLX0gUU9NWF9WSURFT19ESVZYUFJPRklMRVRZUEU7Ci0KLS8qKgotICogRGl2WCBWaWRlbyBQYXJhbXMKLSAqCi0gKiAgU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUZvcm1hdCAgICA6IFZlcnNpb24gb2YgRGl2WCBzdHJlYW0gLyBkYXRhCi0gKiAgZVByb2ZpbGUgICA6IFByb2ZpbGUgb2YgRGl2WCBzdHJlYW0gLyBkYXRhCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fUEFSQU1fRElWWFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBRT01YX1ZJREVPX0RJVlhGT1JNQVRUWVBFIGVGb3JtYXQ7Ci0gICAgUU9NWF9WSURFT19ESVZYUFJPRklMRVRZUEUgZVByb2ZpbGU7Ci19IFFPTVhfVklERU9fUEFSQU1fRElWWFRZUEU7Ci0KLQotCi0vKioKLSAqICBWUCBWZXJzaW9ucwotICovCi10eXBlZGVmIGVudW0gUU9NWF9WSURFT19WUEZPUk1BVFRZUEUgewotICAgIFFPTVhfVklERU9fVlBGb3JtYXRVbnVzZWQgPSAweDAxLCAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLwotICAgIFFPTVhfVklERU9fVlBGb3JtYXQ2ICAgICAgPSAweDAyLCAvKio8IFZQNiBWaWRlbyBGb3JtYXQgKi8KLSAgICBRT01YX1ZJREVPX1ZQRm9ybWF0NyAgICAgID0gMHgwNCwgLyoqPCBWUDcgVmlkZW8gRm9ybWF0ICovCi0gICAgUU9NWF9WSURFT19WUEZvcm1hdDggICAgICA9IDB4MDgsIC8qKjwgVlA4IFZpZGVvIEZvcm1hdCAqLwotICAgIFFPTVhfVklERU9fVlBGb3JtYXQ5ICAgICAgPSAweDEwLCAvKio8IFZQOSBWaWRlbyBGb3JtYXQgKi8KLSAgICBRT01YX1ZJREVPX1ZQRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLAotICAgIFFPTVhfVklERU9fVlBGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsCi0gICAgUU9NWF9WSURFT19WUEZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gUU9NWF9WSURFT19WUEZPUk1BVFRZUEU7Ci0KLS8qKgotICogVlAgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzCi0gKiBlbmNvZGluZyB0b29scy4KLSAqLwotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fVlBQUk9GSUxFVFlQRSB7Ci0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVTaW1wbGUgICA9IDB4MDEsIC8qKjwgU2ltcGxlIFByb2ZpbGUsIGFwcGxpZXMgdG8gVlA2IG9ubHkgKi8KLSAgICBRT01YX1ZJREVPX1ZQUHJvZmlsZUFkdmFuY2VkID0gMHgwMiwgLyoqPCBBZHZhbmNlZCBQcm9maWxlLCBhcHBsaWVzIHRvIFZQNiBvbmx5ICovCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVWZXJzaW9uMCA9IDB4MDQsIC8qKjwgVmVyc2lvbiAwLCBhcHBsaWVzIHRvIFZQNyBhbmQgVlA4ICovCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVWZXJzaW9uMSA9IDB4MDgsIC8qKjwgVmVyc2lvbiAxLCBhcHBsaWVzIHRvIFZQNyBhbmQgVlA4ICovCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVWZXJzaW9uMiA9IDB4MTAsIC8qKjwgVmVyc2lvbiAyLCBhcHBsaWVzIHRvIFZQOCBvbmx5ICovCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVWZXJzaW9uMyA9IDB4MjAsIC8qKjwgVmVyc2lvbiAzLCBhcHBsaWVzIHRvIFZQOCBvbmx5ICovCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVNYXggPSAweDdGRkZGRkZGCi19IFFPTVhfVklERU9fVlBQUk9GSUxFVFlQRTsKLQotLyoqCi0gKiBWUCBWaWRlbyBQYXJhbXMKLSAqCi0gKiAgU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUZvcm1hdCAgICA6IEZvcm1hdCBvZiBWUCBzdHJlYW0gLyBkYXRhCi0gKiAgZVByb2ZpbGUgICA6IFByb2ZpbGUgb3IgVmVyc2lvbiBvZiBWUCBzdHJlYW0gLyBkYXRhCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fUEFSQU1fVlBUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgUU9NWF9WSURFT19WUEZPUk1BVFRZUEUgZUZvcm1hdDsKLSAgICBRT01YX1ZJREVPX1ZQUFJPRklMRVRZUEUgZVByb2ZpbGU7Ci19IFFPTVhfVklERU9fUEFSQU1fVlBUWVBFOwotCi0vKioKLSAqIFNwYXJrIFZlcnNpb25zCi0gKi8KLXR5cGVkZWYgZW51bSBRT01YX1ZJREVPX1NQQVJLRk9STUFUVFlQRSB7Ci0gICAgUU9NWF9WSURFT19TcGFya0Zvcm1hdFVudXNlZCA9IDB4MDEsIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCi0gICAgUU9NWF9WSURFT19TcGFya0Zvcm1hdDAgICAgICA9IDB4MDIsIC8qKjwgVmlkZW8gRm9ybWF0IFZlcnNpb24gMCAqLwotICAgIFFPTVhfVklERU9fU3BhcmtGb3JtYXQxICAgICAgPSAweDA0LCAvKio8IFZpZGVvIEZvcm1hdCBWZXJzaW9uIDEgKi8KLSAgICBRT01YX1ZJREVPX1NwYXJrRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLAotICAgIFFPTVhfVklERU9fU3BhcmtGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsCi0gICAgUU9NWF9WSURFT19TcGFya0Zvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gUU9NWF9WSURFT19TUEFSS0ZPUk1BVFRZUEU7Ci0KLS8qKgotICogU3BhcmsgVmlkZW8gUGFyYW1zCi0gKgotICogIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVGb3JtYXQgICAgOiBWZXJzaW9uIG9mIFNwYXJrIHN0cmVhbSAvIGRhdGEKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9WSURFT19QQVJBTV9TUEFSS1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBRT01YX1ZJREVPX1NQQVJLRk9STUFUVFlQRSBlRm9ybWF0OwotfSBRT01YX1ZJREVPX1BBUkFNX1NQQVJLVFlQRTsKLQotCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX1FVRVJZX0RFQ09ERVJfSU5TVEFOQ0VTIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuTnVtT2ZJbnN0YW5jZXM7Ci19IFFPTVhfVklERU9fUVVFUllfREVDT0RFUl9JTlNUQU5DRVM7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfRU5BQkxFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX0JPT0wgYkVuYWJsZTsKLX0gUU9NWF9FTkFCTEVUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX0RJU0FCTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfQk9PTCBiRGlzYWJsZTsKLX0gUU9NWF9ESVNBQkxFVFlQRTsKLQotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fRVZFTlRTIHsKLSAgICBPTVhfRXZlbnRJbmRleHNldHRpbmdDaGFuZ2VkID0gT01YX0V2ZW50VmVuZG9yU3RhcnRVbnVzZWQKLX0gUU9NWF9WSURFT19FVkVOVFM7Ci0KLXR5cGVkZWYgZW51bSBRT01YX1ZJREVPX1BJQ1RVUkVfT1JERVIgewotICAgIFFPTVhfVklERU9fRElTUExBWV9PUkRFUiA9IDB4MSwKLSAgICBRT01YX1ZJREVPX0RFQ09ERV9PUkRFUiA9IDB4MgotfSBRT01YX1ZJREVPX1BJQ1RVUkVfT1JERVI7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fREVDT0RFUl9QSUNUVVJFX09SREVSIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgUU9NWF9WSURFT19QSUNUVVJFX09SREVSIGVPdXRwdXRQaWN0dXJlT3JkZXI7Ci19IFFPTVhfVklERU9fREVDT0RFUl9QSUNUVVJFX09SREVSOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX0lOREVYRVhUUkFEQVRBVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJFbmFibGVkOwotICAgIE9NWF9JTkRFWFRZUEUgbkluZGV4OwotfSBRT01YX0lOREVYRVhUUkFEQVRBVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9JTkRFWFRJTUVTVEFNUFJFT1JERVIgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRW5hYmxlOwotfSBRT01YX0lOREVYVElNRVNUQU1QUkVPUkRFUjsKLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9JTkRFWERPV05TQ0FMQVIgewotICAgICAgICBPTVhfVTMyIG5TaXplOwotICAgICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICAgICAgT01YX0JPT0wgYkVuYWJsZTsKLX0gUU9NWF9JTkRFWERPV05TQ0FMQVI7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fQ1VTVE9NX0JVRkZFUlNJWkUgewotICAgICAgICBPTVhfVTMyIG5TaXplOwotICAgICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICAgICAgT01YX1UzMiBuQnVmZmVyU2l6ZTsKLX0gUU9NWF9WSURFT19DVVNUT01fQlVGRkVSU0laRTsKLQotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9WSURFT19TWU5DRlJBTUVERUNPRElOR01PREUgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLlN5bmNGcmFtZURlY29kaW5nTW9kZSIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fSU5ERVhFWFRSQURBVEEgIk9NWC5RQ09NLmluZGV4LnBhcmFtLkluZGV4RXh0cmFEYXRhIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9WSURFT19TTElDRURFTElWRVJZTU9ERSAiT01YLlFDT00uaW5kZXgucGFyYW0uU2xpY2VEZWxpdmVyeU1vZGUiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX1ZJREVPX0ZSQU1FUEFDS0lOR19FWFRSQURBVEEgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLkZyYW1lUGFja2luZ0V4dHJhZGF0YSIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fVklERU9fUVBfRVhUUkFEQVRBICJPTVguUUNPTS5pbmRleC5wYXJhbS52aWRlby5RUEV4dHJhZGF0YSIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fVklERU9fSU5QVVRCSVRTSU5GT19FWFRSQURBVEEgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLklucHV0Qml0c0luZm9FeHRyYWRhdGEiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX1ZJREVPX0VYVE5VU0VSX0VYVFJBREFUQSAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uRXh0blVzZXJFeHRyYURhdGEiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19WSURFT19GUkFNRVBBQ0tJTkdfSU5GTyAiT01YLlFDT00uaW5kZXguY29uZmlnLnZpZGVvLkZyYW1lUGFja2luZ0luZm8iCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX1ZJREVPX01QRUcyU0VRRElTUF9FWFRSQURBVEEgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLk1wZWcyU2VxRGlzcEV4dHJhRGF0YSIKLQotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9WSURFT19ISUVSU1RSVUNUVVJFICJPTVguUUNPTS5pbmRleC5wYXJhbS52aWRlby5IaWVyU3RydWN0dXJlIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9WSURFT19MVFJDT1VOVCAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uTFRSQ291bnQiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX1ZJREVPX0xUUlBFUklPRCAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uTFRSUGVyaW9kIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfVklERU9fTFRSVVNFICJPTVguUUNPTS5pbmRleC5jb25maWcudmlkZW8uTFRSVXNlIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfVklERU9fTFRSTUFSSyAiT01YLlFDT00uaW5kZXguY29uZmlnLnZpZGVvLkxUUk1hcmsiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19WSURFT19ISUVSX1BfTEFZRVJTICJPTVguUUNPTS5pbmRleC5jb25maWcudmlkZW8uaGllcnBsYXllcnMiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19SRUNUQU5HTEVfVFlQRSAiT01YLlFDT00uaW5kZXguY29uZmlnLnZpZGVvLnJlY3RhbmdsZSIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fVklERU9fQkFTRV9MQVlFUl9JRCAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uYmFzZWxheWVyaWQiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19WSURFT19RUCAiT01YLlFDT00uaW5kZXguY29uZmlnLnZpZGVvLnFwIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9WSURFT19TQVIgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLnNhciIKLSNkZWZpbmUgT01YX1FUSV9JTkRFWF9QQVJBTV9WSURFT19MT1dfTEFURU5DWSAiT01YLlFUSS5pbmRleC5wYXJhbS52aWRlby5Mb3dMYXRlbmN5IgotCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX1ZJREVPX1BBU1NJTlBVVEJVRkZFUkZEICJPTVguUUNPTS5pbmRleC5wYXJhbS52aWRlby5QYXNzSW5wdXRCdWZmZXJGZCIKLSNkZWZpbmUgT01YX1FUSV9JTkRFWF9QQVJBTV9WSURFT19QUkVGRVJfQURBUFRJVkVfUExBWUJBQ0sgIk9NWC5RVEkuaW5kZXgucGFyYW0udmlkZW8uUHJlZmVyQWRhcHRpdmVQbGF5YmFjayIKLSNkZWZpbmUgT01YX1FUSV9JTkRFWF9DT05GSUdfVklERU9fU0VUVElNRURBVEEgIk9NWC5RVEkuaW5kZXguY29uZmlnLnZpZGVvLnNldHRpbWVkYXRhIgotI2RlZmluZSBPTVhfUVRJX0lOREVYX1BBUkFNX1ZJREVPX0ZPUkNFX0NPTVBSRVNTRURfRk9SX0RQQiAiT01YLlFUSS5pbmRleC5wYXJhbS52aWRlby5Gb3JjZUNvbXByZXNzZWRGb3JEUEIiCi0jZGVmaW5lIE9NWF9RVElfSU5ERVhfUEFSQU1fVklERU9fRU5BQkxFX1JPSUlORk8gIk9NWC5RVEkuaW5kZXgucGFyYW0uZW5hYmxlUm9pSW5mbyIKLSNkZWZpbmUgT01YX1FUSV9JTkRFWF9DT05GSUdfVklERU9fUk9JSU5GTyAiT01YLlFUSS5pbmRleC5jb25maWcuUm9pSW5mbyIKLSNkZWZpbmUgT01YX1FUSV9JTkRFWF9DT05GSUdfVklERU9fQkxVUklORk8gIk9NWC5RVEkuaW5kZXguY29uZmlnLkJsdXJJbmZvIgotI2RlZmluZSBPTVhfUVRJX0lOREVYX1BBUkFNX1ZJREVPX0NMSUVOVF9FWFRSQURBVEEgIk9NWC5RVEkuaW5kZXgucGFyYW0uY2xpZW50LmV4dHJhZGF0YSIKLSNkZWZpbmUgT01YX1FUSV9JTkRFWF9DT05GSUdfQ09MT1JfQVNQRUNUUyAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlQ29sb3JBc3BlY3RzIgotCi10eXBlZGVmIGVudW0gewotICAgIFFPTVhfVklERU9fRlJBTUVfUEFDS0lOR19DSEVDS0VSQk9BUkQgPSAwLAotICAgIFFPTVhfVklERU9fRlJBTUVfUEFDS0lOR19DT0xVTU5fSU5URVJMRUFWRSA9IDEsCi0gICAgUU9NWF9WSURFT19GUkFNRV9QQUNLSU5HX1JPV19JTlRFUkxFQVZFID0gMiwKLSAgICBRT01YX1ZJREVPX0ZSQU1FX1BBQ0tJTkdfU0lERV9CWV9TSURFID0gMywKLSAgICBRT01YX1ZJREVPX0ZSQU1FX1BBQ0tJTkdfVE9QX0JPVFRPTSA9IDQsCi0gICAgUU9NWF9WSURFT19GUkFNRV9QQUNLSU5HX1RFTVBPUkFMID0gNSwKLX0gUU9NWF9WSURFT19GUkFNRV9QQUNLSU5HX0FSUkFOR0VNRU5UOwotCi10eXBlZGVmIGVudW0gewotICAgIFFPTVhfVklERU9fQ09OVEVOVF9VTlNQRUNJRklFRCA9IDAsCi0gICAgUU9NWF9WSURFT19DT05URU5UX0xSX1ZJRVcgPSAxLAotICAgIFFPTVhfVklERU9fQ09OVEVOVF9STF9WSUVXID0gMiwKLX0gUU9NWF9WSURFT19DT05URU5UX0lOVEVSUFJFVEFUSU9OOwotCi0vKioKLSAqIFNwZWNpZmllcyB0aGUgZXh0ZW5kZWQgcGljdHVyZSB0eXBlcy4gVGhlc2UgdmFsdWVzIHNob3VsZCBiZQotICogT1InZCBhbG9uZyB3aXRoIHRoZSB0eXBlcyBkZWZpbmVkIGluIE9NWF9WSURFT19QSUNUVVJFVFlQRSB0bwotICogc2lnbmFsIGFsbCBwaWN0dXJlcyB0eXBlcyB3aGljaCBhcmUgYWxsb3dlZC4KLSAqCi0gKiBFTlVNUzoKLSAqICBILjI2NCBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgIElEUgotICovCi10eXBlZGVmIGVudW0gUU9NWF9WSURFT19QSUNUVVJFVFlQRSB7Ci0gICAgUU9NWF9WSURFT19QaWN0dXJlVHlwZUlEUiA9IE9NWF9WSURFT19QaWN0dXJlVHlwZVZlbmRvclN0YXJ0VW51c2VkICsgMHgxMDAwCi19IFFPTVhfVklERU9fUElDVFVSRVRZUEU7Ci0KLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX0FDVElWRV9SRUdJT05fREVURUNUSU9OICAgICAgICAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLmFjdGl2ZXJlZ2lvbmRldGVjdGlvbiIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX0FDVElWRV9SRUdJT05fREVURUNUSU9OX1NUQVRVUyAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLmFjdGl2ZXJlZ2lvbmRldGVjdGlvbnN0YXR1cyIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX1NDQUxJTkdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLnNjYWxpbmdtb2RlIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfTk9JU0VSRURVQ1RJT04gICAgICAgICAgICAgICAgICAgICJPTVguUUNPTS5pbmRleC5jb25maWcubm9pc2VyZWR1Y3Rpb24iCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19JTUFHRUVOSEFOQ0VNRU5UICAgICAgICAgICAgICAgICAgIk9NWC5RQ09NLmluZGV4LmNvbmZpZy5pbWFnZWVuaGFuY2VtZW50IgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9IRUxEQlVGRkVSQ09VTlQgICAgICAgICAgICAgICAgICAgICJPTVguUUNPTS5pbmRleC5wYXJhbS5IZWxkQnVmZmVyQ291bnQiIC8qKjwgcmVmZXJlbmNlOiBRT01YX0hFTERCVUZGRVJDT1VOVFRZUEUgKi8KLQotCi10eXBlZGVmIHN0cnVjdCBRT01YX1JFQ1RUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfUzMyIG5MZWZ0OwotICAgIE9NWF9TMzIgblRvcDsKLSAgICBPTVhfVTMyIG5XaWR0aDsKLSAgICBPTVhfVTMyIG5IZWlnaHQ7Ci19IFFPTVhfUkVDVFRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfQUNUSVZFUkVHSU9OREVURUNUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJFbmFibGU7Ci0gICAgUU9NWF9SRUNUVFlQRSBzUk9JOwotICAgIE9NWF9VMzIgbk51bUV4Y2x1c2lvblJlZ2lvbnM7Ci0gICAgUU9NWF9SRUNUVFlQRSBzRXhjbHVzaW9uUmVnaW9uc1sxXTsKLX0gUU9NWF9BQ1RJVkVSRUdJT05ERVRFQ1RJT05UWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX0FDVElWRVJFR0lPTkRFVEVDVElPTl9TVEFUVVNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkRldGVjdGVkOwotICAgIFFPTVhfUkVDVFRZUEUgc0RldGVjdGVkUmVnaW9uOwotfSBRT01YX0FDVElWRVJFR0lPTkRFVEVDVElPTl9TVEFUVVNUWVBFOwotCi10eXBlZGVmIGVudW0gUU9NWF9TQ0FMRV9NT0RFVFlQRSB7Ci0gICAgUU9NWF9TQ0FMRV9NT0RFX05vcm1hbCwKLSAgICBRT01YX1NDQUxFX01PREVfQW5hbW9ycGhpYywKLSAgICBRT01YX1NDQUxFX01PREVfTWF4ID0gMHg3RkZGRkZGRgotfSBRT01YX1NDQUxFX01PREVUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX1NDQUxJTkdNT0RFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgUU9NWF9TQ0FMRV9NT0RFVFlQRSAgZVNjYWxlTW9kZTsKLX0gUU9NWF9TQ0FMSU5HTU9ERVRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfTk9JU0VSRURVQ1RJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkVuYWJsZTsKLSAgICBPTVhfQk9PTCBiQXV0b01vZGU7Ci0gICAgT01YX1MzMiBuTm9pc2VSZWR1Y3Rpb247Ci19IFFPTVhfTk9JU0VSRURVQ1RJT05UWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX0lNQUdFRU5IQU5DRU1FTlRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkVuYWJsZTsKLSAgICBPTVhfQk9PTCBiQXV0b01vZGU7Ci0gICAgT01YX1MzMiBuSW1hZ2VFbmhhbmNlbWVudDsKLX0gUU9NWF9JTUFHRUVOSEFOQ0VNRU5UVFlQRTsKLQotLyoKLSAqIHRoZXNlIGFyZSBwYXJ0IG9mIE9NWDEuMiBidXQgSkIgTVIyIGJyYW5jaCBkb2Vzbid0IGhhdmUgdGhlbSBkZWZpbmVkCi0gKiBPTVhfSW5kZXhQYXJhbUludGVybGFjZUZvcm1hdAotICogT01YX0lOVEVSTEFDRUZPUk1BVFRZUEUKLSAqLwotI2lmbmRlZiBPTVhfSW5kZXhQYXJhbUludGVybGFjZUZvcm1hdAotI2RlZmluZSBPTVhfSW5kZXhQYXJhbUludGVybGFjZUZvcm1hdCAoMHg3RkYwMDAwMCkKLXR5cGVkZWYgc3RydWN0IE9NWF9JTlRFUkxBQ0VGT1JNQVRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuRm9ybWF0OwotICAgIE9NWF9USUNLUyBuVGltZVN0YW1wOwotfSBPTVhfSU5URVJMQUNFRk9STUFUVFlQRTsKLSNlbmRpZgotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMKLSAqIHRoYXQgYSBwb3J0IHdpbGwgaG9sZCBkdXJpbmcgZGF0YSBmbG93LgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbwotICogIG5Qb3J0SW5kZXggICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkhlbGRCdWZmZXJDb3VudCAgIDogUmVhZC1vbmx5LCBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIHRoYXQgd2lsbCBiZSBoZWxkCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfSEVMREJVRkZFUkNPVU5UVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkhlbGRCdWZmZXJDb3VudDsKLX0gUU9NWF9IRUxEQlVGRkVSQ09VTlRUWVBFOwotCi10eXBlZGVmIGVudW0gUU9NWF9WSURFT19ISUVSQVJDSElDQUxDT0RJTkdUWVBFIHsKLSAgICBRT01YX0hJRVJBUkNISUNBTENPRElOR19QID0gMHgwMSwKLSAgICBRT01YX0hJRVJBUkNISUNBTENPRElOR19CID0gMHgwMiwKLX0gUU9NWF9WSURFT19ISUVSQVJDSElDQUxDT0RJTkdUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX0hJRVJBUkNISUNBTExBWUVSUyB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbk51bUxheWVyczsKLSAgICBRT01YX1ZJREVPX0hJRVJBUkNISUNBTENPRElOR1RZUEUgZUhpZXJhcmNoaWNhbENvZGluZ1R5cGU7Ci19IFFPTVhfVklERU9fSElFUkFSQ0hJQ0FMTEFZRVJTOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX0gyNjRFTlRST1BZQ09ESU5HVFlQRSB7Ci0gICBPTVhfVTMyIG5TaXplOwotICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgT01YX0JPT0wgYkNhYmFjOwotICAgT01YX1UzMiBuQ2FiYWNJbml0SWRjOwotfSBRT01YX1ZJREVPX0gyNjRFTlRST1BZQ09ESU5HVFlQRTsKLQotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fSUZSQU1FU0laRV9UWVBFIHsKLSAgICBRT01YX0lGUkFNRVNJWkVfREVGQVVMVCwKLSAgICBRT01YX0lGUkFNRVNJWkVfTUVESVVNLAotICAgIFFPTVhfSUZSQU1FU0laRV9IVUdFLAotICAgIFFPTVhfSUZSQU1FU0laRV9VTkxJTUlURUQsCi19IFFPTVhfVklERU9fSUZSQU1FU0laRV9UWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX0lGUkFNRVNJWkUgewotICAgT01YX1UzMiBuU2l6ZTsKLSAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgIFFPTVhfVklERU9fSUZSQU1FU0laRV9UWVBFIGVUeXBlOwotfSBRT01YX1ZJREVPX0lGUkFNRVNJWkU7Ci0KLS8qIFZJREVPIFBPU1RQUk9DRVNTSU5HIENUUkxTIEFORCBFTlVNUyAqLwotLyogTVVTVCBLRUVQIFNBTUUgQVMgSU4gdnBwLmggKi8KLSNkZWZpbmUgUU9NWF9WUFBfSFFWX0NVU1RPTVBBWUxPQURfU1ogMjU2Ci0jZGVmaW5lIFZQUF9IUVZfQ09OVFJPTF9HTE9CQUxfU1RBUlQgKFZQUF9IUVZfQ09OVFJPTF9DVVNUICsgMSkKLQotdHlwZWRlZiBlbnVtIFFPTVhfVlBQX0hRVl9NT0RFIHsKLSAgICBWUFBfSFFWX01PREVfT0ZGLAotICAgIFZQUF9IUVZfTU9ERV9BVVRPLAotICAgIFZQUF9IUVZfTU9ERV9NQU5VQUwsCi0gICAgVlBQX0hRVl9NT0RFX01BWAotfSBRT01YX1ZQUF9IUVZfTU9ERTsKLQotdHlwZWRlZiBlbnVtIFFPTVhfVlBQX0hRVkNPTlRST0xUWVBFIHsKLSAgICBWUFBfSFFWX0NPTlRST0xfQ0FERSA9IDB4MSwKLSAgICBWUFBfSFFWX0NPTlRST0xfREkgPSAweDAyLAotICAgIFZQUF9IUVZfQ09OVFJPTF9DTlIgPSAweDA0LAotICAgIFZQUF9IUVZfQ09OVFJPTF9BSUUgPSAweDA1LAotICAgIFZQUF9IUVZfQ09OVFJPTF9GUkMgPSAweDA2LAotICAgIFZQUF9IUVZfQ09OVFJPTF9DVVNUID0gMHgwNywKLSAgICBWUFBfSFFWX0NPTlRST0xfR0xPQkFMX0RFTU8gPSBWUFBfSFFWX0NPTlRST0xfR0xPQkFMX1NUQVJULAotICAgIFZQUF9IUVZfQ09OVFJPTF9NQVgsCi19IFFPTVhfVlBQX0hRVkNPTlRST0xUWVBFOwotCi10eXBlZGVmIGVudW0gUU9NWF9WUFBfSFFWX0RJX01PREUgewotICAgIFZQUF9IUVZfRElfTU9ERV9PRkYsCi0gICAgVlBQX0hRVl9ESV9NT0RFX1ZJREVPXzFGLAotICAgIFZQUF9IUVZfRElfTU9ERV9WSURFT18zRiwKLSAgICBWUFBfSFFWX0RJX01PREVfQVVUTywKLSAgICBWUFBfSFFWX0RJX01PREVfTUFYLAotfSBRT01YX1ZQUF9IUVZfRElfTU9ERTsKLQotdHlwZWRlZiBlbnVtIFFPTVhfVlBQX0hRVl9IVUVfTU9ERSB7Ci0gICAgVlBQX0hRVl9IVUVfTU9ERV9PRkYsCi0gICAgVlBQX0hRVl9IVUVfTU9ERV9PTiwKLSAgICBWUFBfSFFWX0hVRV9NT0RFX01BWCwKLX0gUU9NWF9WUFBfSFFWX0hVRV9NT0RFOwotCi10eXBlZGVmIGVudW0gUU9NWF9WUFBfU1BMSVRfRElSRUNUSU9OIHsKLSAgICBWUFBfSFFWX1NQTElUX0xFRlRfVE9fUklHSFQsCi0gICAgVlBQX0hRVl9TUExJVF9SSUdIVF9UT19MRUZULAotICAgIFZQUF9IUVZfU1BMSVRfVE9QX1RPX0JPVFRPTSwKLSAgICBWUFBfSFFWX1NQTElUX0JPVFRPTV9UT19UT1AsCi0gICAgVlBQX0hRVl9TUExJVF9NQVgsCi19IFFPTVhfVlBQX1NQTElUX0RJUkVDVElPTjsKLQotdHlwZWRlZiBlbnVtIFFPTVhfVlBQX0hRVl9GUkNfTU9ERSB7Ci0gICBWUFBfSFFWX0ZSQ19NT0RFX09GRiwKLSAgIFZQUF9IUVZfRlJDX01PREVfTE9XLAotICAgVlBQX0hRVl9GUkNfTU9ERV9NRUQsCi0gICBWUFBfSFFWX0ZSQ19NT0RFX0hJR0gsCi0gICBWUFBfSFFWX0ZSQ19NT0RFX01BWCwKLX0gUU9NWF9WUFBfSFFWX0ZSQ19NT0RFOwotCi0KLXR5cGVkZWYgc3RydWN0IFFPTVhfVlBQX0hRVkNUUkxfQ0FERSB7Ci0gICAgUU9NWF9WUFBfSFFWX01PREUgbW9kZTsKLSAgICBPTVhfVTMyIGxldmVsOwotICAgIE9NWF9TMzIgY29udHJhc3Q7Ci0gICAgT01YX1MzMiBzYXR1cmF0aW9uOwotfSBRT01YX1ZQUF9IUVZDVFJMX0NBREU7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfVlBQX0hRVkNUUkxfREkgewotICAgIFFPTVhfVlBQX0hRVl9ESV9NT0RFIG1vZGU7Ci19IFFPTVhfVlBQX0hRVkNUUkxfREk7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfVlBQX0hRVkNUUkxfQ05SIHsKLSAgICBRT01YX1ZQUF9IUVZfTU9ERSBtb2RlOwotICAgIE9NWF9VMzIgbGV2ZWw7Ci19IFFPTVhfVlBQX0hRVkNUUkxfQ05SOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZQUF9IUVZDVFJMX0FJRSB7Ci0gICAgUU9NWF9WUFBfSFFWX01PREUgbW9kZTsKLSAgICBRT01YX1ZQUF9IUVZfSFVFX01PREUgaHVlX21vZGU7Ci0gICAgT01YX1UzMiBjYWRlX2xldmVsOwotICAgIE9NWF9VMzIgbHRtX2xldmVsOwotfSBRT01YX1ZQUF9IUVZDVFJMX0FJRTsKLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9WUFBfSFFWQ1RSTF9DVVNUT00gewotICAgIE9NWF9VMzIgaWQ7Ci0gICAgT01YX1UzMiBsZW47Ci0gICAgT01YX1U4IGRhdGFbUU9NWF9WUFBfSFFWX0NVU1RPTVBBWUxPQURfU1pdOwotfSBRT01YX1ZQUF9IUVZDVFJMX0NVU1RPTTsKLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9WUFBfSFFWQ1RSTF9HTE9CQUxfREVNTyB7Ci0gICAgT01YX1UzMiBwcm9jZXNzX3BlcmNlbnQ7Ci0gICAgUU9NWF9WUFBfU1BMSVRfRElSRUNUSU9OIHByb2Nlc3NfZGlyZWN0aW9uOwotfSBRT01YX1ZQUF9IUVZDVFJMX0dMT0JBTF9ERU1POwotCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZQUF9IUVZDVFJMX0ZSQyB7Ci0gICAgUU9NWF9WUFBfSFFWX0ZSQ19NT0RFIG1vZGU7Ci19IFFPTVhfVlBQX0hRVkNUUkxfRlJDOwotCi0vKiBWSURFTyBQT1NUUFJPQ0VTU0lORyBPTVggQ1RSTFMgKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfVlBQX0hRVkNPTlRST0wgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIFFPTVhfVlBQX0hRVl9NT0RFIG1vZGU7Ci0gICAgUU9NWF9WUFBfSFFWQ09OVFJPTFRZUEUgY3RybF90eXBlOwotICAgIHVuaW9uIHsKLSAgICAgICAgUU9NWF9WUFBfSFFWQ1RSTF9DQURFIGNhZGU7Ci0gICAgICAgIFFPTVhfVlBQX0hRVkNUUkxfREkgZGk7Ci0gICAgICAgIFFPTVhfVlBQX0hRVkNUUkxfQ05SIGNucjsKLSAgICAgICAgUU9NWF9WUFBfSFFWQ1RSTF9BSUUgYWllOwotICAgICAgICBRT01YX1ZQUF9IUVZDVFJMX0NVU1RPTSBjdXN0b207Ci0gICAgICAgIFFPTVhfVlBQX0hRVkNUUkxfR0xPQkFMX0RFTU8gZ2xvYmFsX2RlbW87Ci0gICAgICAgIFFPTVhfVlBQX0hRVkNUUkxfRlJDIGZyYzsKLSAgICB9OwotfSBRT01YX1ZQUF9IUVZDT05UUk9MOwotCi0vKiBTVFJVQ1RVUkUgVE8gVFVSTiBWUFAgT04gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfVlBQX0VOQUJMRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX0JPT0wgZW5hYmxlX3ZwcDsKLX0gUU9NWF9WUFBfRU5BQkxFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX0VYVFJBREFUQV9FTkFCTEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRW5hYmxlOwotfSBRT01YX0VYVFJBREFUQV9FTkFCTEU7Ci0KLXR5cGVkZWYgZW51bSBPTVhfUU9NWF9WSURFT19NQklTVEFUSVNUSUNTVFlQRSB7Ci0gICAgUU9NWF9NQklfU1RBVElTVElDU19NT0RFX0RFRkFVTFQgPSAwLAotICAgIFFPTVhfTUJJX1NUQVRJU1RJQ1NfTU9ERV8xID0gMHgwMSwKLSAgICBRT01YX01CSV9TVEFUSVNUSUNTX01PREVfMiA9IDB4MDIsCi19IE9NWF9RT01YX1ZJREVPX01CSVNUQVRJU1RJQ1NUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUU9NWF9WSURFT19NQklfU1RBVElTVElDUyB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9RT01YX1ZJREVPX01CSVNUQVRJU1RJQ1NUWVBFIGVNQklTdGF0aXN0aWNzVHlwZTsKLX0gT01YX1FPTVhfVklERU9fTUJJX1NUQVRJU1RJQ1M7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fQkFUQ0hTSVpFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkJhdGNoU2l6ZTsKLX0gUU9NWF9WSURFT19CQVRDSFNJWkVUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX0NMSUVOVF9FWFRSQURBVEEgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5GZDsKLSAgICBPTVhfVTMyIG5FeHRyYWRhdGFBbGxvY1NpemU7Ci0gICAgT01YX1UzMiBuRXh0cmFkYXRhU2l6ZTsKLX0gUU9NWF9WSURFT19DTElFTlRfRVhUUkFEQVRBVFlQRTsKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmIGRlZmluZWQoVVNFX0NBTUVSQV9NRVRBQlVGRkVSX1VUSUxTKQotCi0jZGVmaW5lIENBTV9NRVRBX0JVRkZFUl9FVkVOVF9QRVJGIDB4MDEKLQotLyoqCi0gKiBDYW1lcmExIG1ldGEtYnVmZmVyIHBheWxvYWQgY3JlYXRlL2FjY2Vzcy9tb2RpZnkgdXRpbGl0eQotICovCi1zdHJ1Y3QgTWV0YUJ1ZmZlclV0aWwgewotCi0gICAgZW51bSB7Ci0gICAgICAgIElOVF9PRkZTRVQgICAgICA9IDEsCi0gICAgICAgIElOVF9TSVpFICAgICAgICA9IDIsCi0gICAgICAgIElOVF9VU0FHRSAgICAgICA9IDMsCi0gICAgICAgIElOVF9USU1FU1RBTVAgICA9IDQsCi0gICAgICAgIElOVF9DT0xPUkZPUk1BVCA9IDUsCi0gICAgICAgIElOVF9CVUZJTkRFWCAgICA9IDYsCi0gICAgICAgIElOVF9CVUZFVkVOVCAgICA9IDcsCi0gICAgICAgIElOVF9UT1RBTCAgICAgICA9IElOVF9CVUZJTkRFWCwKLSAgICB9OwotCi0gICAgc3RhdGljIGludCBnZXROdW1GZHNGb3JCYXRjaChpbnQgYmF0Y2hTaXplKSB7Ci0gICAgICAgIHJldHVybiBiYXRjaFNpemU7Ci0gICAgfQotICAgIHN0YXRpYyBpbnQgZ2V0TnVtSW50c0ZvckJhdGNoKGludCBiYXRjaFNpemUpIHsKLSAgICAgICAgcmV0dXJuIGJhdGNoU2l6ZSAqIElOVF9UT1RBTDsKLSAgICB9Ci0gICAgc3RhdGljIGludCBnZXRCYXRjaFNpemUoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpobmQpIHsKLSAgICAgICAgcmV0dXJuIE1ldGFCdWZmZXJVdGlsOjppc0hhbmRsZVNhbmUoaG5kKSA/IGhuZC0+bnVtRmRzIDogLTE7Ci0gICAgfQotCi0gICAgLyogZ2V0dGVycyAqLwotICAgIC8qIHJldHVybiBhIGZkIGF0IGluZGV4IG9yIC0xIGlmIGluZGV4IGlzIGludmFsaWQgKi8KLSAgICBzdGF0aWMgaW50IGdldEZkQXQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpobmQsIGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gKE1ldGFCdWZmZXJVdGlsOjppc0hhbmRsZVNhbmUoaG5kKSAmJiAoaW5kZXggPCBobmQtPm51bUZkcykpID8gaG5kLT5kYXRhW2luZGV4XSA6IC0xOwotICAgIH0KLSAgICAvKiByZXR1cm4gYSBpbnQgb2YgdHlwZSBhdCBpbmRleCBvciAtMSBpZiBpbmRleCBvciB0eXBlIGlzIGludmFsaWQgKi8KLSAgICBzdGF0aWMgaW50IGdldEludEF0KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaG5kLCBpbnQgaW5kZXgsIGludCB0eXBlKSB7Ci0gICAgICAgIGludCBpZHggPSBNZXRhQnVmZmVyVXRpbDo6Z2V0SW50SW5kZXgoaG5kLCBpbmRleCwgdHlwZSk7Ci0gICAgICAgIHJldHVybiBpZHggPCAwID8gLTEgOiBobmQtPmRhdGFbaWR4XTsKLSAgICB9Ci0KLSAgICAvKiBzZXR0ZXJzICovCi0gICAgLyogcmVwbGFjZSB0aGUgZmQgYXQgaW5kZXggYW5kIHJldHVybiAwLiBSZXR1cm4gLTEgaWYgaW5kZXggaXMgaW52YWxpZCAqLwotICAgIHN0YXRpYyBpbnQgc2V0RmRBdChuYXRpdmVfaGFuZGxlX3QgKmhuZCwgaW50IGluZGV4LCBpbnQgZmQpIHsKLSAgICAgICAgcmV0dXJuIChNZXRhQnVmZmVyVXRpbDo6aXNIYW5kbGVTYW5lKGhuZCkgJiYgKGluZGV4IDwgaG5kLT5udW1GZHMpKSA/IGhuZC0+ZGF0YVtpbmRleF0gPSBmZCwgMCA6IC0xOwotICAgIH0KLSAgICAvKiByZXBsYWNlIGFuIGludCBvZiB0eXBlIGF0IGluZGV4IGFuZCByZXR1cm4gMC4gUmV0dXJuIC0xIGlmIGluZGV4IG9yIHR5cGUgaXMgaW52YWxpZCAqLwotICAgIHN0YXRpYyBpbnQgc2V0SW50QXQobmF0aXZlX2hhbmRsZV90ICpobmQsIGludCBpbmRleCwgaW50IHR5cGUsIGludCB2YWx1ZSkgewotICAgICAgICBpbnQgaWR4ID0gTWV0YUJ1ZmZlclV0aWw6OmdldEludEluZGV4KGhuZCwgaW5kZXgsIHR5cGUpOwotICAgICAgICByZXR1cm4gaWR4IDwgMCA/IC0xIDogaG5kLT5kYXRhW2lkeF0gPSB2YWx1ZSwgMDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIGJvb2wgaXNIYW5kbGVTYW5lKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaG5kKSB7Ci0gICAgICAgIHJldHVybiBobmQgJiYgaG5kLT52ZXJzaW9uID09IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0SW50SW5kZXgoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpobmQsIGludCBpbmRleCwgaW50IHR5cGUpIHsKLSAgICAgICAgaW50IGlkeCA9IGluZGV4ICsgdHlwZSAqIE1ldGFCdWZmZXJVdGlsOjpnZXRCYXRjaFNpemUoaG5kKTsKLSAgICAgICAgcmV0dXJuIChNZXRhQnVmZmVyVXRpbDo6aXNIYW5kbGVTYW5lKGhuZCkgJiYgKGlkeCA8IChobmQtPm51bUludHMgKyBobmQtPm51bUZkcykpKSA/IGlkeCA6IC0xOwotICAgIH0KLX07Ci0KLSNlbmRpZiAvLyBfX2NwbHVzcGx1cwotCi10eXBlZGVmIGVudW0gUU9NWF9WSURFT19ESVRIRVJUWVBFIHsKLSAgICBRT01YX0RJVEhFUl9ESVNBQkxFID0gMCwKLSAgICBRT01YX0RJVEhFUl9DT0xPUlNQQUNFX0VYQ0VQVF9CVDIwMjAgPSAweDAxLAotICAgIFFPTVhfRElUSEVSX0FMTF9DT0xPUlNQQUNFID0gMHgwMiwKLX0gUU9NWF9WSURFT19ESVRIRVJUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX0RJVEhFUl9DT05UUk9MIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgUU9NWF9WSURFT19ESVRIRVJUWVBFIGVEaXRoZXJUeXBlOwotfSBRT01YX1ZJREVPX0RJVEhFUl9DT05UUk9MOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19PTVhfUUNPTV9FWFRFTlNJT05TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9Ta3lwZV9WaWRlb0V4dGVuc2lvbnMuaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfU2t5cGVfVmlkZW9FeHRlbnNpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzMwZjMuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9Ta3lwZV9WaWRlb0V4dGVuc2lvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKkBAQCsrK0BAQEAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIE1pY3Jvc29mdCBTa3lwZSBFbmdpbmVlcmluZwotIENvcHlyaWdodCAoQykgMjAxNCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCi0KLU1JVCBMaWNlbnNlCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLSB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCi0gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi0gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi0gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLSBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi0gVEhFIFNPRlRXQVJFLgotCi0qQEBALS0tQEBAQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fT01YX1NLWVBFX1ZJREVPRVhURU5TSU9OU19IX18KLSNkZWZpbmUgX19PTVhfU0tZUEVfVklERU9FWFRFTlNJT05TX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0jaW5jbHVkZSA8T01YX0NvcmUuaD4KLQotI3ByYWdtYSBwYWNrKHB1c2gsIDEpCi0KLQotdHlwZWRlZiBlbnVtIE9NWF9TS1lQRV9WSURFT19TbGljZUNvbnRyb2xNb2RlCi17Ci0gICAgT01YX1NLWVBFX1ZJREVPX1NsaWNlQ29udHJvbE1vZGVOb25lICAgICAgICA9IDAsCi0gICAgT01YX1NLWVBFX1ZJREVPX1NsaWNlQ29udHJvbE1vZGVNQiAgICAgICAgICA9IDEsCi0gICAgT01YX1NLWVBFX1ZJREVPX1NsaWNlQ29udHJvbE1vZGVCeXRlICAgICAgICA9IDIsCi0gICAgT01YX1NLWVBFX1ZJREVPX1NsaWNlQ29udHJvbE1vZE1CUm93ICAgICAgICA9IDMsCi19IE9NWF9TS1lQRV9WSURFT19TbGljZUNvbnRyb2xNb2RlOwotCi0KLXR5cGVkZWYgZW51bSBPTVhfU0tZUEVfVklERU9fSGllcmFyVHlwZQotewotICAgIE9NWF9TS1lQRV9WSURFT19IaWVyYXJUeXBlX1AgICAgICAgICAgICAgICAgPSAweDAxLAotICAgIE9NWF9TS1lQRV9WSURFT19IaWVyYXJUeXBlX0IgICAgICAgICAgICAgICAgPSAweDAyLAotfSBPTVhfU0tZUEVfVklERU9fSElFUkFSX0hpZXJhclR5cGU7Ci0KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fRVhURU5TSU9OX0FWQ1BST0ZJTEVUWVBFCi17Ci0gICAgT01YX1ZJREVPX0VYVF9BVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZSA9IDB4MDEsCi0gICAgT01YX1ZJREVPX0VYVF9BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoICAgICA9IDB4MDIsCi19IE9NWF9WSURFT19FWFRFTlNJT05fQVZDUFJPRklMRVRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9TS1lQRV9WSURFT19FTkNPREVSUEFSQU1TIHsKLSAgICBPTVhfQk9PTCBiTG93TGF0ZW5jeTsKLSAgICBPTVhfQk9PTCBiVXNlRXh0ZW5kZWRQcm9maWxlOwotICAgIE9NWF9CT09MIGJTZXF1ZW5jZUhlYWRlcldpdGhJRFI7Ci0gICAgT01YX1ZJREVPX0VYVEVOU0lPTl9BVkNQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLSAgICBPTVhfVTMyIG5MVFJGcmFtZXM7Ci0gICAgT01YX1NLWVBFX1ZJREVPX0hpZXJhclR5cGUgZUhpZXJhclR5cGU7Ci0gICAgT01YX1UzMiBuTWF4VGVtcG9yYWxMYXllckNvdW50OwotICAgIE9NWF9TS1lQRV9WSURFT19TbGljZUNvbnRyb2xNb2RlIGVTbGljZUNvbnRyb2xNb2RlOwotICAgIE9NWF9VMzIgblNhckluZGV4OwotICAgIE9NWF9VMzIgblNhcldpZHRoOwotICAgIE9NWF9VMzIgblNhckhlaWdodDsKLX0gT01YX1NLWVBFX1ZJREVPX0VOQ09ERVJQQVJBTVM7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9TS1lQRV9WSURFT19QQVJBTV9FTkNPREVSU0VUVElORyB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TS1lQRV9WSURFT19FTkNPREVSUEFSQU1TIHN0RW5jUGFyYW07Ci19IE9NWF9TS1lQRV9WSURFT19QQVJBTV9FTkNPREVTRVRUSU5HOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfU0tZUEVfVklERU9fRU5DT0RFUkNBUCB7Ci0gICAgT01YX0JPT0wgYkxvd0xhdGVuY3k7Ci0gICAgT01YX1UzMiBuTWF4RnJhbWVXaWR0aDsKLSAgICBPTVhfVTMyIG5NYXhGcmFtZUhlaWdodDsKLSAgICBPTVhfVTMyIG5NYXhJbnN0YW5jZXM7Ci0gICAgT01YX1UzMiBuTWF4VGVtcG9yYUxheWVyQ291bnQ7Ci0gICAgT01YX1UzMiBuTWF4UmVmRnJhbWVzOwotICAgIE9NWF9VMzIgbk1heExUUkZyYW1lczsKLSAgICBPTVhfVklERU9fQVZDTEVWRUxUWVBFIG5NYXhMZXZlbDsKLSAgICBPTVhfVTMyIG5TbGljZUNvbnRyb2xNb2Rlc0JNOwotICAgIE9NWF9VMzIgbk1heE1hY3JvYmxvY2tQcm9jZXNzaW5nUmF0ZTsKLSAgICBPTVhfVTMyIHhNaW5TY2FsZUZhY3RvcjsKLX0gT01YX1NLWVBFX1ZJREVPX0VOQ09ERVJDQVA7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9TS1lQRV9WSURFT19QQVJBTV9FTkNPREVSQ0FQIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1NLWVBFX1ZJREVPX0VOQ09ERVJDQVAgc3RFbmNDYXA7Ci19IE9NWF9TS1lQRV9WSURFT19QQVJBTV9FTkNPREVSQ0FQOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfU0tZUEVfVklERU9fREVDT0RFUkNBUCB7Ci0gICAgT01YX0JPT0wgYkxvd0xhdGVuY3k7Ci0gICAgT01YX1UzMiBuTWF4RnJhbWVXaWR0aDsKLSAgICBPTVhfVTMyIG5NYXhGcmFtZUhlaWdodDsKLSAgICBPTVhfVTMyIG5NYXhJbnN0YW5jZXM7Ci0gICAgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSBuTWF4TGV2ZWw7Ci0gICAgT01YX1UzMiBuTWF4TWFjcm9ibG9ja1Byb2Nlc3NpbmdSYXRlOwotfSBPTVhfU0tZUEVfVklERU9fREVDT0RFUkNBUDsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1NLWVBFX1ZJREVPX1BBUkFNX0RFQ09ERVJDQVAgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfU0tZUEVfVklERU9fREVDT0RFUkNBUCBzdERlY29kZXJDYXA7Ci19IE9NWF9TS1lQRV9WSURFT19QQVJBTV9ERUNPREVSQ0FQOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfUUNPTV9WSURFT19DT05GSUdfUVAgT01YX1NLWVBFX1ZJREVPX0NPTkZJR19RUDsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1NLWVBFX1ZJREVPX0NPTkZJR19CQVNFTEFZRVJQSUR7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgblBJRDsKLX0gT01YX1NLWVBFX1ZJREVPX0NPTkZJR19CQVNFTEFZRVJQSUQ7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9TS1lQRV9WSURFT19QQVJBTV9EUklWRVJWRVIgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTY0IG5Ecml2ZXJWZXJzaW9uOwotfSBPTVhfU0tZUEVfVklERU9fUEFSQU1fRFJJVkVSVkVSOwotCi10eXBlZGVmIGVudW0gT01YX1NLWVBFX1ZJREVPX0Rvd25TY2FsZUZhY3RvcgotewotICAgIE9NWF9TS1lQRV9WSURFT19Eb3duU2NhbGVGYWN0b3JfMV8xICAgICAgICAgPSAwLAotICAgIE9NWF9TS1lQRV9WSURFT19Eb3duU2NhbGVGYWN0b3JfRXF1YWxfQVIgICAgPSAxLAotICAgIE9NWF9TS1lQRV9WSURFT19Eb3duU2NhbGVGYWN0b3JfQW55ICAgICAgICAgPSAyLAotfSBPTVhfU0tZUEVfVklERU9fRG93blNjYWxlRmFjdG9yOwotCi0jcHJhZ21hIHBhY2socG9wKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfVHlwZXMuaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5ZmFiNC4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9pbmMvT01YX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICovCi0KLS8qKiBPTVhfVHlwZXMuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBPTVhfVHlwZXMgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIHByaW1pdGl2ZSB0eXBlIGRlZmluaXRpb25zIHVzZWQgYnkKLSAqICB0aGUgY29yZSwgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50LiAgVGhpcyBmaWxlIG1heSBuZWVkIHRvIGJlCi0gKiAgbW9kaWZpZWQgdG8gYmUgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgImNoYXIiIHNldCB0byA4IGJpdHMsIAotICogICJzaG9ydCIgc2V0IHRvIDE2IGJpdHMgYW5kICJsb25nIiBzZXQgdG8gMzIgYml0cy4KLSAqLwotCi0jaWZuZGVmIE9NWF9UeXBlc19oCi0jZGVmaW5lIE9NWF9UeXBlc19oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotLyoqIFRoZSBPTVhfQVBJIGFuZCBPTVhfQVBJRU5UUlkgYXJlIHBsYXRmb3JtIHNwZWNpZmljIGRlZmluaXRpb25zIHVzZWQKLSAqICB0byBkZWNsYXJlIE9NWCBmdW5jdGlvbiBwcm90b3R5cGVzLiAgVGhleSBhcmUgbW9kaWZpZWQgdG8gbWVldCB0aGUKLSAqICByZXF1aXJlbWVudHMgZm9yIGEgcGFydGljdWxhciBwbGF0Zm9ybSAqLwotI2lmZGVmIF9fU1lNQklBTjMyX18KLSMgICBpZmRlZiBfX09NWF9FWFBPUlRTCi0jICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgIGVsc2UKLSMgICAgICAgaWZkZWYgX1dJTjMyCi0jICAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgICAgZWxzZQotIyAgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgICAgIGVuZGlmCi0jICAgZW5kaWYKLSNlbHNlCi0jICAgaWZkZWYgX1dJTjMyCi0jICAgICAgaWZkZWYgX19PTVhfRVhQT1JUUwotIyAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgICBlbHNlCi0jICAgICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyAgICAgIGVuZGlmCi0jICAgZWxzZQotIyAgICAgIGlmZGVmIF9fT01YX0VYUE9SVFMKLSMgICAgICAgICAgZGVmaW5lIE9NWF9BUEkKLSMgICAgICBlbHNlCi0jICAgICAgICAgIGRlZmluZSBPTVhfQVBJIGV4dGVybgotIyAgICAgIGVuZGlmCi0jICAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIE9NWF9BUElFTlRSWQotI2RlZmluZSBPTVhfQVBJRU5UUlkKLSNlbmRpZgotCi0vKiogT01YX0lOIGlzIHVzZWQgdG8gaWRlbnRpZnkgaW5wdXRzIHRvIGFuIE9NWCBmdW5jdGlvbi4gIFRoaXMgZGVzaWduYXRpb24KLSAgICB3aWxsIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSBwYXJhbWV0ZXIKLSAgICB0aGF0IGlzIHVzZWQgYXMgYW4gb3V0cHV0LiAqLwotI2lmbmRlZiBPTVhfSU4KLSNkZWZpbmUgT01YX0lOCi0jZW5kaWYKLQotLyoqIE9NWF9PVVQgaXMgdXNlZCB0byBpZGVudGlmeSBvdXRwdXRzIGZyb20gYW4gT01YIGZ1bmN0aW9uLiAgVGhpcwotICAgIGRlc2lnbmF0aW9uIHdpbGwgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0IHBvaW50cwotICAgIHRvIGEgcGFyYW1ldGVyIHRoYXQgaXMgdXNlZCBhcyBhbiBpbnB1dC4gKi8KLSNpZm5kZWYgT01YX09VVAotI2RlZmluZSBPTVhfT1VUCi0jZW5kaWYKLQotCi0vKiogT01YX0lOT1VUIGlzIHVzZWQgdG8gaWRlbnRpZnkgcGFyYW1ldGVycyB0aGF0IG1heSBiZSBlaXRoZXIgaW5wdXRzIG9yCi0gICAgb3V0cHV0cyBmcm9tIGFuIE9NWCBmdW5jdGlvbiBhdCB0aGUgc2FtZSB0aW1lLiAgVGhpcyBkZXNpZ25hdGlvbiB3aWxsCi0gICAgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0ICBwb2ludHMgdG8gYSBwYXJhbWV0ZXIgdGhhdAotICAgIGlzIHVzZWQgYm90aCBhcyBhbiBpbnB1dCBhbmQgYW4gb3V0cHV0LiAqLwotI2lmbmRlZiBPTVhfSU5PVVQKLSNkZWZpbmUgT01YX0lOT1VUCi0jZW5kaWYKLQotLyoqIE9NWF9BTEwgaXMgdXNlZCB0byBhcyBhIHdpbGRjYXJkIHRvIHNlbGVjdCBhbGwgZW50aXRpZXMgb2YgdGhlIHNhbWUgdHlwZQotICogIHdoZW4gc3BlY2lmeWluZyB0aGUgaW5kZXgsIG9yIHJlZmVycmluZyB0byBhIG9iamVjdCBieSBhbiBpbmRleC4gIChpLmUuCi0gKiAgdXNlIE9NWF9BTEwgdG8gaW5kaWNhdGUgYWxsIE4gY2hhbm5lbHMpLiBXaGVuIHVzZWQgYXMgYSBwb3J0IGluZGV4Ci0gKiAgZm9yIGEgY29uZmlnIG9yIHBhcmFtZXRlciB0aGlzIE9NWF9BTEwgZGVub3RlcyB0aGF0IHRoZSBjb25maWcgb3IKLSAqICBwYXJhbWV0ZXIgYXBwbGllcyB0byB0aGUgZW50aXJlIGNvbXBvbmVudCBub3QganVzdCBvbmUgcG9ydC4gKi8KLSNkZWZpbmUgT01YX0FMTCAweEZGRkZGRkZGCi0KLS8qKiBJbiB0aGUgZm9sbG93aW5nIHdlIGRlZmluZSBncm91cHMgdGhhdCBoZWxwIGJ1aWxkaW5nIGRveHlnZW4gZG9jdW1lbnRhdGlvbiAqLwotCi0vKiogQGRlZmdyb3VwIGNvcmUgT3Blbk1BWCBJTCBjb3JlCi0gKiBGdW5jdGlvbnMgYW5kIHN0cnVjdHVyZSByZWxhdGVkIHRvIHRoZSBPTVggSUwgY29yZQotICovCi0gCi0gLyoqIEBkZWZncm91cCBjb21wIE9wZW5NQVggSUwgY29tcG9uZW50Ci0gKiBGdW5jdGlvbnMgYW5kIHN0cnVjdHVyZSByZWxhdGVkIHRvIHRoZSBPTVggSUwgY29tcG9uZW50Ci0gKi8KLSAKLS8qKiBAZGVmZ3JvdXAgcnBtIFJlc291cmNlIGFuZCBQb2xpY3kgTWFuYWdlbWVudAotICogU3RydWN0dXJlcyBmb3IgcmVzb3VyY2UgYW5kIHBvbGljeSBtYW5hZ2VtZW50IG9mIGNvbXBvbmVudHMKLSAqLwotCi0vKiogQGRlZmdyb3VwIGJ1ZiBCdWZmZXIgTWFuYWdlbWVudAotICogQnVmZmVyIGhhbmRsaW5nIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcwotICovCi0gIAotLyoqIEBkZWZncm91cCB0dW4gVHVubmVsaW5nCi0gKiBAaW5ncm91cCBjb3JlIGNvbXAKLSAqIFN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdHVubmVscyBhbW9uZyBjb21wb25lbnQgcG9ydHMKLSAqLwotIAotLyoqIEBkZWZncm91cCBjcCBDb250ZW50IFBpcGVzCi0gKiAgQGluZ3JvdXAgY29yZQotICovCi0gCi0gLyoqIEBkZWZncm91cCBtZXRhZGF0YSBNZXRhZGF0YSBoYW5kbGluZwotICAqIAotICAqLyAKLQotLyoqIE9NWF9VOCBpcyBhbiA4IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKLQotLyoqIE9NWF9TOCBpcyBhbiA4IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyBieXRlIGFsaWduZWQgKi8KLXR5cGVkZWYgc2lnbmVkIGNoYXIgT01YX1M4OwotCi0vKiogT01YX1UxNiBpcyBhIDE2IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDE2IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgT01YX1UxNjsKLQotLyoqIE9NWF9TMTYgaXMgYSAxNiBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMTYgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiBzaWduZWQgc2hvcnQgT01YX1MxNjsKLQotLyoqIE9NWF9VMzIgaXMgYSAzMiBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAzMiBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTMyOwotCi0vKiogT01YX1MzMiBpcyBhIDMyIGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAzMiBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MzMjsKLQotCi0vKiBVc2VycyB3aXRoIGNvbXBpbGVycyB0aGF0IGNhbm5vdCBhY2NlcHQgdGhlICJsb25nIGxvbmciIGRlc2lnbmF0aW9uIHNob3VsZAotICAgZGVmaW5lIHRoZSBPTVhfU0tJUDY0QklUIG1hY3JvLiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhpcyBtYXkgY2F1c2UKLSAgIHNvbWUgY29tcG9uZW50cyB0byBmYWlsIHRvIGNvbXBpbGUgaWYgdGhlIGNvbXBvbmVudCB3YXMgd3JpdHRlbiB0byByZXF1aXJlCi0gICA2NCBiaXQgaW50ZWdyYWwgdHlwZXMuICBIb3dldmVyLCB0aGVzZSBjb21wb25lbnRzIHdvdWxkIE5PVCBjb21waWxlIGFueXdheQotICAgc2luY2UgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHdheSB0aGUgY29tcG9uZW50IHdhcyB3cml0dGVuLgotKi8KLSNpZm5kZWYgT01YX1NLSVA2NEJJVAotI2lmZGVmIF9fU1lNQklBTjMyX18KLS8qKiBPTVhfVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsKLQotLyoqIE9NWF9TNjQgaXMgYSA2NCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIE9NWF9TNjQ7Ci0KLSNlbGlmIGRlZmluZWQoV0lOMzIpCi0KLS8qKiBPTVhfVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICBPTVhfVTY0OwotCi0vKiogT01YX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCAgIF9faW50NjQgIE9NWF9TNjQ7Ci0KLSNlbHNlIC8qIFdJTjMyICovCi0KLS8qKiBPTVhfVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsKLQotLyoqIE9NWF9TNjQgaXMgYSA2NCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIE9NWF9TNjQ7Ci0KLSNlbmRpZiAvKiBXSU4zMiAqLwotI2VuZGlmCi0KLQotLyoqIFRoZSBPTVhfQk9PTCB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgdHJ1ZSBvciBhIGZhbHNlCi0gICAgdmFsdWUgd2hlbiBwYXNzaW5nIHBhcmFtZXRlcnMgdG8gYW5kIGZyb20gdGhlIE9NWCBjb3JlIGFuZCBjb21wb25lbnRzLiAgVGhlCi0gICAgT01YX0JPT0wgaXMgYSAzMiBiaXQgcXVhbnRpdHkgYW5kIGlzIGFsaWduZWQgb24gYSAzMiBiaXQgd29yZCBib3VuZGFyeS4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9CT09MIHsKLSAgICBPTVhfRkFMU0UgPSAwLAotICAgIE9NWF9UUlVFID0gIU9NWF9GQUxTRSwKLSAgICBPTVhfQk9PTF9NQVggPSAweDdGRkZGRkZGCi19IE9NWF9CT09MOwotIAotI2lmZGVmIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCi0KLXR5cGVkZWYgT01YX1UzMiBPTVhfUFRSOwotdHlwZWRlZiBPTVhfUFRSIE9NWF9TVFJJTkc7Ci10eXBlZGVmIE9NWF9QVFIgT01YX0JZVEU7Ci0KLSNlbHNlCi0KLS8qKiBUaGUgT01YX1BUUiB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyBwb2ludGVycyBiZXR3ZWVuIHRoZSBPTVgKLSAgICBhcHBsaWNhdGlvbnMgYW5kIHRoZSBPTVggQ29yZSBhbmQgY29tcG9uZW50cy4gIFRoaXMgaXMgYSAzMiBiaXQgcG9pbnRlciBhbmQKLSAgICBpcyBhbGlnbmVkIG9uIGEgMzIgYml0IGJvdW5kYXJ5LgotICovCi10eXBlZGVmIHZvaWQqIE9NWF9QVFI7Ci0KLS8qKiBUaGUgT01YX1NUUklORyB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyAiQyIgdHlwZSBzdHJpbmdzIGJldHdlZW4KLSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb3JlIGFuZCBjb21wb25lbnQuICBUaGUgT01YX1NUUklORyB0eXBlIGlzIGEgMzIKLSAgICBiaXQgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcuICBUaGUgIHBvaW50ZXIgaXMgd29yZCBhbGlnbmVkIGFuZAotICAgIHRoZSBzdHJpbmcgaXMgYnl0ZSBhbGlnbmVkLgotICovCi10eXBlZGVmIGNoYXIqIE9NWF9TVFJJTkc7Ci0KLS8qKiBUaGUgT01YX0JZVEUgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgYXJyYXlzIG9mIGJ5dGVzIHN1Y2ggYXMKLSAgICBidWZmZXJzIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50IGFuZCBjb3JlLiAgVGhlIE9NWF9CWVRFCi0gICAgdHlwZSBpcyBhIDMyIGJpdCBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSAgcG9pbnRlciBpcyB3b3JkCi0gICAgYWxpZ25lZCBhbmQgdGhlIHN0cmluZyBpcyBieXRlIGFsaWduZWQuCi0gKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciogT01YX0JZVEU7Ci0KLS8qKiBPTVhfVVVJRFRZUEUgaXMgYSB2ZXJ5IGxvbmcgdW5pcXVlIGlkZW50aWZpZXIgdG8gdW5pcXVlbHkgaWRlbnRpZnkKLSAgICBhdCBydW50aW1lLiAgVGhpcyBpZGVudGlmaWVyIHNob3VsZCBiZSBnZW5lcmF0ZWQgYnkgYSBjb21wb25lbnQgaW4gYSB3YXkKLSAgICB0aGF0IGd1YXJhbnRlZXMgdGhhdCBldmVyeSBpbnN0YW5jZSBvZiB0aGUgaWRlbnRpZmllciBydW5uaW5nIG9uIHRoZSBzeXN0ZW0KLSAgICBpcyB1bmlxdWUuICovCi0KLQotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVVVJRFRZUEVbMTI4XTsKLQotLyoqIFRoZSBPTVhfRElSVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIGlmIGEgcG9ydCBpcyBhbiBpbnB1dCBvcgotICAgIGFuIG91dHB1dCBwb3J0LiAgVGhpcyBlbnVtZXJhdGlvbiBpcyBjb21tb24gYWNyb3NzIGFsbCBjb21wb25lbnQgdHlwZXMuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfRElSVFlQRQotewotICAgIE9NWF9EaXJJbnB1dCwgICAgICAgICAgICAgIC8qKjwgUG9ydCBpcyBhbiBpbnB1dCBwb3J0ICovCi0gICAgT01YX0Rpck91dHB1dCwgICAgICAgICAgICAgLyoqPCBQb3J0IGlzIGFuIG91dHB1dCBwb3J0ICovCi0gICAgT01YX0Rpck1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0RJUlRZUEU7Ci0KLS8qKiBUaGUgT01YX0VORElBTlRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgYml0IG9yZGVyaW5nCi0gICAgZm9yIG51bWVyaWNhbCBkYXRhIChpLmUuIGJpZyBlbmRpYW4sIG9yIGxpdHRsZSBlbmRpYW4pLgotICovCi10eXBlZGVmIGVudW0gT01YX0VORElBTlRZUEUKLXsKLSAgICBPTVhfRW5kaWFuQmlnLCAvKio8IGJpZyBlbmRpYW4gKi8KLSAgICBPTVhfRW5kaWFuTGl0dGxlLCAvKio8IGxpdHRsZSBlbmRpYW4gKi8KLSAgICBPTVhfRW5kaWFuTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRU5ESUFOVFlQRTsKLQotCi0vKiogVGhlIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIGlmIGRhdGEKLSAgICBpcyBzaWduZWQgb3IgdW5zaWduZWQKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9OVU1FUklDQUxEQVRBVFlQRQotewotICAgIE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkLCAvKio8IHNpZ25lZCBkYXRhICovCi0gICAgT01YX051bWVyaWNhbERhdGFVbnNpZ25lZCwgLyoqPCB1bnNpZ25lZCBkYXRhICovCi0gICAgT01YX051bWVyY2lhbERhdGFNYXggPSAweDdGRkZGRkZGCi19IE9NWF9OVU1FUklDQUxEQVRBVFlQRTsKLQotCi0vKiogVW5zaWduZWQgYm91bmRlZCB2YWx1ZSB0eXBlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQlUzMiB7Ci0gICAgT01YX1UzMiBuVmFsdWU7IC8qKjwgYWN0dWFsIHZhbHVlICovCi0gICAgT01YX1UzMiBuTWluOyAgIC8qKjwgbWluaW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlID49IG5NaW4pICovCi0gICAgT01YX1UzMiBuTWF4OyAgIC8qKjwgbWF4aW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlIDw9IG5NYXgpICovCi19IE9NWF9CVTMyOwotCi0KLS8qKiBTaWduZWQgYm91bmRlZCB2YWx1ZSB0eXBlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQlMzMiB7Ci0gICAgT01YX1MzMiBuVmFsdWU7IC8qKjwgYWN0dWFsIHZhbHVlICovCi0gICAgT01YX1MzMiBuTWluOyAgIC8qKjwgbWluaW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlID49IG5NaW4pICovCi0gICAgT01YX1MzMiBuTWF4OyAgIC8qKjwgbWF4aW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlIDw9IG5NYXgpICovCi19IE9NWF9CUzMyOwotCi0KLS8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHNvbWUgdGltZSBvciBkdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMuIFRoaXMgc3RydWN0dXJlCi0gICogIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgNjQgYml0IHZhbHVlLiBUaGUgcXVhbnRpdHkgaXMgc2lnbmVkIHRvIGFjY29tbW9kYXRlCi0gICogIG5lZ2F0aXZlIGRlbHRhcyBhbmQgcHJlcm9sbCBzY2VuYXJpb3MuIFRoZSBxdWFudGl0eSBpcyByZXByZXNlbnRlZCBpbiBtaWNyb3NlY29uZHMKLSAgKiAgdG8gYWNjb21vZGF0ZSBoaWdoIHJlc29sdXRpb24gdGltZXN0YW1wcyAoZS5nLiBEVkQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMgYmFzZWQKLSAgKiAgb24gYSA5MGtIeiBjbG9jaykgYW5kIHRvIGFsbG93IG1vcmUgYWNjdXJhdGUgYW5kIHN5bmNocm9uaXplZCBkZWxpdmVyeSAoZS5nLgotICAqICBpbmRpdmlkdWFsIGF1ZGlvIHNhbXBsZXMgZGVsaXZlcmVkIGF0IDE5MiBrSHopLiBUaGUgcXVhbnRpdHkgaXMgNjQgYml0IHRvIAotICAqICBhY2NvbW1vZGF0ZSBhIGxhcmdlIGR5bmFtaWMgcmFuZ2UgKHNpZ25lZCAzMiBiaXQgdmFsdWVzIHdvdWxkIGFsbG93IG9ubHkgZm9yIHBsdXMKLSAgKiAgb3IgbWludXMgMzUgbWludXRlcykuCi0gICoKLSAgKiAgSW1wbGVtZW50YXRpb25zIHdpdGggbGltaXRlZCBwcmVjaXNpb24gbWF5IGNvbnZlcnQgdGhlIHNpZ25lZCA2NCBiaXQgdmFsdWUgdG8KLSAgKiAgYSBzaWduZWQgMzIgYml0IHZhbHVlIGludGVybmFsbHkgYnV0IHJpc2sgbG9zcyBvZiBwcmVjaXNpb24uCi0gICovCi0jaWZuZGVmIE9NWF9TS0lQNjRCSVQKLXR5cGVkZWYgT01YX1M2NCBPTVhfVElDS1M7Ci0jZWxzZQotdHlwZWRlZiBzdHJ1Y3QgT01YX1RJQ0tTCi17Ci0gICAgT01YX1UzMiBuTG93UGFydDsgICAgLyoqIGxvdyBiaXRzIG9mIHRoZSBzaWduZWQgNjQgYml0IHRpY2sgdmFsdWUgKi8KLSAgICBPTVhfVTMyIG5IaWdoUGFydDsgICAvKiogaGlnaCBiaXRzIG9mIHRoZSBzaWduZWQgNjQgYml0IHRpY2sgdmFsdWUgKi8KLX0gT01YX1RJQ0tTOwotI2VuZGlmCi0jZGVmaW5lIE9NWF9USUNLU19QRVJfU0VDT05EIDEwMDAwMDAKLQotLyoqIERlZmluZSB0aGUgcHVibGljIGludGVyZmFjZSBmb3IgdGhlIE9NWCBIYW5kbGUuICBUaGUgY29yZSB3aWxsIG5vdCB1c2UKLSAgICB0aGlzIHZhbHVlIGludGVybmFsbHksIGJ1dCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIG9ubHkgdXNlIHRoaXMgdmFsdWUuCi0gKi8KLXR5cGVkZWYgdm9pZCogT01YX0hBTkRMRVRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9NQVJLVFlQRQotewotICAgIE9NWF9IQU5ETEVUWVBFIGhNYXJrVGFyZ2V0Q29tcG9uZW50OyAgIC8qKjwgVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGEgbWFyayBldmVudCB1cG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRoZSBtYXJrLiAqLwotICAgIE9NWF9QVFIgcE1hcmtEYXRhOyAgIC8qKjwgQXBwbGljYXRpb24gc3BlY2lmaWMgZGF0YSBhc3NvY2lhdGVkIHdpdGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFyayBzZW50IG9uIGEgbWFyayBldmVudCB0byBkaXNhbWJpZ3VhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWFyayBmcm9tIG90aGVycy4gKi8KLX0gT01YX01BUktUWVBFOwotCi0KLS8qKiBPTVhfTkFUSVZFX0RFVklDRVRZUEUgaXMgdXNlZCB0byBtYXAgYSBPTVggdmlkZW8gcG9ydCB0byB0aGUKLSAqICBwbGF0Zm9ybSAmIG9wZXJhdGluZyBzcGVjaWZpYyBvYmplY3QgdXNlZCB0byByZWZlcmVuY2UgdGhlIGRpc3BsYXkgCi0gKiAgb3IgY2FuIGJlIHVzZWQgYnkgYSBhdWRpbyBwb3J0IGZvciBuYXRpdmUgYXVkaW8gcmVuZGVyaW5nICovCi10eXBlZGVmIHZvaWQqIE9NWF9OQVRJVkVfREVWSUNFVFlQRTsKLQotLyoqIE9NWF9OQVRJVkVfV0lORE9XVFlQRSBpcyB1c2VkIHRvIG1hcCBhIE9NWCB2aWRlbyBwb3J0IHRvIHRoZQotICogIHBsYXRmb3JtICYgb3BlcmF0aW5nIHNwZWNpZmljIG9iamVjdCB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgd2luZG93ICovCi10eXBlZGVmIHZvaWQqIE9NWF9OQVRJVkVfV0lORE9XVFlQRTsKLQotLyoqIFRoZSBPTVhfVkVSU0lPTlRZUEUgdW5pb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB2ZXJzaW9uIGZvcgotICAgIGEgc3RydWN0dXJlIG9yIGNvbXBvbmVudC4gIEZvciBhIGNvbXBvbmVudCwgdGhlIHZlcnNpb24gaXMgZW50aXJlbHkKLSAgICBzcGVjaWZpZWQgYnkgdGhlIGNvbXBvbmVudCB2ZW5kb3IuICBDb21wb25lbnRzIGRvaW5nIHRoZSBzYW1lIGZ1bmN0aW9uCi0gICAgZnJvbSBkaWZmZXJlbnQgdmVuZG9ycyBtYXkgb3IgbWF5IG5vdCBoYXZlIHRoZSBzYW1lIHZlcnNpb24uICBGb3IKLSAgICBzdHJ1Y3R1cmVzLCB0aGUgdmVyc2lvbiBzaGFsbCBiZSBzZXQgYnkgdGhlIGVudGl0eSB0aGF0IGFsbG9jYXRlcyB0aGUKLSAgICBzdHJ1Y3R1cmUuICBGb3Igc3RydWN0dXJlcyBzcGVjaWZpZWQgaW4gdGhlIE9NWCAxLjEgc3BlY2lmaWNhdGlvbiwgdGhlCi0gICAgdmFsdWUgb2YgdGhlIHZlcnNpb24gc2hhbGwgYmUgc2V0IHRvIDEuMS4wLjAgaW4gYWxsIGNhc2VzLiAgQWNjZXNzIHRvIHRoZQotICAgIE9NWF9WRVJTSU9OVFlQRSBjYW4gYmUgYnkgYSBzaW5nbGUgMzIgYml0IGFjY2VzcyAoZS5nLiBieSBuVmVyc2lvbikgb3IKLSAgICBieSBhY2Nlc3Npbmcgb25lIG9mIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgdG8sIGZvciBleGFtcGxlLCBjaGVjayBvbmx5Ci0gICAgdGhlIE1ham9yIHJldmlzaW9uLgotICovCi10eXBlZGVmIHVuaW9uIE9NWF9WRVJTSU9OVFlQRQotewotICAgIHN0cnVjdAotICAgIHsKLSAgICAgICAgT01YX1U4IG5WZXJzaW9uTWFqb3I7ICAgLyoqPCBNYWpvciB2ZXJzaW9uIGFjY2Vzc29yIGVsZW1lbnQgKi8KLSAgICAgICAgT01YX1U4IG5WZXJzaW9uTWlub3I7ICAgLyoqPCBNaW5vciB2ZXJzaW9uIGFjY2Vzc29yIGVsZW1lbnQgKi8KLSAgICAgICAgT01YX1U4IG5SZXZpc2lvbjsgICAgICAgLyoqPCBSZXZpc2lvbiB2ZXJzaW9uIGFjY2Vzc29yIGVsZW1lbnQgKi8KLSAgICAgICAgT01YX1U4IG5TdGVwOyAgICAgICAgICAgLyoqPCBTdGVwIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLwotICAgIH0gczsKLSAgICBPTVhfVTMyIG5WZXJzaW9uOyAgICAgICAgICAgLyoqPCAzMiBiaXQgdmFsdWUgdG8gbWFrZSBhY2Nlc3NpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIGVhc2lseSBkb25lIGluIGEgc2luZ2xlIHdvcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgY29weS9jb21wYXJlIG9wZXJhdGlvbiAqLwotfSBPTVhfVkVSU0lPTlRZUEU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZgotLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfVmlkZW8uaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9PTVhfVmlkZW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRkYmU4Ny4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9pbmMvT01YX1ZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgyICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKgotICovCi0KLS8qKiAKLSAqICBAZmlsZSBPTVhfVmlkZW8uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBzdHJ1Y3R1cmVzIGlzIG5lZWRlZCBieSBWaWRlbyBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgCi0gKiAgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIE9NWCBjb21wb25lbnRzLgotICovCi0jaWZuZGVmIE9NWF9WaWRlb19oCi0jZGVmaW5lIE9NWF9WaWRlb19oCi0KLS8qKiBAZGVmZ3JvdXAgdmlkZW8gT3Blbk1BWCBJTCBWaWRlbyBEb21haW4KLSAqIEBpbmdyb3VwIGl2Ci0gKiBTdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIFZpZGVvIGRvbWFpbgotICogQHsKLSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyoqCi0gKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAotICovCi0KLSNpbmNsdWRlIDxPTVhfSVZDb21tb24uaD4KLQotCi0vKioKLSAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSB2aWRlbyBjb21wcmVzc2lvbiBjb2RpbmdzLiAgCi0gKiBOT1RFOiAgVGhpcyBlc3NlbnRpYWxseSByZWZlcnMgdG8gZmlsZSBleHRlbnNpb25zLiBJZiB0aGUgY29kaW5nIGlzIAotICogICAgICAgIGJlaW5nIHVzZWQgdG8gc3BlY2lmeSB0aGUgRU5DT0RFIHR5cGUsIHRoZW4gYWRkaXRpb25hbCB3b3JrIAotICogICAgICAgIG11c3QgYmUgZG9uZSB0byBjb25maWd1cmUgdGhlIGV4YWN0IGZsYXZvciBvZiB0aGUgY29tcHJlc3Npb24gCi0gKiAgICAgICAgdG8gYmUgdXNlZC4gIEZvciBkZWNvZGUgY2FzZXMgd2hlcmUgdGhlIHVzZXIgYXBwbGljYXRpb24gY2FuIAotICogICAgICAgIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gTVBFRy00IGFuZCBILjI2NCBiaXQgc3RyZWFtcywgaXQgaXMgCi0gKiAgICAgICAgdXAgdG8gdGhlIGNvZGVjIHRvIGhhbmRsZSB0aGlzLgotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX0NPRElOR1RZUEUgewotICAgIE9NWF9WSURFT19Db2RpbmdVbnVzZWQsICAgICAvKio8IFZhbHVlIHdoZW4gY29kaW5nIGlzIE4vQSAqLwotICAgIE9NWF9WSURFT19Db2RpbmdBdXRvRGV0ZWN0LCAvKio8IEF1dG9kZXRlY3Rpb24gb2YgY29kaW5nIHR5cGUgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nTVBFRzIsICAgICAgLyoqPCBBS0E6IEguMjYyICovCi0gICAgT01YX1ZJREVPX0NvZGluZ0gyNjMsICAgICAgIC8qKjwgSC4yNjMgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nTVBFRzQsICAgICAgLyoqPCBNUEVHLTQgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nV01WLCAgICAgICAgLyoqPCBhbGwgdmVyc2lvbnMgb2YgV2luZG93cyBNZWRpYSBWaWRlbyAqLwotICAgIE9NWF9WSURFT19Db2RpbmdSViwgICAgICAgICAvKio8IGFsbCB2ZXJzaW9ucyBvZiBSZWFsIFZpZGVvICovCi0gICAgT01YX1ZJREVPX0NvZGluZ0FWQywgICAgICAgIC8qKjwgSC4yNjQvQVZDICovCi0gICAgT01YX1ZJREVPX0NvZGluZ01KUEVHLCAgICAgIC8qKjwgTW90aW9uIEpQRUcgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nVlA4LCAgICAgICAgLyoqPCBHb29nbGUgVlA4LCBmb3JtZXJseSBrbm93biBhcyBPbjIgVlA4ICovCi0gICAgT01YX1ZJREVPX0NvZGluZ1ZQOSwgICAgICAgIC8qKjwgR29vZ2xlIFZQOSAqLwotICAgIE9NWF9WSURFT19Db2RpbmdIRVZDLCAgICAgICAvKio8IEhFVkMgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19Db2RpbmdNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19DT0RJTkdUWVBFOwotCi0KLS8qKgotICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYSB2aWRlbyBwYXRoLiAgVGhlIG51bWJlciBvZiBWaWRlbyBwYXRocyBmb3IgCi0gKiBpbnB1dCBhbmQgb3V0cHV0IHdpbGwgdmFyeSBieSB0eXBlIG9mIHRoZSBWaWRlbyBjb21wb25lbnQuICAKLSAqIAotICogICAgSW5wdXQgKGFrYSBTb3VyY2UpIDogemVybyBJbnB1dHMsIG9uZSBPdXRwdXQsCi0gKiAgICBTcGxpdHRlciAgICAgICAgICAgOiBvbmUgSW5wdXQsIDIgb3IgbW9yZSBPdXRwdXRzLAotICogICAgUHJvY2Vzc2luZyBFbGVtZW50IDogb25lIElucHV0LCBvbmUgb3V0cHV0LAotICogICAgTWl4ZXIgICAgICAgICAgICAgIDogMiBvciBtb3JlIGlucHV0cywgb25lIG91dHB1dCwKLSAqICAgIE91dHB1dCAoYWthIFNpbmspICA6IG9uZSBJbnB1dCwgemVybyBvdXRwdXRzLgotICogCi0gKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKLSAqIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IHZpZGVvIAotICogcGF0aC4gIElmIGFkZGl0aW9uYWwgdmVuZG9yIHNwZWNpZmljIGRhdGEgaXMgcmVxdWlyZWQsIGl0IHNob3VsZCBiZSAKLSAqIHRyYW5zbWl0dGVkIHRvIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIEN1c3RvbUNvbW1hbmQgZnVuY3Rpb24uICBDb21wbGlhbnQgCi0gKiBjb21wb25lbnRzIHdpbGwgcHJlcG9wdWxhdGUgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBvcHRpbWFsIHZhbHVlcyBkdXJpbmcgdGhlIAotICogR2V0RGVmYXVsdEluaXRQYXJhbXMgY29tbWFuZC4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBjTUlNRVR5cGUgICAgICAgICAgICAgOiBNSU1FIHR5cGUgb2YgZGF0YSBmb3IgdGhlIHBvcnQKLSAqICBwTmF0aXZlUmVuZGVyICAgICAgICAgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgZGlzcGxheSBpZiBhIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDAKLSAqICBuRnJhbWVXaWR0aCAgICAgICAgICAgOiBXaWR0aCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiAgVXNlIDAgZm9yIHVua25vd24sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQotICogIG5GcmFtZUhlaWdodCAgICAgICAgICA6IEhlaWdodCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCi0gKiAgblN0cmlkZSAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIGJ5dGVzIHBlciBzcGFuIG9mIGFuIGltYWdlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdldAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gc3BhbiBOIHRvIHNwYW4gTisxLCB3aGVyZSBuZWdhdGl2ZSBzdHJpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGltYWdlIGlzIGJvdHRvbSB1cAotICogIG5TbGljZUhlaWdodCAgICAgICAgICA6IEhlaWdodCB1c2VkIHdoZW4gZW5jb2RpbmcgaW4gc2xpY2VzCi0gKiAgbkJpdHJhdGUgICAgICAgICAgICAgIDogQml0IHJhdGUgb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuIFVzZSAwIGZvciB1bmtub3duLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCi0gKiAgeEZyYW1lcmF0ZSAgICAgICAgICAgIDogRnJhbWUgcmF0ZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgdW5jb21wcmVzc2VkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwgZG9uJ3QgY2FyZSBvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4gIFVuaXRzIGFyZSBRMTYgZnJhbWVzIHBlciBzZWNvbmQuCi0gKiAgYkZsYWdFcnJvckNvbmNlYWxtZW50IDogVHVybnMgb24gZXJyb3IgY29uY2VhbG1lbnQgaWYgaXQgaXMgc3VwcG9ydGVkIGJ5IAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBPTVggY29tcG9uZW50Ci0gKiAgZUNvbXByZXNzaW9uRm9ybWF0ICAgIDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9WSURFT19Db2RpbmdVbnVzZWQgaXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBlQ29sb3JGb3JtYXQgaXMgdXNlZAotICogIGVDb2xvckZvcm1hdCA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAotICogIHBOYXRpdmVXaW5kb3cgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgd2luZG93IG9iamVjdCBpZiBhIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgc2luayAsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDB4MC4gCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgewotICAgIE9NWF9TVFJJTkcgY01JTUVUeXBlOwotICAgIE9NWF9OQVRJVkVfREVWSUNFVFlQRSBwTmF0aXZlUmVuZGVyOwotICAgIE9NWF9VMzIgbkZyYW1lV2lkdGg7Ci0gICAgT01YX1UzMiBuRnJhbWVIZWlnaHQ7Ci0gICAgT01YX1MzMiBuU3RyaWRlOwotICAgIE9NWF9VMzIgblNsaWNlSGVpZ2h0OwotICAgIE9NWF9VMzIgbkJpdHJhdGU7Ci0gICAgT01YX1UzMiB4RnJhbWVyYXRlOwotICAgIE9NWF9CT09MIGJGbGFnRXJyb3JDb25jZWFsbWVudDsKLSAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7Ci0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OwotICAgIE9NWF9OQVRJVkVfV0lORE9XVFlQRSBwTmF0aXZlV2luZG93OwotfSBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFOwotCi0vKiogIAotICogUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUgdGhlIHZhcmlvdXMgCi0gKiBkYXRhIGlucHV0L291dHB1dCBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBwb3J0LgotICogCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgIDogSW5kaWNhdGVzIHdoaWNoIHBvcnQgdG8gc2V0Ci0gKiAgbkluZGV4ICAgICAgICAgICAgIDogSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tIAotICogICAgICAgICAgICAgICAgICAgICAgIDB4MCB0byBOLTEKLSAqICBlQ29tcHJlc3Npb25Gb3JtYXQgOiBDb21wcmVzc2lvbiBmb3JtYXQgdXNlZCBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuIFdoZW4gT01YX1ZJREVPX0NvZGluZ1VudXNlZCBpcyBzcGVjaWZpZWQsIAotICogICAgICAgICAgICAgICAgICAgICAgIGVDb2xvckZvcm1hdCBpcyB1c2VkIAotICogIGVDb2xvckZvcm1hdCAgICAgICA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAotICogIHhGcmFtZVJhdGUgICAgICAgICA6IEluZGljYXRlcyB0aGUgdmlkZW8gZnJhbWUgcmF0ZSBpbiBRMTYgZm9ybWF0Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkluZGV4OwotICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsgCi0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OwotICAgIE9NWF9VMzIgeEZyYW1lcmF0ZTsKLX0gT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFOwotCi0KLS8qKgotICogVGhpcyBpcyBhIHN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgdmlkZW8gY29tcHJlc3Npb24gcXVhbnRpemF0aW9uIAotICogcGFyYW1ldGVyIHZhbHVlcy4gIENvZGVjcyBtYXkgc3VwcG9ydCBkaWZmZXJlbnQgUVAgdmFsdWVzIGZvciBkaWZmZXJlbnQKLSAqIGZyYW1lIHR5cGVzLgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblFwSSAgICAgICA6IFFQIHZhbHVlIHRvIHVzZSBmb3IgaW5kZXggZnJhbWVzCi0gKiAgblFwUCAgICAgICA6IFFQIHZhbHVlIHRvIHVzZSBmb3IgUCBmcmFtZXMKLSAqICBuUXBCICAgICAgIDogUVAgdmFsdWVzIHRvIHVzZSBmb3IgYmlkaXJlY3Rpb25hbCBmcmFtZXMgCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuUXBJOwotICAgIE9NWF9VMzIgblFwUDsKLSAgICBPTVhfVTMyIG5RcEI7Ci19IE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFOwotCi0KLS8qKiAKLSAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJhdGlvbiBvZiB2aWRlbyBmYXN0IHVwZGF0ZSBwYXJhbWV0ZXJzLiAKLSAqICAKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvIAotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGJFbmFibGVWRlUgOiBFbmFibGUvRGlzYWJsZSB2aWRlbyBmYXN0IHVwZGF0ZQotICogIG5GaXJzdEdPQiAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgbWFjcm9ibG9jayByb3cKLSAqICBuRmlyc3RNQiAgIDogc3BlY2lmaWVzIHRoZSBmaXJzdCBNQiByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGZpcnN0IEdPQgotICogIG5OdW1NQnMgICAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBNQnMgdG8gYmUgcmVmcmVzaGVkIGZyb20gbkZpcnN0R09CIAotICogICAgICAgICAgICAgICBhbmQgbkZpcnN0TUIKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1ZJREVPRkFTVFVQREFURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAotICAgIE9NWF9CT09MIGJFbmFibGVWRlU7ICAgICAgCi0gICAgT01YX1UzMiBuRmlyc3RHT0I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9VMzIgbkZpcnN0TUI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9VMzIgbk51bU1CczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFOwotCi0KLS8qKiAKLSAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGJpdHJhdGUgY29udHJvbCB0eXBlcyAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgewotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZURpc2FibGUsCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGUsCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQsCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGVTa2lwRnJhbWVzLAotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50U2tpcEZyYW1lcywKLSAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19DT05UUk9MUkFURVRZUEU7Ci0KLQotLyoqIAotICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyBiaXRyYXRlIG1vZGUgb2YgYSBjb2RlYy4gCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3QgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICA6IE9NWCBzcGVjIHZlcnNpb24gaW5mbwotICogIG5Qb3J0SW5kZXggICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0IGFwcGxpZXMgdG8KLSAqICBlQ29udHJvbFJhdGUgICA6IENvbnRyb2wgcmF0ZSB0eXBlIGVudW0KLSAqICBuVGFyZ2V0Qml0cmF0ZSA6IFRhcmdldCBiaXRyYXRlIHRvIGVuY29kZSB3aXRoCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBlQ29udHJvbFJhdGU7IAotICAgIE9NWF9VMzIgblRhcmdldEJpdHJhdGU7ICAgICAgICAgICAgICAgICAKLX0gT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFOwotCi0KLS8qKiAKLSAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIG1vdGlvbiB2ZWN0b3IgKE1WKSB0eXBlcyAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFIHsKLSAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yUGl4ZWwsCi0gICAgT01YX1ZpZGVvX01vdGlvblZlY3RvckhhbGZQZWwsCi0gICAgT01YX1ZpZGVvX01vdGlvblZlY3RvclF1YXJ0ZXJQZWwsCi0gICAgT01YX1ZpZGVvX01vdGlvblZlY3RvckVpZ2h0aFBlbCwKLSAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFOwotCi0KLS8qKgotICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyB0aGUgbnVtYmVyIG9mIG1vdGlvbiB2ZWN0b3JzIHVzZWQgYXMgd2VsbAotICogYXMgdGhlaXIgYWNjdXJhY3kuCi0gKiAKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3QgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWMgdmVyc2lvbiBpbmZvCi0gKiAgblBvcnRJbmRleCAgICAgICA6IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUFjY3VyYWN5ICAgICAgICA6IEVudW1lcmF0ZWQgTVYgYWNjdXJhY3kKLSAqICBiVW5yZXN0cmljdGVkTVZzIDogQWxsb3cgdW5yZXN0cmljdGVkIE1WcwotICogIGJGb3VyTVYgICAgICAgICAgOiBBbGxvdyB1c2Ugb2YgNCBNVnMKLSAqICBzWFNlYXJjaFJhbmdlICAgIDogU2VhcmNoIHJhbmdlIGluIGhvcml6b250YWwgZGlyZWN0aW9uIGZvciBNVnMKLSAqICBzWVNlYXJjaFJhbmdlICAgIDogU2VhcmNoIHJhbmdlIGluIHZlcnRpY2FsIGRpcmVjdGlvbiBmb3IgTVZzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9NT1RJT05WRUNUT1JUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1ZJREVPX01PVElPTlZFQ1RPUlRZUEUgZUFjY3VyYWN5OwotICAgIE9NWF9CT09MIGJVbnJlc3RyaWN0ZWRNVnM7Ci0gICAgT01YX0JPT0wgYkZvdXJNVjsKLSAgICBPTVhfUzMyIHNYU2VhcmNoUmFuZ2U7Ci0gICAgT01YX1MzMiBzWVNlYXJjaFJhbmdlOwotfSBPTVhfVklERU9fUEFSQU1fTU9USU9OVkVDVE9SVFlQRTsKLQotCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBtZXRob2RzIHRvIHVzZSBmb3IgSW50cmEgUmVmcmVzaCAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFIHsKLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQ3ljbGljLAotICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hBZGFwdGl2ZSwKLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQm90aCwKLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hSYW5kb20sCi0gICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1ZJREVPX0lOVFJBUkVGUkVTSFRZUEU7Ci0KLQotLyoqCi0gKiBTdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyaW5nIGludHJhIHJlZnJlc2ggbW9kZSAKLSAqIAotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZVJlZnJlc2hNb2RlIDogQ3ljbGljLCBBZGFwdGl2ZSwgb3IgQm90aAotICogIG5BaXJNQnMgICAgICA6IE51bWJlciBvZiBpbnRyYSBtYWNyb2Jsb2NrcyB0byByZWZyZXNoIGluIGEgZnJhbWUgd2hlbiAKLSAqICAgICAgICAgICAgICAgICBBSVIgaXMgZW5hYmxlZAotICogIG5BaXJSZWYgICAgICA6IE51bWJlciBvZiB0aW1lcyBhIG1vdGlvbiBtYXJrZWQgbWFjcm9ibG9jayBoYXMgdG8gYmUgIAotICogICAgICAgICAgICAgICAgIGludHJhIGNvZGVkCi0gKiAgbkNpck1CcyAgICAgIDogTnVtYmVyIG9mIGNvbnNlY3V0aXZlIG1hY3JvYmxvY2tzIHRvIGJlIGNvZGVkIGFzICJpbnRyYSIgIAotICogICAgICAgICAgICAgICAgIHdoZW4gQ0lSIGlzIGVuYWJsZWQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRSBlUmVmcmVzaE1vZGU7Ci0gICAgT01YX1UzMiBuQWlyTUJzOwotICAgIE9NWF9VMzIgbkFpclJlZjsKLSAgICBPTVhfVTMyIG5DaXJNQnM7Ci19IE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFOwotCi0KLS8qKgotICogU3RydWN0dXJlIGZvciBlbmFibGluZyB2YXJpb3VzIGVycm9yIGNvcnJlY3Rpb24gbWV0aG9kcyBmb3IgdmlkZW8gCi0gKiBjb21wcmVzc2lvbi4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvIAotICogIGJFbmFibGVIRUMgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgaGVhZGVyIGV4dGVuc2lvbiBjb2RlcyAoSEVDKQotICogIGJFbmFibGVSZXN5bmMgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgcmVzeW5jaHJvbml6YXRpb24gbWFya2VycwotICogIG5SZXN5bmNoTWFya2VyU3BhY2luZyAgIDogUmVzeW5jaCBtYXJrZXJzIGludGVydmFsIChpbiBiaXRzKSB0byBiZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgaW4gdGhlIHN0cmVhbSAKLSAqICBiRW5hYmxlRGF0YVBhcnRpdGlvbmluZyA6IEVuYWJsZS9kaXNhYmxlIGRhdGEgcGFydGl0aW9uaW5nIAotICogIGJFbmFibGVSVkxDICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgcmV2ZXJzaWJsZSB2YXJpYWJsZSBsZW5ndGggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpbmcKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRW5hYmxlSEVDOwotICAgIE9NWF9CT09MIGJFbmFibGVSZXN5bmM7Ci0gICAgT01YX1UzMiAgblJlc3luY2hNYXJrZXJTcGFjaW5nOwotICAgIE9NWF9CT09MIGJFbmFibGVEYXRhUGFydGl0aW9uaW5nOwotICAgIE9NWF9CT09MIGJFbmFibGVSVkxDOwotfSBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRTsKLQotCi0vKiogCi0gKiBDb25maWd1cmF0aW9uIG9mIHZhcmlhYmxlIGJsb2NrLXNpemUgbW90aW9uIGNvbXBlbnNhdGlvbiAoVkJTTUMpIAotICogCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgYjE2eDE2ICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggMTZ4MTYKLSAqICBiMTZ4OCAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCAxNng4Ci0gKiAgYjh4MTYgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggOHgxNgotICogIGI4eDggICAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDh4OAotICogIGI4eDQgICAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDh4NAotICogIGI0eDggICAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDR4OAotICogIGI0eDQgICAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDR4NAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fVkJTTUNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgCi0gICAgT01YX0JPT0wgYjE2eDE2OyAKLSAgICBPTVhfQk9PTCBiMTZ4ODsgCi0gICAgT01YX0JPT0wgYjh4MTY7Ci0gICAgT01YX0JPT0wgYjh4ODsKLSAgICBPTVhfQk9PTCBiOHg0OwotICAgIE9NWF9CT09MIGI0eDg7Ci0gICAgT01YX0JPT0wgYjR4NDsKLX0gT01YX1ZJREVPX1BBUkFNX1ZCU01DVFlQRTsKLQotCi0vKiogCi0gKiBILjI2MyBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCi0gKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgotICoKLSAqIEVOVU1TOgotICogIEJhc2VsaW5lICAgICAgICAgICA6IEJhc2VsaW5lIFByb2ZpbGU6IEguMjYzIChWMSksIG5vIG9wdGlvbmFsIG1vZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogIEgzMjAgQ29kaW5nICAgICAgICA6IEguMzIwIENvZGluZyBFZmZpY2llbmN5IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZTogSC4yNjMrIChWMiksIGluY2x1ZGVzIGFubmV4ZXMgSSwgSiwgTC40Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgYW5kIFQKLSAqICBCYWNrd2FyZENvbXBhdGlibGUgOiBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IFByb2ZpbGU6IEguMjYzIChWMSksIAotICogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIGFubmV4IEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICBJU1dWMiAgICAgICAgICAgICAgOiBJbnRlcmFjdGl2ZSBTdHJlYW1pbmcgV2lyZWxlc3MgUHJvZmlsZTogSC4yNjMrIAotICogICAgICAgICAgICAgICAgICAgICAgIChWMiksIGluY2x1ZGVzIGFubmV4ZXMgSSwgSiwgSyBhbmQgVCAgICAgICAgICAgICAgICAgCi0gKiAgSVNXVjMgICAgICAgICAgICAgIDogSW50ZXJhY3RpdmUgU3RyZWFtaW5nIFdpcmVsZXNzIFByb2ZpbGU6IEguMjYzKysgIAotICogICAgICAgICAgICAgICAgICAgICAgIChWMyksIGluY2x1ZGVzIHByb2ZpbGUgMyBhbmQgYW5uZXhlcyBWIGFuZCBXLjYuMy44ICAgCi0gKiAgSGlnaENvbXByZXNzaW9uICAgIDogQ29udmVyc2F0aW9uYWwgSGlnaCBDb21wcmVzc2lvbiBQcm9maWxlOiBILjI2MysrICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAoVjMpLCBpbmNsdWRlcyBwcm9maWxlcyAxICYgMiBhbmQgYW5uZXhlcyBEIGFuZCBVICAgCi0gKiAgSW50ZXJuZXQgICAgICAgICAgIDogQ29udmVyc2F0aW9uYWwgSW50ZXJuZXQgUHJvZmlsZTogSC4yNjMrKyAoVjMpLCAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgcHJvZmlsZSA1IGFuZCBhbm5leCBLICAgICAgICAgICAgICAgICAgICAgICAKLSAqICBJbnRlcmxhY2UgICAgICAgICAgOiBDb252ZXJzYXRpb25hbCBJbnRlcmxhY2UgUHJvZmlsZTogSC4yNjMrKyAoVjMpLCAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgcHJvZmlsZSA1IGFuZCBhbm5leCBXLjYuMy4xMSAgICAgICAgICAgICAgIAotICogIEhpZ2hMYXRlbmN5ICAgICAgICA6IEhpZ2ggTGF0ZW5jeSBQcm9maWxlOiBILjI2MysrIChWMyksIGluY2x1ZGVzICAKLSAqICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlIDYgYW5kIGFubmV4ZXMgTy4xIGFuZCBQLjUgICAgICAgICAgICAgICAgICAgICAgIAotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRSB7Ci0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUgICAgICAgICAgICA9IDB4MDEsICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVIMzIwQ29kaW5nICAgICAgICAgID0gMHgwMiwgICAgICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlICA9IDB4MDQsICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMiAgICAgICAgICAgICAgID0gMHgwOCwgICAgICAgICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMyAgICAgICAgICAgICAgID0gMHgxMCwgICAgICAgICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoQ29tcHJlc3Npb24gICAgID0gMHgyMCwgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybmV0ICAgICAgICAgICAgPSAweDQwLCAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybGFjZSAgICAgICAgICAgPSAweDgwLCAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaExhdGVuY3kgICAgICAgICA9IDB4MTAwLCAgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZU1heCAgICAgICAgICAgICAgICAgPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRTsKLQotCi0vKiogCi0gKiBILjI2MyBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSBzaXplcywgCi0gKiBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fSDI2M0xFVkVMVFlQRSB7Ci0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDEwICA9IDB4MDEsICAKLSAgICBPTVhfVklERU9fSDI2M0xldmVsMjAgID0gMHgwMiwgICAgICAKLSAgICBPTVhfVklERU9fSDI2M0xldmVsMzAgID0gMHgwNCwgICAgICAKLSAgICBPTVhfVklERU9fSDI2M0xldmVsNDAgID0gMHgwOCwgICAgICAKLSAgICBPTVhfVklERU9fSDI2M0xldmVsNDUgID0gMHgxMCwgICAgICAKLSAgICBPTVhfVklERU9fSDI2M0xldmVsNTAgID0gMHgyMCwgICAgICAKLSAgICBPTVhfVklERU9fSDI2M0xldmVsNjAgID0gMHg0MCwgICAgICAKLSAgICBPTVhfVklERU9fSDI2M0xldmVsNzAgID0gMHg4MCwgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fSDI2M0xldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fSDI2M0xldmVsTWF4ID0gMHg3RkZGRkZGRiAgCi19IE9NWF9WSURFT19IMjYzTEVWRUxUWVBFOwotCi0KLS8qKiAKLSAqIFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlLiBUaGVzZSB2YWx1ZXMgc2hvdWxkIGJlIE9SJ2QgdG8gc2lnbmFsIGFsbCAKLSAqIHBpY3R1cmVzIHR5cGVzIHdoaWNoIGFyZSBhbGxvd2VkLgotICoKLSAqIEVOVU1TOgotICogIEdlbmVyaWMgUGljdHVyZSBUeXBlczogICAgICAgICAgSSwgUCBhbmQgQgotICogIEguMjYzIFNwZWNpZmljIFBpY3R1cmUgVHlwZXM6ICAgU0kgYW5kIFNQCi0gKiAgSC4yNjQgU3BlY2lmaWMgUGljdHVyZSBUeXBlczogICBFSSBhbmQgRVAKLSAqICBNUEVHLTQgU3BlY2lmaWMgUGljdHVyZSBUeXBlczogIFMKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19QSUNUVVJFVFlQRSB7Ci0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlSSAgID0gMHgwMSwKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVQICAgPSAweDAyLAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZUIgICA9IDB4MDQsCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlU0kgID0gMHgwOCwKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVTUCAgPSAweDEwLAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZUVJICA9IDB4MTEsCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlRVAgID0gMHgxMiwKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVTICAgPSAweDE0LAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1ZJREVPX1BJQ1RVUkVUWVBFOwotCi0KLS8qKiAKLSAqIEguMjYzIFBhcmFtcyAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblBGcmFtZXMgICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCi0gKiAgbkJGcmFtZXMgICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIEIgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCi0gKiAgZVByb2ZpbGUgICAgICAgICAgICAgICAgIDogSC4yNjMgcHJvZmlsZShzKSB0byB1c2UKLSAqICBlTGV2ZWwgICAgICAgICAgICAgICAgICAgOiBILjI2MyBsZXZlbChzKSB0byB1c2UKLSAqICBiUExVU1BUWVBFQWxsb3dlZCAgICAgICAgOiBJbmRpY2F0aW5nIHRoYXQgaXQgaXMgYWxsb3dlZCB0byB1c2UgUExVU1BUWVBFIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcGVjaWZpZWQgaW4gdGhlIDE5OTggdmVyc2lvbiBvZiBILjI2MykgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGUgY3VzdG9tIHBpY3R1cmUgc2l6ZXMgb3IgY2xvY2sgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmNpZXMgCi0gKiAgbkFsbG93ZWRQaWN0dXJlVHlwZXMgICAgIDogU3BlY2lmaWVzIHRoZSBwaWN0dXJlIHR5cGVzIGFsbG93ZWQgaW4gdGhlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICogIGJGb3JjZVJvdW5kaW5nVHlwZVRvWmVybyA6IHZhbHVlIG9mIHRoZSBSVFlQRSBiaXQgKGJpdCA2IG9mIE1QUFRZUEUpIGlzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBjb25zdHJhaW5lZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gY2hhbmdlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgUlRZUEUgYml0IGZvciBlYWNoIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGluIGVycm9yLWZyZWUgY29tbXVuaWNhdGlvbgotICogIG5QaWN0dXJlSGVhZGVyUmVwZXRpdGlvbiA6IFNwZWNpZmllcyB0aGUgZnJlcXVlbmN5IG9mIHBpY3R1cmUgaGVhZGVyIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGV0aXRpb24KLSAqICBuR09CSGVhZGVySW50ZXJ2YWwgICAgICAgOiBTcGVjaWZpZXMgdGhlIGludGVydmFsIG9mIG5vbi1lbXB0eSBHT0IgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgaW4gdW5pdHMgb2YgR09CcwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5QRnJhbWVzOwotICAgIE9NWF9VMzIgbkJGcmFtZXM7Ci0gICAgT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLQlPTVhfVklERU9fSDI2M0xFVkVMVFlQRSBlTGV2ZWw7Ci0gICAgT01YX0JPT0wgYlBMVVNQVFlQRUFsbG93ZWQ7Ci0gICAgT01YX1UzMiBuQWxsb3dlZFBpY3R1cmVUeXBlczsKLSAgICBPTVhfQk9PTCBiRm9yY2VSb3VuZGluZ1R5cGVUb1plcm87Ci0gICAgT01YX1UzMiBuUGljdHVyZUhlYWRlclJlcGV0aXRpb247Ci0gICAgT01YX1UzMiBuR09CSGVhZGVySW50ZXJ2YWw7Ci19IE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRTsKLQotCi0vKiogCi0gKiBNUEVHLTIgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAotICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19NUEVHMlBST0ZJTEVUWVBFIHsKLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlU2ltcGxlID0gMCwgIC8qKjwgU2ltcGxlIFByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlTWFpbiwgICAgICAgIC8qKjwgTWFpbiBQcm9maWxlICovCi0gICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZTQyMiwgICAgICAgICAvKio8IDQ6MjoyIFByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlU05SLCAgICAgICAgIC8qKjwgU05SIFByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlU3BhdGlhbCwgICAgIC8qKjwgU3BhdGlhbCBQcm9maWxlICovCi0gICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZUhpZ2gsICAgICAgICAvKio8IEhpZ2ggUHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZU1heCA9IDB4N0ZGRkZGRkYgIAotfSBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRTsKLQotCi0vKiogCi0gKiBNUEVHLTIgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgCi0gKiBzaXplcywgYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZCAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19NUEVHMkxFVkVMVFlQRSB7Ci0gICAgT01YX1ZJREVPX01QRUcyTGV2ZWxMTCA9IDAsICAvKio8IExvdyBMZXZlbCAqLyAKLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbE1MLCAgICAgIC8qKjwgTWFpbiBMZXZlbCAqLyAKLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbEgxNCwgICAgIC8qKjwgSGlnaCAxNDQwICovIAotICAgIE9NWF9WSURFT19NUEVHMkxldmVsSEwsICAgICAgLyoqPCBIaWdoIExldmVsICovICAgCi0gICAgT01YX1ZJREVPX01QRUcyTGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX01QRUcyTGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19NUEVHMkxldmVsTWF4ID0gMHg3RkZGRkZGRiAgCi19IE9NWF9WSURFT19NUEVHMkxFVkVMVFlQRTsKLQotCi0vKiogCi0gKiBNUEVHLTIgcGFyYW1zIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5QRnJhbWVzICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKLSAqICBuQkZyYW1lcyAgIDogTnVtYmVyIG9mIEIgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCi0gKiAgZVByb2ZpbGUgICA6IE1QRUctMiBwcm9maWxlKHMpIHRvIHVzZQotICogIGVMZXZlbCAgICAgOiBNUEVHLTIgbGV2ZWxzKHMpIHRvIHVzZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fTVBFRzJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAKLSAgICBPTVhfVTMyIG5QRnJhbWVzOyAgICAgICAgCi0gICAgT01YX1UzMiBuQkZyYW1lczsgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHMlBST0ZJTEVUWVBFIGVQcm9maWxlOwotCU9NWF9WSURFT19NUEVHMkxFVkVMVFlQRSBlTGV2ZWw7ICAgCi19IE9NWF9WSURFT19QQVJBTV9NUEVHMlRZUEU7Ci0KLQotLyoqIAotICogTVBFRy00IHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyAKLSAqIHBlcmZvcm1hbmNlIGJvdW5kcyBhbmQgZGlmZmVyZW50IGFubmV4ZXMuCi0gKiAKLSAqIEVOVU1TOgotICogIC0gU2ltcGxlIFByb2ZpbGUsIExldmVscyAxLTMKLSAqICAtIFNpbXBsZSBTY2FsYWJsZSBQcm9maWxlLCBMZXZlbHMgMS0yCi0gKiAgLSBDb3JlIFByb2ZpbGUsIExldmVscyAxLTIKLSAqICAtIE1haW4gUHJvZmlsZSwgTGV2ZWxzIDItNAotICogIC0gTi1iaXQgUHJvZmlsZSwgTGV2ZWwgMgotICogIC0gU2NhbGFibGUgVGV4dHVyZSBQcm9maWxlLCBMZXZlbCAxCi0gKiAgLSBTaW1wbGUgRmFjZSBBbmltYXRpb24gUHJvZmlsZSwgTGV2ZWxzIDEtMgotICogIC0gU2ltcGxlIEZhY2UgYW5kIEJvZHkgQW5pbWF0aW9uIChGQkEpIFByb2ZpbGUsIExldmVscyAxLTIKLSAqICAtIEJhc2ljIEFuaW1hdGVkIFRleHR1cmUgUHJvZmlsZSwgTGV2ZWxzIDEtMgotICogIC0gSHlicmlkIFByb2ZpbGUsIExldmVscyAxLTIKLSAqICAtIEFkdmFuY2VkIFJlYWwgVGltZSBTaW1wbGUgUHJvZmlsZXMsIExldmVscyAxLTQKLSAqICAtIENvcmUgU2NhbGFibGUgUHJvZmlsZSwgTGV2ZWxzIDEtMwotICogIC0gQWR2YW5jZWQgQ29kaW5nIEVmZmljaWVuY3kgUHJvZmlsZSwgTGV2ZWxzIDEtNAotICogIC0gQWR2YW5jZWQgQ29yZSBQcm9maWxlLCBMZXZlbHMgMS0yCi0gKiAgLSBBZHZhbmNlZCBTY2FsYWJsZSBUZXh0dXJlLCBMZXZlbHMgMi0zCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSB7Ci0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSAgICAgICAgICAgPSAweDAxLCAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlICAgPSAweDAyLCAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZSAgICAgICAgICAgICA9IDB4MDQsICAgICAgICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiAgICAgICAgICAgICA9IDB4MDgsICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVOYml0ICAgICAgICAgICAgID0gMHgxMCwgICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmUgID0gMHgyMCwgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRmFjZSAgICAgICA9IDB4NDAsICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRkJBICAgICAgICA9IDB4ODAsICAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQgICAgPSAweDEwMCwgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVIeWJyaWQgICAgICAgICAgID0gMHgyMDAsICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUgPSAweDQwMCwgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlU2NhbGFibGUgICAgID0gMHg4MDAsICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nICAgPSAweDEwMDAsICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvcmUgICAgID0gMHgyMDAwLCAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlID0gMHg0MDAwLAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSAgID0gMHg4MDAwLAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1heCAgICAgICAgICAgICAgPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEU7Ci0KLQotLyoqIAotICogTVBFRy00IGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lIAotICogc2l6ZXMsIGJpdCByYXRlcywgZGVjb2RlciBmcmFtZSByYXRlcy4gIE5vIG5lZWQgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEUgewotICAgIE9NWF9WSURFT19NUEVHNExldmVsMCAgPSAweDAxLCAgIC8qKjwgTGV2ZWwgMCAqLyAgIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsMGIgPSAweDAyLCAgIC8qKjwgTGV2ZWwgMGIgKi8gICAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgID0gMHgwNCwgICAvKio8IExldmVsIDEgKi8gCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICA9IDB4MDgsICAgLyoqPCBMZXZlbCAyICovIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsMyAgPSAweDEwLCAgIC8qKjwgTGV2ZWwgMyAqLyAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDQgID0gMHgyMCwgICAvKio8IExldmVsIDQgKi8gIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsNGEgPSAweDQwLCAgIC8qKjwgTGV2ZWwgNGEgKi8gIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsNSAgPSAweDgwLCAgIC8qKjwgTGV2ZWwgNSAqLyAgCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19NUEVHNExldmVsTWF4ID0gMHg3RkZGRkZGRiAgCi19IE9NWF9WSURFT19NUEVHNExFVkVMVFlQRTsKLQotCi0vKiogCi0gKiBNUEVHLTQgY29uZmlndXJhdGlvbi4gIFRoaXMgc3RydWN0dXJlIGhhbmRsZXMgY29uZmlndXJhdGlvbiBvcHRpb25zCi0gKiB3aGljaCBhcmUgc3BlY2lmaWMgdG8gTVBFRzQgYWxnb3JpdGhtcwotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5TbGljZUhlYWRlclNwYWNpbmcgIDogTnVtYmVyIG9mIG1hY3JvYmxvY2tzIGJldHdlZW4gc2xpY2UgaGVhZGVyIChIMjYzKyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEFubmV4IEspLiBQdXQgemVybyBpZiBub3QgdXNlZAotICogIGJTVkggICAgICAgICAgICAgICAgIDogRW5hYmxlIFNob3J0IFZpZGVvIEhlYWRlciBtb2RlCi0gKiAgYkdvdiAgICAgICAgICAgICAgICAgOiBGbGFnIHRvIGVuYWJsZSBHT1YKLSAqICBuUEZyYW1lcyAgICAgICAgICAgICA6IE51bWJlciBvZiBQIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZSAoYWxzbyBjYWxsZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBHT1YgcGVyaW9kKQotICogIG5CRnJhbWVzICAgICAgICAgICAgIDogTnVtYmVyIG9mIEIgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCi0gKiAgbklEQ1ZMQ1RocmVzaG9sZCAgICAgOiBWYWx1ZSBvZiBpbnRyYSBEQyBWTEMgdGhyZXNob2xkCi0gKiAgYkFDUHJlZCAgICAgICAgICAgICAgOiBGbGFnIHRvIHVzZSBhYyBwcmVkaWN0aW9uCi0gKiAgbk1heFBhY2tldFNpemUgICAgICAgOiBNYXhpbXVtIHNpemUgb2YgcGFja2V0IGluIGJ5dGVzLgotICogIG5UaW1lSW5jUmVzICAgICAgICAgIDogVXNlZCB0byBwYXNzIFZPUCB0aW1lIGluY3JlbWVudCByZXNvbHV0aW9uIGZvciBNUEVHNC4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnByZXRlZCBhcyBkZXNjcmliZWQgaW4gTVBFRzQgc3RhbmRhcmQuCi0gKiAgZVByb2ZpbGUgICAgICAgICAgICAgOiBNUEVHLTQgcHJvZmlsZShzKSB0byB1c2UuCi0gKiAgZUxldmVsICAgICAgICAgICAgICAgOiBNUEVHLTQgbGV2ZWwocykgdG8gdXNlLgotICogIG5BbGxvd2VkUGljdHVyZVR5cGVzIDogU3BlY2lmaWVzIHRoZSBwaWN0dXJlIHR5cGVzIGFsbG93ZWQgaW4gdGhlIGJpdHN0cmVhbQotICogIG5IZWFkZXJFeHRlbnNpb24gICAgIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgdmlkZW8gcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzIHdpdGhpbiBhIFZPUAotICogIGJSZXZlcnNpYmxlVkxDICAgICAgIDogU3BlY2lmaWVzIHdoZXRoZXIgcmV2ZXJzaWJsZSB2YXJpYWJsZSBsZW5ndGggY29kaW5nIAotICogICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW4gdXNlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5TbGljZUhlYWRlclNwYWNpbmc7Ci0gICAgT01YX0JPT0wgYlNWSDsKLSAgICBPTVhfQk9PTCBiR292OwotICAgIE9NWF9VMzIgblBGcmFtZXM7Ci0gICAgT01YX1UzMiBuQkZyYW1lczsKLSAgICBPTVhfVTMyIG5JRENWTENUaHJlc2hvbGQ7Ci0gICAgT01YX0JPT0wgYkFDUHJlZDsKLSAgICBPTVhfVTMyIG5NYXhQYWNrZXRTaXplOwotICAgIE9NWF9VMzIgblRpbWVJbmNSZXM7Ci0gICAgT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgZVByb2ZpbGU7Ci0gICAgT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFIGVMZXZlbDsKLSAgICBPTVhfVTMyIG5BbGxvd2VkUGljdHVyZVR5cGVzOwotICAgIE9NWF9VMzIgbkhlYWRlckV4dGVuc2lvbjsKLSAgICBPTVhfQk9PTCBiUmV2ZXJzaWJsZVZMQzsKLX0gT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRTsKLQotCi0vKiogCi0gKiBXTVYgVmVyc2lvbnMgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fV01WRk9STUFUVFlQRSB7Ci0gICAgT01YX1ZJREVPX1dNVkZvcm1hdFVudXNlZCA9IDB4MDEsICAgLyoqPCBGb3JtYXQgdW51c2VkIG9yIHVua25vd24gKi8KLSAgICBPTVhfVklERU9fV01WRm9ybWF0NyAgICAgID0gMHgwMiwgICAvKio8IFdpbmRvd3MgTWVkaWEgVmlkZW8gZm9ybWF0IDcgKi8KLSAgICBPTVhfVklERU9fV01WRm9ybWF0OCAgICAgID0gMHgwNCwgICAvKio8IFdpbmRvd3MgTWVkaWEgVmlkZW8gZm9ybWF0IDggKi8KLSAgICBPTVhfVklERU9fV01WRm9ybWF0OSAgICAgID0gMHgwOCwgICAvKio8IFdpbmRvd3MgTWVkaWEgVmlkZW8gZm9ybWF0IDkgKi8KLSAgICBPTVhfVklERU9fV01GRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19XTUZGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19XTVZGb3JtYXRNYXggICAgPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19XTVZGT1JNQVRUWVBFOwotCi0KLS8qKiAKLSAqIFdNViBQYXJhbXMgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUZvcm1hdCAgICA6IFZlcnNpb24gb2YgV01WIHN0cmVhbSAvIGRhdGEKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1dNVlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7IAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1ZJREVPX1dNVkZPUk1BVFRZUEUgZUZvcm1hdDsKLX0gT01YX1ZJREVPX1BBUkFNX1dNVlRZUEU7Ci0KLQotLyoqIAotICogUmVhbCBWaWRlbyBWZXJzaW9uIAotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX1JWRk9STUFUVFlQRSB7Ci0gICAgT01YX1ZJREVPX1JWRm9ybWF0VW51c2VkID0gMCwgLyoqPCBGb3JtYXQgdW51c2VkIG9yIHVua25vd24gKi8KLSAgICBPTVhfVklERU9fUlZGb3JtYXQ4LCAgICAgICAgICAvKio8IFJlYWwgVmlkZW8gZm9ybWF0IDggKi8KLSAgICBPTVhfVklERU9fUlZGb3JtYXQ5LCAgICAgICAgICAvKio8IFJlYWwgVmlkZW8gZm9ybWF0IDkgKi8KLSAgICBPTVhfVklERU9fUlZGb3JtYXRHMiwgICAgICAgICAvKio8IFJlYWwgVmlkZW8gRm9ybWF0IEcyICovCi0gICAgT01YX1ZJREVPX1JWRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19SVkZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX1JWRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fUlZGT1JNQVRUWVBFOwotCi0KLS8qKiAKLSAqIFJlYWwgVmlkZW8gUGFyYW1zIAotICoKLSAqIFNUVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4ICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVGb3JtYXQgICAgICAgICAgICA6IFZlcnNpb24gb2YgUlYgc3RyZWFtIC8gZGF0YQotICogIG5CaXRzUGVyUGl4ZWwgICAgICA6IEJpdHMgcGVyIHBpeGVsIGNvZGVkIGluIHRoZSBmcmFtZQotICogIG5QYWRkZWRXaWR0aCAgICAgICA6IFBhZGRlZCB3aWR0aCBpbiBwaXhlbCBvZiBhIHZpZGVvIGZyYW1lCi0gKiAgblBhZGRlZEhlaWdodCAgICAgIDogUGFkZGVkIEhlaWdodCBpbiBwaXhlbHMgb2YgYSB2aWRlbyBmcmFtZQotICogIG5GcmFtZVJhdGUgICAgICAgICA6IFJhdGUgb2YgdmlkZW8gaW4gZnJhbWVzIHBlciBzZWNvbmQKLSAqICBuQml0c3RyZWFtRmxhZ3MgICAgOiBGbGFncyB3aGljaCBpbnRlcm5hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYml0c3RyZWFtCi0gKiAgbkJpdHN0cmVhbVZlcnNpb24gIDogQml0c3RyZWFtIHZlcnNpb24KLSAqICBuTWF4RW5jb2RlRnJhbWVTaXplOiBNYXggZW5jb2RlZCBmcmFtZSBzaXplCi0gKiAgYkVuYWJsZVBvc3RGaWx0ZXIgIDogVHVybiBvbi9vZmYgcG9zdCBmaWx0ZXIKLSAqICBiRW5hYmxlVGVtcG9yYWxJbnRlcnBvbGF0aW9uIDogVHVybiBvbi9vZmYgdGVtcG9yYWwgaW50ZXJwb2xhdGlvbgotICogIGJFbmFibGVMYXRlbmN5TW9kZSA6IFdoZW4gZW5hYmxlZCwgdGhlIGRlY29kZXIgZG9lcyBub3QgZGlzcGxheSBhIGRlY29kZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgdW50aWwgaXQgaGFzIGRldGVjdGVkIHRoYXQgbm8gZW5oYW5jZW1lbnQgbGF5ZXIgCi0gKiAgCQkJCQkgZnJhbWVzIG9yIGRlcGVuZGVudCBCIGZyYW1lcyB3aWxsIGJlIGNvbWluZy4gVGhpcyAKLSAqICAJCQkJCSBkZXRlY3Rpb24gdXN1YWxseSBvY2N1cnMgd2hlbiBhIHN1YnNlcXVlbnQgbm9uLUIgCi0gKiAgCQkJCQkgZnJhbWUgaXMgZW5jb3VudGVyZWQgCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9SVlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVklERU9fUlZGT1JNQVRUWVBFIGVGb3JtYXQ7Ci0gICAgT01YX1UxNiBuQml0c1BlclBpeGVsOwotICAgIE9NWF9VMTYgblBhZGRlZFdpZHRoOwotICAgIE9NWF9VMTYgblBhZGRlZEhlaWdodDsKLSAgICBPTVhfVTMyIG5GcmFtZVJhdGU7Ci0gICAgT01YX1UzMiBuQml0c3RyZWFtRmxhZ3M7Ci0gICAgT01YX1UzMiBuQml0c3RyZWFtVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5NYXhFbmNvZGVGcmFtZVNpemU7Ci0gICAgT01YX0JPT0wgYkVuYWJsZVBvc3RGaWx0ZXI7Ci0gICAgT01YX0JPT0wgYkVuYWJsZVRlbXBvcmFsSW50ZXJwb2xhdGlvbjsKLSAgICBPTVhfQk9PTCBiRW5hYmxlTGF0ZW5jeU1vZGU7Ci19IE9NWF9WSURFT19QQVJBTV9SVlRZUEU7Ci0KLQotLyoqIAotICogQVZDIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyAKLSAqIHBlcmZvcm1hbmNlIGJvdW5kcyBhbmQgZGlmZmVyZW50IGFubmV4ZXMuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgewotICAgIE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUgPSAweDAxLCAgIC8qKjwgQmFzZWxpbmUgcHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiAgICAgPSAweDAyLCAgIC8qKjwgTWFpbiBwcm9maWxlICovCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVFeHRlbmRlZCA9IDB4MDQsICAgLyoqPCBFeHRlbmRlZCBwcm9maWxlICovCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoICAgICA9IDB4MDgsICAgLyoqPCBIaWdoIHByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gxMCAgID0gMHgxMCwgICAvKio8IEhpZ2ggMTAgcHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDQyMiAgPSAweDIwLCAgIC8qKjwgSGlnaCA0OjI6MiBwcm9maWxlICovCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDQ0ICA9IDB4NDAsICAgLyoqPCBIaWdoIDQ6NDo0IHByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYXggICAgICA9IDB4N0ZGRkZGRkYgIAotfSBPTVhfVklERU9fQVZDUFJPRklMRVRZUEU7Ci0KLQotLyoqIAotICogQVZDIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lIHNpemVzLCAKLSAqIGJpdCByYXRlcywgZGVjb2RlciBmcmFtZSByYXRlcy4gIE5vIG5lZWQgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fQVZDTEVWRUxUWVBFIHsKLSAgICBPTVhfVklERU9fQVZDTGV2ZWwxICAgPSAweDAxLCAgICAgLyoqPCBMZXZlbCAxICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMWIgID0gMHgwMiwgICAgIC8qKjwgTGV2ZWwgMWIgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwxMSAgPSAweDA0LCAgICAgLyoqPCBMZXZlbCAxLjEgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwxMiAgPSAweDA4LCAgICAgLyoqPCBMZXZlbCAxLjIgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwxMyAgPSAweDEwLCAgICAgLyoqPCBMZXZlbCAxLjMgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwyICAgPSAweDIwLCAgICAgLyoqPCBMZXZlbCAyICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMjEgID0gMHg0MCwgICAgIC8qKjwgTGV2ZWwgMi4xICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMjIgID0gMHg4MCwgICAgIC8qKjwgTGV2ZWwgMi4yICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMyAgID0gMHgxMDAsICAgIC8qKjwgTGV2ZWwgMyAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDMxICA9IDB4MjAwLCAgICAvKio8IExldmVsIDMuMSAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDMyICA9IDB4NDAwLCAgICAvKio8IExldmVsIDMuMiAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDQgICA9IDB4ODAwLCAgICAvKio8IExldmVsIDQgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWw0MSAgPSAweDEwMDAsICAgLyoqPCBMZXZlbCA0LjEgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWw0MiAgPSAweDIwMDAsICAgLyoqPCBMZXZlbCA0LjIgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWw1ICAgPSAweDQwMDAsICAgLyoqPCBMZXZlbCA1ICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsNTEgID0gMHg4MDAwLCAgIC8qKjwgTGV2ZWwgNS4xICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsNTIgID0gMHgxMDAwMCwgICAvKio8IExldmVsIDUuMiAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fQVZDTGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAotfSBPTVhfVklERU9fQVZDTEVWRUxUWVBFOwotCi0KLS8qKiAKLSAqIEFWQyBsb29wIGZpbHRlciBtb2RlcyAKLSAqCi0gKiBPTVhfVklERU9fQVZDTG9vcEZpbHRlckVuYWJsZSAgICAgICAgICAgICAgIDogRW5hYmxlCi0gKiBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGUgICAgICAgICAgICAgIDogRGlzYWJsZQotICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlU2xpY2VCb3VuZGFyeSA6IERpc2FibGVkIG9uIHNsaWNlIGJvdW5kYXJpZXMKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNMT09QRklMVEVSVFlQRSB7Ci0gICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGUgPSAwLAotICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZSwKLSAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGVTbGljZUJvdW5kYXJ5LAotICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlck1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1ZJREVPX0FWQ0xPT1BGSUxURVJUWVBFOwotCi0KLS8qKiAKLSAqIEFWQyBwYXJhbXMgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblNsaWNlSGVhZGVyU3BhY2luZyAgICAgICA6IE51bWJlciBvZiBtYWNyb2Jsb2NrcyBiZXR3ZWVuIHNsaWNlIGhlYWRlciwgcHV0ICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybyBpZiBub3QgdXNlZAotICogIG5QRnJhbWVzICAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKLSAqICBuQkZyYW1lcyAgICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIEIgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCi0gKiAgYlVzZUhhZGFtYXJkICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIEhhZGFtYXJkIHRyYW5zZm9ybQotICogIG5SZWZGcmFtZXMgICAgICAgICAgICAgICAgOiBNYXggbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgdG8gdXNlIGZvciBpbnRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gc2VhcmNoICgxLTE2KQotICogIG5SZWZJZHhUcmFpbGluZyAgICAgICAgICAgOiBQaWMgcGFyYW0gc2V0IHJlZiBmcmFtZSBpbmRleCAoaW5kZXggaW50byByZWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgYnVmZmVyIG9mIHRyYWlsaW5nIGZyYW1lcyBsaXN0KSwgQiBmcmFtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0Ci0gKiAgblJlZklkeEZvcndhcmQgICAgICAgICAgICA6IFBpYyBwYXJhbSBzZXQgcmVmIGZyYW1lIGluZGV4IChpbmRleCBpbnRvIHJlZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBidWZmZXIgb2YgZm9yd2FyZCBmcmFtZXMgbGlzdCksIEIgZnJhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAotICogIGJFbmFibGVVRVAgICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSB1bmVxdWFsIGVycm9yIHByb3RlY3Rpb24uIFRoaXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgdmFsaWQgb2YgZGF0YSBwYXJ0aXRpb25pbmcgaXMgZW5hYmxlZC4KLSAqICBiRW5hYmxlRk1PICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgZmxleGlibGUgbWFjcm9ibG9jayBvcmRlcmluZwotICogIGJFbmFibGVBU08gICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBhcmJpdHJhcnkgc2xpY2Ugb3JkZXJpbmcKLSAqICBiRW5hYmxlUlMgICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgc2VuZGluZyBvZiByZWR1bmRhbnQgc2xpY2VzCi0gKiAgZVByb2ZpbGUgICAgICAgICAgICAgICAgICA6IEFWQyBwcm9maWxlKHMpIHRvIHVzZQotICogIGVMZXZlbCAgICAgICAgICAgICAgICAgICAgOiBBVkMgbGV2ZWwocykgdG8gdXNlCi0gKiAgbkFsbG93ZWRQaWN0dXJlVHlwZXMgICAgICA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiAgYkZyYW1lTUJzT25seSAgICAgICAgICAgICA6IHNwZWNpZmllcyB0aGF0IGV2ZXJ5IGNvZGVkIHBpY3R1cmUgb2YgdGhlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCB2aWRlbyBzZXF1ZW5jZSBpcyBhIGNvZGVkIGZyYW1lIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIG9ubHkgZnJhbWUgbWFjcm9ibG9ja3MKLSAqICBiTUJBRkYgICAgICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgc3dpdGNoaW5nIGJldHdlZW4gZnJhbWUgYW5kIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBtYWNyb2Jsb2NrcyB3aXRoaW4gYSBwaWN0dXJlCi0gKiAgYkVudHJvcHlDb2RpbmdDQUJBQyAgICAgICA6IEVudHJvcHkgZGVjb2RpbmcgbWV0aG9kIHRvIGJlIGFwcGxpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4IGVsZW1lbnRzIGZvciB3aGljaCB0d28gZGVzY3JpcHRvcnMgYXBwZWFyIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgc3ludGF4IHRhYmxlcwotICogIGJXZWlnaHRlZFBQcmVkaWN0aW9uICAgICAgOiBFbmFibGUvZGlzYWJsZSB3ZWlnaHRlZCBwcmVkaWN0aW9uIHNoYWxsIG5vdCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXBwbGllZCB0byBQIGFuZCBTUCBzbGljZXMKLSAqICBuV2VpZ2h0ZWRCaXByZWRpY2l0b25Nb2RlIDogRGVmYXVsdCB3ZWlnaHRlZCBwcmVkaWN0aW9uIGlzIGFwcGxpZWQgdG8gQiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzIAotICogIGJjb25zdElwcmVkICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBpbnRyYSBwcmVkaWN0aW9uCi0gKiAgYkRpcmVjdDh4OEluZmVyZW5jZSAgICAgICA6IFNwZWNpZmllcyB0aGUgbWV0aG9kIHVzZWQgaW4gdGhlIGRlcml2YXRpb24gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgZm9yIGx1bWEgbW90aW9uIHZlY3RvcnMgZm9yIEJfU2tpcCwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJfRGlyZWN0XzE2eDE2IGFuZCBCX0RpcmVjdF84eDggYXMgc3BlY2lmaWVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzdWJjbGF1c2UgOC40LjEuMiBvZiB0aGUgQVZDIHNwZWMgCi0gKiAgYkRpcmVjdFNwYXRpYWxUZW1wb3JhbCAgICA6IEZsYWcgaW5kaWNhdGluZyBzcGF0aWFsIG9yIHRlbXBvcmFsIGRpcmVjdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHVzZWQgaW4gQiBzbGljZSBjb2RpbmcgKHJlbGF0ZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEaXJlY3Q4eDhJbmZlcmVuY2UpIC4gU3BhdGlhbCBkaXJlY3QgbW9kZSBpcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBjb21tb24gYW5kIHNob3VsZCBiZSB0aGUgZGVmYXVsdC4KLSAqICBuQ2FiYWNJbml0SWR4ICAgICAgICAgICAgIDogSW5kZXggdXNlZCB0byBpbml0IENBQkFDIGNvbnRleHRzCi0gKiAgZUxvb3BGaWx0ZXJNb2RlICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGxvb3AgZmlsdGVyCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9BVkNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5TbGljZUhlYWRlclNwYWNpbmc7ICAKLSAgICBPTVhfVTMyIG5QRnJhbWVzOyAgICAgCi0gICAgT01YX1UzMiBuQkZyYW1lczsgICAgIAotICAgIE9NWF9CT09MIGJVc2VIYWRhbWFyZDsKLSAgICBPTVhfVTMyIG5SZWZGcmFtZXM7ICAKLQlPTVhfVTMyIG5SZWZJZHgxMEFjdGl2ZU1pbnVzMTsKLQlPTVhfVTMyIG5SZWZJZHgxMUFjdGl2ZU1pbnVzMTsKLSAgICBPTVhfQk9PTCBiRW5hYmxlVUVQOyAgCi0gICAgT01YX0JPT0wgYkVuYWJsZUZNTzsgIAotICAgIE9NWF9CT09MIGJFbmFibGVBU087ICAKLSAgICBPTVhfQk9PTCBiRW5hYmxlUlM7ICAgCi0gICAgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIGVQcm9maWxlOwotCU9NWF9WSURFT19BVkNMRVZFTFRZUEUgZUxldmVsOyAKLSAgICBPTVhfVTMyIG5BbGxvd2VkUGljdHVyZVR5cGVzOyAgCi0JT01YX0JPT0wgYkZyYW1lTUJzT25seTsgICAgICAgIAkJCQkJCQkJCQotICAgIE9NWF9CT09MIGJNQkFGRjsgICAgICAgICAgICAgICAKLSAgICBPTVhfQk9PTCBiRW50cm9weUNvZGluZ0NBQkFDOyAgCi0gICAgT01YX0JPT0wgYldlaWdodGVkUFByZWRpY3Rpb247IAotICAgIE9NWF9VMzIgbldlaWdodGVkQmlwcmVkaWNpdG9uTW9kZTsgCi0gICAgT01YX0JPT0wgYmNvbnN0SXByZWQgOwotICAgIE9NWF9CT09MIGJEaXJlY3Q4eDhJbmZlcmVuY2U7ICAKLQlPTVhfQk9PTCBiRGlyZWN0U3BhdGlhbFRlbXBvcmFsOwotCU9NWF9VMzIgbkNhYmFjSW5pdElkYzsKLQlPTVhfVklERU9fQVZDTE9PUEZJTFRFUlRZUEUgZUxvb3BGaWx0ZXJNb2RlOwotfSBPTVhfVklERU9fUEFSQU1fQVZDVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgewotICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIAotICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIAotICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIAotICAgT01YX1UzMiBlUHJvZmlsZTsgICAgICAvKio8IHR5cGUgaXMgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFLCBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIGRlcGVuZGluZyBvbiBjb250ZXh0ICovCi0gICBPTVhfVTMyIGVMZXZlbDsgICAgICAgIC8qKjwgdHlwZSBpcyBPTVhfVklERU9fQVZDTEVWRUxUWVBFLCBPTVhfVklERU9fSDI2M0xFVkVMVFlQRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBkZXBlbmRpbmcgb24gY29udGV4dCAqLwotICAgT01YX1UzMiBuUHJvZmlsZUluZGV4OyAvKio8IFVzZWQgdG8gcXVlcnkgZm9yIGluZGl2aWR1YWwgcHJvZmlsZSBzdXBwb3J0IGluZm9ybWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYWxsIG90aGVyIGluZGljZXMgdGhpcyBwYXJhbWV0ZXIgaXMgdG8gYmUgaWdub3JlZC4gKi8KLX0gT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEU7Ci0KLS8qKiAKLSAqIFN0cnVjdHVyZSBmb3IgZHluYW1pY2FsbHkgY29uZmlndXJpbmcgYml0cmF0ZSBtb2RlIG9mIGEgY29kZWMuIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgOiBPTVggc3BlYyB2ZXJzaW9uIGluZm8KLSAqICBuUG9ydEluZGV4ICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvCi0gKiAgbkVuY29kZUJpdHJhdGUgOiBUYXJnZXQgYXZlcmFnZSBiaXRyYXRlIHRvIGJlIGdlbmVyYXRlZCBpbiBicHMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1UzMiBuRW5jb2RlQml0cmF0ZTsgICAgICAgICAgICAgICAgIAotfSBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFOwotCi0vKiogCi0gKiBEZWZpbmVzIEVuY29kZXIgRnJhbWUgUmF0ZSBzZXR0aW5nCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIHhFbmNvZGVGcmFtZXJhdGUgOiBFbmNvZGluZyBmcmFtZXJhdGUgcmVwcmVzZW50ZWQgaW4gUTE2IGZvcm1hdAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIHhFbmNvZGVGcmFtZXJhdGU7IC8qIFExNiBmb3JtYXQgKi8KLX0gT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBJbnRyYVJlZnJlc2hWT1A7Ci19IE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuRXJyTWFwU2l6ZTsgICAgICAgICAgIC8qIFNpemUgb2YgdGhlIEVycm9yIE1hcCBpbiBieXRlcyAqLwotICAgIE9NWF9VOCAgRXJyTWFwWzFdOyAgICAgICAgICAgICAvKiBFcnJvciBtYXAgaGludCAqLwotfSBPTVhfQ09ORklHX01BQ1JPQkxPQ0tFUlJPUk1BUFRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUJFUlJPUlJFUE9SVElOR1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRW5hYmxlZDsKLX0gT01YX0NPTkZJR19NQkVSUk9SUkVQT1JUSU5HVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX01BQ1JPQkxPQ0tTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbk1hY3JvYmxvY2tzOwotfSBPTVhfUEFSQU1fTUFDUk9CTE9DS1NUWVBFOwotCi0vKiogCi0gKiBBVkMgU2xpY2UgTW9kZSBtb2RlcyAKLSAqCi0gKiBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0RlZmF1bHQgICA6IE5vcm1hbCBmcmFtZSBlbmNvZGluZywgb25lIHNsaWNlIHBlciBmcmFtZQotICogT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNNQlNsaWNlICAgOiBOQUwgbW9kZSwgbnVtYmVyIG9mIE1CcyBwZXIgZnJhbWUKLSAqIE9NWF9WSURFT19TTElDRU1PREVfQVZDQnl0ZVNsaWNlIDogTkFMIG1vZGUsIG51bWJlciBvZiBieXRlcyBwZXIgZnJhbWUKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNTTElDRU1PREVUWVBFIHsKLSAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0RlZmF1bHQgPSAwLAotICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDTUJTbGljZSwKLSAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0J5dGVTbGljZSwKLSAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNMZXZlbE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1ZJREVPX0FWQ1NMSUNFTU9ERVRZUEU7Ci0KLS8qKiAKLSAqIEFWQyBGTU8gU2xpY2UgTW9kZSBQYXJhbXMgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbk51bVNsaWNlR3JvdXBzIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2xpY2UgZ3JvdXBzCi0gKiAgblNsaWNlR3JvdXBNYXBUeXBlIDogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHNsaWNlIGdyb3VwcwotICogIGVTbGljZU1vZGUgOiBTcGVjaWZpZXMgdGhlIHR5cGUgb2Ygc2xpY2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1PIHsKLSAgICBPTVhfVTMyIG5TaXplOyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VOCBuTnVtU2xpY2VHcm91cHM7Ci0gICAgT01YX1U4IG5TbGljZUdyb3VwTWFwVHlwZTsKLSAgICBPTVhfVklERU9fQVZDU0xJQ0VNT0RFVFlQRSBlU2xpY2VNb2RlOwotfSBPTVhfVklERU9fUEFSQU1fQVZDU0xJQ0VGTU87Ci0KLS8qKiAKLSAqIEFWQyBJRFIgUGVyaW9kIENvbmZpZ3MKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuSURSUGVyaW9kIDogU3BlY2lmaWVzIHBlcmlvZGljaXR5IG9mIElEUiBmcmFtZXMKLSAqICBuUEZyYW1lcyA6IFNwZWNpZmllcyBpbnRlcm5hbCBvZiBjb2RpbmcgSW50cmEgZnJhbWVzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0QgewotICAgIE9NWF9VMzIgblNpemU7IAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuSURSUGVyaW9kOwotICAgIE9NWF9VMzIgblBGcmFtZXM7Ci19IE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0Q7Ci0KLS8qKiAKLSAqIEFWQyBOQUwgU2l6ZSBDb25maWdzCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbk5hbHVCeXRlcyA6IFNwZWNpZmllcyB0aGUgTkFMIHVuaXQgc2l6ZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fQ09ORklHX05BTFNJWkUgewotICAgIE9NWF9VMzIgblNpemU7IAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuTmFsdUJ5dGVzOwotfSBPTVhfVklERU9fQ09ORklHX05BTFNJWkU7Ci0KLQotLyoqCi0gKiBEZWludGVybGFjZSBDb25maWcKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuRW5hYmxlIDogU3BlY2lmaWVzIHRvIGVuYWJsZSBkZWludGVybGFjZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fQ09ORklHX0RFSU5URVJMQUNFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuRW5hYmxlOwotfSBPTVhfVklERU9fQ09ORklHX0RFSU5URVJMQUNFOwotCi0vKiogQH0gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwotCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9pbmMvT01YX1ZpZGVvRXh0LmggYi9zZG04NDUvbW0tY29yZS9pbmMvT01YX1ZpZGVvRXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMGE3OGMuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL09NWF9WaWRlb0V4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKi8KLQotLyoqIE9NWF9WaWRlb0V4dC5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiBUaGUgT01YX1ZpZGVvRXh0IGhlYWRlciBmaWxlIGNvbnRhaW5zIGV4dGVuc2lvbnMgdG8gdGhlCi0gKiBkZWZpbml0aW9ucyB1c2VkIGJ5IGJvdGggdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50IHRvCi0gKiBhY2Nlc3MgdmlkZW8gaXRlbXMuCi0gKi8KLQotI2lmbmRlZiBPTVhfVmlkZW9FeHRfaAotI2RlZmluZSBPTVhfVmlkZW9FeHRfaAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qIEVhY2ggT01YIGhlYWRlciBzaGFsbCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5Ci0gKi8KLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotCi0vKiogTkFMVSBGb3JtYXRzICovCi10eXBlZGVmIGVudW0gT01YX05BTFVGT1JNQVRTVFlQRSB7Ci0gICAgT01YX05hbHVGb3JtYXRTdGFydENvZGVzID0gMSwKLSAgICBPTVhfTmFsdUZvcm1hdE9uZU5hbHVQZXJCdWZmZXIgPSAyLAotICAgIE9NWF9OYWx1Rm9ybWF0T25lQnl0ZUludGVybGVhdmVMZW5ndGggPSA0LAotICAgIE9NWF9OYWx1Rm9ybWF0VHdvQnl0ZUludGVybGVhdmVMZW5ndGggPSA4LAotICAgIE9NWF9OYWx1Rm9ybWF0Rm91ckJ5dGVJbnRlcmxlYXZlTGVuZ3RoID0gMTYsCi0gICAgT01YX05hbHVGb3JtYXRDb2RpbmdNYXggPSAweDdGRkZGRkZGCi19IE9NWF9OQUxVRk9STUFUU1RZUEU7Ci0KLS8qKiBOQUwgU3RyZWFtIEZvcm1hdCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX05BTFNUUkVBTUZPUk1BVFRZUEV7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9OQUxVRk9STUFUU1RZUEUgZU5hbHVGb3JtYXQ7Ci19IE9NWF9OQUxTVFJFQU1GT1JNQVRUWVBFOwotCi0vKiogQVZDIGFkZGl0aW9uYWwgcHJvZmlsZXMgKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fQVZDUFJPRklMRUVYVFRZUEUgewotICAgIE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZSA9IDB4MTAwMDAsICAgLyoqPCBDb25zdHJhaW5lZCBiYXNlbGluZSBwcm9maWxlICovCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2ggICAgID0gMHg4MDAwMCwgICAvKio8IENvbnN0cmFpbmVkIGhpZ2ggcHJvZmlsZSAqLwotfSBPTVhfVklERU9fQVZDUFJPRklMRUVYVFRZUEU7Ci0KLS8qKiBWUDggcHJvZmlsZXMgKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fVlA4UFJPRklMRVRZUEUgewotICAgIE9NWF9WSURFT19WUDhQcm9maWxlTWFpbiA9IDB4MDEsCi0gICAgT01YX1ZJREVPX1ZQOFByb2ZpbGVVbmtub3duID0gMHg2RUZGRkZGRiwKLSAgICBPTVhfVklERU9fVlA4UHJvZmlsZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1ZJREVPX1ZQOFBST0ZJTEVUWVBFOwotCi0vKiogVlA4IGxldmVscyAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19WUDhMRVZFTFRZUEUgewotICAgIE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMCA9IDB4MDEsCi0gICAgT01YX1ZJREVPX1ZQOExldmVsX1ZlcnNpb24xID0gMHgwMiwKLSAgICBPTVhfVklERU9fVlA4TGV2ZWxfVmVyc2lvbjIgPSAweDA0LAotICAgIE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMyA9IDB4MDgsCi0gICAgT01YX1ZJREVPX1ZQOExldmVsVW5rbm93biA9IDB4NkVGRkZGRkYsCi0gICAgT01YX1ZJREVPX1ZQOExldmVsTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fVlA4TEVWRUxUWVBFOwotCi0vKiogVlA4IFBhcmFtICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fVlA4VFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9WSURFT19WUDhQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLSAgICBPTVhfVklERU9fVlA4TEVWRUxUWVBFIGVMZXZlbDsKLSAgICBPTVhfVTMyIG5EQ1RQYXJ0aXRpb25zOwotICAgIE9NWF9CT09MIGJFcnJvclJlc2lsaWVudE1vZGU7Ci19IE9NWF9WSURFT19QQVJBTV9WUDhUWVBFOwotCi0vKiogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyBWUDggcmVmZXJlbmNlIGZyYW1lcyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1ZQOFJFRkVSRU5DRUZSQU1FVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJQcmV2aW91c0ZyYW1lUmVmcmVzaDsKLSAgICBPTVhfQk9PTCBiR29sZGVuRnJhbWVSZWZyZXNoOwotICAgIE9NWF9CT09MIGJBbHRlcm5hdGVGcmFtZVJlZnJlc2g7Ci0gICAgT01YX0JPT0wgYlVzZVByZXZpb3VzRnJhbWU7Ci0gICAgT01YX0JPT0wgYlVzZUdvbGRlbkZyYW1lOwotICAgIE9NWF9CT09MIGJVc2VBbHRlcm5hdGVGcmFtZTsKLX0gT01YX1ZJREVPX1ZQOFJFRkVSRU5DRUZSQU1FVFlQRTsKLQotLyoqIFN0cnVjdHVyZSBmb3IgcXVlcnlpbmcgVlA4IHJlZmVyZW5jZSBmcmFtZSB0eXBlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fVlA4UkVGRVJFTkNFRlJBTUVJTkZPVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJJc0ludHJhRnJhbWU7Ci0gICAgT01YX0JPT0wgYklzR29sZGVuT3JBbHRlcm5hdGVGcmFtZTsKLX0gT01YX1ZJREVPX1ZQOFJFRkVSRU5DRUZSQU1FSU5GT1RZUEU7Ci0KLS8qKiBIRVZDIFByb2ZpbGVzICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX0hFVkNQUk9GSUxFVFlQRSB7Ci0gICAgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiAgICA9IDB4MDEsCi0gICAgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwICA9IDB4MDIsCi0gICAgLy8gTWFpbjEwIHByb2ZpbGUgd2l0aCBIRFIgU0VJIHN1cHBvcnQuCi0gICAgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwSERSMTAgID0gMHgxMDAwLAotICAgIE9NWF9WSURFT19IRVZDUHJvZmlsZVVua25vd24gPSAweDZFRkZGRkZGLAotICAgIE9NWF9WSURFT19IRVZDUHJvZmlsZU1heCAgICAgID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fSEVWQ1BST0ZJTEVUWVBFOwotCi0vKiogSEVWQyBsZXZlbHMgKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fSEVWQ0xFVkVMVFlQRSB7Ci0gICAgT01YX1ZJREVPX0hFVkNMZXZlbF9WZXJzaW9uMCAgPSAweDAsCi0gICAgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMSAgPSAweDEsCi0gICAgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMSAgPSAweDIsCi0gICAgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMiAgPSAweDQsCi0gICAgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMiAgPSAweDgsCi0gICAgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMjEgPSAweDEwLAotICAgIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDIxID0gMHgyMCwKLSAgICBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwzICA9IDB4NDAsCi0gICAgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMyAgPSAweDgwLAotICAgIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDMxID0gMHgxMDAsCi0gICAgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMzEgPSAweDIwMCwKLSAgICBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0ICA9IDB4NDAwLAotICAgIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDQgID0gMHg4MDAsCi0gICAgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNDEgPSAweDEwMDAsCi0gICAgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNDEgPSAweDIwMDAsCi0gICAgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNSAgPSAweDQwMDAsCi0gICAgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNSAgPSAweDgwMDAsCi0gICAgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNTEgPSAweDEwMDAwLAotICAgIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDUxID0gMHgyMDAwMCwKLSAgICBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MiA9IDB4NDAwMDAsCi0gICAgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNTIgPSAweDgwMDAwLAotICAgIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDYgID0gMHgxMDAwMDAsCi0gICAgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNiAgPSAweDIwMDAwMCwKLSAgICBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw2MSA9IDB4NDAwMDAwLAotICAgIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDYxID0gMHg4MDAwMDAsCi0gICAgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNjIgPSAweDEwMDAwMDAsCi0gICAgT01YX1ZJREVPX0hFVkNMZXZlbFVua25vd24gPSAweDZFRkZGRkZGLAotICAgIE9NWF9WSURFT19IRVZDTGV2ZWxNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19IRVZDTEVWRUxUWVBFOwotCi0vKiogSEVWQyBQYXJhbSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0hFVkNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1ZJREVPX0hFVkNQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLSAgICBPTVhfVklERU9fSEVWQ0xFVkVMVFlQRSBlTGV2ZWw7Ci0gICAgT01YX1UzMiBuS2V5RnJhbWVJbnRlcnZhbDsKLX0gT01YX1ZJREVPX1BBUkFNX0hFVkNUWVBFOwotCi0vKioKLSAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgdmlkZW8gY29tcHJlc3Npb24gaW50cmEgcmVmcmVzaCBwZXJpb2QKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuUmVmcmVzaFBlcmlvZCAgICAgIDogSW50cmEgcmVmcmVoIHBlcmlvZCBpbiBmcmFtZXMuIFZhbHVlIDAgbWVhbnMgZGlzYWJsZSBpbnRyYSByZWZyZXNoCi0qLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX0lOVFJBUkVGUkVTSFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5SZWZyZXNoUGVyaW9kOwotfSBPTVhfVklERU9fQ09ORklHX0FORFJPSURfSU5UUkFSRUZSRVNIVFlQRTsKLQotLyoqIE1heGltdW0gbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyBzdXBwb3J0ZWQgYnkgQVZDL0hFVkMgKi8KLSNkZWZpbmUgT01YX1ZJREVPX0FORFJPSURfTUFYVEVNUE9SQUxMQVlFUlMgOAotCi0vKiogdGVtcG9yYWwgbGF5ZXIgcGF0dGVybnMgKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HUEFUVEVSTlRZUEUgewotICAgIE9NWF9WSURFT19BbmRyb2lkVGVtcG9yYWxMYXllcmluZ1BhdHRlcm5Ob25lID0gMCwKLSAgICAvLyBwYXR0ZXJuIGFzIGRlZmluZWQgYnkgV2ViUlRDCi0gICAgT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybldlYlJUQyA9IDEgPDwgMCwKLSAgICAvLyBwYXR0ZXJuIHdoZXJlIGZyYW1lcyBpbiBhbnkgbGF5ZXIgb3RoZXIgdGhhbiB0aGUgYmFzZSBsYXllciBvbmx5IGRlcGVuZCBvbiBhdCBtb3N0IHRoZSB2ZXJ5Ci0gICAgLy8gbGFzdCBmcmFtZSBmcm9tIGVhY2ggcHJlY2VkaW5nIGxheWVyIChvdGhlciB0aGFuIHRoZSBiYXNlIGxheWVyLikKLSAgICBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuQW5kcm9pZCA9IDEgPDwgMSwKLX0gT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFOwotCi0vKioKLSAqIEFuZHJvaWQgc3BlY2lmaWMgcGFyYW0gZm9yIGNvbmZpZ3VyYXRpb24gb2YgdGVtcG9yYWwgbGF5ZXJpbmcuCi0gKiBBbmRyb2lkIG9ubHkgc3VwcG9ydHMgdGVtcG9yYWwgbGF5ZXJpbmcgd2hlcmUgc3VjY2Vzc2l2ZSBsYXllcnMgZWFjaCBkb3VibGUgdGhlCi0gKiBwcmV2aW91cyBsYXllcidzIGZyYW1lcmF0ZS4KLSAqIE5PVEU6IFJlYWRpbmcgdGhpcyBwYXJhbWV0ZXIgYXQgcnVuLXRpbWUgU0hBTEwgcmV0dXJuIGFjdHVhbCBydW4tdGltZSB2YWx1ZXMuCi0gKgotICogIG5TaXplICAgICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAob3V0cHV0IHBvcnQgZm9yIGVuY29kZXJzKQotICogIGVTdXBwb3J0ZWRQYXR0ZXJucyAgICAgICAgIDogQSBiaXRtYXNrIG9mIHN1cHBvcnRlZCBsYXllcmluZyBwYXR0ZXJucwotICogIG5MYXllckNvdW50TWF4ICAgICAgICAgICAgIDogTWF4IG51bWJlciBvZiB0ZW1wb3JhbCBjb2RpbmcgbGF5ZXJzIHN1cHBvcnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGVuY29kZXIgKG11c3QgYmUgYXQgbGVhc3QgMSwgMSBtZWFuaW5nIHRlbXBvcmFsIGxheWVyaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBOT1Qgc3VwcG9ydGVkKQotICogIG5CTGF5ZXJDb3VudE1heCAgICAgICAgICAgIDogTWF4IG51bWJlciBvZiBsYXllcnMgdGhhdCBjYW4gY29udGFpbiBCIGZyYW1lcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApIHRvIChuTGF5ZXJDb3VudE1heCAtIDEpCi0gKiAgZVBhdHRlcm4gICAgICAgICAgICAgICAgICAgOiBMYXllcmluZyBwYXR0ZXJuLgotICogIG5QTGF5ZXJDb3VudEFjdHVhbCAgICAgICAgIDogTnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyB0byBiZSBjb2RlZCB3aXRoIG5vbi1CIGZyYW1lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGZyb20gYW5kIGluY2x1ZGluZyB0aGUgYmFzZS1sYXllci4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHRvIG5MYXllckNvdW50TWF4IC0gbkJMYXllckNvdW50QWN0dWFsKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgblBMYXllckNvdW50QWN0dWFsIGlzIDEgYW5kIG5CTGF5ZXJDb3VudEFjdHVhbCBpcyAwLCB0ZW1wb3JhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgaXMgZGlzYWJsZWQuIE90aGVyd2lzZSwgaXQgaXMgZW5hYmxlZC4KLSAqICBuQkxheWVyQ291bnRBY3R1YWwgICAgICAgICA6IE51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgdG8gYmUgY29kZWQgd2l0aCBCIGZyYW1lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGFmdGVyIG5vbi1CIGxheWVycy4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIHRvIG5CTGF5ZXJDb3VudE1heCkKLSAqICBiQml0cmF0ZVJhdGlvc1NwZWNpZmllZCAgICA6IEZsYWcgdG8gaW5kaWNhdGUgaWYgbGF5ZXItd2lzZSBiaXRyYXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gaXMgc3BlY2lmaWVkLgotICogIG5CaXRyYXRlUmF0aW9zICAgICAgICAgICAgIDogQml0cmF0ZSByYXRpbyAoMTAwIGJhc2VkKSBwZXIgbGF5ZXIgKGluZGV4IDAgaXMgYmFzZSBsYXllcikuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb25vcmVkIGlmIGJCaXRyYXRlUmF0aW9zU3BlY2lmaWVkIGlzIHNldC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZSBmb3IgNCBsYXllcnMgd2l0aCBkZXNpcmVkIGRpc3RyaWJ1dGlvbiAoMjUlIDI1JSAyNSUgMjUlKSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CaXRyYXRlUmF0aW8gPSB7MjUsIDUwLCA3NSwgMTAwLCAuLi4gfQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGluIGluZGljZXMgbm90IGxlc3MgdGhhbiAndGhlIGFjdHVhbCBudW1iZXIgb2YgbGF5ZXJzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51cyAxJyBNQVkgYmUgaWdub3JlZCBhbmQgYXNzdW1lZCB0byBiZSAxMDAuCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFIGVTdXBwb3J0ZWRQYXR0ZXJuczsKLSAgICBPTVhfVTMyIG5MYXllckNvdW50TWF4OwotICAgIE9NWF9VMzIgbkJMYXllckNvdW50TWF4OwotICAgIE9NWF9WSURFT19BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdQQVRURVJOVFlQRSBlUGF0dGVybjsKLSAgICBPTVhfVTMyIG5QTGF5ZXJDb3VudEFjdHVhbDsKLSAgICBPTVhfVTMyIG5CTGF5ZXJDb3VudEFjdHVhbDsKLSAgICBPTVhfQk9PTCBiQml0cmF0ZVJhdGlvc1NwZWNpZmllZDsKLSAgICBPTVhfVTMyIG5CaXRyYXRlUmF0aW9zW09NWF9WSURFT19BTkRST0lEX01BWFRFTVBPUkFMTEFZRVJTXTsKLX0gT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1RZUEU7Ci0KLS8qKgotICogQW5kcm9pZCBzcGVjaWZpYyBjb25maWcgZm9yIGNoYW5naW5nIHRoZSB0ZW1wb3JhbC1sYXllciBjb3VudCBvcgotICogYml0cmF0ZS1kaXN0cmlidXRpb24gYXQgcnVuLXRpbWUuCi0gKgotICogIG5TaXplICAgICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAob3V0cHV0IHBvcnQgZm9yIGVuY29kZXJzKQotICogIGVQYXR0ZXJuICAgICAgICAgICAgICAgICAgIDogTGF5ZXJpbmcgcGF0dGVybi4KLSAqICBuUExheWVyQ291bnRBY3R1YWwgICAgICAgICA6IE51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgdG8gYmUgY29kZWQgd2l0aCBub24tQiBmcmFtZXMuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2FtZSBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSBsaW1pdHMgYXBwbHkuKQotICogIG5CTGF5ZXJDb3VudEFjdHVhbCAgICAgICAgIDogTnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyB0byBiZSBjb2RlZCB3aXRoIEIgZnJhbWVzLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNhbWUgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1RZUEUgbGltaXRzIGFwcGx5LikKLSAqICBiQml0cmF0ZVJhdGlvc1NwZWNpZmllZCAgICA6IEZsYWcgdG8gaW5kaWNhdGUgaWYgbGF5ZXItd2lzZSBiaXRyYXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gaXMgc3BlY2lmaWVkLgotICogIG5CaXRyYXRlUmF0aW9zICAgICAgICAgICAgIDogQml0cmF0ZSByYXRpbyAoMTAwIGJhc2VkLCBRMTYgdmFsdWVzKSBwZXIgbGF5ZXIgKDAgaXMgYmFzZSBsYXllcikuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb25vcmVkIGlmIGJCaXRyYXRlUmF0aW9zU3BlY2lmaWVkIGlzIHNldC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYW1lIE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdUWVBFIGxpbWl0cyBhcHBseS4pCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9WSURFT19BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdQQVRURVJOVFlQRSBlUGF0dGVybjsKLSAgICBPTVhfVTMyIG5QTGF5ZXJDb3VudEFjdHVhbDsKLSAgICBPTVhfVTMyIG5CTGF5ZXJDb3VudEFjdHVhbDsKLSAgICBPTVhfQk9PTCBiQml0cmF0ZVJhdGlvc1NwZWNpZmllZDsKLSAgICBPTVhfVTMyIG5CaXRyYXRlUmF0aW9zW09NWF9WSURFT19BTkRST0lEX01BWFRFTVBPUkFMTEFZRVJTXTsKLX0gT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdUWVBFOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogT01YX1ZpZGVvRXh0X2ggKi8KLS8qIEZpbGUgRU9GICovCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9pbmMvUUNNZWRpYURlZnMuaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9RQ01lZGlhRGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODZmMGE4Li4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL2luYy9RQ01lZGlhRGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiAtIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLQotI2lmbmRlZiBRQ19NRURJQV9ERUZTX0hfCi0KLSNkZWZpbmUgUUNfTUVESUFfREVGU19IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1dNVjsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19XTVZfVkMxOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1dNQTsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19XTUFfUFJPOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1dNQV9MT1NTTEVTUzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVNGOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlg7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9BQUM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1FDUDsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYMzExOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlg0OwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMjsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfM0cyOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RUUzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EVFNfTEJSOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCX1BMVVM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUlGRjsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FQRTsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfUUNNUEVHMlRTOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9RQ01QRUc7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1FDQU1SX05COwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9RQ0FNUl9XQjsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfUUNXQVY7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1FDRkxWOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9RQ01QRUcyUFM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1FDTVBFRzQ7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1FDTUFUUk9TS0E7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1FDT0dHOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9RVElGTEFDOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQWDsgLy9iYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0M7Ci19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vUUNfTUVESUFfREVGU19IXwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL1FDTWV0YURhdGEuaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9RQ01ldGFEYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTA2MzcuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL1FDTWV0YURhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgUUNfTUVUQV9EQVRBX0hfCi0KLSNkZWZpbmUgUUNfTUVUQV9EQVRBX0hfCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAga0tleUFhY0NvZGVjU3BlY2lmaWNEYXRhID0gJ25hY2MnICwgLy8gZm9yIG5hdGl2ZSBhYWMgZmlsZXMKLQotICAgIGtLZXlSYXdDb2RlY1NwZWNpZmljRGF0YSA9ICdyY3NkJywgIC8vIHJhdyBkYXRhIC0gYWRkZWQgdG8gc3VwcG9ydCBtbVBhcnNlcgotICAgIGtLZXlEaXZYVmVyc2lvbiAgICAgICAgICA9ICdEaXZYJywgIC8vIGludDMyX3QKLSAgICBrS2V5RGl2WERybSAgICAgICAgICAgICAgPSAnUURybScsICAvLyB2b2lkICoKLSAgICBrS2V5V01BRW5jb2RlT3B0ICAgICAgICAgPSAnZW9wdCcsICAvLyBpbnQzMl90Ci0gICAga0tleVdNQUJsb2NrQWxpZ24gICAgICAgID0gJ2Jsa2EnLCAgLy8gaW50MzJfdAotICAgIGtLZXlXTUFWZXJzaW9uICAgICAgICAgICA9ICd3bWF2JywgIC8vIGludDMyX3QKLSAgICBrS2V5V01BQWR2RW5jT3B0MSAgICAgICAgPSAnYWRlMScsICAvLyBpbnQxNl90Ci0gICAga0tleVdNQUFkdkVuY09wdDIgICAgICAgID0gJ2FkZTInLCAgLy8gaW50MzJfdAotICAgIGtLZXlXTUFGb3JtYXRUYWcgICAgICAgICA9ICdmbXR0JywgIC8vIGludDY0X3QKLSAgICBrS2V5V01BQml0c3BlcnNhbXBsZSAgICAgPSAnYnNwcycsICAvLyBpbnQ2NF90Ci0gICAga0tleVdNQVZpclBrdFNpemUgICAgICAgID0gJ3Zwa3MnLCAgLy8gaW50NjRfdAotICAgIGtLZXlXTUFDaGFubmVsTWFzayAgICAgICA9ICdjaG1rJywgIC8vIGludDMyX3QKLSAgICBrS2V5Vm9yYmlzRGF0YSAgICAgICAgICAgPSAndmRhdCcsICAvLyByYXcgZGF0YQotCi0gICAga0tleUZpbGVGb3JtYXQgICAgICAgICAgID0gJ2ZmbXQnLCAgLy8gY3N0cmluZwotCi0gICAga2tleUFhY0Zvcm1hdEFkaWYgICAgICAgID0gJ2FkaWYnLCAgLy8gYm9vbCAoaW50MzJfdCkKLSAgICBrS2V5SW50ZXJsYWNlICAgICAgICAgICAgPSAnaW50TCcsICAvLyBib29sIChpbnQzMl90KQotICAgIGtrZXlBYWNGb3JtYXRMdHAgICAgICAgICA9ICdsdHAgJywKLQotCi0gICAgLy9EVFMgc3VidHlwZQotICAgIGtLZXlEVFNTdWJ0eXBlICAgICAgICAgICA9ICdkdHNzJywgIC8vaW50MzJfdAotCi0gICAgLy9FeHRyYWN0b3Igc2V0cyB0aGlzCi0gICAga0tleVVzZUFyYml0cmFyeU1vZGUgICAgID0gJ0FyYk0nLCAgLy9ib29sIChpbnQzMl90KQotICAgIGtLZXlTbW9vdGhTdHJlYW1pbmcgICAgICA9ICdFU21TJywgIC8vYm9vbCAoaW50MzJfdCkKLSAgICBrS2V5SEZSICAgICAgICAgICAgICAgICAgPSAnaGZyICcsICAvLyBpbnQzMl90Ci0gICAga0tleUhTUiAgICAgICAgICAgICAgICAgID0gJ2hzciAnLCAgLy8gaW50MzJfdAotCi0gICAga0tleVNhbXBsZUJpdHMgICAgICAgICAgID0gJ3NiaXQnLCAvLyBpbnQzMl90IChhdWRpbyBzYW1wbGUgYml0LXdpZHRoKQotICAgIGtLZXlQY21Gb3JtYXQgICAgICAgICAgICA9ICdwZm10JywgLy9pbnQzMl90IChwY20gZm9ybWF0KQotICAgIGtLZXlNaW5CbGtTaXplICAgICAgICAgICA9ICdtaWJzJywgLy9pbnQzMl90Ci0gICAga0tleU1heEJsa1NpemUgICAgICAgICAgID0gJ21hYnMnLCAvL2ludDMyX3QKLSAgICBrS2V5TWluRnJtU2l6ZSAgICAgICAgICAgPSAnbWlmcycsIC8vaW50MzJfdAotICAgIGtLZXlNYXhGcm1TaXplICAgICAgICAgICA9ICdtYWZzJywgLy9pbnQzMl90Ci0gICAga0tleU1kNVN1bSAgICAgICAgICAgICAgID0gJ21kNXMnLCAvL2NzdHJpbmcKLQotICAgIGtLZXlCYXRjaFNpemUgICAgICAgICAgICA9ICdidGNoJywgLy9pbnQzMl90Ci0gICAga0tleUlzQnl0ZU1vZGUgICAgICAgICAgID0gJ2J5dG0nLCAvL2ludDMyX3QKLSAgICBrS2V5VXNlU2V0QnVmZmVycyAgICAgICAgPSAnc2V0YicsIC8vYm9vbCAoaW50MzJfdCkKLX07Ci0KLWVudW0gewotICAgIGtUeXBlRGl2WFZlcl8zXzExLAotICAgIGtUeXBlRGl2WFZlcl80LAotICAgIGtUeXBlRGl2WFZlcl81LAotICAgIGtUeXBlRGl2WFZlcl82LAotfTsKLWVudW0gewotICAgIGtUeXBlV01BLAotICAgIGtUeXBlV01BUHJvLAotICAgIGtUeXBlV01BTG9zc0xlc3MsCi19OwotCi0vL1RoaXMgZW51bSBzaG91bGQgYmUga2VlcCBpbiBzeW5jIHdpdGggImVudW0gRmxhZ3MiIGluIE1lZGlhRXh0cmFjdG9yLmggaW4gQU9TUCwKLS8vVmFsdWUgc2hvdWxkIHJlZmxlY3QgYXMgbGFzdCBlbnRyeSBpbiB0aGUgZW51bQotZW51bSB7Ci0gICAgQ0FOX1NFRUtfVE9fWkVSTyAgID0gMTYsIC8vIHRoZSAicHJldmlvdXMgYnV0dG9uIgotfTsKLQotZW51bSB7Ci0gICAgVVNFX1NFVF9CVUZGRVJTID0gMHgxLAotICAgIFVTRV9BVURJT19CSUdfQlVGRkVSUyA9IDB4MiwKLX07Ci19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFFDX01FVEFfREFUQV9IXwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL1FPTVhfQXVkaW9FeHRlbnNpb25zLmggYi9zZG04NDUvbW0tY29yZS9pbmMvUU9NWF9BdWRpb0V4dGVuc2lvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwNDAxOC4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9pbmMvUU9NWF9BdWRpb0V4dGVuc2lvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMDksIDIwMTEsIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vcgotICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgICAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLU9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiBNIEEgWCAgIHcgciBhIHAgcCBlIHIgcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuICBNIEEgWCAgIEMgbyByIGUKLQotKi8vKiogQGZpbGUgUU9NWF9BdWRpb0V4dGVuc2lvbnMuaAotICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgZXh0ZW5zaW9ucyBmb3IgQXVkaW8KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpZm5kZWYgX19IX1FPTVhfQVVESU9FWFRFTlNJT05TX0hfXwotI2RlZmluZSBfX0hfUU9NWF9BVURJT0VYVEVOU0lPTlNfSF9fCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMgRk9SIE1PRFVMRQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2luY2x1ZGUgPE9NWF9BdWRpby5oPgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgREVGSU5JVElPTlMgQU5EIERFQ0xBUkFUSU9OUwotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jaWYgZGVmaW5lZCggX19jcGx1c3BsdXMgKQotZXh0ZXJuICJDIgotewotI2VuZGlmIC8qIGVuZCBvZiBtYWNybyBfX2NwbHVzcGx1cyAqLwotCi0vKiBBdWRpbyBleHRlbnNpb24gc3RyaW5ncyAqLwotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9BTVJXQlBMVVMgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5hbXJ3YnBsdXMiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX1dNQTEwUFJPICAgICAgICAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLndtYTEwcHJvIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9TRVNTSU9OSUQgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5zZXNzaW9uSWQiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX1ZPSUNFUkVDT1JEVFlQRSAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLlZvaWNlUmVjb3JkIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9BQzNUWVBFICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5hYzMiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX0FDM1BQICAgICAgICAgICAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLnBvc3Rwcm9jLmFjMyIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fREFLX0JVTkRMRSAgICAgICJPTVguUXVhbGNvbW0uaW5kZXguYXVkaW8uZGFrYnVuZGxlIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9EQUtfTTJTICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5kYWtfbTJzIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9EQUtfU1NFICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5kYWtfc3NlIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9EQUtfU0xDICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5kYWtfc2xjIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9EQUtfVk9MICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5kYWtfdm9sIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9EQUtfTkIgICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5kYWtfbmIiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX0RBS19HRVEgICAgICAgICAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLmRha19nZXEiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX0RBS19NU1IgICAgICAgICAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLmRha19tc3IiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX0RBS19IRkUgICAgICAgICAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLmRha19oZmUiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX0RBS19GQURFICAgICAgICAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLmRha19mYWRlIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9EQUtfU0VRICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5kYWtfc2VxIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfRFVBTE1PTk8gICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5kdWFsbW9ubyIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX0FBQ19TRUxfTUlYX0NPRUYgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5hYWNfc2VsX21peF9jb2VmIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9BTEFDICAgICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5hbGFjIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9BUEUgICAgICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5hcGUiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX0RTRCAgICAgICAgICAgICAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLmRzZCIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fRkxBQ19ERUMgICAgICAgICJPTVguUXVhbGNvbW0uaW5kZXguYXVkaW8uZmxhY2RlYyIKLQotI2RlZmluZSBBTEFDX0NTRF9TSVpFIDI0Ci0jZGVmaW5lIEFQRV9DU0RfU0laRSAzMgotCi10eXBlZGVmIGVudW0gUU9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEUgewotICAgIFFPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjkgICAgICAgICAgICAgID0gMHg3RjAwMDAwMSwvKio8IEFNUldCIE1vZGUgOSA9IFNJRCovCi0gICAgUU9NWF9BVURJT19BTVJCYW5kTW9kZVdCMTAgICAgICAgICAgICAgPSAweDdGMDAwMDAyLC8qKjwgQU1SV0IgTW9kZSAxMCA9IDEzNjAwIGJwcyAqLwotICAgIFFPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjExICAgICAgICAgICAgID0gMHg3RjAwMDAwMywvKio8IEFNUldCIE1vZGUgMTEgPSAxODAwMCBicHMgKi8KLSAgICBRT01YX0FVRElPX0FNUkJhbmRNb2RlV0IxMiAgICAgICAgICAgICA9IDB4N0YwMDAwMDQsLyoqPCBBTVJXQiBNb2RlIDEyID0gMjQwMDAgYnBzICovCi0gICAgUU9NWF9BVURJT19BTVJCYW5kTW9kZVdCMTMgICAgICAgICAgICAgPSAweDdGMDAwMDA1LC8qKjwgQU1SV0IgTW9kZSAxMyA9IDI0MDAwIGJwcyAqLwotICAgIFFPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjE0ICAgICAgICAgICAgID0gMHg3RjAwMDAwNiwvKio8IEFNUldCIE1vZGUgMTQgPSBGUkFNRV9FUkFTRSovCi0gICAgUU9NWF9BVURJT19BTVJCYW5kTW9kZVdCMTUgICAgICAgICAgICAgPSAweDdGMDAwMDA3LC8qKjwgQU1SV0IgTW9kZSAxNSA9IE5PX0RBVEEgKi8KLX1RT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRTsKLQotdHlwZWRlZiBlbnVtIFFPTVhfQVVESU9fQ09ESU5HVFlQRSB7Ci0gICBRT01YX0FVRElPX0NvZGluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICBRT01YX0FVRElPX0NvZGluZ0VWUkNCICA9IDB4N0YwMDAwMDEsCi0gICBRT01YX0FVRElPX0NvZGluZ0VWUkNXQiA9IDB4N0YwMDAwMDIsCi0gICBRT01YX0FVRElPX0NvZGluZ0ZMQUMgICA9IDB4N0YwMDAwMDMsCi0gICBRT01YX0FVRElPX0NvZGluZ01heCA9IDB4N0ZGRkZGRkYKLX1RT01YX0FVRElPX0NPRElOR1RZUEU7Ci0KLQotLyoqCi0gKiBBTVIgV0IgUExVUyB0eXBlCi0gKgotICogIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5DaGFubmVscyAgICAgICA6IE51bWJlciBvZiBjaGFubmVscwotICogIG5CaXRSYXRlICAgICAgICA6IEJpdCByYXRlIHJlYWQgb25seSBmaWVsZAotICogIG5TYW1wbGVSYXRlICAgICA6IFNhbXBsaW5nIGZyZXF1ZW5jeSBmb3IgdGhlIGNsaXAoMTYvMjQvMzIvNDhLSHopCi0gKiAgZUFNUkJhbmRNb2RlICAgIDogQU1SIEJhbmQgTW9kZSBlbnVtZXJhdGlvbgotICogIGVBTVJEVFhNb2RlICAgICA6IEFNUiBEVFggTW9kZSBlbnVtZXJhdGlvbgotICogIGVBTVJGcmFtZUZvcm1hdCA6IEFNUiBmcmFtZSBmb3JtYXQgZW51bWVyYXRpb24KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBRT01YX0FVRElPX1BBUkFNX0FNUldCUExVU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5DaGFubmVsczsKLSAgICBPTVhfVTMyIG5CaXRSYXRlOwotICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7Ci0gICAgT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSAgIGVBTVJCYW5kTW9kZTsKLSAgICBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEUgICAgIGVBTVJEVFhNb2RlOwotICAgIE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEUgZUFNUkZyYW1lRm9ybWF0OwotfSBRT01YX0FVRElPX1BBUkFNX0FNUldCUExVU1RZUEU7Ci0KLXR5cGVkZWYgZW51bSBRT01YX0FVRElPX1dNQUZPUk1BVFRZUEUgewotICAgIFFPTVhfQVVESU9fV01BRm9ybWF0MTBQcm8gPSAweDdGMDAwMDAxLCAvKio8IFdpbmRvd3MgTWVkaWEgQXVkaW8gZm9ybWF0IDEwKi8KLX0gUU9NWF9BVURJT19XTUFGT1JNQVRUWVBFOwotCi0vKioKLSAqIFdNQSAxMCBQUk8gdHlwZQotICoKLSAqICBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuQ2hhbm5lbHMgICAgICAgICAgOiBOdW1iZXIgb2YgY2hhbm5lbHMKLSAqICBuQml0UmF0ZSAgICAgICAgICAgOiBCaXQgcmF0ZSByZWFkIG9ubHkgZmllbGQKLSAqICBlRm9ybWF0ICAgICAgICAgICAgOiBWZXJzaW9uIG9mIFdNQSBzdHJlYW0gLyBkYXRhCi0gKiAgZVByb2ZpbGUgICAgICAgICAgIDogUHJvZmlsZSBvZiBXTUEgc3RyZWFtIC8gZGF0YQotICogIG5TYW1wbGluZ1JhdGUgICAgICA6IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhCi0gKiAgbkJsb2NrQWxpZ24gICAgICAgIDogYmxvY2sgYWxpZ25tZW50LCBvciBibG9jayBzaXplLCBpbiBieXRlcyBvZiB0aGUgYXVkaW8gY29kZWMKLSAqICBuRW5jb2RlT3B0aW9ucyAgICAgOiBXTUEgVHlwZS1zcGVjaWZpYyBkYXRhCi0gKiAgblN1cGVyQmxvY2tBbGlnbiAgIDogV01BIFR5cGUtc3BlY2lmaWMgZGF0YQotICogIHZhbGlkQml0c1BlclNhbXBsZSA6IGVuY29kZWQgc3RyZWFtICgyNC1iaXQgb3IgMTYtYml0KQotICogIGZvcm1hdFRhZyAgICAgICAgICA6IGNvZGVjIElEKDB4MTYyIG9yIDB4MTY2KQotICogIGFkdmFuY2VkRW5jb2RlT3B0ICA6IGJpdCBwYWNrZWQgd29yZHMgaW5kaWNhdGluZyB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGZvciBMQlIgYml0c3RyZWFtCi0gKiAgYWR2YW5jZWRFbmNvZGVPcHQyIDogYml0IHBhY2tlZCB3b3JkcyBpbmRpY2F0aW5nIHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgZm9yIExCUiBiaXRzdHJlYW0KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9BVURJT19QQVJBTV9XTUExMFBST1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTE2IG5DaGFubmVsczsKLSAgICBPTVhfVTMyIG5CaXRSYXRlOwotICAgIFFPTVhfQVVESU9fV01BRk9STUFUVFlQRSBlRm9ybWF0OwotICAgIE9NWF9BVURJT19XTUFQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLSAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7Ci0gICAgT01YX1UxNiBuQmxvY2tBbGlnbjsKLSAgICBPTVhfVTE2IG5FbmNvZGVPcHRpb25zOwotICAgIE9NWF9VMzIgblN1cGVyQmxvY2tBbGlnbjsKLSAgICBPTVhfVTMyIHZhbGlkQml0c1BlclNhbXBsZTsKLSAgICBPTVhfVTMyIGZvcm1hdFRhZzsKLSAgICBPTVhfVTMyIGFkdmFuY2VkRW5jb2RlT3B0OwotICAgIE9NWF9VMzIgYWR2YW5jZWRFbmNvZGVPcHQyOwotICAgIE9NWF9VMTYgblZpcnR1YWxQa3RTaXplOwotfSBRT01YX0FVRElPX1BBUkFNX1dNQTEwUFJPVFlQRTsKLQotCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0FDM0ZPUk1BVFRZUEUgewotICAgb214X2F1ZGlvX2FjMyAgICAgICA9IDB4N2YwMDAwMDEsIC8qKjwgYWMtMyAqLwotICAgb214X2F1ZGlvX2VhYzMgICAgICA9IDB4N2YwMDAwMDIgIC8qKjwgZWFjLTMgKi8KLX0gT01YX0FVRElPX0FDM0ZPUk1BVFRZUEU7Ci0KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQUMzX0NIQU5ORUxfQ09ORklHCi17Ci0gICBPTVhfQVVESU9fQUMzX0NIQU5ORUxfQ09ORklHX1JTVkQgPSAwLAotICAgT01YX0FVRElPX0FDM19DSEFOTkVMX0NPTkZJR18xXzAsCi0gICBPTVhfQVVESU9fQUMzX0NIQU5ORUxfQ09ORklHXzJfMCwKLSAgIE9NWF9BVURJT19BQzNfQ0hBTk5FTF9DT05GSUdfM18wLAotICAgT01YX0FVRElPX0FDM19DSEFOTkVMX0NPTkZJR18yXzEsCi0gICBPTVhfQVVESU9fQUMzX0NIQU5ORUxfQ09ORklHXzNfMSwKLSAgIE9NWF9BVURJT19BQzNfQ0hBTk5FTF9DT05GSUdfMl8yLAotICAgT01YX0FVRElPX0FDM19DSEFOTkVMX0NPTkZJR18zXzIsCi0gICBPTVhfQVVESU9fQUMzX0NIQU5ORUxfQ09ORklHXzNfMF8xLAotICAgT01YX0FVRElPX0FDM19DSEFOTkVMX0NPTkZJR18yXzJfMSwKLSAgIE9NWF9BVURJT19BQzNfQ0hBTk5FTF9DT05GSUdfM18yXzEsCi0gICBPTVhfQVVESU9fQUMzX0NIQU5ORUxfQ09ORklHXzNfMF8yLAotICAgT01YX0FVRElPX0FDM19DSEFOTkVMX0NPTkZJR18yXzJfMiwKLSAgIE9NWF9BVURJT19BQzNfQ0hBTk5FTF9DT05GSUdfM18yXzIsCi0gICBPTVhfQVVESU9fQUMzX0NIQU5ORUxfQ09ORklHX0RFRkFVTFQgPSAweEZGRkYKLX0gT01YX0FVRElPX0FDM19DSEFOTkVMX0NPTkZJRzsKLQotLyoqCi0gKiBBQy0zIHR5cGUKLSAqCi0gKiAgU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkNoYW5uZWxzICAgICAgICAgICA6IE51bWJlciBvZiBjaGFubmVscwotICogIG5CaXRSYXRlICAgICAgICAgICAgOiBCaXRyYXRlCi0gKiAgblNhbXBsaW5nUmF0ZSAgICAgICA6IFNhbXBsaW5nIHJhdGUsIDMySywgNDQuMUssIDQ4SyBvbmx5IHN1cHBvcnRlZAotICogIGVGb3JtYXQgICAgICAgICAgICAgOiBBQy0zIG9yIEVBQy0zCi0gKiAgZUNoYW5uZWxDb25maWcgICAgICA6IENoYW5uZWwgY29uZmlndXJhdGlvbgotICogIG5Qcm9ncmFtSUQgICAgICAgICAgOiBJbmRpY2F0aW9uIG9mIFByb2dyYW1JRCwgMC03Ci0gKiAgYkNvbXByZXNzaW9uT24gICAgICA6IEZsYWcgdG8gZW5hYmxlIENvbXByZXNzaW9uCi0gKiAgYkxmZU9uICAgICAgICAgICAgICA6IEZsYWcgZm9yIExGRSBvbi9vZmYKLSAqICBiRGVsYXlTdXJyb3VuZENoYW5uZWxzIDogRmxhZyB0byBwdXQgZGVsYXkgb24gc3Vycm91bmQgY2hhbm5lbHMKLSAqCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfQVVESU9fUEFSQU1fQUMzVFlQRSB7Ci0gICBPTVhfVTMyIG5TaXplOwotICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgT01YX1UxNiBuQ2hhbm5lbHM7Ci0gICBPTVhfVTMyIG5CaXRSYXRlOwotICAgT01YX1UzMiBuU2FtcGxpbmdSYXRlOwotICAgT01YX0FVRElPX0FDM0ZPUk1BVFRZUEUgZUZvcm1hdDsKLSAgIE9NWF9BVURJT19BQzNfQ0hBTk5FTF9DT05GSUcgZUNoYW5uZWxDb25maWc7Ci0gICBPTVhfVTggblByb2dyYW1JRDsKLSAgIE9NWF9CT09MIGJDb21wcmVzc2lvbk9uOwotICAgT01YX0JPT0wgYkxmZU9uOwotICAgT01YX0JPT0wgYkRlbGF5U3Vycm91bmRDaGFubmVsczsKLX0gUU9NWF9BVURJT19QQVJBTV9BQzNUWVBFOwotCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0FDM19DSEFOTkVMX1JPVVRJTkcKLXsKLSAgIE9NWF9BVURJT19BQzNfQ0hBTk5FTF9MRUZULAotICAgT01YX0FVRElPX0FDM19DSEFOTkVMX0NFTlRFUiwKLSAgIE9NWF9BVURJT19BQzNfQ0hBTk5FTF9SSUdIVCwKLSAgIE9NWF9BVURJT19BQzNfQ0hBTk5FTF9MRUZUX1NVUlJPVU5ELAotICAgT01YX0FVRElPX0FDM19DSEFOTkVMX1JJR0hUX1NVUlJPVU5ELAotICAgT01YX0FVRElPX0FDM19DSEFOTkVMX1NVUlJPVU5ELAotICAgT01YX0FVRElPX0FDM19DSEFOTkVMX0VYVEVOU0lPTl8xLAotICAgT01YX0FVRElPX0FDM19DSEFOTkVMX0VYVEVOU0lPTl8yLAotICAgT01YX0FVRElPX0FDM19DSEFOTkVMX0RFRkFVTFQgPSAweEZGRkYKLX0gT01YX0FVRElPX0FDM19DSEFOTkVMX1JPVVRJTkc7Ci0KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQUMzX0NPTVBSRVNTSU9OX01PREUKLXsKLSAgIE9NWF9BVURJT19BQzNfQ09NUFJFU1NJT05fTU9ERV9BTkFMT0dfRElBTE5PUk0sCi0gICBPTVhfQVVESU9fQUMzX0NPTVBSRVNTSU9OX01PREVfRElHSVRBTF9ESUFMTk9STSwKLSAgIE9NWF9BVURJT19BQzNfQ09NUFJFU1NJT05fTU9ERV9MSU5FX09VVCwKLSAgIE9NWF9BVURJT19BQzNfQ09NUFJFU1NJT05fTU9ERV9SRl9SRU1PRAotfSBPTVhfQVVESU9fQUMzX0NPTVBSRVNTSU9OX01PREU7Ci0KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQUMzX1NURVJFT19NT0RFCi17Ci0gICBPTVhfQVVESU9fQUMzX1NURVJFT19NT0RFX0FVVE9fREVURUNULAotICAgT01YX0FVRElPX0FDM19TVEVSRU9fTU9ERV9MVF9SVCwKLSAgIE9NWF9BVURJT19BQzNfU1RFUkVPX01PREVfTE9fUk8sCi0gICBPTVhfQVVESU9fQUMzX1NURVJFT19NT0RFX0RFRkFVTFQgPSAweEZGRkYKLX0gT01YX0FVRElPX0FDM19TVEVSRU9fTU9ERTsKLQotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19BQzNfRFVBTF9NT05PX01PREUKLXsKLSAgIE9NWF9BVURJT19BQzNfRFVBTF9NT05PX01PREVfU1RFUkVPLAotICAgT01YX0FVRElPX0FDM19EVUFMX01PTk9fTU9ERV9MRUZUX01PTk8sCi0gICBPTVhfQVVESU9fQUMzX0RVQUxfTU9OT19NT0RFX1JJR0hUX01PTk8sCi0gICBPTVhfQVVESU9fQUMzX0RVQUxfTU9OT19NT0RFX01JWEVEX01PTk8sCi0gICBPTVhfQVVESU9fQUMzX0RVQUxfTU9OT19NT0RFX0RFRkFVTFQgPSAweEZGRkYKLX0gT01YX0FVRElPX0FDM19EVUFMX01PTk9fTU9ERTsKLQotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19BQzNfS0FSQU9LRV9NT0RFCi17Ci0gICBPTVhfQVVESU9fQUMzX0tBUkFPS0VfTU9ERV9OT19WT0NBTCwKLSAgIE9NWF9BVURJT19BQzNfS0FSQU9LRV9NT0RFX0xFRlRfVk9DQUwsCi0gICBPTVhfQVVESU9fQUMzX0tBUkFPS0VfTU9ERV9SSUdIVF9WT0NBTCwKLSAgIE9NWF9BVURJT19BQzNfS0FSQU9LRV9NT0RFX0JPVEhfVk9DQUwsCi0gICBPTVhfQVVESU9fQUMzX0tBUkFPS0VfTU9ERV9ERUZBVUxUID0gMHhGRkZGCi19IE9NWF9BVURJT19BQzNfS0FSQU9LRV9NT0RFOwotCi0KLXR5cGVkZWYgc3RydWN0IFFPTVhfQVVESU9fUEFSQU1fQUMzUFAKLXsKLSAgIE9NWF9VMzIgblNpemU7Ci0gICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICBPTVhfQVVESU9fQUMzX0NIQU5ORUxfUk9VVElORyBlQ2hhbm5lbFJvdXRpbmdbOF07Ci0gICBPTVhfQVVESU9fQUMzX0NPTVBSRVNTSU9OX01PREUgZUNvbXByZXNzaW9uTW9kZTsKLSAgIE9NWF9BVURJT19BQzNfU1RFUkVPX01PREUgZVN0ZXJlb01vZGU7Ci0gICBPTVhfQVVESU9fQUMzX0RVQUxfTU9OT19NT0RFIGVEdWFsTW9ub01vZGU7Ci0gICBPTVhfVTMyIHVzUGNtU2NhbGU7Ci0gICBPTVhfVTMyIHVzRHluYW1pY1NjYWxlQm9vc3Q7Ci0gICBPTVhfVTMyIHVzRHluYW1pY1NjYWxlQ3V0OwotICAgT01YX0FVRElPX0FDM19LQVJBT0tFX01PREUgZUthcmFva2VNb2RlOwotfSBRT01YX0FVRElPX1BBUkFNX0FDM1BQOwotCi0KLS8qKgotICogU3RyZWFtIGluZm8gZGF0YQotICoKLSAqICBTVFJVQ1QgTUVNQkVSUzoKLSAqICBzZXNzaW9uSWQgOiAgc2Vzc2lvbiBJZCBmb3IgYWxzYSB0byByb3V0ZSBkYXRhCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfQVVESU9fU1RSRUFNX0lORk9fREFUQSB7Ci0gICAgT01YX1U4ICBzZXNzaW9uSWQ7Ci19IFFPTVhfQVVESU9fU1RSRUFNX0lORk9fREFUQTsKLQotCi0vKioKLSAqIFJlY29yZCBQYXRoCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiByZWNQYXRoIDogUmVjb3JkIFBhdGggZm9yIGVuY29kaW5nCi0gKi8KLXR5cGVkZWYgZW51bXsKLQotUU9NWF9BVURJT19WT0lDRV9UWCwKLVFPTVhfQVVESU9fVk9JQ0VfUlgsCi1RT01YX0FVRElPX1ZPSUNFX01JWEVELAotCi19IFFPTVhfQVVESU9fVk9JQ0VSRUNPUkRNT0RFVFlQRTsKLXR5cGVkZWYgc3RydWN0IFFPTVhfQVVESU9fQ09ORklHX1ZPSUNFUkVDT1JEVFlQRSB7Ci0KLU9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNpemU7Ci1PTVhfVkVSU0lPTlRZUEUgICAgICAgICAgICAgICAgICAgIG5WZXJzaW9uOwotUU9NWF9BVURJT19WT0lDRVJFQ09SRE1PREVUWVBFICAgICBlVm9pY2VSZWNvcmRNb2RlOwotfSAgUU9NWF9BVURJT19DT05GSUdfVk9JQ0VSRUNPUkRUWVBFOwotCi0vKiBFbnVtIGZvciBtYXBwaW5nIGR1YWwtbW9ubyBjb250ZW50cyB0byBsZWZ0IGFuZCByaWdodCBjaGFubmVscyAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19EVUFMX01PTk9fQ0hBTk5FTF9DT05GSUcgewotIE9NWF9BVURJT19EVUFMX01PTk9fTU9ERV9GTF9GUiwvKiAxc3QgU0NFIHRvIGxlZnQgJiByaWdodCAqLwotIE9NWF9BVURJT19EVUFMX01PTk9fTU9ERV9TTF9TUiwvKiAybmQgU0NFIHRvIGxlZnQgJiByaWdodCAqLwotIE9NWF9BVURJT19EVUFMX01PTk9fTU9ERV9TTF9GUiwvKiAybmQgU0NFIHRvIGxlZnQsIDFzdCBTQ0UgdG8gcmlnaHQgKi8KLSBPTVhfQVVESU9fRFVBTF9NT05PX01PREVfRkxfU1IsLyogMXN0IFNDRSB0byBsZWZ0LCAybmQgU0NFIHRvIHJpZ2h0IGRlZmF1bHQgKi8KLSBPTVhfQVVESU9fRFVBTF9NT05PX01PREVfREVGQVVMVCA9IE9NWF9BVURJT19EVUFMX01PTk9fTU9ERV9GTF9TUiwKLSBPTVhfQVVESU9fRFVBTF9NT05PX01PREVfSU5WQUxJRCA9IC0xCi19IE9NWF9BVURJT19EVUFMX01PTk9fQ0hBTk5FTF9DT05GSUc7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEQUsgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiogdGhpcyBpcyB0aGUgbGlzdCBvZiBjdXN0b20gdmVuZG9yIGluZGV4ICovCi10eXBlZGVmIGVudW0gT01YX0lOREVYX0RBS19UWVBFIHsKLSAgICBPTVhfSW5kZXhDb25maWdEQUtfQlVORExFID0gT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQgLyoweDdGMDAwMDAwKi8sICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfREFLX0NPTkZJR19CVU5ETEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnREFLX00yUywgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9EQUtfQ09ORklHX00yU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdEQUtfU1NFLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0RBS19DT05GSUdfU1NFVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0RBS19TTEMsICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfREFLX0NPTkZJR19TTENUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnREFLX1ZPTCwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9EQUtfQ09ORklHX1ZPTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdEQUtfTkIsICAgICAvKio8IHJlZmVyZW5jZTogT01YX0RBS19DT05GSUdfTkJUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnREFLX0dFUSwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9EQUtfQ09ORklHX0dFUVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdEQUtfTVNSLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0RBS19DT05GSUdfTVNSVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0RBS19IRkUsICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfREFLX0NPTkZJR19IRkVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnREFLX0ZBREUsICAgLyoqPCByZWZlcmVuY2U6IE9NWF9EQUtfQ09ORklHX0ZBREVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnREFLX1NFUSwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9EQUtfQ09ORklHX1NFUVRZUEUgKi8KLQotfSBPTVhfSU5ERVhfREFLX1RZUEU7Ci0KLQotLyoqIERvbGJ5IEF1ZGlvIEtlcm5lbCBUREFTIGJ1bmRsZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0RBS19DT05GSUdfQlVORExFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgbkRBS19WZXJzaW9uOyAgICAgICAgICAvKio8IERvbGJ5IEF1ZGlvIEtlcm5lbCB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuREFLX1JldmlzaW9uOyAgICAgICAgIC8qKjwgRG9sYnkgQXVkaW8gS2VybmVsIHJldmlzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1U4IG5MZmVNaXhMZXZlbDsgICAgICAgICAgIC8qKjwgbGV2ZWwgYXQgd2hpY2ggdGhlIExGRSBjaGFubmVsIGlzIG1peGVkIGludG8gdGhlIG91dHB1dCBhdWRpbyAqLwotICAgIE9NWF9VOCBuU2FtcGxlUmF0ZUluZGV4OyAgICAgICAvKio8IE91dHB1dCBzYW1wbGUgcmF0ZSAqLwotICAgIE9NWF9VOCBuSW5DaGFuczsgICAgICAgICAgICAgICAvKio8IENoYW5uZWwgZm9ybWF0IG9mIGlucHV0IGF1ZGlvICovCi0gICAgT01YX1U4IG5Jbk1hdHJpeDsgICAgICAgICAgICAgIC8qKjwgTC9SIG1peGluZyBzcGVjaWZpY2F0aW9uIGZvciBzdGVyZW8gYXVkaW8gaW5wdXQgKi8KLSAgICBPTVhfVTggbkJ5cGFzczsgICAgICAgICAgICAgICAgLyoqPCBBdWRpbyBQcm9jZXNzaW5nIGJ5cGFzcyAqLwotICAgIE9NWF9VOCBuUmF0ZU11bHRpcGllcjsgICAgICAgICAvKio8IFNhbXBsZS1yYXRlIG11bHRpcGxpZXIgKG91dHB1dCB3aXRoIHJlc3BlY3QgdG8gaW5wdXQpICovCi0gICAgT01YX1U4IG5JbkNoYW5Gb3JtYXQ7ICAgICAgICAgIC8qKjwgSW5wdXQvT3V0cHV0IGNoYW5uZWwgZm9ybWF0ICovCi0gICAgT01YX1U4IG5Nc3JNYXhQcm9maWxlOyAgICAgICAgIC8qKjwgTWF4aW11bSBudW1iZXIgb2YgdmlydHVhbCByZW5kZXJpbmcgY2hhbm5lbHMgaW4gTW9iaWxlIFN1cnJvdW5kICovCi0gICAgT01YX0JPT0wgYlBvcnRhYmxlbW9kZUVuYWJsZTsgIC8qKjwgRW5hYmxlIG9yIGRpc2FibGUgUHVsc2UgUG9ydGFibGUgTW9kZSAqLwotICAgIE9NWF9TMTYgblBvdGFibGVtb2RlR2FpbjsgICAgICAvKio8IFNlbmQgdGhlIFBvcnRhYmxlIE1vZGUgZ2FpbiB2YWx1ZSBmcm9tIHRoZSBQdWxzZSBkZWNvZGVyICovCi0gICAgT01YX1U4IG5PUkw7ICAgICAgICAgICAgICAgICAgIC8qKjwgRGV2aWNlIHNwZWNpZmljIHRhcmdldCBzaWduYWwgbGV2ZWwgKG91dHB1dCByZWZlcmVuY2UgbGV2ZWwpICovCi0gICAgT01YX0JPT0wgYlB1bHNlZG93bm1peEVuYWJsZTsgIC8qKjwgRW5hYmxlIHRoZSBQdWxzZSBEb3dubWl4IGNvbXBlbnNhdGlvbiAqLwotICAgIE9NWF9TOCBuUHVsc2Vkb3dubWl4QXR0ZW47ICAgICAvKio8IEF0dGVudWF0aW9uIHZhbHVlIHRoYXQgUHVsc2UgaXMgY3VycmVudGx5IGFwcGx5aW5nICovCi0gICAgT01YX1U4IG5PdXRDaGFuczsgICAgICAgICAgICAgIC8qKjwgQ2hhbm5lbCBmb3JtYXQgb2Ygb3V0cHV0IGF1ZGlvICovCi0KLX0gT01YX0RBS19DT05GSUdfQlVORExFVFlQRTsKLQotLyoqIERvbGJ5IEF1ZGlvIEtlcm5lbCBNb25vLXRvLVN0ZXJlbyBDcmVhdG9yICovCi10eXBlZGVmIHN0cnVjdCBPTVhfREFLX0NPTkZJR19NMlNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgTW9uby10by1TdGVyZW8gQ3JlYXRvciBlbmFibGUgKi8KLSAgICBPTVhfQk9PTCBiRGV0ZWN0b3I7ICAgICAgICAvKio8IFN0ZXJlbyBkZXRlY3RvciBzdGF0dXMgKi8KLX0gT01YX0RBS19DT05GSUdfTTJTVFlQRTsKLQotLyoqIERvbGJ5IEF1ZGlvIEtlcm5lbCBTb3VuZCBTcGFjZSBFeHBhbmRlciAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0RBS19DT05GSUdfU1NFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IFNvdW5kIFNwYWNlIEV4cGFuZGVyIGVuYWJsZSAqLwotICAgIE9NWF9VOCBuV2lkdGg7ICAgICAgICAgICAgIC8qKjwgV2lkdGggb2YgZXhwYW5zaW9uIGVmZmVjdCAqLwotICAgIE9NWF9VOCBuU3BrTW9kZTsgICAgICAgICAgIC8qKjwgU3BlYWtlciBNb2RlICovCi19IE9NWF9EQUtfQ09ORklHX1NTRVRZUEU7Ci0KLS8qKiBEb2xieSBBdWRpbyBLZXJuZWwgU291bmQgTGV2ZWwgQ29udHJvbGxlciAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0RBS19DT05GSUdfU0xDVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IFNvdW5kIExldmVsIENvbnRyb2xsZXIgZW5hYmxlICovCi0gICAgT01YX1U4IG5MZXZlbDsgICAgICAgICAgICAgLyoqPCBTb3VyY2UgYXVkaW8gUk1TIGxldmVsICovCi0gICAgT01YX1U4IG5EZXB0aDsgICAgICAgICAgICAgLyoqPCBEZXB0aCBvZiBlZmZlY3QgKi8KLX0gT01YX0RBS19DT05GSUdfU0xDVFlQRTsKLQotLyoqIERvbGJ5IEF1ZGlvIEtlcm5lbCBWb2x1bWUgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9EQUtfQ09ORklHX1ZPTFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBWb2x1bWUgZW5hYmxlICovCi0gICAgT01YX1U4IG5HYWluVHlwZTsgICAgICAgICAgLyoqPCBMaW5lYXIvTG9nYXJpdGhtaWMgYXVkaW8gc2NhbGluZyAqLwotICAgIE9NWF9VOCBuSW50ZXJuYWxHYWluOyAgICAgIC8qKjwgQXVkaW8gdm9sdW1lIHNjYWxlICovCi0gICAgT01YX1U4IG5FeHRlcm5hbEdhaW47ICAgICAgLyoqPCBBdWRpbyB2b2x1bWUgc2NhbGUgYXBwbGllZCBieSBleHRlcm5hbCB2b2x1bWUgY29udHJvbCAqLwotICAgIE9NWF9TOCBuQmFsYW5jZTsgICAgICAgICAgIC8qKjwgTC9SIHBhbm5pbmcgZm9yIG91dHB1dCBhdWRpbyAqLwotICAgIE9NWF9CT09MIGJNdXRlOyAgICAgICAgICAgIC8qKjwgQXVkaW8gTXV0ZSAqLwotfSBPTVhfREFLX0NPTkZJR19WT0xUWVBFOwotCi0vKiogRG9sYnkgQXVkaW8gS2VybmVsIE5hdHVyYWwgQmFzcyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0RBS19DT05GSUdfTkJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgTmF0dXJhbCBCYXNzIGVuYWJsZSAqLwotICAgIE9NWF9VOCBuQ3V0b2ZmOyAgICAgICAgICAgIC8qKjwgU3BlYWtlcnMvaGVhZHBob25lcyBsb3dlciBjdXRvZmYgZnJlcXVlbmN5ICovCi0gICAgT01YX1U4IG5Cb29zdDsgICAgICAgICAgICAgLyoqPCBTdHJlbmd0aCBvZiBlZmZlY3QgKi8KLSAgICBPTVhfVTggbkxldmVsOyAgICAgICAgICAgICAvKio8IE1heGltdW0gb3V0cHV0IGxldmVsIGNhcGFiaWxpdHkgb2Ygc3BlYWtlcnMvaGVhZHBob25lcyAqLwotfSBPTVhfREFLX0NPTkZJR19OQlRZUEU7Ci0KLS8qKiBEb2xieSBBdWRpbyBLZXJuZWwgR3JhcGhpYyBFUSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0RBS19DT05GSUdfR0VRVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEdyYXBoaWMgRVEgZW5hYmxlICovCi0gICAgT01YX1U4IG5OYmFuZHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZnJlcXVlbmN5IGJhbmRzICovCi0gICAgT01YX1M4IG5QcmVhbXA7ICAgICAgICAgICAgLyoqPCBHbG9iYWwgYXR0ZW51YXRpb24gdG8gYXBwbHkgcHJpb3IgdG8gYmFuZCBsZXZlbCBhZGp1c3RtZW50ICovCi0gICAgT01YX1U4IG5NYXhib29zdDsgICAgICAgICAgLyoqPCBNYXhpbXVtIGFic29sdXRlIGJvb3N0IHdpdGggcmVzcGVjdCB0byB0aGUgc291cmNlIGF1ZGlvICovCi0gICAgT01YX1M4IG5CYW5kMTsgICAgICAgICAgICAgLyoqPCBCb29zdC9jdXQgZm9yIDFzdCBmcmVxdWVuY3kgYmFuZCAqLwotICAgIE9NWF9TOCBuQmFuZDI7ICAgICAgICAgICAgIC8qKjwgQm9vc3QvY3V0IGZvciAybmQgZnJlcXVlbmN5IGJhbmQgKi8KLSAgICBPTVhfUzggbkJhbmQzOyAgICAgICAgICAgICAvKio8IEJvb3N0L2N1dCBmb3IgM3JkIGZyZXF1ZW5jeSBiYW5kICovCi0gICAgT01YX1M4IG5CYW5kNDsgICAgICAgICAgICAgLyoqPCBCb29zdC9jdXQgZm9yIDR0aCBmcmVxdWVuY3kgYmFuZCAqLwotICAgIE9NWF9TOCBuQmFuZDU7ICAgICAgICAgICAgIC8qKjwgQm9vc3QvY3V0IGZvciA1dGggZnJlcXVlbmN5IGJhbmQgKi8KLSAgICBPTVhfUzggbkJhbmQ2OyAgICAgICAgICAgICAvKio8IEJvb3N0L2N1dCBmb3IgNnRoIGZyZXF1ZW5jeSBiYW5kICovCi0gICAgT01YX1M4IG5CYW5kNzsgICAgICAgICAgICAgLyoqPCBCb29zdC9jdXQgZm9yIDd0aCBmcmVxdWVuY3kgYmFuZCAqLwotfSBPTVhfREFLX0NPTkZJR19HRVFUWVBFOwotCi0vKiogRG9sYnkgQXVkaW8gS2VybmVsLCBNb2JpbGUgU3Vycm91bmQgYW5kIFN1cnJvdW5kIFVwbWl4ZXIgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9EQUtfQ09ORklHX01TUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX0JPT0wgYk1zckVuYWJsZTsgICAgICAgLyoqPCBNb2JpbGUgU3Vycm91bmQgZW5hYmxlICovCi0gICAgT01YX1U4IG5Nc3JSb29tOyAgICAgICAgICAgLyoqPCBSb29tIFNpemUgY29udHJvbCAqLwotICAgIE9NWF9VOCBuTXNyQnJpZ2h0OyAgICAgICAgIC8qKjwgQnJpZ2h0bmVzcyBjb250cm9sICovCi0gICAgT01YX0JPT0wgYk11cEVuYWJsZTsgICAgICAgLyoqPCBNb2JpbGUgU3Vycm91bmQgVXBtaXhlciBlbmFibGUgKi8KLX0gT01YX0RBS19DT05GSUdfTVNSVFlQRTsKLQotLyoqIERvbGJ5IEF1ZGlvIEtlcm5lbCBIaWdoIEZyZXF1ZW5jeSBFbmhhbmNlciAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0RBS19DT05GSUdfSEZFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEhpZ2ggRnJlcXVlbmN5IEVuaGFuY2VyIGVuYWJsZSAqLwotICAgIE9NWF9VOCBuRGVwdGg7ICAgICAgICAgICAgIC8qKjwgU3RyZW5ndGggb2YgZWZmZWN0ICovCi19IE9NWF9EQUtfQ09ORklHX0hGRVRZUEU7Ci0KLS8qKiBEb2xieSBBdWRpbyBLZXJuZWwgRmFkZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0RBS19DT05GSUdfRkFERVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBGYWRlIGVuYWJsZSAqLwotICAgIE9NWF9VOCBuVGFyZ2V0OyAgICAgICAgICAgIC8qKjwgVGFyZ2V0IGZhZGUgbGV2ZWwgKi8KLSAgICBPTVhfVTE2IG5UaW1lOyAgICAgICAgICAgICAvKio8IEZhZGUgdGltZSBpbnRlcnZhbCAqLwotfSBPTVhfREFLX0NPTkZJR19GQURFVFlQRTsKLQotLyoqIERvbGJ5IEF1ZGlvIEtlcm5lbCBTcGVha2VyIEVRICovCi10eXBlZGVmIHN0cnVjdCBPTVhfREFLX0NPTkZJR19TRVFUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgU3BlYWtlciBFUSBlbmFibGUgKi8KLSAgICBPTVhfUzggbkxlZnRHYWluREI7ICAgICAgICAvKio8IEFkZGl0aW9uYWwgZ2FpbiBmb3IgTGVmdCBjaGFubmVsICovCi0gICAgT01YX1M4IG5SaWdodEdhaW5EQjsgICAgICAgLyoqPCBBZGRpdGlvbmFsIGdhaW4gZm9yIFJpZ2h0IGNoYW5uZWwgKi8KLSAgICBPTVhfVTggbkNvZWY0ODAwMFNpemU7ICAgICAvKio8IExlbmd0aCBvZiB0aGUgYmxvY2sgb2YgY29lZmZpY2llbnRzIGZvciA0OEtIeiBTYW1wbGluZyBSYXRlIGNhc2UgKi8KLSAgICBPTVhfUFRSIHBDb2VmNDgwMDA7ICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGhlIGJsb2NrIG9mIGNvZWZmaWNpZW50cyBmb3IgdGhlIDQ4S0h6IGNhc2UgKi8KLSAgICBPTVhfVTggbkNvZWY0NDEwMFNpemU7ICAgICAvKio8IExlbmd0aCBvZiB0aGUgYmxvY2sgb2YgY29lZmZpY2llbnRzIGZvciA0NC4xS0h6IFNhbXBsaW5nIFJhdGUgY2FzZSAqLwotICAgIE9NWF9QVFIgcENvZWY0NDEwMDsgICAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgYmxvY2sgb2YgY29lZmZpY2llbnRzIGZvciB0aGUgNDQuMUtIeiBjYXNlICovCi0gICAgT01YX1U4IG5Db2VmMzIwMDBTaXplOyAgICAgLyoqPCBMZW5ndGggb2YgdGhlIGJsb2NrIG9mIGNvZWZmaWNpZW50cyBmb3IgMzJLSHogU2FtcGxpbmcgUmF0ZSBjYXNlICovCi0gICAgT01YX1BUUiBwQ29lZjMyMDAwOyAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBibG9jayBvZiBjb2VmZmljaWVudHMgZm9yIHRoZSAzMktIeiBjYXNlICovCi0gICAgT01YX1U4IG5Db2VmMjQwMDBTaXplOyAgICAgLyoqPCBMZW5ndGggb2YgdGhlIGJsb2NrIG9mIGNvZWZmaWNpZW50cyBmb3IgMjRLSHogU2FtcGxpbmcgUmF0ZSBjYXNlICovCi0gICAgT01YX1BUUiBwQ29lZjI0MDAwOyAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBibG9jayBvZiBjb2VmZmljaWVudHMgZm9yIHRoZSAyNEtIeiBjYXNlICovCi0KLX0gT01YX0RBS19DT05GSUdfU0VRVFlQRTsKLQotCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0NIQU5ORUxUWVBFX0VYVEVOU0lPTiB7Ci0gICAgT01YX0FVRElPX0NoYW5uZWxUUyA9IE9NWF9BVURJT19DaGFubmVsVmVuZG9yU3RhcnRVbnVzZWQsICAvKio8IFRvcCBTdXJyb3VuZCAqLwotICAgIE9NWF9BVURJT19DaGFubmVsQ1ZIICAgICAgIC8qKjwgQ2VudHJhbCBWZXJ0aWNhbCBIZWlnaHQgKi8KLX0gT01YX0FVRElPX0NIQU5ORUxUWVBFX0VYVEVOU0lPTjsKLQotLyoqCi0gKiBEVUFMLU1PTk8gdHlwZQotICoKLSAqICBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlQ2hhbm5lbENvbmZpZyAgICAgIDogRW51bSBmb3IgY2hhbm5lbCBjb25maWcKLSAqCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfQVVESU9fQ09ORklHX0RVQUxNT05PVFlQRSB7Ci0gICBPTVhfVTMyIG5TaXplOwotICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgT01YX0FVRElPX0RVQUxfTU9OT19DSEFOTkVMX0NPTkZJRyBlQ2hhbm5lbENvbmZpZzsKLX0gUU9NWF9BVURJT19DT05GSUdfRFVBTE1PTk9UWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX0FVRElPX1BBUkFNX0FMQUNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAvKiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgLyogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQk9PTCBiQnl0ZXNTdHJlYW1Nb2RlOyAvKmVuYWJsZSBieXRlIHN0cmVhbSBtb2RlKi8KLSAgICBPTVhfVTMyIG5GcmFtZUxlbmd0aDsgLyogRnJhbWVzIHBlciBwYWNrZXQgd2hlbiBubyBleHBsaWNpdCBmcmFtZXMgcGVyIHBhY2tldCBzZXR0aW5nIGlzIHByZXNlbnQgaW4gdGhlIHBhY2tldCBoZWFkZXIgKi8KLSAgICBPTVhfVTggbkNvbXBhdGlibGVWZXJzaW9uOyAvKiBJbmRpY2F0ZXMgdGhlIGNvbXBhdGlibGUgdmVyc2lvbiAqLwotICAgIE9NWF9VOCBuQml0RGVwdGg7IC8qIEJpdCBkZXB0aCBvZiB0aGUgc291cmNlIFBDTSBkYXRhICovCi0gICAgT01YX1U4IG5QYjsgLyogVHVuaW5nIFBhcmFtZXRlcjsgY3VycmVudGx5IG5vdCB1c2VkICovCi0gICAgT01YX1U4IG5NYjsgLyogVHVuaW5nIFBhcmFtZXRlcjsgY3VycmVudGx5IG5vdCB1c2VkICovCi0gICAgT01YX1U4IG5LYjsgLyogVHVuaW5nIFBhcmFtZXRlcjsgY3VycmVudGx5IG5vdCB1c2VkICovCi0gICAgT01YX1U4IG5DaGFubmVsczsgLyogTnVtYmVyIG9mIGNoYW5uZWxzIGZvciBtdWx0aWNoYW5uZWwgZGVjb2RpbmcgKi8KLSAgICBPTVhfVTE2IG5NYXhSdW47IC8qIEN1cnJlbnRseSBub3QgdXNlZCAqLwotICAgIE9NWF9VMzIgbk1heEZyYW1lQnl0ZXM7IC8qIE1heCBzaXplIG9mIGFuIEFwcGxlIExvc3NsZXNzIHBhY2tldCB3aXRoaW4gdGhlIGVuY29kZWQgc3RyZWFtICovCi0gICAgT01YX1UzMiBuQXZnQml0UmF0ZTsgLyogQXZlcmFnZSBiaXQgcmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQgb2YgdGhlIEFwcGxlIExvc3NsZXNzIHN0cmVhbSAqLwotICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7IC8qIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQgaW4gSGVydHogKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsTGF5b3V0VGFnOyAvKkluZGljYXRlcyB3aGV0aGVyIGNoYW5uZWwgbGF5b3V0IGluZm9ybWF0aW9uIGlzIHByZXNlbnQgaW4gdGhlIGJpdHN0cmVhbSAqLwotfSBRT01YX0FVRElPX1BBUkFNX0FMQUNUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX0FVRElPX1BBUkFNX0FQRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7IC8qIFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAvKiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJCeXRlc1N0cmVhbU1vZGU7IC8qZW5hYmxlIGJ5dGUgc3RyZWFtIG1vZGUqLwotICAgIE9NWF9VMTYgbkNvbXBhdGlibGVWZXJzaW9uOyAvKiBJbmRpY2F0ZXMgdGhlIGNvbXBhdGlibGUgdmVyc2lvbiAqLwotICAgIE9NWF9VMTYgbkNvbXByZXNzaW9uTGV2ZWw7IC8qIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBwcmVzZW50IGluIHRoZSBlbmNvZGVkIHBhY2tldCAqLwotICAgIE9NWF9VMzIgbkZvcm1hdEZsYWdzOyAvKiBSZXNlcnZlZCBwYXJhbWV0ZXIgZm9yIGZ1dHVyZSB1c2UgKi8KLSAgICBPTVhfVTMyIG5CbG9ja3NQZXJGcmFtZTsgLyogSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYXVkaW8gYmxvY2tzIGluIG9uZSBmcmFtZSBwcmVzZW50IGluIHRoZSBlbmNvZGVkIHBhY2tldCBoZWFkZXIgKi8KLSAgICBPTVhfVTMyIG5GaW5hbEZyYW1lQmxvY2tzOyAvKiBJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBhdWRpbyBibG9ja3MgaW4gdGhlIGZpbmFsIGZyYW1lIHByZXNlbnQgaW4gdGhlIGVuY29kZWQgcGFja2V0IGhlYWRlciAqLwotICAgIE9NWF9VMzIgblRvdGFsRnJhbWVzOyAvKiBJbmRpY2F0ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgKi8KLSAgICBPTVhfVTE2IG5CaXRzUGVyU2FtcGxlOyAvKiBCaXQgZGVwdGggb2YgdGhlIHNvdXJjZSBQQ00gZGF0YSAqLwotICAgIE9NWF9VMTYgbkNoYW5uZWxzOyAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgZm9yIGRlY29kaW5nICovCi0gICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgLyogU2FtcGxlcyBwZXIgc2Vjb25kIGluIEhlcnR6ICovCi0gICAgT01YX1UzMiBuU2Vla1RhYmxlUHJlc2VudDsgLyogRmxhZyB0byBpbmRpY2F0ZSBpZiBzZWVrIHRhYmxlIGlzIHByZXNlbnQgb3Igbm90ICovCi19IFFPTVhfQVVESU9fUEFSQU1fQVBFVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9BVURJT19QQVJBTV9GTEFDX0RFQ19UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuQ2hhbm5lbHM7Ci0gICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsKLSAgICBPTVhfVTMyIG5CaXRzUGVyU2FtcGxlOwotICAgIE9NWF9VMzIgbk1pbkJsa1NpemU7Ci0gICAgT01YX1UzMiBuTWF4QmxrU2l6ZTsKLSAgICBPTVhfVTMyIG5NaW5Gcm1TaXplOwotICAgIE9NWF9VMzIgbk1heEZybVNpemU7Ci19IFFPTVhfQVVESU9fUEFSQU1fRkxBQ19ERUNfVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9BVURJT19QQVJBTV9EU0RfVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJCeXRlc1N0cmVhbU1vZGU7IC8qZW5hYmxlIGJ5dGUgc3RyZWFtIG1vZGUqLwotICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7Ci0gICAgT01YX1UzMiBuT3V0U2FtcGxlUGVyQ2g7Ci0gICAgT01YX1UzMiBuQ2hhbm5lbHM7Ci0gICAgT01YX1UzMiBuQml0c1BlclNhbXBsZTsKLX0gUU9NWF9BVURJT19QQVJBTV9EU0RfVFlQRTsKLQotZW51bSB7Ci0gICAga0tleUluZGV4QWxhY0ZyYW1lTGVuZ3RoID0gMCwKLSAgICBrS2V5SW5kZXhBbGFjQ29tcGF0aWJsZVZlcnNpb24gPSA0LAotICAgIGtLZXlJbmRleEFsYWNCaXREZXB0aCA9IDUsCi0gICAga0tleUluZGV4QWxhY1BiID0gNiwKLSAgICBrS2V5SW5kZXhBbGFjTWIgPSA3LAotICAgIGtLZXlJbmRleEFsYWNLYiA9IDgsCi0gICAga0tleUluZGV4QWxhY051bUNoYW5uZWxzID0gOSwKLSAgICBrS2V5SW5kZXhBbGFjTWF4UnVuID0gMTAsCi0gICAga0tleUluZGV4QWxhY01heEZyYW1lQnl0ZXMgPSAxMiwKLSAgICBrS2V5SW5kZXhBbGFjQXZnQml0UmF0ZSA9IDE2LAotICAgIGtLZXlJbmRleEFsYWNTYW1wbGluZ1JhdGUgPSAyMCwKLSAgICBrS2V5SW5kZXhBbGFjQ2hhbm5lbExheW91dFRhZyA9IDI0LAotICAgIGtLZXlJbmRleEFsYWNNYXggPSBrS2V5SW5kZXhBbGFjQ2hhbm5lbExheW91dFRhZywKLX07Ci0KLWVudW0gewotICAgIGtLZXlJbmRleEFwZUNvbXBhdGlibGVWZXJzaW9uID0gMCwKLSAgICBrS2V5SW5kZXhBcGVDb21wcmVzc2lvbkxldmVsID0gMiwKLSAgICBrS2V5SW5kZXhBcGVGb3JtYXRGbGFncyA9IDQsCi0gICAga0tleUluZGV4QXBlQmxvY2tzUGVyRnJhbWUgPSA4LAotICAgIGtLZXlJbmRleEFwZUZpbmFsRnJhbWVCbG9ja3MgPSAxMiwKLSAgICBrS2V5SW5kZXhBcGVUb3RhbEZyYW1lcyA9IDE2LAotICAgIGtLZXlJbmRleEFwZUJpdHNQZXJTYW1wbGUgPSAyMCwKLSAgICBrS2V5SW5kZXhBcGVOdW1DaGFubmVscyA9IDIyLAotICAgIGtLZXlJbmRleEFwZVNhbXBsZVJhdGUgPSAyNCwKLSAgICBrS2V5SW5kZXhBcGVTZWVrVGFibGVQcmVzZW50ID0gMjgsCi0gICAga0tleUluZGV4QXBlTWF4ID0ga0tleUluZGV4QXBlU2Vla1RhYmxlUHJlc2VudCwKLX07Ci0KLWVudW0gewotICAgIEFQRV9DT01QUkVTU0lPTl9MRVZFTF9GQVNUID0gMTAwMCwKLSAgICBBUEVfQ09NUFJFU1NJT05fTEVWRUxfTk9STUFMID0gMjAwMCwKLSAgICBBUEVfQ09NUFJFU1NJT05fTEVWRUxfSElHSCA9IDMwMDAsCi0gICAgQVBFX0NPTVBSRVNTSU9OX0xFVkVMX0VYVFJBX0hJR0ggPSA0MDAwLAotICAgIEFQRV9DT01QUkVTU0lPTl9MRVZFTF9JTlNBTkUgPSA1MDAwLAotfTsKLQotI2lmIGRlZmluZWQoIF9fY3BsdXNwbHVzICkKLX0KLSNlbmRpZiAvKiBlbmQgb2YgbWFjcm8gX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIGVuZCBvZiBtYWNybyBfX0hfUU9NWF9BVURJT0VYVEVOU0lPTlNfSF9fICovCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9pbmMvUU9NWF9BdWRpb0luZGV4RXh0ZW5zaW9ucy5oIGIvc2RtODQ1L21tLWNvcmUvaW5jL1FPTVhfQXVkaW9JbmRleEV4dGVuc2lvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlNDY2Ny4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9pbmMvUU9NWF9BdWRpb0luZGV4RXh0ZW5zaW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gTSBBIFggICB3IHIgYSBwIHAgZSByIHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiAgTSBBIFggICBDIG8gciBlCi0KLSovLyoqIEBmaWxlIFFPTVhfQXVkaW9JbmRleEV4dGVuc2lvbnMuaAotICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgaW5kZXggZXh0ZW5zaW9ucyBmb3IgQXVkaW8KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotI2lmbmRlZiBfX0hfUU9NWF9BVURJT0lOREVYRVhURU5TSU9OU19IX18KLSNkZWZpbmUgX19IX1FPTVhfQVVESU9JTkRFWEVYVEVOU0lPTlNfSF9fCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMgRk9SIE1PRFVMRQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2luY2x1ZGUgPE9NWF9Db3JlLmg+Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICBERUZJTklUSU9OUyBBTkQgREVDTEFSQVRJT05TCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNpZiBkZWZpbmVkKCBfX2NwbHVzcGx1cyApCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYgLyogZW5kIG9mIG1hY3JvIF9fY3BsdXNwbHVzICovCi0KLS8qKgotICogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgUXVhbGNvbW0ncyB2ZW5kb3IgZXh0ZW5zaW9ucyBmb3IKLSAqIGF1ZGlvLiBUaGUgYXVkaW8gZXh0ZW5zaW9ucyBvY2N1cHkgYSByYW5nZSBvZgotICogMHg3RjEwMDAwMC0weDdGMUZGRkZGLCBpbmNsdXNpdmUuCi0gKi8KLXR5cGVkZWYgZW51bSBRT01YX0FVRElPX0VYVEVOU0lPTlNfSU5ERVhUWVBFCi17Ci0gICAgUU9NWF9JbmRleFBhcmFtQXVkaW9BbXJXYlBsdXMgICAgICAgPSAweDdGMjAwMDAwLCAvKio8ICJPTVguUXVhbGNvbW0uaW5kZXguYXVkaW8uYW1yd2JwbHVzIiAqLwotICAgIFFPTVhfSW5kZXhQYXJhbUF1ZGlvV21hMTBQcm8gICAgICAgID0gMHg3RjIwMDAwMSwgLyoqPCAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLndtYTEwcHJvIiAqLwotICAgIFFPTVhfSW5kZXhQYXJhbUF1ZGlvU2Vzc2lvbklkICAgICAgID0gMHg3RjIwMDAwMiwgLyoqPCAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLnNlc3Npb25JZCIgKi8KLSAgICBRT01YX0luZGV4UGFyYW1BdWRpb1ZvaWNlUmVjb3JkICAgICA9IDB4N0YyMDAwMDMsIC8qKjwgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5Wb2ljZVJlY29yZCIgKi8KLSAgICBRT01YX0luZGV4Q29uZmlnQXVkaW9EdWFsTW9ubyAgICAgICA9IDB4N0YyMDAwMDQsIC8qKjwgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5kdWFsbW9ubyIgKi8KLSAgICBRT01YX0luZGV4UGFyYW1BdWRpb0FjMyAgICAgICAgICAgICA9IDB4N0YyMDAwMDUsIC8qKjwgIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5hYzMiICovCi0gICAgUU9NWF9JbmRleFBhcmFtQXVkaW9BYzNQb3N0UHJvYyAgICAgPSAweDdGMjAwMDA2LCAvKio8ICJPTVguUXVhbGNvbW0uaW5kZXguYXVkaW8ucG9zdHByb2MuYWMzIiAqLwotICAgIFFPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjU2VsZWN0TWl4Q29lZiA9IDB4N0YyMDAwMDcsIC8qKiAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLmFhY19zZWxfbWl4X2NvZWYqKi8KLSAgICBRT01YX0luZGV4UGFyYW1BdWRpb0FsYWMgICAgICAgICAgICA9IDB4N0YyMDAwMDgsIC8qKiAiT01YLlF1YWxjb21tLmluZGV4LmF1ZGlvLmFsYWMiICovCi0gICAgUU9NWF9JbmRleFBhcmFtQXVkaW9BcGUgICAgICAgICAgICAgPSAweDdGMjAwMDA5LCAvKiogIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5hcGUiICovCi0gICAgUU9NWF9JbmRleFBhcmFtQXVkaW9GbGFjRGVjICAgICAgICAgPSAweDdGMjAwMDBBLCAvKiogIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5mbGFjZGVjKiovCi0gICAgUU9NWF9JbmRleFBhcmFtQXVkaW9Ec2REZWMgICAgICAgICAgPSAweDdGMjAwMDBCLCAvKiogIk9NWC5RdWFsY29tbS5pbmRleC5hdWRpby5Ec2RkZWMqKi8KLSAgICBRT01YX0luZGV4UGFyYW1BdWRpb1VudXNlZCAgICAgICAgICA9IDB4N0YyRkZGRkYKLX0gUU9NWF9BVURJT19FWFRFTlNJT05TX0lOREVYVFlQRTsKLQotI2lmIGRlZmluZWQoIF9fY3BsdXNwbHVzICkKLX0KLSNlbmRpZiAvKiBlbmQgb2YgbWFjcm8gX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIGVuZCBvZiBtYWNybyBfX0hfUU9NWF9BVURJT0lOREVYRVhURU5TSU9OU19IX18gKi8KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL2luYy9RT01YX0NvcmVFeHRlbnNpb25zLmggYi9zZG04NDUvbW0tY29yZS9pbmMvUU9NWF9Db3JlRXh0ZW5zaW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWRkYjkwLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL2luYy9RT01YX0NvcmVFeHRlbnNpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDExIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBfX0hfUU9NWF9DT1JFRVhURU5TSU9OU19IX18KLSNkZWZpbmUgX19IX1FPTVhfQ09SRUVYVEVOU0lPTlNfSF9fCi0KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTIEZPUiBNT0RVTEUKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgREVGSU5JVElPTlMgQU5EIERFQ0xBUkFUSU9OUwotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jaWYgZGVmaW5lZCggX19jcGx1c3BsdXMgKQotZXh0ZXJuICJDIgotewotI2VuZGlmIC8qIGVuZCBvZiBtYWNybyBfX2NwbHVzcGx1cyAqLwotCi0vKioKLSAqIFF1YWxjb20gdmVuZG9yIGV4dGVuc2lvbnMuCi0gKi8KLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fSU5ERVhFWFRSQURBVEEgIk9NWC5RQ09NLmluZGV4LnBhcmFtLkluZGV4RXh0cmFEYXRhIiAvKio8IHJlZmVyZW5jZTogUU9NWF9JTkRFWEVYVFJBREFUQVRZUEUgKi8KLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fSEVMREJVRkZFUkNPVU5UICJPTVguUUNPTS5pbmRleC5wYXJhbS5IZWxkQnVmZmVyQ291bnQiIC8qKjwgcmVmZXJlbmNlOiBRT01YX0hFTERCVUZGRVJDT1VOVFRZUEUgKi8KLQotLyoqCi0gKiBCdWZmZXIgaGVhZGVyIG5GbGFncyBmaWVsZCBleHRlbnNpb24uCi0gKgotICogVGhlIHNvdXJjZSBvZiBhIHN0cmVhbSBzZXRzIHRoZSBUSU1FU1RBTVBJTlZBTElEIGZsYWcgdG8KLSAqIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBoZWFkZXIgblRpbWVTdGFtcCBmaWVsZCBkb2VzIG5vdAotICogaG9sZCB2YWxpZCB0aW1lc3RhbXAgaW5mb3JtYXRpb24uIFRoZSBjb21wb25lbnQgdGhhdCB1cGRhdGVzCi0gKiB0aGUgblRpbWVTdGFtcCBmaWVsZCB0byByZWZsZWN0IGEgdmFsaWQgdGltZXN0YW1wIHNoYWxsIGNsZWFyCi0gKiB0aGlzIGZsYWcuCi0gKi8KLSNkZWZpbmUgUU9NWF9CVUZGRVJGTEFHX1RJTUVTVEFNUElOVkFMSUQgMHg4MDAwMDAwMAotCi0vKioKLSAqIEJ1ZmZlciBoZWFkZXIgbkZsYWdzIGZpZWxkIGV4dGVuc2lvbi4KLSAqCi0gKiBUaGUgUkVBRE9OTFkgZmxhZyBpcyBzZXQgd2hlbiB0aGUgY29tcG9uZW50IGVtaXR0aW5nIHRoZQotICogYnVmZmVyIG9uIGFuIG91dHB1dCBwb3J0IGlkZW50aWZpZXMgdGhlIGJ1ZmZlcidzIGNvbnRlbnRzIHRvCi0gKiBiZSByZWFkLW9ubHkuIFRoZSBJTCBjbGllbnQgb3IgaW5wdXQgcG9ydCB0aGF0IHJlY2VpdmVzIGEKLSAqIGZpbGxlZCByZWFkLW9ubHkgYnVmZmVyIGNhbm5vdCBhbHRlciB0aGUgY29udGVudHMgb2YgdGhlCi0gKiBidWZmZXIuIFRoaXMgZmxhZyBjYW4gYmUgY2xlYXJlZCBieSB0aGUgY29tcG9uZW50IHdoZW4gdGhlCi0gKiBlbXB0aWVkIGJ1ZmZlciBpcyByZXR1cm5lZCB0byBpdC4KLSAqLwotI2RlZmluZSBRT01YX0JVRkZFUkZMQUdfUkVBRE9OTFkgICAgICAgICAweDQwMDAwMDAwCi0KLS8qKgotICogQnVmZmVyIGhlYWRlciBuRmxhZ3MgZmllbGQgZXh0ZW5zaW9uLgotICoKLSAqIFRoZSBFTkRPRlNVQkZSQU1FIGZsYWcgaXMgYW4gb3B0aW9uYWwgZmxhZyB0aGF0IGlzIHNldCBieSBhbgotICogb3V0cHV0IHBvcnQgd2hlbiB0aGUgbGFzdCBieXRlIHRoYXQgYSBidWZmZXIgcGF5bG9hZCBjb250YWlucwotICogaXMgYW4gZW5kLW9mLXN1YmZyYW1lLiBBbnkgY29tcG9uZW50IHRoYXQgaW1wbGVtZW50cyBzZXR0aW5nCi0gKiB0aGUgRU5ET0ZTVUJGUkFNRSBmbGFnIG9uIGFuIG91dHB1dCBwb3J0IHNoYWxsIHNldCB0aGlzIGZsYWcKLSAqIGZvciBldmVyeSBidWZmZXIgc2VudCBmcm9tIHRoZSBvdXRwdXQgcG9ydCBjb250YWluaW5nIGFuCi0gKiBlbmQtb2Ytc3ViZnJhbWUuCi0gKgotICogQSBzdWJmcmFtZSBpcyBkZWZpbmVkIGJ5IHRoZSBuZXh0IGxldmVsIG9mIG5hdHVyYWwKLSAqIHBhcnRpdGlvbmluZyBpbiBhIGxvZ2ljYWwgdW5pdCBmb3IgYSBnaXZlbiBmb3JtYXQuIEZvcgotICogZXhhbXBsZSwgYSBzdWJmcmFtZSBpbiBhbiBILjI2NCBhY2Nlc3MgdW5pdCBpcyBkZWZpbmVkIGFzIHRoZQotICogIm5ldHdvcmsgYWJzdHJhY3Rpb24gbGF5ZXIiIHVuaXQsIG9yIE5BTCB1bml0LgotICovCi0jZGVmaW5lIFFPTVhfQlVGRkVSRkxBR19FTkRPRlNVQkZSQU1FICAgIDB4MjAwMDAwMDAKLQotLyoqCi0gKiBBIGNvbXBvbmVudCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKQotICogaW4gdGhlIGV2ZW50IHRoYXQgYXBwbGljYXRpb24gb2YgYSBjb25maWcgb3IgcGFyYW1ldGVyIGhhcyBmYWlsZWQgc29tZSB0aW1lCi0gKiBhZnRlciB0aGUgcmV0dXJuIG9mIE9NWF9TZXRDb25maWcgb3IgT01YX1NldFBhcmFtZXRlci4gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYQotICogY29tcG9uZW50IHRyYW5zaXRpb25zIGJldHdlZW4gc3RhdGVzIGFuZCBkaXNjb3ZlcnMgc29tZSBpbmNvbXBhdGliaWxpdHkKLSAqIGJldHdlZW4gbXVsdGlwbGUgc2V0dGluZ3MuIENvbmZpZ3VyYXRpb24gaW5kaWNpZXMgc2VudCB2aWEgZXh0cmEgZGF0YSBtYXkgYWxzbwotICogZmFpbCB3aGVuIHNldCB0byBhIGRvd24gc3RyZWFtIGNvbXBvbmVudC4gVGhlIGluZGV4IHRoYXQgZmFpbGVkIHdpbGwgYmUKLSAqIGluY2x1ZGVkIGFzIHRoZSBuRGF0YTIgcGFyYW1ldGVyIG9mIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2suCi0gKi8KLSNkZWZpbmUgUU9NWF9FcnJvckFzeW5jSW5kZXhGYWlsZWQgKE9NWF9FcnJvclZlbmRvclN0YXJ0VW51c2VkKzEpCi0KLS8qIEluIHNvbWUgc2NlbmFyaW9zIHRoZXJlIG1heSBiZSBhIHBvc3NpYmlsdHkgdG8gcnVuIG91dCBvZiB0aGUgc3RvcmFnZSBzcGFjZQotICogYW5kIGNvbXBvbmVudHMgbWF5IHdhbnQgdG8gbm90aWZ5IHRoaXMgZXJyb3IgdG8gSUwgY2xpZW50IHRvIHRha2UgYXBwcm9wcmlhdGUKLSAqIGFjdGlvbiBieSB0aGUgSUwgY2xpZW50LgotICoKLSAqIEZvciBleGFtcGxlLCBJbiByZWNvcmRpbmcgc2NlbmFyaW8sIE1VWCBjb21wb25lbnQgY2FuIGtub3cgdGhlIGF2YWlsYWJsZQotICogc3BhY2UgaW4gdGhlIHJlY29yZGluZyBtZWRpYSBhbmQgY2FuIGNvbXB1dGUgcGVyaWRpY2FsbHkgdG8gYWNjb21tb2RhdGUgdGhlCi0gKiBtZXRhIGRhdGEgYmVmb3JlIHdlIHJlYWNoIHRvIGEgc3RhZ2Ugd2hlcmUgd2UgZW5kIHVwIG5vIHNwYWNlIHRvIHdyaXRlIGV2ZW4KLSAqIHRoZSBtZXRhIGRhdGEuIFdoZW4gdGhlIHNwYWNlIGxpbWl0IHJlYWNoZWQgaW4gcmVjb3JkaW5nIG1lZGlhLCBNVVggY29tcG9uZW50Ci0gKiB3b3VsZCBsaWtlIHRvIG5vdGlmeSB0aGUgSUwgY2xpZW50IHdpdGggIFFPTVhfRXJyb3JTcGFjZUxpbWl0UmVhY2hlZC4KLSAqIEFmdGVyIHRoaXMgZXJyb3IgYWxsIHRoZSBidWZmZXJzIHRoYXQgYXJlIHJldHVybmVkIHdpbGwgaGF2ZSBuRmlsbGVkTGVuCi0gKiB1bmNoYW5nZXMgaS5lIG5vdCBjb25zdW1lZC4KLSAqLwotI2RlZmluZSBRT01YX0Vycm9yU3RvcmFnZUxpbWl0UmVhY2hlZCAoT01YX0Vycm9yVmVuZG9yU3RhcnRVbnVzZWQgKyAyKQotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgdGhlIGdlbmVyYXRpb24gb3IKLSAqIGNvbnN1bXB0aW9uIG9mIHRoZSBRT01YX0V4dHJhRGF0YU9NWEluZGV4IGV4dHJhIGRhdGEgdHlwZSBmb3IKLSAqIHRoZSBzcGVjaWZpZWQgT3Blbk1heCBpbmRleC4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbwotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGJFbmFibGVkICAgOiBFbmFibGUvRGlzYWJsZSB0aGUgZXh0cmEgZGF0YSBwcm9jZXNzaW5nCi0gKiAgbkluZGV4ICAgICA6IFRoZSBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dHJhIGRhdGEKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9JTkRFWEVYVFJBREFUQVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRW5hYmxlZDsKLSAgICBPTVhfSU5ERVhUWVBFIG5JbmRleDsKLX0gUU9NWF9JTkRFWEVYVFJBREFUQVRZUEU7Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnVmZmVycwotICogdGhhdCBhIHBvcnQgd2lsbCBob2xkIGR1cmluZyBkYXRhIGZsb3cuCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvCi0gKiAgblBvcnRJbmRleCAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuSGVsZEJ1ZmZlckNvdW50ICAgOiBSZWFkLW9ubHksIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCB3aWxsIGJlIGhlbGQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9IRUxEQlVGRkVSQ09VTlRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuSGVsZEJ1ZmZlckNvdW50OwotfSBRT01YX0hFTERCVUZGRVJDT1VOVFRZUEU7Ci0KLSNpZiBkZWZpbmVkKCBfX2NwbHVzcGx1cyApCi19Ci0jZW5kaWYgLyogZW5kIG9mIG1hY3JvIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBlbmQgb2YgbWFjcm8gX19IX1FPTVhfQ09SRUVYVEVOU0lPTlNfSF9fICovCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9pbmMvUU9NWF9GaWxlRm9ybWF0RXh0ZW5zaW9ucy5oIGIvc2RtODQ1L21tLWNvcmUvaW5jL1FPTVhfRmlsZUZvcm1hdEV4dGVuc2lvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4YmVjMi4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9pbmMvUU9NWF9GaWxlRm9ybWF0RXh0ZW5zaW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yCi0gICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTi1JTkZSSU5HRU1FTlQgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgX19RT01YX0ZJTEVfRk9STUFUX0VYVEVOU0lPTlNfSF9fCi0jZGVmaW5lIF9fUU9NWF9GSUxFX0ZPUk1BVF9FWFRFTlNJT05TX0hfXwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovLyoqIEBmaWxlIFFPTVhfRmlsZUZvcm1hdEV4dGVuc2lvbnMuaAotICBUaGlzIGhlYWRlciBjb250YWlucyBjb25zdGFudHMgYW5kIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBzcGVjaWZ5IHRoZQotICBleHRlbnNpb25zIGFkZGVkIHRvIHRoZSBPcGVuTUFYIFZlbmRvciBzcGVjaWZpYyBBUElzLgotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBIaXN0b3J5Ci0KLXdoZW4gICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5Ci0tLS0tLS0tLSAgIC0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBGaWxlcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0jaW5jbHVkZSAiT01YX0NvcmUuaCIKLQotCi0vKiA6T01YLlFDT00uaW5kZXgucGFyYW0uY29udGFpbmVyLmluZm8qLwotI2RlZmluZSBRT01YX1Fjb21JbmRleFBhcmFtQ29udGFpbmVySW5mbyAweDdGMDAwMDA5Ci0KLS8qKjxPTVguUXVhbGNvbW0uaW5kZXgudmlkZW8ucGFyYW0uZW5jcnlwdHR5cGVjb25maWdwYXJhbWV0ZXJzKi8KLSNkZWZpbmUgUU9NWF9GaWxlbXV4SW5kZXhFbmNyeXB0aW9uVHlwZUNvbmZpZ1BhcmFtZXRlcnMgMHg3RjAwMDAwQQotCi0jZGVmaW5lIFFPTVhfSU5ERVhfQ09OVEFJTkVSX0lORk9fU1RSSU5HICAgICJRT01YLlF1YWxjb21tLmluZGV4LnBhcmFtLmNvbnRhaW5lcmluZm8iCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0ZJTEVfRk9STUFUICAgICAgICAgICJPTVguUUNPTS5pbmRleC5jb25maWcuRmlsZUZvcm1hdCIKLSNkZWZpbmUgUU9NWF9JTkRFWF9DT05GSUdfRU5DUllQVF9UWVBFICAgICAgIlFPTVguUXVhbGNvbW0uaW5kZXguY29uZmlnLkVuY3J5cHRUeXBlIgotCi0vKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgT01YLlFDT00uaW5kZXgucGFyYW0uY29udGFpbmVyLmluZm8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi10eXBlZGVmIGVudW0gUU9NWF9DT05UQUlORVJfRk9STUFUVFlQRSB7Ci0gICAgUU9NWF9GT1JNQVRfUkFXLAotICAgIFFPTVhfRk9STUFUX01QNCwKLSAgICBRT01YX0ZPUk1BVF8zR1AsCi0gICAgUU9NWF9GT1JNQVRfM0cyLAotICAgIFFPTVhfRk9STUFUX0FNQywKLSAgICBRT01YX0ZPUk1BVF9TS00sCi0gICAgUU9NWF9GT1JNQVRfSzNHLAotICAgIFFPTVhfRk9STUFUX1ZPQiwKLSAgICBRT01YX0ZPUk1BVF9BVkksCi0gICAgUU9NWF9GT1JNQVRfQVNGLAotICAgIFFPTVhfRk9STUFUX1JNICwKLSAgICBRT01YX0ZPUk1BVF9NUEVHX0VTLAotICAgIFFPTVhfRk9STUFUX0RJVlgsCi0gICAgUU9NWF9GT1JNQVRNUEVHX1RTLAotICAgIFFPTVhfRk9STUFUX1FULAotICAgIFFPTVhfRk9STUFUX000QSwKLSAgICBRT01YX0ZPUk1BVF9NUDMsCi0gICAgUU9NWF9GT1JNQVRfV0FWRSwKLSAgICBRT01YX0ZPUk1BVF9YTUYsCi0gICAgUU9NWF9GT1JNQVRfQU1SLAotICAgIFFPTVhfRk9STUFUX0FBQywKLSAgICBRT01YX0ZPUk1BVF9FVlJDLAotICAgIFFPTVhfRk9STUFUX1FDUCwKLSAgICBRT01YX0ZPUk1BVF9TTUYsCi0gICAgUU9NWF9GT1JNQVRfT0dHLAotICAgIFFPTVhfRk9STUFUX0JNUCwKLSAgICBRT01YX0ZPUk1BVF9KUEcsCi0gICAgUU9NWF9GT1JNQVRfSlBHMjAwMAotfVFPTVhfQ09OVEFJTkVSX0ZPUk1BVFRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfQ09OVEFJTkVSX0lORk9UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBRT01YX0NPTlRBSU5FUl9GT1JNQVRUWVBFIGVGbXRUeXBlOwotfSBRT01YX0NPTlRBSU5FUl9JTkZPVFlQRTsKLQotdHlwZWRlZiBlbnVtIFFPTVhfRklMRUZPUk1BVFRZUEUgewotICAgIFFPTVhfRmlsZUZvcm1hdE5vbmUsIC8qKjwgbm8gZmlsZSBmb3JtYXQgbmFtaW5nIGNvbnZlbnRpb24gaXMgZm9sbG93ZWQuICovCi0gICAgUU9NWF9GaWxlRm9ybWF0RENGLCAvKio8IERDRiBmaWxlIG5hbWluZyBjb252ZW50aW9uLiAqLwotICAgIFFPTVhfRmlsZUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gUU9NWF9GSUxFRk9STUFUVFlQRTsKLQotLyoqIFFPTVhfQ09ORklHX0ZJTEVGT1JNQVRUWVBFIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyB0aGUgZmlsZSB3cml0ZXIgd2lsbCBpbnRlcnByZXQKLXRoZSBwcm92aWRlZCBjb250ZW50IFVSSSBhbmQgd2hldGhlciBpdCB3aWxsIGluY3JlbWVudCB0aGUgaW5kZXggb2YgdGhlIGZpbGUgbmFtZS4gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfQ09ORklHX0ZJTEVGT1JNQVRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgUU9NWF9GSUxFRk9STUFUVFlQRSBlRmlsZUZvcm1hdDsgLyoqIGZpbGUgZm9ybWF0IHR5cGUgKi8KLX0gUU9NWF9DT05GSUdfRklMRUZPUk1BVFRZUEU7Ci0KLS8qKlRoZSBRT01YX1JFQ09SRElOR1NUQVRJU1RJQ1NJTlRFUlZBTFRZUEUgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW5hYmxlCi1JTCBjbGllbnQgdG8gaW5kaWNhdGUgdGhlIGludGVydmFsIG9mIHRoZSBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiB0byBmaWxlIG11eAotY29tcG9uZW50LiBUaW1lIGludGVydmFsIHdpbGwgaW5kaWNhdGUgdGhlIGZyZXF1ZW5jeShpbiBtcykgd2hlbiBjbGllbnQgbmVlZHMKLXRoZSBzdGF0aXN0aWNzIGRhdGEqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9SRUNPUkRJTkdTVEFUSVNUSUNTSU5URVJWQUxUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVElDS1MgIGludGVydmFsOy8qKjwgc3BlY2lmaWVzIHRoZSB0aW1lKG1pbGxpc2Vjb25kcykgYmV0d2VlbiB1cGRhdGVzICovCi0gICB9UU9NWF9SRUNPUkRJTkdTVEFUSVNUSUNTSU5URVJWQUxUWVBFOwotCi0vKipRT01YX1JFQ09SRElOR1NUQVRJU1RJQ1NUWVBFIGluZGljYXRlcyB0aGUgY3VycmVudCByZWNvcmRpbmcKLXRpbWUgYW5kIHNwYWNlIHN0YXRpc3RpY3Mgb2YgdGhpcyBzZXNzaW9uLCB3aGljaCBjYW4gYmUgdXNlZCBieSBjbGllbnQgdG8KLWlkZW50aWZ5IGN1cnJlbnQgc3RhdHVzIG9mIHJlY29yZGVkIGRhdGEgaW4gbWlsbGlzZWNvbmRzIGFuZCBieXRlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9SRUNPUkRJTkdTVEFUSVNUSUNTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVElDS1MgIG5SZWNvcmRlZFRpbWU7IC8qKiAgZHVyYXRpb24gdGhhdCB3ZSBhbHJlYWR5IHJlY29yZGVkKi8KLSAgICBPTVhfVElDS1MgIG5UaW1lQ2FuUmVjb3JkOy8qKiB0aGUgdGltZSB3ZSBjYW4gcmVjb3JkIGF0IHRoZSBzYW1lIGJpdHJhdGUqLwotICAgIE9NWF9VNjQgICBuU3BhY2VDb25zdW1lZDsvKiogc3BhY2UgdGhhdCBjb25zdW1lZCBpbiBieXRlcyovCi0gICAgT01YX1U2NCAgblNwYWNlTGVmdDsvKiogc3BhY2UgbGVmdCBpbiBieXRlcyovCi19IFFPTVhfUkVDT1JESU5HU1RBVElTVElDU1RZUEU7Ci0KLS8qKlFPTVhfRU5DUllQVF9UWVBFIGluZGljYXRlcyB0aGUgdHlwZSBvZiBlbmNyeXB0aW9uICovCi10eXBlZGVmIGVudW0gUU9NWF9FTkNSWVBUX1RZUEUgewotICAgIFFPTVhfRU5DUllQVF9UWVBFX0hEQ1AsCi0gICAgUU9NWF9FTkNSWVBUX1RZUEVfSU5WQUxJRAotfVFPTVhfRU5DUllQVF9UWVBFOwotCi0vKipRT01YX0VOQ1JZUFRJT05UWVBFIGluZGljYXRlcyB0aGUgZW5jcnlwdCB0eXBlICovCi10eXBlZGVmIHN0cnVjdCBRT01YX0VOQ1JZUFRJT05UWVBFIHsKLSAgICBPTVhfVTMyICAgICAgICAgICAgblNpemU7ICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSAgICBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX0JPT0wgICAgICAgICAgIG5TdHJlYW1FbmNyeXB0ZWQ7ICAvKiogc3RyZWFtIGlzIGVuY3J5cHRlZCBvciBub3QgKi8KLSAgICBRT01YX0VOQ1JZUFRfVFlQRSAgblR5cGU7ICAvKiogdHlwZSBvZiBFbmNyeXB0aW9uICovCi0gICAgT01YX1UzMiAgICAgICAgICAgIG5FbmNyeXB0VmVyc2lvbjsgLyoqIEVuY3J5cHQgdmVyc2lvbiAqLwotfSBRT01YX0VOQ1JZUFRJT05UWVBFOwotI2VuZGlmIC8qX19RT01YX0ZJTEVfRk9STUFUX0VYVEVOU0lPTlNfSF9fKi8KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL2luYy9RT01YX0lWQ29tbW9uRXh0ZW5zaW9ucy5oIGIvc2RtODQ1L21tLWNvcmUvaW5jL1FPTVhfSVZDb21tb25FeHRlbnNpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZjFmZDUuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL1FPTVhfSVZDb21tb25FeHRlbnNpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDExLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBfX0hfUU9NWF9JVkNPTU1PTkVYVEVOU0lPTlNfSF9fCi0jZGVmaW5lIF9fSF9RT01YX0lWQ09NTU9ORVhURU5TSU9OU19IX18KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKi8vKiogQGZpbGUgUU9NWF9Db21tb25FeHRlbnNpb25zLmgKLQotQHBhciBGSUxFIFNFUlZJQ0VTOgotICAgICAgY29tbW9uIGV4dGVuc2lvbnMgQVBJIGZvciBPcGVuTWF4IElMLgotCi0gICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBRdWFsY29tbSBPcGVuTWF4IElMCi0gICAgICBjb21tb24gZXh0ZW50aW9uIGludGVyZmFjZSwgdGhyb3VnaCB3aGljaCB0aGUgSUwgY2xpZW50IGFuZCBPcGVuTWF4Ci0gICAgICBjb21wb25lbnRzIGNhbiBhY2Nlc3MgYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMuCi0KLSovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUyBGT1IgTU9EVUxFCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jaW5jbHVkZSA8T01YX0NvcmUuaD4KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT05TIEFORCBERUNMQVJBVElPTlMKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2lmIGRlZmluZWQoIF9fY3BsdXNwbHVzICkKLWV4dGVybiAiQyIKLXsKLSNlbmRpZiAvKiBlbmQgb2YgbWFjcm8gX19jcGx1c3BsdXMgKi8KLQotLyogSVYgY29tbW9uIGV4dGVuc2lvbiBzdHJpbmdzICovCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19NRURJQUlORk8gICAgICAgICAgICAgICAgICJPTVguUUNPTS5pbmRleC5jb25maWcubWVkaWFpbmZvIiAgLyoqPCByZWZlcmVuY2U6IFFPTVhfTUVESUFJTkZPVFlQRSAqLwotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfQ09OVEVOVFVSSSAgICAgICAgICAgICAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLmNvbnRlbnR1cmkiIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09OVEVOVFVSSVRZUEUgKi8KLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fSU1BR0VTSVpFQ09OVFJPTCAgICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5wYXJhbS5JbWFnZVNpemVDb250cm9sIiAvKio8IHJlZmVyZW5jZTogUU9NWF9JTUFHRV9JTUFHRVNJWkVDT05UUk9MVFlQRSAqLwotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfUEFVU0VQT1JUICAgICAgICAgICAgICAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLlBhdXNlUG9ydCIgLyoqPCByZWZlcmVuY2U6IFFPTVhfQ09ORklHX1BBVVNFUE9SVFRZUEUgKi8KLQotLyoqIHJlZmVyZW5jZTogUU9NWF9VUkFOR0VUWVBFCi0gKiAgbk1pbiwgbk1heCwgblN0ZXBTaXplIGdpdmUgd2lkdGggaW4gcGl4ZWxzICovCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX0ZSQU1FV0lEVEhSQU5HRVNVUFBPUlRFRCAgICJPTVguUUNPTS5pbmRleC5wYXJhbS5GcmFtZVdpZHRoUmFuZ2VTdXBwb3J0ZWQiCi0KLS8qKiByZWZlcmVuY2U6IFFPTVhfVVJBTkdFVFlQRQotICogIG5NaW4sIG5NYXgsIG5TdGVwU2l6ZSBnaXZlIGhlaWdodCBpbiBwaXhlbHMgKi8KLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fRlJBTUVIRUlHSFRSQU5HRVNVUFBPUlRFRCAgIk9NWC5RQ09NLmluZGV4LnBhcmFtLkZyYW1lSGVpZ2h0UmFuZ2VTdXBwb3J0ZWQiCi0KLS8qKiByZWZlcmVuY2U6IFFPTVhfVVJBTkdFVFlQRQotICogIG5NaW4sIG5NYXgsIG5TdGVwU2l6ZSBnaXZlIHRoZSBudW1iZXIgb2YgbWFjcm9ibG9ja3MgcGVyCi0gKiAgZnJhbWUuICovCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX01BQ1JPQkxPQ0tTUEVSRlJBTUVSQU5HRVNVUFBPUlRFRCAiT01YLlFDT00uaW5kZXgucGFyYW0uTWFjcm9ibG9ja3NQZXJGcmFtZVJhbmdlU3VwcG9ydGVkIgotCi0vKiogcmVmZXJlbmNlOiBRT01YX1VSQU5HRVRZUEUKLSAqICBuTWluLCBuTWF4LCBuU3RlcFNpemUgZ2l2ZSB0aGUgbnVtYmVyIG9mIG1hY3JvYmxvY2tzIHBlcgotICogIHNlY29uZC4gKi8KLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fTUFDUk9CTE9DS1NQRVJTRUNPTkRSQU5HRVNVUFBPUlRFRCAiT01YLlFDT00uaW5kZXgucGFyYW0uTWFjcm9ibG9ja3NQZXJTZWNvbmRSYW5nZVN1cHBvcnRlZCIKLQotLyoqIHJlZmVyZW5jZTogUU9NWF9VUkFOR0VUWVBFCi0gKiAgbk1pbiwgbk1heCwgblN0ZXBTaXplIGdpdmUgZnJhbWUgcmF0ZSBpbiBmcmFtZXMgcGVyIHNlY29uZAotICogIGluIFExNiBmb3JtYXQuICovCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX0ZSQU1FUkFURVJBTkdFU1VQUE9SVEVEICAgICJPTVguUUNPTS5pbmRleC5wYXJhbS5GcmFtZVJhdGVSYW5nZVN1cHBvcnRlZCIKLQotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9QTEFORURFRklOSVRJT04gICAgICAgICAgICAiT01YLlFDT00uaW5kZXgucGFyYW0uUGxhbmVEZWZpbml0aW9uIiAvKiogcmVmZXJlbmNlOiBRT01YX1BMQU5FREVGSU5JVElPTlRZUEUgKi8KLQotLyoqIHJlZmVyZW5jZTogUU9NWF9VUkFOR0VUWVBFCi0gKiAgbk1pbiwgbk1heCwgblN0ZXBTaXplIGdpdmUgdGhlIGNyb3Agd2lkdGggaW4gcGl4ZWxzICovCi0jZGVmaW5lIE9NWF9RT01YX0lOREVYX1BBUkFNX0NST1BXSURUSFJBTkdFU1VQUE9SVEVEICAgICAgICAiT01YLlFDT00uaW5kZXgucGFyYW0uQ3JvcFdpZHRoUmFuZ2VTdXBwb3J0ZWQiCi0KLS8qKiByZWZlcmVuY2U6IFFPTVhfVVJBTkdFVFlQRQotICogIG5NaW4sIG5NYXgsIG5TdGVwU2l6ZSBnaXZlIHRoZSBjcm9wIGhlaWdodCBpbiBwaXhlbHMgKi8KLSNkZWZpbmUgT01YX1FPTVhfSU5ERVhfUEFSQU1fQ1JPUEhFSUdIVFJBTkdFU1VQUE9SVEVEICAgICAgICAiT01YLlFDT00uaW5kZXgucGFyYW0uQ3JvcEhlaWdodFJhbmdlU3VwcG9ydGVkIgotCi0vKiogcmVmZXJlbmNlOiBRT01YX1VSQU5HRVRZUEUKLSAqICBuTWluLCBuTWF4LCBuU3RlcFNpemUgZ2l2ZSB0aGUgZGlnaXRhbCB6b29tIGZhY3RvciBvbiB3aWR0aAotICogIGluIFExNiBmb3JtYXQuICovCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX0RJR0lUQUxaT09NV0lEVEhSQU5HRVNVUFBPUlRFRCAgICAiT01YLlFDT00uaW5kZXgucGFyYW0uRGlnaXRhbFpvb21XaWR0aFJhbmdlU3VwcG9ydGVkIgotCi0vKiogcmVmZXJlbmNlOiBRT01YX1VSQU5HRVRZUEUKLSAqICBuTWluLCBuTWF4LCBuU3RlcFNpemUgZ2l2ZSB0aGUgZGlnaXRhbCB6b29tIGZhY3RvciBvbiBoZWlnaHQKLSAqICBpbiBRMTYgZm9ybWF0LiAqLwotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9ESUdJVEFMWk9PTUhFSUdIVFJBTkdFU1VQUE9SVEVEICAgICJPTVguUUNPTS5pbmRleC5wYXJhbS5EaWdpdGFsWm9vbUhlaWdodFJhbmdlU3VwcG9ydGVkIgotCi0gICAgLy8gbmV3IGV4dGVybnNpb25zIGZvciB2aWRwcAotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfQUNUSVZFX1JFR0lPTl9ERVRFQ1RJT04gICAgICAgICAgICJPTVguUUNPTS5pbmRleC5jb25maWcuYWN0aXZlcmVnaW9uZGV0ZWN0aW9uIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfQUNUSVZFX1JFR0lPTl9ERVRFQ1RJT05fU1RBVFVTICAgICJPTVguUUNPTS5pbmRleC5jb25maWcuYWN0aXZlcmVnaW9uZGV0ZWN0aW9uc3RhdHVzIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfU0NBTElOR19NT0RFICAgICAgICAgICAgICAgICAgICAgICJPTVguUUNPTS5pbmRleC5jb25maWcuc2NhbGluZ21vZGUiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19OT0lTRVJFRFVDVElPTiAgICAgICAgICAgICAgICAgICAgIk9NWC5RQ09NLmluZGV4LmNvbmZpZy5ub2lzZXJlZHVjdGlvbiIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX0lNQUdFRU5IQU5DRU1FTlQgICAgICAgICAgICAgICAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLmltYWdlZW5oYW5jZW1lbnQiCi0vKioKLSAqIEVudW1lcmF0aW9uIGRlZmluaW5nIHRoZSBleHRlbmRlZCB1bmNvbXByZXNzZWQgaW1hZ2UvdmlkZW8KLSAqIGZvcm1hdHMuCi0gKgotICogRU5VTVM6Ci0gKiAgWVZVNDIwUGFja2VkU2VtaVBsYW5hciAgICAgICA6IEJ1ZmZlciBjb250YWluaW5nIGFsbCBZLCBhbmQgdGhlbiBWIGFuZCBVCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGVhdmVkLgotICogIFlWVTQyMFBhY2tlZFNlbWlQbGFuYXIzMm00a2EgOiBZVVYgcGxhbmFyIGZvcm1hdCwgc2ltaWxhciB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVZVNDIwUGFja2VkU2VtaVBsYW5hciBmb3JtYXQsIGJ1dCB3aXRoIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4gVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYm90aCBwbGFuZSBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGEgbXVsdGlwbGUgb2YgMzIgdGV4ZWxzLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gVGhlIGJhc2UgYWRkcmVzcyBvZiBib3RoIHBsYW5lcyBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduZWQgdG8gYSA0a0IgYm91bmRhcnkuCi0gKgotICogIFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIxNm0ya2EgOiBZVVYgcGxhbmFyIGZvcm1hdCwgc2ltaWxhciB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwUGFja2VkU2VtaVBsYW5hciBmb3JtYXQsIGJ1dCB3aXRoIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4gVGhlIHdpZHRoIG9mIHRoZSBsdW1hIHBsYW5lIG11c3QgYmUgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBvZiAxNiBwaXhlbHMuCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBUaGUgYWRkcmVzcyBvZiBib3RoIHBsYW5lcyBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduZWQgdG8gYSAya0IgYm91bmRhcnkuCi0gKgotICogIFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI2NHgzMlRpbGUybThrYSA6IFlVViBwbGFuYXIgZm9ybWF0LCBzaW1pbGFyIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjBQYWNrZWRTZW1pUGxhbmFyIGZvcm1hdCwgYnV0IHdpdGggdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiBUaGUgZGF0YSBpcyBsYWlkIG91dCBpbiBhIDR4MiBNQiB0aWxpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHN0cnVjdHVyZQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gVGhlIHdpZHRoIG9mIGVhY2ggcGxhbmUgaXMgYSBtdWx0aXBsZSBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIDR4MiBNQiB0aWxlcy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuIFRoZSBoZWlnaHQgb2YgZWFjaCBwbGFuIGlzIGEgbXVsdGlwbGUgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA0eDIgTUIgdGlsZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuIFRoZSBiYXNlIGFkZHJlc3Mgb2YgYm90aCBwbGFuZXMgbXVzdCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIHRvIGFuIDhrQiBib3VuZGFyeS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuIFRoZSB0aWxlcyBhcmUgc2Nhbm5lZCBpbiB0aGUgb3JkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBpbiB0aGUgTUZDVjUuMSBVc2VyJ3MgTWFudWFsLgotICovCi10eXBlZGVmIGVudW0gUU9NWF9DT0xPUl9GT1JNQVRUWVBFCi17Ci0gICAgUU9NWF9DT0xPUl9Gb3JtYXRZVlU0MjBQYWNrZWRTZW1pUGxhbmFyICAgICAgID0gMHg3RjAwMDAwMSwKLSAgICBRT01YX0NPTE9SX0Zvcm1hdFlWVTQyMFBhY2tlZFNlbWlQbGFuYXIzMm00a2EsCi0gICAgUU9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMTZtMmthLAotICAgIFFPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjY0eDMyVGlsZTJtOGthLAotICAgIFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybSwKLX0gUU9NWF9DT0xPUl9GT1JNQVRUWVBFOwotCi10eXBlZGVmIGVudW0gUU9NWF9NRURJQUlORk9UQUdUWVBFIHsKLSAgICBRT01YX01lZGlhSW5mb1RhZ1ZlcnNpb24sICAgICAgIC8qKjwgT01YX1ZFUlNJT05UWVBFLiBWZXJzaW9uIG9mIHRoZSBzdGFuZGFyZCBzcGVjaWZ5aW5nIHRoZSBtZWRpYSBpbmZvcm1hdGlvbi4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnVUlELCAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBVbmlxdWUgSUQgb2YgdGhlIG1lZGlhIGRhdGEsIGllIGltYWdlIHVuaXF1ZSBJRC4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnRGVzY3JpcHRpb24sICAgLyoqPCBPTVhfVTgqLiBDb21tZW50cyBhYm91dCB0aGUgbWVkaWEuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1RpdGxlLCAgICAgICAgIC8qKjwgT01YX1U4Ki4gVGl0bGUgb2YgdGhlIG1lZGlhLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdBdXRob3IsICAgICAgICAvKio8IE9NWF9VOCouIEF1dGhvciBvZiB0aGUgbWVkaWEuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0NvcHlyaWdodCwgICAgIC8qKjwgT01YX1U4Ki4gQ29weXJpZ2h0IGluZm9ybWF0aW9uLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdUcmFja051bSwgICAgICAvKio8IE9NWF9VMzIuIFRyYWNrIG51bWJlci4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnR2VucmUsICAgICAgICAgLyoqPCBPTVhfVTgqLiBUaGUgZ2VucmUgb2YgdGhlIG1lZGlhLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdFcXVpcG1lbnRNYWtlLCAvKio8IE9NWF9VOCouIE1hbnVmYWN0dXJlciBvZiByZWNvcmRpbmcgZXF1aXBtZW50LiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdFcXVpcG1lbnRNb2RlbCwvKio8IE9NWF9VOCouIE1vZGVsIG9yIG5hbWUgb2YgdGhlIHJlY29yZGluZyBlcXVpcG1lbnQuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1NvZnR3YXJlLCAgICAgIC8qKjwgT01YX1U4Ki4gTmFtZSBhbmQgdmVyc2lvbiBvZiB0aGUgc29mdHdhcmUgb3IgZmlybXdhcmUgb2YgdGhlIGRldmljZSBnZW5lcmF0aW5nIHRoZSBtZWRpYS4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnQXNzb2NpYXRlZEZpbGUsLyoqPCBPTVhfVTgqLiBUaGUgbmFtZSBvZiB0aGUgZmlsZSByZWxhdGVkIHRvIHRoZSBtZWRpYS4gIEZvciBleGFtcGxlLCBhbiBhdWRpbyBmaWxlIHJlbGF0ZWQgdG8gYW4gaW1hZ2UgZmlsZS4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnUmVzb2x1dGlvbiwgICAgLyoqPCBRT01YX1JFU09MVVRJT05UWVBFLiBOdW1iZXIgb2YgcGl4ZWxzIHBlciByZXNvbHV0aW9uIHVuaXQuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0RhdGVDcmVhdGVkLCAgIC8qKjwgUU9NWF9EQVRFU1RBTVBUWVBFLiBEYXRlIHdoZW4gbWVkaWEgd2FzIGNyZWF0ZWQuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1RpbWVDcmVhdGVkLCAgIC8qKjwgUU9NWF9USU1FU1RBTVBUWVBFLiBUaW1lIHdoZW4gbWVkaWEgd2FzIGNyZWF0ZWQuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0RhdGVNb2RpZmllZCwgIC8qKjwgUU9NWF9EQVRFU1RBTVBFVFlQRS4gRGF0ZSB3aGVuIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1RpbWVNb2RpZmllZCwgIC8qKjwgUU9NWF9USU1FU1RBTVBUWVBFLiBUaW1lIHdoZW4gZmlsZSB3YXMgbGFzdCBtb2RpZmllZC4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnR1BTQXJlYU5hbWUsICAgLyoqPCBPTVhfVTgqLiBUaGUgbmFtZSBvZiB0aGUgbG9jYXRpb24uKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0dQU1ZlcnNpb24sICAgIC8qKjwgT01YX1ZFUlNJT05UWVBFLiBHUFMgdmVyc2lvbi4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnR1BTQ29vcmRpbmF0ZXMsLyoqPCBRT01YX0dFT0RFVElDVFlQRS4gVGhlIGxvbmdpdHVkZSwgbGF0aXR1ZGUsIGFuZCBhbHRpdHVkZS4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnR1BTU2F0ZWxsaXRlcywgLyoqPCBPTVhfVTgqLiBUaGUgR1BTIHNhdGVsbGl0ZXMgdXNlZCBmb3IgbWVhc3VyZW1lbnRzLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdHUFNQcmVjaXNpb24sICAvKio8IE9NWF9VMzIuIEdQUyBkZWdyZWUgb2YgcHJlY2lzaW9uLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdHUFNEYXRlU3RhbXAsICAvKio8IFFPTVhfREFURVNUQU1QVFlQRS4gRGF0ZSBvZiB0aGUgR1BTIGRhdGEuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0dQU1RpbWVTdGFtcCwgIC8qKjwgUU9NWF9USU1FU1RBTVBUWVBFLiBUaW1lIG9mIHRoZSBHUFMgZGF0YS4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnTWVkaWFTdHJlYW1UeXBlLC8qKjwgUU9NWF9NRURJQVNUUkVBTVRZUEUuIFR5cGUgb2YgdGhlIHN0cmVhbS4gKi8KLSAgICBRT01YX01lZGlhSW5mb0R1cmF0aW9uLCAgICAgICAgIC8qKjwgT01YX1RJQ0tTLiBUb3RhbCBkdXJhdGlvbiBvZiB0aGUgbWVkaWEuKi8KLSAgICBRT01YX01lZGlhSW5mb1NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE9NWF9VMzIuIFRvdGFsIHNpemUgb2YgdGhlIG1lZGlhIGluIGJ5dGVzLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdBbGJ1bSwgICAgICAgICAgICAgICAgICAgICAvKio8IE9NWF9VOCouIE5hbWUgb2YgYWxidW0vbW92aWUvc2hvdy4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnTG9jYXRpb24sICAgICAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBSZWNvcmRpbmcgbG9jYXRpb24gaW5mb3JtYXRpb24uKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0NsYXNzaWZpY2F0aW9uLCAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gQ2xhc3NpZmljYXRpb24gaW5mb3JtYXRpb24gb2YgbWVkaWEuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1JhdGluZ3MsICAgICAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gTWVkaWEgUmF0aW5ncyBiYXNlZCBvbiBwb3B1bGFyaXR5ICYgcmF0aW5nIGNyaXRlcmlhLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdLZXl3b3JkLCAgICAgICAgICAgICAgICAgICAvKio8IE9NWF9VOCouIEtleXdvcmQgYXNzb2NpYXRlZCB3aXRoIG1lZGlhIHdoaWNoIGFyZSBpbnRlbmRlZCB0byByZWZsZWN0IG1vb2Qgb2YgdGhlIEEvVi4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnUGVyZm9ybWFuY2UsICAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBNZWRpYSBQZXJmb3JtZXIgaW5mb3JtYXRpb24uLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdZZWFyLCAgICAgICAgICAgICAgICAgICAgICAvKio8IE9NWF9VOCouIFByb2R1Y3Rpb24geWVhciBpbmZvcm1hdGlvbiBvZiBtZWRpYS4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnQ29tcG9zZXIsICAgICAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBOYW1lIG9mIHRoZSBjb21wb3NlciBvZiBtZWRpYSBpLmUuIGF1ZGlvLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdFbmNvZGVyTmFtZSwgICAgICAgICAgICAgICAgICAvKio8IE9NWF9VOCouIE5hbWUgb2YgdGhlIHBlcnNvbiBvciBvcmdhbmlzYXRpb24gd2hvIGVuY29kZWQgbWVkaWEuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0NvcHlQcm9oaWJpdEZsYWcsICAgICAgICAgIC8qKjwgT01YX1U4Ki4gRmxhZyB0byBpbmRpY2F0ZSBpZiBjb3B5IGlzIGFsbG93ZWQgb3Igbm90LiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdMeXJpY2lzdCwgICAgICAgICAgICAgICAgICAvKio8IE9NWF9VOCouIE5hbWUgb2YgdGhlIGx5cmljaXN0IG9yIHRleHQgd3JpdGVyIGluIHJlY29yZGluZy4gU3BlY2lmaWMgdG8gSUQzIHRhZy4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnU3VidGl0bGUsICAgICAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBTdWJ0aXRsZS9EZXNjcmlwdGlvbiB1c2VkIGZvciBpbmZvcm1hdG9uIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGl0bGUgb2YgbWVkaWEuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ09yaWdpbmFsRmlsZU5hbWUsICAgICAgICAgIC8qKjwgT01YX1U4Ki4gT3JpZ2luYWwgZmlsZSBuYW1lLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdPcmlnaW5hbEx5cmljaXN0LCAgICAgICAgICAvKio8IE9NWF9VOCouIE5hbWUgb2YgdGhlIG9yaWdpbmFsIGx5cmljaXN0L3RleHQgd3JpdGVyIG9mIG9yaWdpbmFsIHJlY29yZGluZy4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnT3JpZ2luYWxBcnRpc3QsICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBOYW1lIG9mIHRoZSBvcmlnaW5hbCBhcnRpc3QuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ09yaWdpbmFsUmVsZWFzZVllYXIsICAgICAgIC8qKjwgT01YX1U4Ki4gT3JpZ2luYWwgcmVsZWFzZSB5ZWFyIG9mIHJlY29yZGVkIG1lZGlhLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdGaWxlT3duZXIsICAgICAgICAgICAgICAgICAvKio8IE9NWF9VOCouIExpY2Vuc2VlIG9yIG5hbWUgb2YgdGhlIGZpbGUgb3duZXIuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ09yY2hlc3RyYSwgICAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gTmFtZSBvZiB0aGUgb3JjaGVzdHJhIG9yIHBlcmZvcm1lcnMgZHVyaW5nIHJlY29yZGluZy4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnQ29uZHVjdG9yLCAgICAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBOYW1lIG9mIHRoZSBjb25kdWN0b3IuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1JlbWl4ZWRCeSwgICAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gUGVyc29uIG9yIG9yZ2FuaXphdGlvbiBuYW1lIHdobyBkaWQgdGhlIHJlbWl4LiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdBbGJ1bUFydGlzdCwgICAgICAgICAgICAgICAvKio8IE9NWF9VOCouIE5hbWUgb2YgdGhlIGFsYnVtIGFydGlzdC4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnUHVibGlzaGVyLCAgICAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBOYW1lIG9mIHRoZSBwdWJsaXNoZXIgb3IgbGFiZWwuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1JlY29yZGluZ0RhdGVzLCAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gUmVjb3JkaW5nIGRhdGUgb2YgbWVkaWEuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0ludGVybmV0UmFkaW9TdGF0aW9uTmFtZSwgIC8qKjwgT01YX1U4Ki4gTmFtZSBvZiB0aGUgSW50ZXJuZXQgcmFkaW8gc3RhdGlvbiBmcm9tIHdoaWNoIHRoZSBhdWRpbyBpcyBzdHJlYW1lZC4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnSW50ZXJuZXRSYWRpb1N0YXRpb25Pd25lciwgLyoqPCBPTVhfVTgqLiBOYW1lIG9mIHRoZSBvd25lciBvZiB0aGUgSW50ZXJuZXQgcmFkaW8gc3RhdGlvbiBmcm9tIHdoaWNoIHRoZSBhdWRpbyBpcyBzdHJlYW1lZC4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnSW50ZXJuYXRpb25hbFJlY29yZGluZ0NvZGUsLyoqPCBPTVhfVTgqLiBJbnRlcm5hdGlvbmFsIHN0YW5kYXJkIHJlY29yZGluZyBjb2RlLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdFbmNvZGVyU3dId1NldHRpbmdzLCAgICAgICAvKio8IE9NWF9VOCouIFNvZnR3YXJlLGhhcmR3YXJlIHNldHRpbmdzIHVzZWQgYnkgZW5jb2Rlci4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnSW52b2x2ZWRQZW9wbGVMaXN0LCAgICAgICAgLyoqPCBPTVhfVTgqLiBMaXN0IG9mIHBlb3BsZSBpbnZvbHZlZC4gU3BlY2lmaWMgdG8gSUQzIHRhZy4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnQ29tbWVudHMsICAgICAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBDb21tZW50cyBhYm91dCB0aGUgbWVkaWEuIEl0IGNhbiBiZSBhbnkga2luZCBvZiBmdWxsIHRleHQgaW5mb3JtYXRvbi4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnQ29tbWlzc2lvbmVkLCAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBDb21taXNzaW9uZWQgaW5mb3JtYXRpb24gb2YgbWVkaWEuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1N1YmplY3QsICAgICAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gU3ViamVjdCBhc3NvY2lhdGVkIHdpdGggbWVkaWEuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0NvbnRhY3QsICAgICAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gQ29uYXRjdCBpbmZvcm1hdGlvbi4gVVJMIGluZm9ybWF0aW9uIG9mIHRoZSBzZWxsZXIuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1ZhbGlkaXR5UGVyaW9kLCAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gTGVuZ3RoIG9yIHBlcmlvZCBvZiB2YWxpZGl0eSBvZiBtZWRpYS4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnVmFsaWRpdHlFZmZlY3RpdmVEYXRlLCAgICAgLyoqPCBPTVhfVTgqLiBWYWxpZGl0eSBlZmZlY3RpdmUgZGF0ZSBvZiBtZWRpYSovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdOdW1iZXJPZkFsbG93ZWRQbGF5YmFja3MsICAvKio8IE9NWF9VOCouIE51bWJlciBvZiBhbGxvd2VkIHBsYXliYWNrcyBmb3IgdGhpcyBtZWRpYSovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdQbGF5Q291bnRlciwgICAgICAgICAgICAgICAvKio8IE9NWF9VOCouIEN1cnJlbnQgcGxheSBjb3VudGVyIG9mIHRoZSBtZWRpYS5JdHMgbnVtYmVyIG9mIHRpbWVzIGEgZmlsZSBoYXMgYmVlbiBwbGF5ZWQuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ01lbW8sICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gTWVtbyBhc3NvY2lhdGQgd2l0aCBtZWRpYS4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnRGV2aWNlTmFtZSwgICAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBOYW1lIG9mIHRoZSBkZXZpY2VzIHVzZWQgaW4gY3JlYXRpbmcgbWVkaWEuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1VSTCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gTGlzdCBhcnRpc3QgL2dlbnJlIC9tb3ZpZSBzaXRlcyBVUkwuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0ZpbGVUeXBlLCAgICAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gSW5kaWNhdGVzIHR5cGUgb2YgYXVkaW8gdHJhY2suKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0NvbnRlbnRHcm91cERlc2MsICAgICAgICAgIC8qKjwgT01YX1U4Ki4gQ29udGVudCBncm91cCBkZXNjcmlwdGlvbiBpZiB0aGUgc291bmQgYmVsb25ncyB0byBhIGxhcmdlciBjYXRlZ29yeSBvZiBvZiBtdXNpYyAvc291bmQuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0luaXRpYWxLZXlzLCAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gQ29udGFpbnMgdGhlIG11c2ljYWwga2V5IGluIHdoaWNoIG1lZGlhIHN0YXJ0cy4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnTGFuZ3VhZ2VzLCAgICAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBMYW5ndWFnZXMgb2YgdGhlIHRleHQgb3IgbHlyaWNzIHNwb2tlbiBvciBzdW5nIGluIHRoZSBtZWRpYS4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnTWVkaWFUeXBlLCAgICAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBEZXNjcmliZXMgZnJvbSB3aGljaCBtZWRpYSB0aGUgbWVkaWEgc291bmQgb3JpZ2luYXRlZC4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnUGxheWxpc3REZWxheSwgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBEZW5vdGVzIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBlYWNoIHNvbmcgb2YgdGhlIHBsYXlsaXN0LiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdCZWF0c1Blck1pbnV0ZSwgICAgICAgICAgICAvKio8IE9NWF9VOCouIE51bWJlciBvZiBiZWF0cyBwZXIgbWludXRlIGluIG1haW4gcGFydCBvZiBhdWRpby4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnUGFydE9mU2V0LCAgICAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBEZXNjcmliZXMgcGFydCBvZiB0aGUgc2V0IHNlbGVjdGVkIG9yIHBsYXllZC4gKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0luc3RydW1lbnROYW1lLCAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gTmFtZSBvZiB0aGUgaW5zdHJ1bWVudCB1c2VkIGluIGNyZWF0aW5nIG1lZGlhLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdMeXJpY3MsICAgICAgICAgICAgICAgICAgICAvKio8IE9NWF9VOCouIEx5cmljcyBvZiB0aGUgbWVkaWEvYXVkaW8gdHJhY2suKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1RyYWNrTmFtZSwgICAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gTmFtZSBvZiB0aGUgbWVkaWEvYXVkaW8gdHJhY2suKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ01hcmtlciwgICAgICAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gVGV4dCBzdHJpbmcgY290bmVudHMgcGxhY2VkIGF0IGEgc3BlY2lmaWMgbG9jYXRpb24gdG8gZGVub3RlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtdXNpYyBhdCB0aGF0IHBvaW50LiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdDdWVQb2ludCwgICAgICAgICAgICAgICAgICAvKio8IE9NWF9VOCouIFN1YnNldCBvZiB0aGUgY29udGVudCB3aGljaCBjYW4gYmUgb3B0aW9uYWxseSBwbGF5ZWQuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0dQU1Bvc2l0aW9uaW5nTmFtZSwgICAgICAgIC8qKjwgT01YX1U4Ki4gR1BTIHBvc2l0aW9uaW5nIG5hbWUuICovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdHUFNQb3NpdGlvbmluZ01ldGhvZCwgICAgICAvKio8IE9NWF9VOCouIEdQUyBwb3NpdGlvbmluZyBtZXRob2QuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0dQU1N1cnZleURhdGEsICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gR1BTIHN1cnZleSBkYXRhLiAqLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnR1BTQnl0ZU9yZGVyLCAgICAgICAgICAgICAgLyoqPCBPTVhfVTE2LkdQUyBieXRlIG9yZGVyLiAqLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnR1BTTGF0aXR1ZGVSZWYsICAgICAgICAgICAgLyoqPCBPTVhfVTMyLlJlZmVyZW5jZSBHUFMgbGF0aXR1ZGUuICovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdHUFNMb25naXR1ZGVSZWYsICAgICAgICAgICAvKio8IE9NWF9VMzIuUmVmZXJlbmNlIEdQUyBsb25naXR1ZGUgKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0dQU0FsdGl0dWRlUmVmLCAgICAgICAgICAgIC8qKjwgT01YX1UzMi4gUmVmZXJlbmNlIEdQUyBhbHRpdHVkZS4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnR1BTRXh0ZW5zaW9uTWFwU2NhbGVJbmZvLCAgLyoqPCBPTVhfVTY0LiBHUFMgZXh0ZW5zaW9uIG1hcCBzY2FsZSBpbmZvcm1hdGlvbi4qLwotICAgIFFPTVhfTWVkaWFJbmZvVGFnVVVJREF0b21JbmZvLCAgICAgICAgICAgICAgLyoqPCBPTVhfVTgqLiBUaGUgdXNlciBkZWZpbmVkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIFVVSUQuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1VVSURBdG9tQ291bnQsICAgICAgICAgICAgIC8qKjwgT01YX1UzMiBVVUlEIGF0b20gY291bnQuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ0xvY2F0aW9uUm9sZSwgICAgICAgICAgICAgIC8qKjwgT01YXzMyLiBJbmRpY2F0ZXMgdGhlIHJvbGUgb2YgdGhlIHBsYWNlLiBpLmUuIJEwkiBpbmRpY2F0ZSCRc2hvb3RpbmcgbG9jYXRpb24nLiCRMZIgkXJlYWwgbG9jYXRpb26SLiovCi0gICAgUU9NWF9NZWRpYUluZm9UYWdBc3Ryb25vbWljYWxCb2R5LCAgICAgICAgICAvKio8IE9NWF9VOCouIEFzdHJvbm9taWNhbCBib2R5IG9uIHdoaWNoIHRoZSBsb2NhdGlvbiBleGlzdHMuKi8KLSAgICBRT01YX01lZGlhSW5mb1RhZ1VzZXJJbmZvRGF0YSAgICAgICAgICAgICAgIC8qKjwgT01YX1U4Ki4gVGhlIHVzZXIgZGVmaW5lZCB0YWcgaW5mb3JtYXRvbi4qLwotfSBRT01YX01FRElBSU5GT1RBR1RZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfTUVESUFJTkZPVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAvKio8IFJlYWQtb25seSB2YWx1ZSBjb250YWluaW5nIHRoZSBpbmRleCBvZiB0aGUgb3V0cHV0IHBvcnQuICovCi0gICAgUU9NWF9NRURJQUlORk9UQUdUWVBFIGVUYWc7IC8qKjwgVGhlIHR5cGUgb2YgbWVkaWEgaW5mbyBiZWluZyBzcGVjaWZpZWQuICovCi0gICAgT01YX1UzMiBuRGF0YVNpemU7IC8qKjwgVGhlIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgY0RhdGEuICBTZXQgbkRhdGFTaXplIHRvIDAgdG8gcmV0cmlldmUgdGhlIHNpemUgcmVxdWlyZWQgZm9yIGNEYXRhLiAqLwotICAgIE9NWF9VOCBjRGF0YVsxXTsgLyoqPCBUaGUgbWVkaWEgZGF0YSBpbmZvICovCi19IFFPTVhfTUVESUFJTkZPVFlQRTsKLQotCi10eXBlZGVmIGVudW0gUU9NWF9SRVNPTFVUSU9OVU5JVFRZUEUgewotICAgIFFPTVhfUmVzb2x1dGlvblVuaXRJbmNoLAotICAgIFFPTVhfUmVzb2x1dGlvbkNlbnRpbWV0ZXIKLX0gUU9NWF9SRVNPTFVUSU9OVU5JVFRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfUkVTT0xVVElPTlRZUEUgewotICAgIFFPTVhfUkVTT0xVVElPTlVOSVRUWVBFIGVVbml0OyAvKio8IFRoZSB1bml0IG9mIG1lYXN1cmVtZW50LiAqLwotICAgIE9NWF9VMzIgblg7IC8qKjwgVGhlIG51bWJlciBvZiBwaXhlbHMgcGVyIHVuaXQgaW4gdGhlIHdpZHRoIGRpcmVjdGlvbi4gKi8KLSAgICBPTVhfVTMyIG5ZOyAvKio8IFRoZSBudW1iZXIgb2YgcGl4ZWxzIHBlciB1bml0IGluIHRoZSBoZWlnaHQgZGlyZWN0aW9uLiAqLwotfSBRT01YX1JFU09MVVRJT05UWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX1RJTUVTVEFNUFRZUEUgewotICAgIE9NWF9VMzIgbkhvdXI7IC8qKjwgVGhlIGhvdXIgcG9ydGlvbiBvZiB0aGUgdGltZSBzdGFtcCwgYmFzZWQgb24gYSAyNC1ob3VyIGZvcm1hdC4gKi8KLSAgICBPTVhfVTMyIG5NaW51dGU7IC8qKjwgVGhlIG1pbnV0ZSBwb3J0aW9uIG9mIHRoZSB0aW1lIHN0YW1wLiAqLwotICAgIE9NWF9VMzIgblNlY29uZDsgLyoqPCBUaGUgc2Vjb25kIHBvcnRpb24gb2YgdGhlIHRpbWUgc3RhbXAuICovCi0gICAgT01YX1UzMiBuTWlsbGlzZWNvbmQ7IC8qKjwgdGhlIG1pbGxpc2Vjb25kIHBvcnRpb24gb2YgdGhlIHRpbWUgc3RhbXAuICovCi19IFFPTVhfVElNRVNUQU1QVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9EQVRFU1RBTVBUWVBFIHsKLSAgICBPTVhfVTMyIG5ZZWFyOyAgLyoqPCBUaGUgeWVhciBwb3J0aW9uIG9mIHRoZSBkYXRlIHN0YW1wLiAqLwotICAgIE9NWF9VMzIgbk1vbnRoOyAvKio8IFRoZSBtb250aHBvcnRpb24gb2YgdGhlIGRhdGUgc3RhbXAuIFZhbGlkIHZhbHVlcyBhcmUgMSB0byAxMi4qLwotICAgIE9NWF9VMzIgbkRheTsgLyoqPCBUaGUgZGF5IHBvcnRpb24gb2YgdGhlIGRhdGUgc3RhbXAuIFZhbGlkIHZhbHVlcyBhcmUgMSB0byAzMSBkZXBlbmRpbmcgb24gdGhlIG1vbnRoIHNwZWNpZmllZC4qLwotfSBRT01YX0RBVEVTVEFNUFRZUEU7Ci0KLXR5cGVkZWYgZW51bSBRT01YX0dFT0RFVElDUkVGVFlQRSB7Ci0gICAgUU9NWF9HZW9kZXRpY1JlZk5vcnRoLCAgLyoqPCBOb3J0aCBsYXRpdHVkZS4gKi8KLSAgICBRT01YX0dlb2RldGljUmVmU291dGgsICAvKio8IFNvdXRoIGxhdGl0dWRlLiAqLwotICAgIFFPTVhfR2VvZGV0aWNSZWZFYXN0LCAgIC8qKjwgRWFzdCBsb25naXR1ZGUuICovCi0gICAgUU9NWF9HZW9kZXRpY1JlZldlc3QgICAgLyoqPCBXZXN0IGxvbmdpdHVkZS4gKi8KLX0gUU9NWF9HRU9ERVRJQ1JFRlRZUEU7Ci0KLS8qKiBRT01YX0dFT0RFVElDQU5HTEVUWVBFIGlzIHVzZWQgdG8gc2V0IGdlb2RldGljIGFuZ2xlIGNvb3JkaW5hdGVzIG9uIGFuIGVsbGlwc29pZCAodGhlIEVhcnRoKSwKLWFuZCBpcyBleHBsaWNpdGx5IHVzZWQgdG8gc3BlY2lmeSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgcmVmZXJlbmNlZCBieSBRT01YX0dFT0RFVElDVFlQRS4gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfR0VPREVUSUNBTkdMRVRZUEUgewotICAgIFFPTVhfR0VPREVUSUNSRUZUWVBFIGVSZWZlcmVuY2U7IC8qKjwgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdlb2RldGljIGFuZ2xlIGlzIGEgbGF0aXR1ZGUgb3IgbG9uZ2l0dWRlLiAqLwotICAgIE9NWF9VMzIgbkRlZ3JlZTsgLyoqPCBUaGUgZGVncmVlIG9mIHRoZSBsYXRpdHVkZSBvciBsb25naXR1ZGUuICovCi0gICAgT01YX1UzMiBuTWludXRlOyAvKio8IFRoZSBtaW51dGUgb2YgdGhlIGxhdGl0dWRlIG9yIGxvbmdpdHVkZS4gKi8KLSAgICBPTVhfVTMyIG5TZWNvbmQ7IC8qKjwgVGhlIHNlY29uZCBvZiB0aGUgbGF0aXR1ZGUgb3IgbG9uZ2l0dWRlLiAqLwotfSBRT01YX0dFT0RFVElDQU5HTEVUWVBFOwotCi10eXBlZGVmIGVudW0gUU9NWF9BTFRJVFVERVJFRlRZUEUgewotICAgIFFPTVhfQWx0aXR1ZGVSZWZTZWFMZXZlbCwgLyoqPCBBdCBzZWEgbGV2ZWwuICovCi0gICAgUU9NWF9BbHRpdHVkZVJlZkJlbG93U2VhTGV2ZWwgLyoqPCBCZWxvdyBzZWEgbGV2ZWwuICovCi19IFFPTVhfQUxUSVRVREVSRUZUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBRT01YX0FMVElUVURFVFlQRSB7Ci0gICAgUU9NWF9BTFRJVFVERVJFRlRZUEUgZVJlZmVyZW5jZTsgLyoqPCBUaGUgcmVmZXJlbmNlIHBvaW50IGZvciB0aGUgYWx0aXR1ZGUuICovCi0gICAgT01YX1UzMiBuTWV0ZXI7IC8qKjwgVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBudW1iZXIgb2YgbWV0ZXJzIGFib3ZlIG9yIGJlbG93IHNlYSBsZXZlbC4gKi8KLSAgICBPTVhfVTMyIG5NaWxsaW1ldGVyOyAvKio8IFRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpbWV0ZXJzIGFib3ZlIG9yIGJlbG93IHNlYSBsZXZlbC4gKi8KLX0gUU9NWF9BTFRJVFVERVRZUEU7Ci0KLS8qKiBRT01YX0dFT0RFVElDVFlQRSBpcyB1c2VkIHRvIHNldCBnZW9kZXRpYyBjb29yZGluYXRlcyBzdWNoIGFzIGxvbmdpdHVkZSwgbGF0aXR1ZGUsIGFuZCBhbHRpdHVkZS4KLVRoaXMgc3RydWN0dXJlIHJlZmVyZW5jZXMgUU9NWF9HRU9ERVRJQ0FOR0xFVFlQRSBhbmQgUU9NWF9BTFRJVFVERVRZUEUuICovCi10eXBlZGVmIHN0cnVjdCBRT01YX0dFT0RFVElDVFlQRSB7Ci0gICAgUU9NWF9HRU9ERVRJQ0FOR0xFVFlQRSBzTGF0aXR1ZGU7IC8qKjwgSW5kaWNhdGVzIHRoZSBsYXRpdHVkZS4qLwotICAgIFFPTVhfR0VPREVUSUNBTkdMRVRZUEUgc0xvbmdpdHVkZTsgLyoqPCBJbmRpY2F0ZXMgdGhlIGxvbmdpdHVkZS4qLwotICAgIFFPTVhfQUxUSVRVREVUWVBFIHNBbHRpdHVkZTsgLyoqPCBJbmRpY2F0ZXMgdGhlIGFsdGl0dWRlLiovCi19IFFPTVhfR0VPREVUSUNUWVBFOwotCi0KLXR5cGVkZWYgc3RydWN0IFFPTVhfSU1BR0VfSU1BR0VTSVpFQ09OVFJPTFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgLyoqPCBwb3J0IGluZGV4IG9uIHdoaWNoIHNpemUgY29udHJvbCBuZWVkcyB0byBiZSBhcHBsaWVkICovCi0gICAgT01YX1UzMiBuVGFyZ2V0SW1hZ2VTaXplOyAvKio8IGV4cGVjdGVkIG1heCB0YXJnZXQgc2l6ZSBpbiBCeXRlcyAqLwotfSBRT01YX0lNQUdFX0lNQUdFU0laRUNPTlRST0xUWVBFOwotCi10eXBlZGVmIGVudW0gUU9NWF9VUklUWVBFIHsKLSAgICBRT01YX1VSSVRZUEVfUlRTUCwgLyoqPCBSVFNQIFVSSSBUeXBlLiAqLwotICAgIFFPTVhfVVJJVFlQRV9IVFRQLCAvKio8IEhUVFAgVVJJIFR5cGUuICovCi0gICAgUU9NWF9VUklUWVBFX0xPQ0FMIC8qKjwgTG9jYWwgVVJJIFR5cGUuKGkuZSBOb24gTmV0d29yaykgKi8KLX1RT01YX1VSSVRZUEU7Ci0KLQotdHlwZWRlZiBlbnVtIFFPTVhfU1RSRUFNVFlQRSB7Ci0gICAgUU9NWF9TVFJFQU1UWVBFX1ZPRCwgLyoqPCBWaWRlbyBPbiBkZW1hbmQgU3RyZWFtICovCi0gICAgUU9NWF9TVFJFQU1UWVBFX0xJVkUsLyoqPCBMaXZlIFN0cmVhbSAqLwotICAgIFFPTVhfU1RSRUFNVFlQRV9GSUxFIC8qKjwgRmlsZSBiYXNlZCBTdHJlYW0gKi8KLX1RT01YX1NUUkVBTVRZUEU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9NRURJQVNUUkVBTVRZUEV7Ci0gICAgUU9NWF9VUklUWVBFIGVVUklUeXBlOwotICAgIFFPTVhfU1RSRUFNVFlQRSBlU3RyZWFtVHlwZTsKLX1RT01YX01FRElBU1RSRUFNVFlQRTsKLQotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIHNwZWNpZmllcyB0aGUgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggZWFjaAotICogcGxhbmUgb2YgdGhlIHVuY29tcHJlc3NlZCBpbWFnZS92aWRlbyBmb3JtYXQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfUExBTkVERUZJTklUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgIC8qKjwgUmVwcmVzZW50cyB0aGUgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5QbGFuZUluZGV4OyAgICAgICAgICAgICAgLyoqPCBTcGVjaWZpZXMgdGhlIHBsYW5lIGVudW1lcmF0aW9uIGluZGV4IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bywgc3RhcnRpbmcgd2l0aCBhIGJhc2UgdmFsdWUgb2YgMSAqLwotICAgIE9NWF9VMzIgbk1pblN0cmlkZTsgICAgICAgICAgICAgICAvKio8IFJlYWQtb25seSBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG1pbmltdW0gYnVmZmVyIHN0cmlkZSAqLwotICAgIE9NWF9VMzIgbk1heFN0cmlkZTsgICAgICAgICAgICAgICAvKio8IFJlYWQtb25seSBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG1heGltdW0gYnVmZmVyIHN0cmlkZSAqLwotICAgIE9NWF9VMzIgblN0cmlkZU11bHRpcGxlczsgICAgICAgICAvKio8IFJlYWQtb25seSBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGJ1ZmZlciBzdHJpZGUgbXVsdGlwbGUgc3VwcG9ydGVkICovCi0gICAgT01YX1MzMiBuQWN0dWFsU3RyaWRlOyAgICAgICAgICAgIC8qKjwgU3BlY2lmaWVzIHRoZSBhY3R1YWwgc3RyaWRlIHRvIGJlIGFwcGxpZWQgKi8KLSAgICBPTVhfVTMyIG5NaW5QbGFuZUJ1ZmZlckhlaWdodDsgICAgLyoqPCBSZWFkLW9ubHkgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIHRoZSBtaW5pbXVtIGJ1ZmZlciBoZWlnaHQgKG51bWJlciBvZiBzdHJpZGUgbGluZXMpICovCi0gICAgT01YX1UzMiBuQWN0dWFsUGxhbmVCdWZmZXJIZWlnaHQ7IC8qKjwgU3BlY2lmaWVzIHRoZSBhY3R1YWwgYnVmZmVyIGhlaWdodCAobnVtYmVyIG9mIHN0cmlkZSBsaW5lcykgdG8gYmUgYXBwbGllZCAqLwotICAgIE9NWF9VMzIgbkJ1ZmZlclNpemU7ICAgICAgICAgICAgICAvKio8IFJlYWQtb25seSBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgYnVmZmVyLCBpbiBieXRlcyAqLwotICAgIE9NWF9VMzIgbkJ1ZmZlckFsaWdubWVudDsgICAgICAgICAvKio8IFJlYWQtb25seSBmaWVsZCB0aGF0IHNwZWNpZmllcyB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IG9mIHRoZSBidWZmZXIsIGluIGJ5dGVzICovCi19IFFPTVhfUExBTkVERUZJTklUSU9OVFlQRTsKLQotLyoqCi0gKiAgUGF1c2UgcG9ydCBwYXJhbWV0ZXJzCi0gKgotICogIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgOiBJbmRleCBvZiBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50Ci0gKiAgYlBhdXNlUG9ydCAgICAgIDogQm9vbGVhbiBmaWVsZCB3aGljaCBpbmRpY2F0ZXMgaWYgcG9ydCBpcyBwYXVzZWQgb3IgcmVzdW1lLiBCeSBkZWZhdWx0IGJQYXVzZVBvcnQgPSBPTVhfRkFMU0UKLSAqICAgICAgICAgICAgICAgICAgICAmIHBvcnQgd2lsbCBiZSBwYXVzZWQgd2hlbiBiUGF1c2VQb3J0ID0gT01YX1RSVUUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9DT05GSUdfUEFVU0VQT1JUVFlQRSB7Ci0gIE9NWF9VMzIgblNpemU7Ci0gIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAvKio8IFJlcHJlc2VudHMgdGhlIHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gIE9NWF9CT09MIGJQYXVzZVBvcnQ7ICAgICAgICAgICAgICAgLyoqPCBTcGVjaWZpZXMgaWYgcG9ydCBuZWVkIHRvIFBBVVNFIG9yIFJFU1VNRSAqLwotfSBRT01YX0NPTkZJR19QQVVTRVBPUlRUWVBFOwotCi0KLXR5cGVkZWYgc3RydWN0IFFPTVhfUkVDVFRZUEUgewotICAgIE9NWF9TMzIgbkxlZnQ7Ci0gICAgT01YX1MzMiBuVG9wOwotICAgIE9NWF9VMzIgbldpZHRoOwotICAgIE9NWF9VMzIgbkhlaWdodDsKLX0gUU9NWF9SRUNUVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9BQ1RJVkVSRUdJT05ERVRFQ1RJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkVuYWJsZTsKLSAgICBRT01YX1JFQ1RUWVBFIHNST0k7Ci0gICAgT01YX1UzMiBuTnVtRXhjbHVzaW9uUmVnaW9uczsKLSAgICBRT01YX1JFQ1RUWVBFIHNFeGNsdXNpb25SZWdpb25zWzFdOwotfSBRT01YX0FDVElWRVJFR0lPTkRFVEVDVElPTlRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfQUNUSVZFUkVHSU9OREVURUNUSU9OX1NUQVRVU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRGV0ZWN0ZWQ7Ci0gICAgUU9NWF9SRUNUVFlQRSBzRGV0ZWN0ZWRSZWdpb247Ci19IFFPTVhfQUNUSVZFUkVHSU9OREVURUNUSU9OX1NUQVRVU1RZUEU7Ci0KLXR5cGVkZWYgZW51bSBRT01YX1NDQUxFX01PREVUWVBFIHsKLSAgICBRT01YX1NDQUxFX01PREVfTm9ybWFsLAotICAgIFFPTVhfU0NBTEVfTU9ERV9BbmFtb3JwaGljLAotICAgIFFPTVhfU0NBTEVfTU9ERV9NYXggPSAweDdGRkZGRkZGCi19IFFPTVhfU0NBTEVfTU9ERVRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfU0NBTElOR01PREVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBRT01YX1NDQUxFX01PREVUWVBFICBlU2NhbGVNb2RlOwotfSBRT01YX1NDQUxJTkdNT0RFVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9OT0lTRVJFRFVDVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRW5hYmxlOwotICAgIE9NWF9CT09MIGJBdXRvTW9kZTsKLSAgICBPTVhfUzMyIG5Ob2lzZVJlZHVjdGlvbjsKLX0gUU9NWF9OT0lTRVJFRFVDVElPTlRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IFFPTVhfSU1BR0VFTkhBTkNFTUVOVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRW5hYmxlOwotICAgIE9NWF9CT09MIGJBdXRvTW9kZTsKLSAgICBPTVhfUzMyIG5JbWFnZUVuaGFuY2VtZW50OwotfSBRT01YX0lNQUdFRU5IQU5DRU1FTlRUWVBFOwotCi0vKgotICogdGhlc2UgYXJlIHBhcnQgb2YgT01YMS4yIGJ1dCBKQiBNUjIgYnJhbmNoIGRvZXNuJ3QgaGF2ZSB0aGVtIGRlZmluZWQKLSAqIE9NWF9JbmRleFBhcmFtSW50ZXJsYWNlRm9ybWF0Ci0gKiBPTVhfSU5URVJMQUNFRk9STUFUVFlQRQotICovCi0jaWZuZGVmIE9NWF9JbmRleFBhcmFtSW50ZXJsYWNlRm9ybWF0Ci0jZGVmaW5lIE9NWF9JbmRleFBhcmFtSW50ZXJsYWNlRm9ybWF0ICgweDdGRjAwMDAwKQotdHlwZWRlZiBlbnVtIE9NWF9JTlRFUkxBQ0VUWVBFCi17Ci0gICBPTVhfSW50ZXJsYWNlRnJhbWVQcm9ncmVzc2l2ZSwKLSAgIE9NWF9JbnRlcmxhY2VJbnRlcmxlYXZlRnJhbWVUb3BGaWVsZEZpcnN0LAotICAgT01YX0ludGVybGFjZUludGVybGVhdmVGcmFtZUJvdHRvbUZpZWxkRmlyc3QsCi0gICBPTVhfSW50ZXJsYWNlRnJhbWVUb3BGaWVsZEZpcnN0LAotICAgT01YX0ludGVybGFjZUZyYW1lQm90dG9tRmllbGRGaXJzdAotfU9NWF9JTlRFUkxBQ0VzOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfSU5URVJMQUNFRk9STUFUVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkZvcm1hdDsKLSAgICBPTVhfVElDS1MgblRpbWVTdGFtcDsKLX0gT01YX0lOVEVSTEFDRUZPUk1BVFRZUEU7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKCBfX2NwbHVzcGx1cyApCi19Ci0jZW5kaWYgLyogZW5kIG9mIG1hY3JvIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBlbmQgb2YgbWFjcm8gX19IX1FPTVhfSVZDT01NT05FWFRFTlNJT05TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL1FPTVhfU291cmNlRXh0ZW5zaW9ucy5oIGIvc2RtODQ1L21tLWNvcmUvaW5jL1FPTVhfU291cmNlRXh0ZW5zaW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGVhYzNiLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL2luYy9RT01YX1NvdXJjZUV4dGVuc2lvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTEtMjAxMiBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yCi0gICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTi1JTkZSSU5HRU1FTlQgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgX19IX1FPTVhfU09VUkNFRVhURU5TSU9OU19IX18KLSNkZWZpbmUgX19IX1FPTVhfU09VUkNFRVhURU5TSU9OU19IX18KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLy8qKiBAZmlsZSBRT01YX1NvdXJjZUV4dGVuc2lvbnMuaAotCi1AcGFyIEZJTEUgU0VSVklDRVM6Ci0gICAgUXVhbGNvbW0gZXh0ZW5zaW9ucyBBUEkgZm9yIE9wZW5NYXggSUwgZGVtdXhlciBjb21wb25lbnQuCi0KLSAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBRdWFsY29tbSBPcGVuTWF4IElMCi0gICAgZGVtdXhlciBjb21wb25lbnQgZXh0ZW50aW9uIGludGVyZmFjZSwgdGhyb3VnaCB3aGljaCB0aGUgSUwgY2xpZW50IGFuZAotICAgIE9wZW5NYXggY29tcG9uZW50cyBjYW4gYWNjZXNzIGFkZGl0aW9uYWwgY2FwYWJpbGl0aWVzIG9mIHRoZSBkZW11eGVyLgotCi0qLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTIEZPUiBNT0RVTEUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jaW5jbHVkZSA8T01YX0NvcmUuaD4KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgREVGSU5JVElPTlMgQU5EIERFQ0xBUkFUSU9OUwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2lmIGRlZmluZWQoIF9fY3BsdXNwbHVzICkKLWV4dGVybiAiQyIKLXsKLSNlbmRpZiAvKiBlbmQgb2YgbWFjcm8gX19jcGx1c3BsdXMgKi8KLS8qIEZyYW1lIHNpemUgcXVlcnkgc3VwcG9ydGVkIGV4dGVuc2lvbiBzdHJpbmcgKi8KLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fRlJBTUVTSVpFUVVFUllTVVBQT1JURUQgICAgICAgIk9NWC5RQ09NLmluZGV4LnBhcmFtLkZyYW1lU2l6ZVF1ZXJ5U3VwcG9ydGVkIiAgICAgIC8qKjwgcmVmZXJlbmNlOiBRT01YX0ZSQU1FU0laRVRZUEUgKi8KLQotLyogQ29udGVudCBpbnRlcmZhY2UgZXh0ZW5zaW9uIHN0cmluZ3MgKi8KLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fQ09OVEVOVElOVEVSRkFDRV9JWFNUUkVBTSAgICAgIk9NWC5RQ09NLmluZGV4LnBhcmFtLmNvbnRlbnRpbnRlcmZhY2UuaXhzdHJlYW0iICAgIC8qKjwgcmVmZXJlbmNlOiBRT01YX0NPTlRFTlRJTlRFUkZBQ0VUWVBFKi8KLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fQ09OVEVOVElOVEVSRkFDRV9JU1RSRUFNUE9SVCAgIk9NWC5RQ09NLmluZGV4LnBhcmFtLmNvbnRlbnRpbnRlcmZhY2UuaXN0cmVhbXBvcnQiIC8qKjwgcmVmZXJlbmNlOiBRT01YX0NPTlRFTlRJTlRFUkZBQ0VUWVBFKi8KLQotLyogU291cmNlIHNlZWsgYWNjZXNzIGV4dGVuc2lvbiBzdHJpbmcgKi8KLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fU0VFS19BQ0NFU1MgICAgICAgICAgICAiT01YLlFDT00uaW5kZXgucGFyYW0uU2Vla0FjY2VzcyIgICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IFFPTVhfUEFSQU1fU0VFS0FDQ0VTU1RZUEUqLwotCi0vKiBNZWRpYSBkdXJhdGlvbiBleHRlbnNpb24gc3RyaW5nKi8KLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX01FRElBRFVSQVRJT04gICAgICAgICAgICAgICAgIk9NWC5RQ09NLmluZGV4LmNvbmZpZy5NZWRpYUR1cmF0aW9uIiAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfTUVESUFEVVJBVElPTlRZUEUqLwotCi0vKioKLSAqICBEYXRhIGludGVyZmFjZSBQYXJhbXMKLSAqCi0gKiAgU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuSW50ZXJmYWNlU2l6ZSA6IFNpemUgb2YgdGhlIGRhdGEgcG9pbnRlZCBieSBwSW50ZXJmYWNlCi0gKiAgcEludGVyZmFjZSAgICAgOiBJbnRlcmZhY2UgcG9pbnRlcgotICovCi10eXBlZGVmIHN0cnVjdCBRT01YX0NPTlRFTlRJTlRFUkZBQ0VUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5JbnRlcmZhY2VTaXplOwotICAgIE9NWF9VOCBwSW50ZXJmYWNlWzFdOwotfSBRT01YX0RBVEFJTlRFUkZBQ0VUWVBFOwotCi0vKioKLSAqICBTZWVrIEFjY2VzcyBQYXJhbWV0ZXJzCi0gKgotICogIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgOiBJbmRleCBvZiBwb3J0Ci0gKiAgYlNlZWtBbGxvd2VkICAgOiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgc2VlayBpcyBzdXBwb3J0ZWQgb3Igbm90Ci0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfUEFSQU1fU0VFS0FDQ0VTU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiU2Vla0FsbG93ZWQ7Ci19IFFPTVhfUEFSQU1fU0VFS0FDQ0VTU1RZUEU7Ci0KLS8qKgotICogIE1lZGlhIER1cmF0aW9uIHBhcmFtZXRlcnMKLSAqCi0gKiAgU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICA6IEluZGV4IG9mIHBvcnQKLSAqICBuRHVyYXRpb24gICAgICA6IFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBtZWRpYQotKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19NRURJQURVUkFUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9USUNLUyBuRHVyYXRpb247Ci19IE9NWF9USU1FX0NPTkZJR19NRURJQURVUkFUSU9OVFlQRTsKLQotLyoqCi0gKiAgVGhlIHBhcmFtZXRlcnMgZm9yIFFPTVhfRlJBTUVTSVpFVFlQRSBhcmUgZGVmaW5lZCBhcwotICogIGZvbGxvd3M6Ci0gKgotICogIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgOiBSZXByZXNlbnRzIHRoZSBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUKLSAqICAgICAgICAgICAgICAgICAgICBhcHBsaWVzIHRvCi0gKiAgc0ZyYW1lU2l6ZSAgICAgIDogSW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBmcmFtZQotICogIG5GcmFtZVNpemVJbmRleCA6IEVudW1lcmF0ZXMgdGhlIHBvc3NpYmxlIGZyYW1lIHNpemVzIGZvcgotICogICAgICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBzZXNzaW9uL1VSTCBjb25maWd1cmF0aW9uLiBUaGUKLSAqICAgICAgICAgICAgICAgICAgICBjYWxsZXIgc3BlY2lmaWVzIGFsbCBmaWVsZHMgYW5kIHRoZQotICogICAgICAgICAgICAgICAgICAgIE9NWF9HZXRQYXJhbWV0ZXIgY2FsbCByZXR1cm5zIHRoZSB2YWx1ZSBvZgotICogICAgICAgICAgICAgICAgICAgIHRoZSBmcmFtZSBzaXplLiBUaGUgdmFsdWUgb2YKLSAqICAgICAgICAgICAgICAgICAgICBuRnJhbWVTaXplSW5kZXggZ29lcyBmcm9tIDAgdG8gTi0xLCB3aGVyZQotICogICAgICAgICAgICAgICAgICAgIE4gaXMgdGhlIG51bWJlciBvZiBmcmFtZSBzaXplcyB0aGF0IG1heSBiZQotICogICAgICAgICAgICAgICAgICAgIGVtaXR0ZWQgYnkgdGhlIHBvcnQuIFRoZSBwb3J0IGRvZXMgbm90Ci0gKiAgICAgICAgICAgICAgICAgICAgbmVlZCB0byByZXBvcnQgTiBhcyB0aGUgY2FsbGVyIGNhbgotICogICAgICAgICAgICAgICAgICAgIGRldGVybWluZSBOIGJ5IGVudW1lcmF0aW5nIGFsbCB0aGUgZnJhbWUKLSAqICAgICAgICAgICAgICAgICAgICBzaXplcyBzdXBwb3J0ZWQgYnkgdGhlIHBvcnQuIElmIHRoZSBwb3J0Ci0gKiAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgaGF2ZSBhZHZhbmNlIGtub3dsZWRnZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBmcmFtZSBzaXplcywgaXQgbWF5IHJlcG9ydCBubwotICogICAgICAgICAgICAgICAgICAgIGZyYW1lIHNpemVzLiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBmcmFtZQotICogICAgICAgICAgICAgICAgICAgIHNpemVzLCBPTVhfR2V0UGFyYW1ldGVyIHJldHVybnMKLSAqICAgICAgICAgICAgICAgICAgICBPTVhfRXJyb3JOb01vcmUuCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfRlJBTUVTSVpFVFlQRQotewotICBPTVhfVTMyIG5TaXplOwotICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgT01YX0ZSQU1FU0laRVRZUEUgc0ZyYW1lU2l6ZTsKLSAgT01YX1UzMiBuRnJhbWVTaXplSW5kZXg7Ci19IFFPTVhfRlJBTUVTSVpFVFlQRTsKLQotI2lmIGRlZmluZWQoIF9fY3BsdXNwbHVzICkKLX0KLSNlbmRpZiAvKiBlbmQgb2YgbWFjcm8gX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIGVuZCBvZiBtYWNybyBfX0hfUU9NWF9TT1VSQ0VFWFRFTlNJT05TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL1FPTVhfU3RyZWFtaW5nRXh0ZW5zaW9ucy5oIGIvc2RtODQ1L21tLWNvcmUvaW5jL1FPTVhfU3RyZWFtaW5nRXh0ZW5zaW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzAyM2EyLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL2luYy9RT01YX1N0cmVhbWluZ0V4dGVuc2lvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0jaWZuZGVmIFFPTVhfU1RSRUFNSU5HRVhURU5TSU9OU19IXwotI2RlZmluZSBRT01YX1NUUkVBTUlOR0VYVEVOU0lPTlNfSF8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vcgotICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgICAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLU9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKi8vKiogQGZpbGUgUU9NWF9TdHJlYW1pbmdFeHRlbnNpb25zLmgKLQotQHBhciBGSUxFIFNFUlZJQ0VTOgotICAgICAgUXVhbGNvbW0gZXh0ZW5zaW9ucyBBUEkgZm9yIE9wZW5NYXggSUwgU3RyZWFtaW5nIENvbXBvbmVudHMuCi0KLSAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIFF1YWxjb21tIE9wZW5NYXggSUwKLSAgICAgIHN0cmVhbWluZyBleHRlbnRpb24gaW50ZXJmYWNlLCB0aHJvdWdoIHdoaWNoIHRoZSBJTCBjbGllbnQgYW5kIE9wZW5NYXgKLSAgICAgIGNvbXBvbmVudHMgY2FuIGFjY2VzcyBhZGRpdGlvbmFsIHN0cmVhbWluZyBjYXBhYmlsaXRpZXMuCi0KLSovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXQgSGlzdG9yeQotCi0kSGVhZGVyOiAvL3NvdXJjZS9xY29tL3FjdC9tdWx0aW1lZGlhMi9hcGkvT3Blbk1heC9RQ09NL21haW4vbGF0ZXN0L1FPTVhfU3RyZWFtaW5nRXh0ZW5zaW9ucy5oIzcgJAotJERhdGVUaW1lOiAyMDExLzAzLzAyIDEyOjI3OjI3ICQKLSRDaGFuZ2U6IDE2MzgzMjMgJAotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiogICAgICAgICAgICAgICBJbmNsdWRlcyBhbmQgUHVibGljIERhdGEgRGVjbGFyYXRpb25zCi0qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTIEZPUiBNT0RVTEUKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2luY2x1ZGUgPE9NWF9UeXBlcy5oPgotI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KLQotI2lmIGRlZmluZWQoIF9fY3BsdXNwbHVzICkKLWV4dGVybiAiQyIKLXsKLSNlbmRpZiAvKiBlbmQgb2YgbWFjcm8gX19jcGx1c3BsdXMgKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgICAgREFUQSBERUNMQVJBVElPTlMKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKiBUeXBlIERlY2xhcmF0aW9ucwotKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qKgotICogUXVhbGNvbW0gdmVuZG9yIHN0cmVhbWluZyBleHRlbnNpb24gc3RyaW5ncy4KLSAqLwotI2RlZmluZSBPTVhfUVVBTENPTU1fSU5ERVhfQ09ORklHX1dBVEVSTUFSSyAgICAgICAgICAgICAgICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5jb25maWcuV2F0ZXJtYXJrIgotI2RlZmluZSBPTVhfUVVBTENPTU1fSU5ERVhfQ09ORklHX1dBVEVSTUFSS1NUQVRVUyAgICAgICAgICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5jb25maWcuV2F0ZXJtYXJrU3RhdHVzIgotI2RlZmluZSBPTVhfUVVBTENPTU1fSU5ERVhfQ09ORklHX0JVRkZFUk1BUktJTkcgICAgICAgICAgICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5jb25maWcuQnVmZmVyTWFya2luZyIKLSNkZWZpbmUgT01YX1FVQUxDT01NX0lOREVYX1BBUkFNX1NUUkVBTUlOR19ORVRXT1JLSU5URVJGQUNFICAgICAgICJPTVguUXVhbGNvbW0uaW5kZXgucGFyYW0uc3RyZWFtaW5nLk5ldHdvcmtJbnRlcmZhY2UiCi0jZGVmaW5lIE9NWF9RVUFMQ09NTV9JTkRFWF9QQVJBTV9TVFJFQU1JTkdfTkVUV09SS1BST0ZJTEUgICAgICAgICAiT01YLlF1YWxjb21tLmluZGV4LnBhcmFtLnN0cmVhbWluZy5OZXR3b3JrUHJvZmlsZSIKLSNkZWZpbmUgT01YX1FVQUxDT01NX0lOREVYX1BBUkFNX1NUUkVBTUlOR19QUk9YWVNFUlZFUiAgICAgICAgICAgICJPTVguUXVhbGNvbW0uaW5kZXgucGFyYW0uc3RyZWFtaW5nLlByb3h5U2VydmVyIgotI2RlZmluZSBPTVhfUVVBTENPTU1fSU5ERVhfUEFSQU1fU1RSRUFNSU5HX1NPVVJDRVBPUlRTICAgICAgICAgICAgIk9NWC5RdWFsY29tbS5pbmRleC5wYXJhbS5zdHJlYW1pbmcuU291cmNlUG9ydHMiCi0jZGVmaW5lIE9NWF9RVUFMQ09NTV9JTkRFWF9DT05GSUdfU1RSRUFNSU5HX1BST1RPQ09MSEVBREVSICAgICAgICAiT01YLlF1YWxjb21tLmluZGV4LnBhcmFtLnN0cmVhbWluZy5Qcm90b2NvbEhlYWRlciIKLSNkZWZpbmUgT01YX1FVQUxDT01NX0lOREVYX0NPTkZJR19TVFJFQU1JTkdfUFJPVE9DT0xFVkVOVCAgICAgICAgICJPTVguUXVhbGNvbW0uaW5kZXguY29uZmlnLnN0cmVhbWluZy5Qcm90b2NvbEV2ZW50IgotI2RlZmluZSBPTVhfUVVBTENPTU1fSU5ERVhfQ09ORklHX1NUUkVBTUlOR19EWU5BTUlDX1NXSVRDSF9DQVBBQklMSVRZICJPTVguUXVhbGNvbW0uaW5kZXguY29uZmlnLnN0cmVhbWluZy5EeW5hbWljU2Vzc2lvblN3aXRjaENhcGFiaWxpdHkiCi0jZGVmaW5lIE9NWF9RVUFMQ09NTV9JTkRFWF9DT05GSUdfU1RSRUFNSU5HX1BST1RPQ09MSEVBREVSU0VWRU5UICAiT01YLlFDT00uaW5kZXguY29uZmlnLnN0cmVhbWluZy5Qcm90b2NvbEhlYWRlcnNFdmVudCIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX1NUUkVBTUlOR19VU0VSUEFVU0VUSU1FT1VUICAgICAgICAgICJPTVguUUNPTS5pbmRleC5jb25maWcuc3RyZWFtaW5nLlVzZXJQYXVzZVRpbWVvdXQiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19TVFJFQU1JTkdfTk9USUZZRVJST1JPTk9QVElPTlNUSU1FT1VUICAgIk9NWC5RQ09NLmluZGV4LmNvbmZpZy5zdHJlYW1pbmcuTm90aWZ5RXJyb3JPbk9wdGlvbnNUaW1lb3V0IgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfU1RSRUFNSU5HX1VTRUlOVEVSTEVBVkVEVENQICAgICAgICAgIk9NWC5RQ09NLmluZGV4LmNvbmZpZy5zdHJlYW1pbmcuVXNlSW50ZXJsZWF2ZWRUQ1AiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19TVFJFQU1JTkdfREFUQUlOQUNUSVZJVFlUSU1FT1VUICAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLnN0cmVhbWluZy5EYXRhSW5hY3Rpdml0eVRpbWVvdXQiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19TVFJFQU1JTkdfUlRTUE9QVElPTlNLRUVQQUxJVkVJTlRFUlZBTCAgICJPTVguUUNPTS5pbmRleC5jb25maWcuc3RyZWFtaW5nLlJUU1BPcHRpb25zS2VlcGFsaXZlSW50ZXJ2YWwiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19TVFJFQU1JTkdfUlRDUFJSSU5URVJWQUwgICAgICAgICAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLnN0cmVhbWluZy5SVENQUlJJbnRlcnZhbCIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX1NUUkVBTUlOR19SRUNPTkZJR1VSRVBPUlQgICAgICAgICAgICJPTVguUUNPTS5pbmRleC5jb25maWcuc3RyZWFtaW5nLlJlY29uZmlndXJlUG9ydCIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX1NUUkVBTUlOR19ERUZBVUxUUlRTUE1FU1NBR0VUSU1FT1VUICJPTVguUUNPTS5pbmRleC5jb25maWcuc3RyZWFtaW5nLkRlZmF1bHRSVFNQTWVzc2FnZVRpbWVvdXQiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19TVFJFQU1JTkdfRU5BQkxFRklSRVdBTExQUk9CRVMgICAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLnN0cmVhbWluZy5FbmFibGVGaXJld2FsbFByb2JlcyIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX1NUUkVBTUlOR19SVFNQT1BUSU9OU0JFRk9SRVNFVFVQICAgICJPTVguUUNPTS5pbmRleC5jb25maWcuc3RyZWFtaW5nLlJUU1BPcHRpb25zQmVmb3JlU2V0dXAiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19TVFJFQU1JTkdfUlRTUFBJUEVMSU5FREZBU1RTVEFSVFVQICAiT01YLlFDT00uaW5kZXguY29uZmlnLnN0cmVhbWluZy5SVFNQUGlwZWxpbmVkRmFzdFN0YXJ0dXAiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19TVFJFQU1JTkdfV01GQVNUU1RBUlRTUEVFRCAgICAgICAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLnN0cmVhbWluZy5XTUZhc3RTdGFydFNwZWVkIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfU1RSRUFNSU5HX0VOQUJMRUZBU1RSRUNPTk5FQ1QgICAgICAgIk9NWC5RQ09NLmluZGV4LmNvbmZpZy5zdHJlYW1pbmcuRW5hYmxlRmFzdFJlY29ubmVjdCIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX1NUUkVBTUlOR19GQVNUUkVDT05ORUNUTUFYQVRURU1QVFMgICJPTVguUUNPTS5pbmRleC5jb25maWcuc3RyZWFtaW5nLkZhc3RSZWNvbm5lY3RNYXhBdHRlbXB0cyIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX1NUUkVBTUlOR19ET1dOTE9BRFBST0dSRVNTVU5JVFNUWVBFICJPTVguUUNPTS5pbmRleC5jb25maWcuc3RyZWFtaW5nLkRvd25sb2FkUHJvZ3Jlc3NVbml0c1R5cGUiCi0jZGVmaW5lIE9NWF9RT01YX0lOREVYX0NPTkZJR19TVFJFQU1JTkdfRE9XTkxPQURQUk9HUkVTUyAgICAgICAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLnN0cmVhbWluZy5Eb3dubG9hZFByb2dyZXNzIgotLyoqCi0gKiBFbnVtZXJhdGlvbiBvZiB0aGUgYnVmZmVyaW5nIHdhdGVybWFyayB0eXBlcwotICovCi10eXBlZGVmIGVudW0gUU9NWF9XQVRFUk1BUktUWVBFCi17Ci0gIFFPTVhfV0FURVJNQVJLX1VOREVSUlVOLCAvKio8IGJ1ZmZlciBoYXMgcmVhY2hlZCBvciBpcyBvcGVyYXRpbmcgaW4gYW4gdW5kZXJydW4gY29uZGl0aW9uICovCi0gIFFPTVhfV0FURVJNQVJLX05PUk1BTCAvKio8IGhhcyByZWFjaGVkIG9yIGlzIG9wZXJhdGluZyBpbiBhIG5vcm1hbCAob3B0aW1hbCkgY29uZGl0aW9uICovCi19UU9NWF9XQVRFUk1BUktUWVBFOwotCi0vKioKLSAqIEVudW1lcmF0aW9uIG9mIHR5cGUgb2YgYnVmZmVyaW5nIGxldmVsIHRyYWNraW5nCi0gKi8KLXR5cGVkZWYgZW51bSBRT01YX1dBVEVSTUFSS1VOSVRTVFlQRQotewotICBRT01YX1dBVEVSTUFSS1VOSVRTVFlQRV9UaW1lLCAvKio8IHVzZSBhIG1lZGlhIHRpbWUgYmFzZWQgcmVmZXJlbmNlICovCi0gIFFPTVhfV0FURVJNQVJLVU5JVFNUWVBFX0RhdGEgLyoqPCB1c2UgYSBkYXRhIGZ1bGxuZXNzIGJhc2VkIHJlZmVyZW5jZSAqLwotfVFPTVhfV0FURVJNQVJLVU5JVFNUWVBFOwotCi0vKioKLSAqIEJ1ZmZlcmluZyB3YXRlcm1hcmsgbGV2ZWxzLgotICoKLSAqICBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlV2F0ZXJNYXJrICAgOiBlV2F0ZXJNYXJrIHNwZWNpZmllcyB0aGUgdHlwZSBvZiBidWZmZXJpbmcgd2F0ZXJtYXJrIGJlaW5nCi0gKiAgICAgICAgICAgICAgICAgY29uZmlndXJlZAotICogICAgICAgICAgICAgICAgIFFPTVhfV0FURVJNQVJLX1VOREVSUlVOIEluZGljYXRlcyB0aGUgY29uZGl0aW9uIHdoZW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICBidWZmZXIgaGFzIHJlYWNoZWQgb3IgaXMgb3BlcmF0aW5nIGluIGFuIHVuZGVycnVuIGNvbmRpdGlvbgotICogICAgICAgICAgICAgICAgICAgLSBub3QgZW5vdWdoIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgUU9NWF9XQVRFUk1BUktfTk9STUFMIEluZGljYXRlcyB0aGUgY29uZGl0aW9uIHdoZW4gdGhlIGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICAgaGFzIHJlYWNoZWQgb3IgaXMgb3BlcmF0aW5nIGluIGEgbm9ybWFsIChvcHRpbWFsKSBjb25kaXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAtIHN1ZmZpY2llbnQgZGF0YSB3aXRoaW4gdGhlIGJ1ZmZlci4KLSAqCi0gKiAgbkxldmVsICAgICAgIDogc3BlY2lmaWVzIHRoZSBidWZmZXJpbmcgbGV2ZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRlcm1hcmsuCi0gKiAgICAgICAgICAgICAgICAgVGhlIHVuaXRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0ZXJtYXJrIGxldmVsIGlzIGRlcGVuZGVudAotICogICAgICAgICAgICAgICAgIG9uIHRoZSBlVW5pdHNUeXBlIGJlaW5nIHNlbGVjdGVkLgotICogICAgICAgICAgICAgICAgICAgUU9NWF9XQVRFUk1BUktVTklUU1RZUEVfVGltZSBuTGV2ZWwgaW4gdW5pdHMgb2YgbWljcm9zZWNvbmRzLgotICogICAgICAgICAgICAgICAgICAgUU9NWF9XQVRFUk1BUktVTklUU1RZUEVfRGF0YSBuTGV2ZWwgaW4gdW5pdHMgb2YgYnl0ZXMuCi0gKgotICogIG5Vbml0c1R5cGUgIDogc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGJ1ZmZlcmluZyBsZXZlbCB0cmFja2luZyB0byBiZSB1c2VkLgotICogICAgICAgICAgICAgICAgICBRT01YX1dBVEVSTUFSS1VOSVRTVFlQRV9UaW1lIHRoZSBidWZmZXIgd2F0ZXJtYXJrIGxldmVsCi0gKiAgICAgICAgICAgICAgICAgICAgc2hhbGwgdXNlIGEgbWVkaWEgdGltZSBiYXNlZCByZWZlcmVuY2UuCi0gKiAgICAgICAgICAgICAgICAgIFFPTVhfV0FURVJNQVJLVU5JVFNUWVBFX0RhdGEgdGhlIGJ1ZmZlciB3YXRlcm1hcmsgbGV2ZWwKLSAqICAgICAgICAgICAgICAgICAgICBzaGFsbCB1c2UgYSBkYXRhIGZ1bGxuZXNzIGJhc2VkIHJlZmVyZW5jZS4KLSAqIGJFbmFibGUgICAgICA6IHNwZWNpZmllcyBpZiB0aGUgd2F0ZXJtYXJrIHR5cGUgaXMgYmVpbmcgZW5hYmxlZCBvciBkaXNhYmxlZAotICovCi10eXBlZGVmIHN0cnVjdCBRT01YX0JVRkZFUklOR1dBVEVSTUFSS1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBRT01YX1dBVEVSTUFSS1RZUEUgZVdhdGVyTWFyazsKLSAgICBPTVhfVTMyIG5MZXZlbDsKLSAgICBRT01YX1dBVEVSTUFSS1VOSVRTVFlQRSBlVW5pdHNUeXBlOwotICAgIE9NWF9CT09MIGJFbmFibGU7Ci19IFFPTVhfQlVGRkVSSU5HV0FURVJNQVJLVFlQRTsKLQotLyoqCi0gKiAgQ3VycmVudCBidWZmZXJpbmcgc3RhdHVzIG9mIHRoZSBzdHJlYW1pbmcgc291cmNlIGNvbXBvbmVudCwgZm9yIGEgZ2l2ZW4KLSAqICBtZWRpYSBwb3J0Ci0gKgotICogIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVDdXJyZW50V2F0ZXJNYXJrIDogc3BlY2lmaWVzIHRoZSBjdXJyZW50IGJ1ZmZlciB3YXRlcm1hcmsgbGV2ZWwgY29uZGl0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICBRT01YX1dBVEVSTUFSS19VTkRFUlJVTiBJbmRpY2F0ZXMgdGhlIGNvbmRpdGlvbiB3aGVuIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaGFzIHJlYWNoZWQgb3IgaXMgb3BlcmF0aW5nIGluIGFuIHVuZGVycnVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiAtIG5vdCBlbm91Z2ggZGF0YQotICogICAgICAgICAgICAgICAgICAgICAgUU9NWF9XQVRFUk1BUktfTk9STUFMIEluZGljYXRlcyB0aGUgY29uZGl0aW9uIHdoZW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBoYXMgcmVhY2hlZCBvciBpcyBvcGVyYXRpbmcgaW4gYSBub3JtYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGltYWwpIGNvbmRpdGlvbiAtIHN1ZmZpY2llbnQgZGF0YSB3aXRoaW4gdGhlIGJ1ZmZlci4KLSAqICBlVW5pdHNUeXBlICAgICAgOiBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgYnVmZmVyaW5nIGxldmVsIHRyYWNraW5nIHRvIGJlIHVzZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgIFFPTVhfV0FURVJNQVJLVU5JVFNUWVBFX1RpbWUgdGhlIGJ1ZmZlciB3YXRlcm1hcmsgbGV2ZWwKLSAqICAgICAgICAgICAgICAgICAgICAgICBzaGFsbCB1c2UgYSBtZWRpYSB0aW1lIGJhc2VkIHJlZmVyZW5jZS4KLSAqICAgICAgICAgICAgICAgICAgICAgUU9NWF9XQVRFUk1BUktVTklUU1RZUEVfRGF0YSB0aGUgYnVmZmVyIHdhdGVybWFyayBsZXZlbAotICogICAgICAgICAgICAgICAgICAgICAgIHNoYWxsIHVzZSBhIGRhdGEgZnVsbG5lc3MgYmFzZWQgcmVmZXJlbmNlLgotICogIG5DdXJyZW50TGV2ZWwgICAgOiBzcGVjaWZpZXMgdGhlIGN1cnJlbnQgYnVmZmVyIHdhdGVybWFyayBsZXZlbCBjb25kaXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgVGhlIHVuaXRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0ZXJtYXJrIGxldmVsIGlzIGRlcGVuZGVudAotICogICAgICAgICAgICAgICAgICAgICBvbiB0aGUgZVVuaXRzVHlwZSBiZWluZyBzZWxlY3RlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICBRT01YX1dBVEVSTUFSS1VOSVRTVFlQRV9UaW1lIG5MZXZlbCBpbiB1bml0cyBvZiBtaWNyb3NlY29uZHMuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgUU9NWF9XQVRFUk1BUktVTklUU1RZUEVfRGF0YSBuTGV2ZWwgaW4gdW5pdHMgb2YgYnl0ZXMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfQlVGRkVSSU5HU1RBVFVTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIFFPTVhfV0FURVJNQVJLVFlQRSBlQ3VycmVudFdhdGVyTWFyazsKLSAgICBRT01YX1dBVEVSTUFSS1VOSVRTVFlQRSBlVW5pdHNUeXBlOwotICAgIE9NWF9VMzIgbkN1cnJlbnRMZXZlbDsKLX0gUU9NWF9CVUZGRVJJTkdTVEFUVVNUWVBFOwotCi0vKioKLSAqICBtYXJrZWQgYnVmZmVyIHNoYWxsIGJlIGVtaXR0ZWQgd2hlbiB0aGUgYnVmZmVyaW5nIGxldmVsIGhhcyByZWFjaCBhbgotICogIHVuZGVycnVuIGNvbmRpdGlvbiAoUU9NWF9XQVRFUk1BUktfVU5ERVJSVU4pLgotICoKLSAqICBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBtYXJrSW5mbyAgICAgICAgICA6IGlkZW50aWZpZXMgdGhlIHRhcmdldCBjb21wb25lbnQgaGFuZGxlIHRoYXQgc2hhbGwgZW1pdAotICogICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmsgYnVmZmVyIGV2ZW50IGFuZCBhc3NvY2lhdGVkCi0gKiAgYkVuYWJsZSAgICAgICAgICAgOiBlbmFibGVzIG9yIGRpc2FibGVzIHRoZSBidWZmZXIgbWFya2luZyBpbnNlcnRpb24uCi0gKgotICovCi10eXBlZGVmIHN0cnVjdCBRT01YX0JVRkZFUk1BUktJTkdUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX01BUktUWVBFIG1hcmtJbmZvOwotICAgIE9NWF9CT09MICBiRW5hYmxlOwotfSBRT01YX0JVRkZFUk1BUktJTkdUWVBFOwotCi0vKioKLSAqIFNvdXJjZSBwb3J0cy4KLSAqCi0gKiAgU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgbk1pbmltdW1Qb3J0TnVtYmVyICA6IE1pbmltdW0gcG9ydCBudW1iZXIgdGhlIGNvbXBvbmVudCBtYXkgdXNlCi0gKiAgbk1heGltdW1Qb3J0TnVtYmVyICA6IE1heGltdW0gcG9ydCBudW1iZXIgdGhlIGNvbXBvbmVudCBtYXkgdXNlCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfUEFSQU1fU1RSRUFNSU5HX1NPVVJDRV9QT1JUUwotewotICBPTVhfVTMyIG5TaXplOwotICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gIE9NWF9VMTYgbk1pbmltdW1Qb3J0TnVtYmVyOwotICBPTVhfVTE2IG5NYXhpbXVtUG9ydE51bWJlcjsKLX0gUU9NWF9QQVJBTV9TVFJFQU1JTkdfU09VUkNFX1BPUlRTOwotCi0vKioKLSAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRvIHRoZSBwcm90b2NvbCBtZXNzYWdlIHR5cGUuCi0gKi8KLXR5cGVkZWYgZW51bSBRT01YX1NUUkVBTUlOR19QUk9UT0NPTE1FU1NBR0VUWVBFCi17Ci0gIFFPTVhfU1RSRUFNSU5HX1BST1RPQ09MTUVTU0FHRV9SRVFVRVNULAotICBRT01YX1NUUkVBTUlOR19QUk9UT0NPTE1FU1NBR0VfUkVTUE9OU0UsCi0gIFFPTVhfU1RSRUFNSU5HX1BST1RPQ09MTUVTU0FHRV9BTEwKLX0gUU9NWF9TVFJFQU1JTkdfUFJPVE9DT0xNRVNTQUdFVFlQRTsKLQotLyoqCi0gKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcHJvdG9jb2wgaGVhZGVyIGFjdGlvbiB0eXBlLgotICovCi10eXBlZGVmIGVudW0gUU9NWF9TVFJFQU1JTkdfUFJPVE9DT0xIRUFERVJBQ1RJT05UWVBFCi17Ci0gIFFPTVhfU1RSRUFNSU5HX1BST1RPQ09MSEVBREVSQUNUSU9OX05PTkUsCi0gIFFPTVhfU1RSRUFNSU5HX1BST1RPQ09MSEVBREVSQUNUSU9OX0FERCwKLSAgUU9NWF9TVFJFQU1JTkdfUFJPVE9DT0xIRUFERVJBQ1RJT05fUkVNT1ZFCi19IFFPTVhfU1RSRUFNSU5HX1BST1RPQ09MSEVBREVSQUNUSU9OVFlQRTsKLQotLyoqCi0gKiBQcm90b2NvbCBtZXNzYWdlIGhlYWRlci4KLSAqCi0gKiAgU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKGluY2x1ZGluZyBzaXplIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSGVhZGVyIHBhcmFtZXRlcikKLSAqICBuVmVyc2lvbiAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBlTWVzc2FnZVR5cGUgICAgICA6IGVudW1lcmF0aW9uIHRvIGRpc3Rpbmd1aXNoIHByb3RvY29sIG1lc3NhZ2UgdHlwZQotICogIGVBY3Rpb25UeXBlICAgICAgIDogZW51bWVyYXRpb24gaW5kaWNhdGluZyBwcm90b2NvbCBoZWFkZXIgYWN0aW9uIHR5cGUKLSAqICBuTWVzc2FnZUNsYXNzU2l6ZSA6IHNpemUgb2YgdGhlIG1lc3NhZ2UgY2xhc3Mgc3RyaW5nIChleGNsdWRpbmcgYW55Ci0gKiAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGluZyBjaGFyYWN0ZXJzKQotICogIG5IZWFkZXJOYW1lU2l6ZSAgIDogc2l6ZSBvZiB0aGUgaGVhZGVyIG5hbWUgc3RyaW5nIChleGNsdWRpbmcgYW55Ci0gKiAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGluZyBjaGFyYWN0ZXJzKQotICogIG5IZWFkZXJWYWx1ZVNpemUgIDogc2l6ZSBvZiB0aGUgaGVhZGVyIHZhbHVlIHN0cmluZyAoZXhjbHVkaW5nIGFueQotICogICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRpbmcgY2hhcmFjdGVycykKLSAqICBtZXNzYWdlSGVhZGVyICAgICA6IHRoZSBOVUxMLXRlcm1pbmF0ZWQgbWVzc2FnZSBoZWFkZXIgc3RyaW5nIGZvcm1lZCBieQotICogICAgICAgICAgICAgICAgICAgICAgY29uY2F0ZW5hdGluZyBtZXNzYWdlIGNsYXNzLCBoZWFkZXIgbmFtZSBhbmQgdmFsdWUKLSAqICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MsIGkuZS4gdGhlIGZpcnN0IG5NZXNzYWdlQ2xhc3NTaXplIGJ5dGVzIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUhlYWRlciBwYXJhbWV0ZXIgY29ycmVzcG9uZCB0byB0aGUgbWVzc2FnZSBjbGFzcwotICogICAgICAgICAgICAgICAgICAgICAgKHdpdGhvdXQgYW55IHRlcm1pbmF0aW5nIGNoYXJhY3RlcnMpLCBmb2xsb3dlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciBuYW1lIG9mIHNpemUgbkhlYWRlck5hbWVTaXplIGJ5dGVzIGFuZCB0aGVuIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgaGVhZGVyIHZhbHVlIG9mIHNpemUgbkhlYWRlclZhbHVlU2l6ZSBieXRlcy4gVGhlIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgICAgICBvZiBtZXNzYWdlIGNsYXNzIGlzIGludGVycHJldGVkIGJ5IHdoYXQgaXMgbWVudGlvbmVkIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICBlTWVzc2FnZVR5cGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgMSkgRm9yIHJlcXVlc3QgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIChRT01YX1NUUkVBTUlOR19QUk9UT0NPTE1FU1NBR0VfUkVRVUVTVCkgaXQgaXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIHRva2VuIChhcyBzcGVjaWZpZWQgaW4gdGhlIFJGQyAyNjE2IGFuZCBSRkMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAyMzI2KS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAyKSBGb3IgcmVzcG9uc2UgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIChRT01YX1NUUkVBTUlOR19QUk9UT0NPTE1FU1NBR0VfUkVTUE9OU0UpIGl0IGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIG9yIGJvdGggdGhlIE1ldGhvZCB0b2tlbiBhbmQgYSB0aHJlZSBkaWdpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cy1Db2RlIChhcyBzcGVjaWZpZWQgaW4gdGhlIFJGQyAyNjE2IGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIFJGQyAyMzI2KSBvciBhIGNsYXNzIG9mIHRoZSByZXNwb25zZSBTdGF0dXMtQ29kZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoMXh4LCAyeHgsIDN4eCwgNHh4LCBhbmQgNXh4KS4gV2hlbiBib3RoIHByZXNlbnQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1ldGhvZCB0b2tlbiBhbmQgc3RhdHVzIGNvZGUgYXJlIHNlcGFyYXRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgIDEgZW1wdHkgc3BhY2UuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgMykgRm9yIGFsbCBtZXNzYWdlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgIChRT01YX1NUUkVBTUlOR19QUk9UT0NPTE1FU1NBR0VfQUxMKSBpdCB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzZW50IChuTWVzc2FnZUNsYXNzU2l6ZSB3aWxsIGJlIHplcm8pLgotICovCi10eXBlZGVmIHN0cnVjdCBRT01YX0NPTkZJR19TVFJFQU1JTkdfUFJPVE9DT0xIRUFERVJUWVBFCi17Ci0gIE9NWF9VMzIgblNpemU7Ci0gIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgUU9NWF9TVFJFQU1JTkdfUFJPVE9DT0xNRVNTQUdFVFlQRSBlTWVzc2FnZVR5cGU7Ci0gIFFPTVhfU1RSRUFNSU5HX1BST1RPQ09MSEVBREVSQUNUSU9OVFlQRSBlQWN0aW9uVHlwZTsKLSAgT01YX1UzMiBuTWVzc2FnZUNsYXNzU2l6ZTsKLSAgT01YX1UzMiBuSGVhZGVyTmFtZVNpemU7Ci0gIE9NWF9VMzIgbkhlYWRlclZhbHVlU2l6ZTsKLSAgT01YX1U4IG1lc3NhZ2VIZWFkZXJbMV07Ci19IFFPTVhfQ09ORklHX1NUUkVBTUlOR19QUk9UT0NPTEhFQURFUlRZUEU7Ci0KLS8qKgotICogUHJvdG9jb2wgRXZlbnQuCi0gKgotICogIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzIChpbmNsdWRpbmcgc2l6ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xFdmVudFRleHQgcGFyYW1ldGVyKQotICogIG5WZXJzaW9uICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qcm90b2NvbEV2ZW50ICAgIDogMXh4LCAyeHgsIDN4eCwgNHh4IG9yIDV4eCBjb2RlcyBmb3IgSFRUUC9SVFNQIHByb3RvY29sCi0gKiAgblJlYXNvblBocmFzZVNpemUgOiBzaXplIG9mIHRoZSByZWFzb24gcGhyYXNlIHN0cmluZyAoZXhjbHVkaW5nIGFueQotICogICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRpbmcgY2hhcmFjdGVycykKLSAqICBuRW50aXR5Qm9keVNpemUgICA6IHNpemUgb2YgdGhlIGVudGl0eSBib2R5IHN0cmluZyAoZXhjbHVkaW5nIGFueQotICogICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRpbmcgY2hhcmFjdGVycykKLSAqICBuQ29udGVudFVyaVNpemUgICA6IHNpemUgb2YgdGhlIHVybCAoZXhjbHVzaW5nIGFueSB0ZXJtaW5hdGluZyBjaGFyYWN0ZXJzKQotICogICAgICAgICAgICAgICAgICAgICAgdXJsIGlzIHVzZWQgYSBrZXkgdG8gaWRlbnRpZnkgZm9yIHdoaWNoIG9wZXJhdGlvbiB0aGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICBldmVudCBiZWxvbmdzIHRvCi0gKiAgcHJvdG9jb2xFdmVudFRleHQgOiBOVUxMLXRlcm1pbmF0ZWQgcHJvdG9jb2wgZXZlbnQgdGV4dCBzdHJpbmcgZm9ybWVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICBjb25jYXRlbmF0aW5nIHJlYXNvbiBwaHJhc2UgYW5kIGVudGl0eSBib2R5Ci0gKiAgICAgICAgICAgICAgICAgICAgICBhbmQgdXJpLCBpLmUuIHRoZSBmaXJzdCBuUmVhc29uUGhyYXNlU2l6ZSBieXRlcyBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRXZlbnRUZXh0IHBhcmFtZXRlciBjb3JyZXNwb25kIHRvIHRoZSByZWFzb24KLSAqICAgICAgICAgICAgICAgICAgICAgIHBocmFzZSAod2l0aG91dCBhbnkgdGVybWluYXRpbmcgY2hhcmFjdGVycyksIGZvbGxvd2VkCi0gKiAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgZW50aXR5IGJvZHkgb2Ygc2l6ZSBuRW50aXR5Qm9keVNpemUgYnl0ZXMsCi0gKiAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSBuQ29udGVudFVyaVNpemUgYnl0ZXMgb2YgVVJJCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfQ09ORklHX1NUUkVBTUlOR19QUk9UT0NPTEVWRU5UVFlQRQotewotICBPTVhfVTMyIG5TaXplOwotICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gIE9NWF9VMzIgblByb3RvY29sRXZlbnQ7Ci0gIE9NWF9VMzIgblJlYXNvblBocmFzZVNpemU7Ci0gIE9NWF9VMzIgbkVudGl0eUJvZHlTaXplOwotICBPTVhfVTMyIG5Db250ZW50VXJpU2l6ZTsKLSAgT01YX1U4IHByb3RvY29sRXZlbnRUZXh0WzFdOwotfSBRT01YX0NPTkZJR19TVFJFQU1JTkdfUFJPVE9DT0xFVkVOVFRZUEU7Ci0KLS8qKgotICogUHJvdG9jb2wgSGVhZGVycyBFdmVudAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogblNpemU6ICAgICAgICAgICAgICAgICAgIFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyBpbmNsdWRpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSGVhZGVycy4KLSAqIG5WZXJzaW9uOiAgICAgICAgICAgICAgICBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiBlTWVzc2FnZVR5cGU6ICAgICAgICAgICAgZW51bWVyYXRpb24gdG8gZGlzdGluZ3Vpc2ggcHJvdG9jb2wgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUKLSAqIG5NZXNzYWdlQ2xhc3NTaXplOiAgICAgICBTaXplIG9mIHRoZSBtZXNzYWdlIGNsYXNzIHN0cmluZy4KLSAqIG5NZXNzYWdlQXR0cmlidXRlc1NpemU6ICBTaXplIG9mIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIHBvcHVsYXRlZCBpbiAyIG1vZGVzOgotICogKGkpICBRdWVyeSBmb3IgcmVxdWlyZWQgc2l6ZXMgb2YgbWVzc2FnZSBjbGFzcyBhbmQgbWVzc2FnZQotICogICAgICBhdHRyaWJ1dGVzLiBJbiB0aGlzIG1vZGUsIG5NZXNzYWdlQ2xhc3NTaXplIGFuZAotICogICAgICBuTWVzc2FnZUF0cmlidXRlc1NpemUgYm90aCBuZWVkIHRvIGJlIHNldCB0byB6ZXJvLgotICogKGlpKSBSZXF1ZXN0IHRvIHBvcHVsYXRlIG1lc3NhZ2VIZWFkZXJzLiBJbiB0aGlzIG1vZGUsIGF0Ci0gKiAgICAgIGxlYXN0IG9uZSBvZiBuTWVzc2FnZUNsYXNzU2l6ZSBvciBuTWVzc2FnZUF0dHJpYnV0ZXNTaXplCi0gKiAgICAgIG5lZWQgdG8gYmUgbm9uLXplcm8uIE9uIG91dHB1dCwgbWVzc2FnZUhlYWRlcnMgd2lsbCBiZQotICogICAgICBwb3B1bGF0ZWQgd2l0aCB0aGUgbWVzc2FnZSBjbGFzcyBhbmQgbWVzc2FnZSBhdHRyaWJ1dGVzLgotICogICAgICBuTWVzc2FnZUNsYXNzU2l6ZSBhbmQvb3Igbk1lc3NhZ2VBdHJpYnV0ZXNTaXplIG1heSBiZQotICogICAgICBvdmVyd3JpdHRlbiB0byByZWZsZWN0IHRoZSBhY3R1YWwgc3RhcnQgYW5kIGVuZCBvZgotICogICAgICBtZXNzYWdlIGNsYXNzIGFuZCBtZXNzYWdlIGF0dHJpYnV0ZXMuIFRoZSBtYXggc2l6ZXMgb2YKLSAqICAgICAgbWVzc2FnZSBjbGFzcyBhbmQgbWVzc2FnZSBhdHRyaWJ1dGVzIHdpbGwgbm90IGV4Y2VlZCB0aGUKLSAqICAgICAgdmFsdWVzIGlucHV0IGJ5IHRoZSBjbGllbnQuIFRoZSBzdHJpbmdzIGFyZSBub3QgbnVsbAotICogICAgICB0ZXJtaW5hdGVkLgotICovCi10eXBlZGVmIHN0cnVjdCBRT01YX1NUUkVBTUlOR19QUk9UT0NPTEhFQURFUlNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBRT01YX1NUUkVBTUlOR19QUk9UT0NPTE1FU1NBR0VUWVBFIGVNZXNzYWdlVHlwZTsKLSAgICBPTVhfVTMyIG5NZXNzYWdlQ2xhc3NTaXplOwotICAgIE9NWF9VMzIgbk1lc3NhZ2VBdHJpYnV0ZXNTaXplOwotICAgIE9NWF9VOCBtZXNzYWdlSGVhZGVyc1sxXTsKLX0gUU9NWF9TVFJFQU1JTkdfUFJPVE9DT0xIRUFERVJTVFlQRTsKLQotLyoqCi0gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBzdHJlYW1pbmcgbmV0d29yayBpbnRlcmZhY2VzLgotICovCi10eXBlZGVmIGVudW0gUU9NWF9TVFJFQU1JTkdfTkVUV09SS0lOVEVSRkFDRVRZUEUKLXsKLSAgUU9NWF9TVFJFQU1JTkdfTkVUV09SS0lOVEVSRkFDRV9BTllfSUZBQ0UsCi0gIFFPTVhfU1RSRUFNSU5HX05FVFdPUktJTlRFUkZBQ0VfQ0RNQV9TTl9JRkFDRSwKLSAgUU9NWF9TVFJFQU1JTkdfTkVUV09SS0lOVEVSRkFDRV9DRE1BX0FOX0lGQUNFLAotICBRT01YX1NUUkVBTUlOR19ORVRXT1JLSU5URVJGQUNFX1VNVFNfSUZBQ0UsCi0gIFFPTVhfU1RSRUFNSU5HX05FVFdPUktJTlRFUkZBQ0VfU0lPX0lGQUNFLAotICBRT01YX1NUUkVBTUlOR19ORVRXT1JLSU5URVJGQUNFX0NETUFfQkNBU1RfSUZBQ0UsCi0gIFFPTVhfU1RSRUFNSU5HX05FVFdPUktJTlRFUkZBQ0VfV0xBTl9JRkFDRSwKLSAgUU9NWF9TVFJFQU1JTkdfTkVUV09SS0lOVEVSRkFDRV9EVU5fSUZBQ0UsCi0gIFFPTVhfU1RSRUFNSU5HX05FVFdPUktJTlRFUkZBQ0VfRkxPX0lGQUNFLAotICBRT01YX1NUUkVBTUlOR19ORVRXT1JLSU5URVJGQUNFX0RWQkhfSUZBQ0UsCi0gIFFPTVhfU1RSRUFNSU5HX05FVFdPUktJTlRFUkZBQ0VfU1RBX0lGQUNFLAotICBRT01YX1NUUkVBTUlOR19ORVRXT1JLSU5URVJGQUNFX0lQU0VDX0lGQUNFLAotICBRT01YX1NUUkVBTUlOR19ORVRXT1JLSU5URVJGQUNFX0xPX0lGQUNFLAotICBRT01YX1NUUkVBTUlOR19ORVRXT1JLSU5URVJGQUNFX01CTVNfSUZBQ0UsCi0gIFFPTVhfU1RSRUFNSU5HX05FVFdPUktJTlRFUkZBQ0VfSVdMQU5fM0dQUF9JRkFDRSwKLSAgUU9NWF9TVFJFQU1JTkdfTkVUV09SS0lOVEVSRkFDRV9JV0xBTl8zR1BQMl9JRkFDRSwKLSAgUU9NWF9TVFJFQU1JTkdfTkVUV09SS0lOVEVSRkFDRV9NSVA2X0lGQUNFLAotICBRT01YX1NUUkVBTUlOR19ORVRXT1JLSU5URVJGQUNFX1VXX0ZNQ19JRkFDRSwKLSAgUU9NWF9TVFJFQU1JTkdfTkVUV09SS0lOVEVSRkFDRV9DTU1CX0lGQUNFCi19IFFPTVhfU1RSRUFNSU5HX05FVFdPUktJTlRFUkZBQ0VUWVBFOwotCi0vKgotICogTmV0d29yayBpbnRlcmZhY2UuCi0gKgotICogIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzIChpbmNsdWRpbmcgc2l6ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xFcnJvclRleHQgcGFyYW1ldGVyKQotICogIG5WZXJzaW9uICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIGVOZXR3b3JrSW50ZXJmYWNlIDogTmV0d29yayBpbnRlcmZhY2UgdGhlIGNvbXBvbmVudCBtYXkgdXNlCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfUEFSQU1fU1RSRUFNSU5HX05FVFdPUktJTlRFUkZBQ0UKLXsKLSAgT01YX1UzMiBuU2l6ZTsKLSAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICBRT01YX1NUUkVBTUlOR19ORVRXT1JLSU5URVJGQUNFVFlQRSBlTmV0d29ya0ludGVyZmFjZTsKLX0gUU9NWF9QQVJBTV9TVFJFQU1JTkdfTkVUV09SS0lOVEVSRkFDRTsKLQotLyoqCi0gKiBFbnVtZXJhdGlvbiBvZiBVbml0VHlwZSBmb3IgRG93bmxvYWRQcm9ncmVzcwotICovCi10eXBlZGVmIGVudW0gUU9NWF9ET1dOTE9BRFBST0dSRVNTVU5JVFNUWVBFCi17Ci0gIFFPTVhfRE9XTkxPQURQUk9HUkVTU1VOSVRTVFlQRV9USU1FLAotICBRT01YX0RPV05MT0FEUFJPR1JFU1NVTklUU1RZUEVfREFUQQotfSBRT01YX0RPV05MT0FEUFJPR1JFU1NVTklUU1RZUEU7Ci0KLQotLyoqCi0gKiBEb3dubG9hZFByb2dyZXNzIHVuaXRzCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKGluY2x1ZGluZyBzaXplIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEV2ZW50VGV4dCBwYXJhbWV0ZXIpCi0gKiAgblZlcnNpb24gICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVVbml0c1R5cGUgICAgICAgIDogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHVuaXRzIHR5cGUgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGRvd25sb2FkIHByZ29yZXNzIHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9DT05GSUdfU1RSRUFNSU5HX0RPV05MT0FEUFJPR1JFU1NVTklUUwotewotICBPTVhfVTMyIG5TaXplOwotICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgUU9NWF9ET1dOTE9BRFBST0dSRVNTVU5JVFNUWVBFIGVVbml0c1R5cGU7Ci19IFFPTVhfQ09ORklHX1NUUkVBTUlOR19ET1dOTE9BRFBST0dSRVNTVU5JVFM7Ci0KLQotLyoqCi0gKiBEb3dubG9hZCBQcm9ncmVzcwotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzIChpbmNsdWRpbmcgc2l6ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xFdmVudFRleHQgcGFyYW1ldGVyKQotICogIG5WZXJzaW9uICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuRGF0YURvd25sb2FkZWQgICA6IHNwZWNpZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgZG93bmxvYWRlZAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGltZSBvciBkYXRhIHNjYWxlIChiYXNlZCBvbgotICogICAgICAgICAgICAgICAgICAgICAgZVVuaXRzVHlwZSkgZnJvbSB0aGUgbWVkaWEgcG9zaXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSBuU3RhcnRPZmZzZXQgYmVsb3cuIEl0Ci0gKiAgICAgICAgICAgICAgICAgICAgICBzdGFydHMgYXQgemVybyBhbmQgcHJvZ3Jlc3NpdmVseQotICogICAgICAgICAgICAgICAgICAgICAgaW5jcmVhc2VzIGFzIG1vcmUgZGF0YSBpcyBkb3dubG9hZGVkCi0gKiAgbkN1cnJlbnRTdGFydE9mZnNldDogc3BlY2lmaWVzIGlzIHRoZSBjdXJyZW50IGRvd25sb2FkIHN0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gaW4gdGltZSBvciBkYXRhIHNjYWxlIChiYXNlZAotICogICAgICAgICAgICAgICAgICAgICAgIG9uIGVVbml0c1R5cGUpCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfQ09ORklHX1NUUkVBTUlOR19ET1dOTE9BRFBST0dSRVNTVFlQRQotewotICBPTVhfVTMyIG5TaXplOwotICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgT01YX1UzMiBuRGF0YURvd25sb2FkZWQ7Ci0gIE9NWF9VMzIgbkN1cnJlbnRTdGFydE9mZnNldDsKLX0gUU9NWF9DT05GSUdfU1RSRUFNSU5HX0RPV05MT0FEUFJPR1JFU1NUWVBFOwotCi0jaWYgZGVmaW5lZCggX19jcGx1c3BsdXMgKQotfQotI2VuZGlmIC8qIGVuZCBvZiBtYWNybyBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogUU9NWF9TVFJFQU1JTkdFWFRFTlNJT05TX0hfICovCi0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL2luYy9RT01YX1ZpZGVvRXh0ZW5zaW9ucy5oIGIvc2RtODQ1L21tLWNvcmUvaW5jL1FPTVhfVmlkZW9FeHRlbnNpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODdmYWUuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL1FPTVhfVmlkZW9FeHRlbnNpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ODIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDExLDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vcgotICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgICAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLU9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIF9fSF9RT01YX1ZJREVPRVhURU5TSU9OU19IX18KLSNkZWZpbmUgX19IX1FPTVhfVklERU9FWFRFTlNJT05TX0hfXwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0qLy8qKiBAZmlsZSBRT01YX1ZpZGVvRXh0ZW5zaW9ucy5oCi0KLUBwYXIgRklMRSBTRVJWSUNFUzoKLSAgICAgIFF1YWxjb21tIGV4dGVuc2lvbnMgQVBJIGZvciBPcGVuTWF4IElMIFZpZGVvLgotCi0gICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBRdWFsY29tbSBPcGVuTWF4IElMCi0gICAgICB2aWRlbyBleHRlbnRpb24gaW50ZXJmYWNlLCB0aHJvdWdoIHdoaWNoIHRoZSBJTCBjbGllbnQgYW5kIE9wZW5NYXgKLSAgICAgIGNvbXBvbmVudHMgY2FuIGFjY2VzcyBhZGRpdGlvbmFsIHZpZGVvIGNhcGFiaWxpdGllcy4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMgRk9SIE1PRFVMRQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2luY2x1ZGUgPE9NWF9Db3JlLmg+Ci0jaW5jbHVkZSA8T01YX1ZpZGVvLmg+Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICBERUZJTklUSU9OUyBBTkQgREVDTEFSQVRJT05TCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNpZiBkZWZpbmVkKCBfX2NwbHVzcGx1cyApCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYgLyogZW5kIG9mIG1hY3JvIF9fY3BsdXNwbHVzICovCi0KLS8qIFZpZGVvIGV4dGVuc2lvbiBzdHJpbmdzICovCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX1ZJREVPX1NZTlRBWEhEUiAgICAgICAgICAgICAgICAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uU3ludGF4SGRyIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9WSURFT19FTkNPREVSTU9ERSAgICAgICAgICAgICAgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLkVuY29kZXJNb2RlIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfVklERU9fSU5UUkFSRUZSRVNIICAgICAgICAgICAgIk9NWC5RQ09NLmluZGV4LmNvbmZpZy52aWRlby5JbnRyYVJlZnJlc2giCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX0NPTkZJR19WSURFT19JTlRSQVBFUklPRCAgICAgICAgICAgICAiT01YLlFDT00uaW5kZXguY29uZmlnLnZpZGVvLkludHJhUGVyaW9kIgotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfVklERU9fVEVNUE9SQUxTUEFUSUFMVFJBREVPRkYgIk9NWC5RQ09NLmluZGV4LmNvbmZpZy52aWRlby5UZW1wb3JhbFNwYXRpYWxUcmFkZU9mZiIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfQ09ORklHX1ZJREVPX01CQ09OQ0VBTE1FTlRSRVBPUlRJTkcgICJPTVguUUNPTS5pbmRleC5jb25maWcudmlkZW8uTUJDb25jZWFsbWVudFJlcG9ydGluZyIKLSNkZWZpbmUgT01YX1FDT01fSU5ERVhfUEFSQU1fVklERU9fRVhUUkFEQVRBTVVMVElTTElDRUlORk8gICJPTVguUUNPTS5pbmRleC5wYXJhbS52aWRlby5FeHRyYURhdGFNdWx0aVNsaWNlSW5mbyIgLyoqPCByZWZlcmVuY2U6IFFPTVhfRU5BQkxFVFlQRSAqLwotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9DT05GSUdfVklERU9fRkxPV1NUQVRVUyAgICAgICAgICAgICAgIk9NWC5RQ09NLmluZGV4LmNvbmZpZy52aWRlby5GbG93U3RhdHVzIiAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogUU9NWF9GTE9XU1RBVFVTVFlQRSAqLwotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9WSURFT19QSUNUVVJFVFlQRURFQ09ERSAgICAgICAgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLlBpY3R1cmVUeXBlRGVjb2RlIiAgICAgICAvKio8IHJlZmVyZW5jZTogUU9NWF9WSURFT19ERUNPREVQSUNUVVJFVFlQRSAqLwotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9WSURFT19TQU1QTEVBU1BFQ1RSQVRJTyAgICAgICAgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLlNhbXBsZUFzcGVjdFJhdGlvIiAgICAgICAvKio8IHJlZmVyZW5jZTogUU9NWF9WSURFT19TQU1QTEVBU1BFQ1RSQVRJTyAqLwotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9WSURFT19FWFRSQURBVEFMVFJJTkZPICAgICAgICAgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLkV4dHJhRGF0YUxUUkluZm8iICAgICAgICAvKio8IHJlZmVyZW5jZTogUU9NWF9FTkFCTEVUWVBFICovCi0KLS8qIFZpZGVvIGNvZGluZyB0eXBlcyAqLwotI2RlZmluZSBPTVhfUUNPTV9JTkRFWF9QQVJBTV9WSURFT19ESVZYICAgICAgICAgICAgICAgICAgICAgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLkRpdlgiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX1ZJREVPX1ZQICAgICAgICAgICAgICAgICAgICAgICAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uVlAiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX1ZJREVPX1NQQVJLICAgICAgICAgICAgICAgICAgICAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uU3BhcmsiCi0jZGVmaW5lIE9NWF9RQ09NX0lOREVYX1BBUkFNX1ZJREVPX1ZDMSAgICAgICAgICAgICAgICAgICAgICAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uVkMxIgotCi0vKioKLSAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBleHRlbmRlZCB2aWRlbyBjb21wcmVzc2lvbgotICogY29kaW5ncywgbm90IHByZXNlbnQgaW4gdGhlIE9wZW5NYXggSUwgMS4xLjIgc3BlY2lmaWNhdGlvbi4KLSAqIE5PVEU6ICBUaGlzIGVzc2VudGlhbGx5IHJlZmVycyB0byBmaWxlIGV4dGVuc2lvbnMuIElmIHRoZQotICogICAgICAgIGNvZGluZyBpcyBiZWluZyB1c2VkIHRvIHNwZWNpZnkgdGhlIEVOQ09ERSB0eXBlLCB0aGVuCi0gKiAgICAgICAgYWRkaXRpb25hbCB3b3JrIG11c3QgYmUgZG9uZSB0byBjb25maWd1cmUgdGhlIGV4YWN0Ci0gKiAgICAgICAgZmxhdm9yIG9mIHRoZSBjb21wcmVzc2lvbiB0byBiZSB1c2VkLgotICovCi10eXBlZGVmIGVudW0gUU9NWF9WSURFT19DT0RJTkdUWVBFCi17Ci0gICAgUU9NWF9WSURFT19Db2RpbmdEaXZYICAgPSAweDdGMDAwMDAxLCAvKio8IGFsbCB2ZXJzaW9ucyBvZiBEaXZYICovCi0gICAgUU9NWF9WSURFT19Db2RpbmdWUCAgICAgPSAweDdGMDAwMDAyLCAvKio8IGFsbCB2ZXJzaW9ucyBvZiBPbjIgVlAgY29kZWMgKi8KLSAgICBRT01YX1ZJREVPX0NvZGluZ1NwYXJrICA9IDB4N0YwMDAwMDMsIC8qKjwgU29yZW5zb24gU3BhcmsgKi8KLSAgICBRT01YX1ZJREVPX0NvZGluZ1ZDMSAgICA9IDB4N0YwMDAwMDQsIC8qKjwgVkMtMSAqLwotICAgIFFPTVhfVklERU9fTVBFRzEgICAgICAgID0gMHg3RjAwMDAwNSAgLyoqPCBNUEVHLTEgKi8KLX0gUU9NWF9WSURFT19DT0RJTkdUWVBFOwotCi0vKioKLSAqIERpdlggVmVyc2lvbnMKLSAqLwotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fRElWWEZPUk1BVFRZUEUgewotICAgIFFPTVhfVklERU9fRElWWEZvcm1hdFVudXNlZCA9IDB4MDEsIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCi0gICAgUU9NWF9WSURFT19ESVZYRm9ybWF0MzExICAgID0gMHgwMiwgLyoqPCBEaXZYIDMuMTEgKi8KLSAgICBRT01YX1ZJREVPX0RJVlhGb3JtYXQ0ICAgICAgPSAweDA0LCAvKio8IERpdlggNCAqLwotICAgIFFPTVhfVklERU9fRElWWEZvcm1hdDUgICAgICA9IDB4MDgsIC8qKjwgRGl2WCA1ICovCi0gICAgUU9NWF9WSURFT19ESVZYRm9ybWF0NiAgICAgID0gMHgxMCwgLyoqPCBEaXZYIDYgKi8KLSAgICBRT01YX1ZJREVPX0RJVlhGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsCi0gICAgUU9NWF9WSURFT19ESVZYRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLAotICAgIFFPTVhfVklERU9fRElWWEZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gUU9NWF9WSURFT19ESVZYRk9STUFUVFlQRTsKLQotLyoqCi0gKiBEaXZYIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IKLSAqIHZhcmlvdXMgcGVyZm9ybWFuY2UgYm91bmRzLgotICovCi10eXBlZGVmIGVudW0gUU9NWF9WSURFT19ESVZYUFJPRklMRVRZUEUgewotICAgIFFPTVhfVklERU9fRGl2WFByb2ZpbGVxTW9iaWxlID0gMHgwMSwgLyoqPCBxTW9iaWxlIFByb2ZpbGUgKi8KLSAgICBRT01YX1ZJREVPX0RpdlhQcm9maWxlTW9iaWxlICA9IDB4MDIsIC8qKjwgTW9iaWxlIFByb2ZpbGUgKi8KLSAgICBRT01YX1ZJREVPX0RpdlhQcm9maWxlTVQgICAgICA9IDB4MDQsIC8qKjwgTW9iaWxlIFRoZWF0cmUgUHJvZmlsZSAqLwotICAgIFFPTVhfVklERU9fRGl2WFByb2ZpbGVIVCAgICAgID0gMHgwOCwgLyoqPCBIb21lIFRoZWF0cmUgUHJvZmlsZSAqLwotICAgIFFPTVhfVklERU9fRGl2WFByb2ZpbGVIRCAgICAgID0gMHgxMCwgLyoqPCBIaWdoIERlZmluaXRpb24gUHJvZmlsZSAqLwotICAgIFFPTVhfVklERU9fRElWWFByb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsCi0gICAgUU9NWF9WSURFT19ESVZYUHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwKLSAgICBRT01YX1ZJREVPX0RJVlhQcm9maWxlTWF4ID0gMHg3RkZGRkZGRgotfSBRT01YX1ZJREVPX0RJVlhQUk9GSUxFVFlQRTsKLQotLyoqCi0gKiBEaXZYIFZpZGVvIFBhcmFtcwotICoKLSAqICBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlRm9ybWF0ICAgIDogVmVyc2lvbiBvZiBEaXZYIHN0cmVhbSAvIGRhdGEKLSAqICBlUHJvZmlsZSAgIDogUHJvZmlsZSBvZiBEaXZYIHN0cmVhbSAvIGRhdGEKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9WSURFT19QQVJBTV9ESVZYVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIFFPTVhfVklERU9fRElWWEZPUk1BVFRZUEUgZUZvcm1hdDsKLSAgICBRT01YX1ZJREVPX0RJVlhQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLX0gUU9NWF9WSURFT19QQVJBTV9ESVZYVFlQRTsKLQotLyoqCi0gKiBWUCBWZXJzaW9ucwotICovCi10eXBlZGVmIGVudW0gUU9NWF9WSURFT19WUEZPUk1BVFRZUEUgewotICAgIFFPTVhfVklERU9fVlBGb3JtYXRVbnVzZWQgPSAweDAxLCAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLwotICAgIFFPTVhfVklERU9fVlBGb3JtYXQ2ICAgICAgPSAweDAyLCAvKio8IFZQNiBWaWRlbyBGb3JtYXQgKi8KLSAgICBRT01YX1ZJREVPX1ZQRm9ybWF0NyAgICAgID0gMHgwNCwgLyoqPCBWUDcgVmlkZW8gRm9ybWF0ICovCi0gICAgUU9NWF9WSURFT19WUEZvcm1hdDggICAgICA9IDB4MDgsIC8qKjwgVlA4IFZpZGVvIEZvcm1hdCAqLwotICAgIFFPTVhfVklERU9fVlBGb3JtYXQ5ICAgICAgPSAweDEwLCAvKio8IFZQOSBWaWRlbyBGb3JtYXQgKi8KLSAgICBRT01YX1ZJREVPX1ZQRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLAotICAgIFFPTVhfVklERU9fVlBGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsCi0gICAgUU9NWF9WSURFT19WUEZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gUU9NWF9WSURFT19WUEZPUk1BVFRZUEU7Ci0KLS8qKgotICogVlAgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzCi0gKiBlbmNvZGluZyB0b29scy4KLSAqLwotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fVlBQUk9GSUxFVFlQRSB7Ci0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVTaW1wbGUgICA9IDB4MDEsIC8qKjwgU2ltcGxlIFByb2ZpbGUsIGFwcGxpZXMgdG8gVlA2IG9ubHkgKi8KLSAgICBRT01YX1ZJREVPX1ZQUHJvZmlsZUFkdmFuY2VkID0gMHgwMiwgLyoqPCBBZHZhbmNlZCBQcm9maWxlLCBhcHBsaWVzIHRvIFZQNiBvbmx5ICovCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVWZXJzaW9uMCA9IDB4MDQsIC8qKjwgVmVyc2lvbiAwLCBhcHBsaWVzIHRvIFZQNyBhbmQgVlA4ICovCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVWZXJzaW9uMSA9IDB4MDgsIC8qKjwgVmVyc2lvbiAxLCBhcHBsaWVzIHRvIFZQNyBhbmQgVlA4ICovCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVWZXJzaW9uMiA9IDB4MTAsIC8qKjwgVmVyc2lvbiAyLCBhcHBsaWVzIHRvIFZQOCBvbmx5ICovCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVWZXJzaW9uMyA9IDB4MjAsIC8qKjwgVmVyc2lvbiAzLCBhcHBsaWVzIHRvIFZQOCBvbmx5ICovCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsCi0gICAgUU9NWF9WSURFT19WUFByb2ZpbGVNYXggPSAweDdGRkZGRkZGCi19IFFPTVhfVklERU9fVlBQUk9GSUxFVFlQRTsKLQotLyoqCi0gKiBWUCBWaWRlbyBQYXJhbXMKLSAqCi0gKiAgU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUZvcm1hdCAgICA6IEZvcm1hdCBvZiBWUCBzdHJlYW0gLyBkYXRhCi0gKiAgZVByb2ZpbGUgICA6IFByb2ZpbGUgb3IgVmVyc2lvbiBvZiBWUCBzdHJlYW0gLyBkYXRhCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fUEFSQU1fVlBUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgUU9NWF9WSURFT19WUEZPUk1BVFRZUEUgZUZvcm1hdDsKLSAgICBRT01YX1ZJREVPX1ZQUFJPRklMRVRZUEUgZVByb2ZpbGU7Ci19IFFPTVhfVklERU9fUEFSQU1fVlBUWVBFOwotCi0vKioKLSAqIFNwYXJrIFZlcnNpb25zCi0gKi8KLXR5cGVkZWYgZW51bSBRT01YX1ZJREVPX1NQQVJLRk9STUFUVFlQRSB7Ci0gICAgUU9NWF9WSURFT19TcGFya0Zvcm1hdFVudXNlZCA9IDB4MDEsIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCi0gICAgUU9NWF9WSURFT19TcGFya0Zvcm1hdDAgICAgICA9IDB4MDIsIC8qKjwgVmlkZW8gRm9ybWF0IFZlcnNpb24gMCAqLwotICAgIFFPTVhfVklERU9fU3BhcmtGb3JtYXQxICAgICAgPSAweDA0LCAvKio8IFZpZGVvIEZvcm1hdCBWZXJzaW9uIDEgKi8KLSAgICBRT01YX1ZJREVPX1NwYXJrRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLAotICAgIFFPTVhfVklERU9fU3BhcmtGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsCi0gICAgUU9NWF9WSURFT19TcGFya0Zvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gUU9NWF9WSURFT19TUEFSS0ZPUk1BVFRZUEU7Ci0KLS8qKgotICogU3BhcmsgVmlkZW8gUGFyYW1zCi0gKgotICogIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVGb3JtYXQgICAgOiBWZXJzaW9uIG9mIFNwYXJrIHN0cmVhbSAvIGRhdGEKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9WSURFT19QQVJBTV9TUEFSS1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBRT01YX1ZJREVPX1NQQVJLRk9STUFUVFlQRSBlRm9ybWF0OwotfSBRT01YX1ZJREVPX1BBUkFNX1NQQVJLVFlQRTsKLQotLyoqCi0gKiBWQy0xIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IKLSAqIHZhcmlvdXMgZW5jb2RpbmcgdG9vbHMuCi0gKi8KLXR5cGVkZWYgZW51bSBRT01YX1ZJREVPX1ZDMVBST0ZJTEVUWVBFIHsKLSAgICBRT01YX1ZJREVPX1ZDMVByb2ZpbGVTaW1wbGUgICA9IDB4MDEsIC8qKjwgU2ltcGxlIFByb2ZpbGUgKi8KLSAgICBRT01YX1ZJREVPX1ZDMVByb2ZpbGVNYWluICAgICA9IDB4MDIsIC8qKjwgTWFpbiBQcm9maWxlICovCi0gICAgUU9NWF9WSURFT19WQzFQcm9maWxlQWR2YW5jZWQgPSAweDA0LCAvKio8IEFkdmFuY2VkIFByb2ZpbGUgKi8KLSAgICBRT01YX1ZJREVPX1ZDMVByb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsCi0gICAgUU9NWF9WSURFT19WQzFQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLAotICAgIFFPTVhfVklERU9fVkMxUHJvZmlsZU1heCA9IDB4N0ZGRkZGRkYKLX0gUU9NWF9WSURFT19WQzFQUk9GSUxFVFlQRTsKLQotLyoqCi0gKiBWQy0xIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzCi0gKiBwZXJmb3JtYW5jZSBib3VuZHMuCi0gKi8KLXR5cGVkZWYgZW51bSBRT01YX1ZJREVPX1ZDMUxFVkVMVFlQRSB7Ci0gICAgUU9NWF9WSURFT19WQzFMZXZlbExvdyAgICA9IDB4MDEsIC8qKjwgTG93IExldmVsLCBhcHBsaWVzIHRvIHNpbXBsZSBhbmQgbWFpbiBwcm9maWxlcyovCi0gICAgUU9NWF9WSURFT19WQzFMZXZlbE1lZGl1bSA9IDB4MDIsIC8qKjwgTWVkaXVtIExldmVsLCBhcHBsaWVzIHRvIHNpbXBsZSBhbmQgbWFpbiBwcm9maWxlcyAqLwotICAgIFFPTVhfVklERU9fVkMxTGV2ZWxIaWdoICAgPSAweDA0LCAvKio8IEhpZ2ggTGV2ZWwsIGFwcGxpZXMgdG8gbWFpbiBwcm9maWxlIG9ubHkgKi8KLSAgICBRT01YX1ZJREVPX1ZDMUxldmVsMCAgICAgID0gMHgwOCwgLyoqPCBMZXZlbCAwLCBhcHBsaWVzIHRvIGFkdmFuY2VkIHByb2ZpbGUgb25seSAqLwotICAgIFFPTVhfVklERU9fVkMxTGV2ZWwxICAgICAgPSAweDEwLCAvKio8IExldmVsIDEsIGFwcGxpZXMgdG8gYWR2YW5jZWQgcHJvZmlsZSBvbmx5ICovCi0gICAgUU9NWF9WSURFT19WQzFMZXZlbDIgICAgICA9IDB4MjAsIC8qKjwgTGV2ZWwgMiwgYXBwbGllcyB0byBhZHZhbmNlZCBwcm9maWxlIG9ubHkgKi8KLSAgICBRT01YX1ZJREVPX1ZDMUxldmVsMyAgICAgID0gMHg0MCwgLyoqPCBMZXZlbCAzLCBhcHBsaWVzIHRvIGFkdmFuY2VkIHByb2ZpbGUgb25seSAqLwotICAgIFFPTVhfVklERU9fVkMxTGV2ZWw0ICAgICAgPSAweDgwLCAvKio8IExldmVsIDQsIGFwcGxpZXMgdG8gYWR2YW5jZWQgcHJvZmlsZSBvbmx5ICovCi0gICAgUU9NWF9WSURFT19WQzFMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwKLSAgICBRT01YX1ZJREVPX1ZDMUxldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLAotICAgIFFPTVhfVklERU9fVkMxTGV2ZWxNYXggPSAweDdGRkZGRkZGCi19IFFPTVhfVklERU9fVkMxTEVWRUxUWVBFOwotCi0vKioKLSAqIFZDLTEgVmlkZW8gUGFyYW1zCi0gKgotICogIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVQcm9maWxlICAgOiBQcm9maWxlIG9mIFZDLTEgc3RyZWFtIC8gZGF0YQotICogIGVMZXZlbCAgICAgOiBMZXZlbCBvZiBWQy0xIHN0cmVhbSAvIGRhdGEKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9WSURFT19QQVJBTV9WQzFUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgUU9NWF9WSURFT19WQzFQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLSAgICBRT01YX1ZJREVPX1ZDMUxFVkVMVFlQRSBlTGV2ZWw7Ci19IFFPTVhfVklERU9fUEFSQU1fVkMxVFlQRTsKLQotLyoqCi0gKiBFeHRlbmRlZCBNUEVHLTQgbGV2ZWwgdHlwZXMgbm90IGRlZmluZWQgaW4gdGhlIE9wZW5NYXggSUwKLSAqIDEuMS4yIHNwZWNpZmljYXRpb24sIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMKLSAqIGZyYW1lIHNpemVzLCBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuCi0gKi8KLXR5cGVkZWYgZW51bSBRT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFIHsKLSAgICBRT01YX1ZJREVPX01QRUc0TGV2ZWw2ID0gMHg3RjAwMDAwMSwgLyoqPCBMZXZlbCA2ICovCi0gICAgUU9NWF9WSURFT19NUEVHNExldmVsNyA9IDB4N0YwMDAwMDIsIC8qKjwgTGV2ZWwgNyAqLwotICAgIFFPTVhfVklERU9fTVBFRzRMZXZlbDggPSAweDdGMDAwMDAzLCAvKio8IExldmVsIDggKi8KLSAgICBRT01YX1ZJREVPX01QRUc0TGV2ZWw5ID0gMHg3RjAwMDAwNCwgLyoqPCBMZXZlbCA5ICovCi0gICAgUU9NWF9WSURFT19NUEVHNExldmVsTWF4ID0gMHg3RkZGRkZGRgotfSBRT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgaW4gcmV0cmlldmluZyB0aGUgc3ludGF4IGhlYWRlciBmcm9tIGEKLSAqIHZpZGVvIGVuY29kZXIgY29tcG9uZW50LCBvciBzZXR0aW5nIHRoZSBvdXQgb2YgYmFuZCBzeW50YXgKLSAqIGhlYWRlciBjb25maWd1cmF0aW9uIGRhdGEgb24gYSB2aWRlbyBkZWNvZGVyIGNvbXBvbmVudC4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbwotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5CeXRlcyAgICAgOiBXaGVuIHVzZWQgd2l0aCBPTVhfR2V0UGFyYW1ldGVyIGZvciB0aGUgZW5jb2RlcgotICogICAgICAgICAgICAgICBjb21wb25lbnQsIGl0IGlzIGEgcmVhZC13cml0ZSBmaWVsZC4gV2hlbgotICogICAgICAgICAgICAgICBRT01YX1ZJREVPX1NZTlRBWEhEUlRZUEUgaXMgcGFzc2VkIGluCi0gKiAgICAgICAgICAgICAgIE9NWF9HZXRQYXJhbWV0ZXIgdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCi0gKiAgICAgICAgICAgICAgIGFycmF5IHBvaW50ZWQgYnkgZGF0YSBmaWVsZC4gV2hlbiB0aGUKLSAqICAgICAgICAgICAgICAgT01YX0dldFBhcmFtZXRlciBjYWxsIHJldHVybnMgdGhpcyBpcyB0aGUKLSAqICAgICAgICAgICAgICAgYW1vdW50IG9mIGRhdGEgd2l0aGluIHRoZSBidWZmZXIgYXJyYXkuCi0gKgotICogICAgICAgICAgICAgICBUaGUgSUwgY2xpZW50IG5lZWRzIHRvIGFsbG9jYXRlIHRoZSBidWZmZXIKLSAqICAgICAgICAgICAgICAgYXJyYXkgYW5kIHRoZW4gcmVxdWVzdCBmb3IgdGhlIHN5bnRheCBoZWFkZXIuCi0gKiAgICAgICAgICAgICAgIElmIHRoZSBzaXplIG9mIGJ1ZmZlciBhcnJheSB0byBhbGxvY2F0ZSBpcwotICogICAgICAgICAgICAgICB1bmtub3duIHRvIHRoZSBJTCBjbGllbnQsIHRoZW4gaXQgY2FuIGNhbGwKLSAqICAgICAgICAgICAgICAgT01YX0dldFBhcmFtdGVyIHdpdGggbkJ5dGVzIHNldCB0byAwLiBJbiB0aGlzCi0gKiAgICAgICAgICAgICAgIGNhc2UsIHdoZW4gT01YX0dldFBhcmFtZXRlciByZXR1cm5zLCB0aGUgbkJ5dGVzCi0gKiAgICAgICAgICAgICAgIGZpZWxkIHdpbGwgYmUgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSBzeW50YXgKLSAqICAgICAgICAgICAgICAgaGVhZGVyLiBJTCBDbGllbnQgY2FuIHRoZW4gYWxsb2NhdGUgYSBidWZmZXIgb2YKLSAqICAgICAgICAgICAgICAgdGhpcyBzaXplIGFuZCBjYWxsIE9NWF9HZXRQYXJhbXRlciBhZ2Fpbi4KLSAqCi0gKiAgICAgICAgICAgICAgIFdoZW4gdXNlZCB3aXRoIE9NWF9TZXRQYXJhbWV0ZXIgZm9yIHRoZSBkZWNvZGVyCi0gKiAgICAgICAgICAgICAgIGNvbXBvbmVudCwgaXQgaXMgYSByZWFkLW9ubHkgZmllbGQgc3BlY2lmeWluZwotICogICAgICAgICAgICAgICB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciBhcnJheS4KLSAqICBkYXRhICAgICAgIDogVGhlIHN5bnRheCBoZWFkZXIgZGF0YS4gVGhlIGZvcm1hdCBvZiB0aGUKLSAqICAgICAgICAgICAgICAgc3ludGF4IGhlYWRlciBpcyBzcGVjaWZpYyB0byB0aGUgdmlkZW8gY29kZWMsCi0gKiAgICAgICAgICAgICAgIGFuZCBpcyBkZXNjcmliZWQgYmVsb3cuCi0gKgotICogICBILjI2MyAgICAgIDogTi9BCi0gKiAgIEguMjY0ICAgICAgOiBUaGUgU1BTIGFuZCBQUFMgcGFyYW1ldGVyIHNldHMKLSAqICAgTVBFRy00ICAgICA6IFRoZSBWTywgVk9TLCBhbmQgVk9MIGhlYWRlcgotICogICBXTVY3ICAgICAgIDogVGhlICJFeHRyYSBEYXRhIiBpbmZvLCBpbiB0aGUgQVNGIFN0cmVhbQotICogICAgICAgICAgICAgICAgUHJvcGVydGllcyBPYmplY3QuCi0gKiAgIFdNVjggICAgICAgOiBUaGUgIkV4dHJhIERhdGEiIGluZm8sIGluIHRoZSBBU0YgU3RyZWFtCi0gKiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIE9iamVjdC4KLSAqICAgV01WOSBTUC9NUCA6IFRoZSBTVFJVQ1RfQyBwb3J0aW9uIG9mIHRoZSBzZXF1ZW5jZSBsYXllcgotICogICAgICAgICAgICAgICAgbWV0YSBkYXRhLCBkZWZpbmVkIGluIFRhYmxlIDI2MyBvZiB0aGUgVkMtMQotICogICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi4KLSAqICAgVkMtMSBTUC9NUCA6IFRoZSBTVFJVQ1RfQyBwb3J0aW9uIG9mIHRoZSBzZXF1ZW5jZSBsYXllcgotICogICAgICAgICAgICAgICAgbWV0YSBkYXRhLCBkZWZpbmVkIGluIFRhYmxlIDI2MyBvZiB0aGUgVkMtMQotICogICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi4KLSAqICAgVkMtMSBBUCAgICA6IFRoZSBzZXF1ZW5jZSBhbmQgZW50cnkgcG9pbnQgaGVhZGVyCi0gKiAgIERpdlggMyAgICAgOiBOL0EKLSAqICAgRGl2WCA0LnggICA6IFRoZSBWTywgVk9TLCBhbmQgVk9MIGhlYWRlcgotICogICBEaXZYIDUueCAgIDogVGhlIFZPLCBWT1MsIGFuZCBWT0wgaGVhZGVyCi0gKiAgIERpdlggNi54ICAgOiBUaGUgVk8sIFZPUywgYW5kIFZPTCBoZWFkZXIKLSAqICAgVlA2ICAgICAgICA6IE4vQQotICogICBTcGFyayAgICAgIDogTi9BCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fU1lOVEFYSERSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkJ5dGVzOwotICAgIE9NWF9VOCAgZGF0YVsxXTsKLX0gUU9NWF9WSURFT19TWU5UQVhIRFJUWVBFOwotCi0KLS8qKgotICogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgdGhlIGV4dGVuZGVkIHZpZGVvIGludHJhIHJlZnJlc2ggdHlwZXMsIG5vdAotICogcHJlc2VudCBpbiB0aGUgT3Blbk1heCBJTCAxLjEuMiBzcGVjaWZpY2F0aW9uLgotICoKLSAqIEVOVU1TOgotICogIEludHJhUmVmcmVzaFJhbmRvbSAgICAgICAgIDogUmFuZG9tIGludHJhIHJlZnJlc2ggbW9kZS4KLSAqLwotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRQotewotICAgIFFPTVhfVklERU9fSW50cmFSZWZyZXNoUmFuZG9tICAgICAgPSAweDdGMTAwMDAwCi19IFFPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRTsKLQotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBpbnRyYSBwZXJpb2RpY2l0eSBmb3IgZW5jb2Rlci4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbwotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5JRFJQZXJpb2QgOiBEZWZpbmVzIHRoZSBwZXJpb2RpY2l0eSBvZiBJRFIgb2NjdXJyZW5jZS4gVGhpcyBzcGVjaWZpZXMKLSAqICAgICAgICAgICAgICAgY29kaW5nIGEgZnJhbWUgYXMgSURSIGFmdGVyIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGludHJhCi0gKiAgICAgICAgICAgICAgIGZyYW1lcy4gVGhlIHBlcmlvZGljaXR5IG9mIGludHJhIGZyYW1lIGNvZGluZyBpcyBzcGVjaWZpZWQgYnkKLSAqICAgICAgICAgICAgICAgdGhlIG5QRnJhbWVzLiAgSWYgbklEUlBlcmlvZCBpcyBzZXQgdG8gMCwgb25seSB0aGUgZmlyc3QKLSAqICAgICAgICAgICAgICAgZnJhbWUgb2YgdGhlIGVuY29kZSBzZXNzaW9uIGlzIGFuIElEUiBmcmFtZS4gVGhpcyBmaWVsZCBpcwotICogICAgICAgICAgICAgICBpZ25vcmVkIGZvciBub24tQVZDIGNvZGVjcyBhbmQgaXMgdXNlZCBvbmx5IGZvciBjb2RlY3MgdGhhdAotICogICAgICAgICAgICAgICBzdXBwb3J0IElEUiBQZXJpb2QuCi0gKiAgblBGcmFtZXMgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBQIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBGcmFtZS4KLSAqICBuQkZyYW1lcyA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIEIgZnJhbWVzIGJldHdlZW4gZWFjaCBJIEZyYW1lLgotICovCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX0lOVFJBUEVSSU9EVFlQRSAgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5JRFJQZXJpb2Q7Ci0gICAgT01YX1UzMiBuUEZyYW1lczsKLSAgICBPTVhfVTMyIG5CRnJhbWVzOwotfSBRT01YX1ZJREVPX0lOVFJBUEVSSU9EVFlQRTsKLQotCi0vKioKLSAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBleHRlbmRlZCB2aWRlbyBleHRyYSBkYXRhIHBheWxvYWQgdHlwZXMgbm90Ci0gKiBwcmVzZW50IGluIHRoZSBPcGVuTWF4IElMIDEuMS4yIHNwZWNpZmljYXRpb24uCi0gKgotICogRU5VTVM6Ci0gKiAgVmlkZW9NdWx0aVNsaWNlSW5mbyA6IE11bHRpIHNsaWNlIGxheW91dCBpbmZvcm1hdGlvbgotICoKLSAqICBTbGljZSBpbmZvcm1hdGlvbiBsYXlvdXQ6Ci0gKiAgRmlyc3QgNCBieXRlcyA9IE51bWJlciBvZiBTbGljZSBFbnRyaWVzCi0gKgotICogIFRoZW4gaW5kaXZpZHVhbCBzbGljZSBlbnRyaWVzOiA4IGJ5dGVzIHBlciBlbnRyeS4KLSAqICBTbGljZTEgaW5mb3JtYXRpb246IG9mZnNldCAoNCBieXRlcyksIExlbmd0aCAoNCBieXRlcykKLSAqICBTbGljZTIgaW5mb3JtYXRpb246IG9mZnNldCAoNCBieXRlcyksIExlbmd0aCAoNCBieXRlcykKLSAqICBTbGljZTMgaW5mb3JtYXRpb246IG9mZnNldCAoNCBieXRlcyksIExlbmd0aCAoNCBieXRlcykKLSAqICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICogIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gKiAgU2xpY2VOIGluZm9ybWF0aW9uOiBvZmZzZXQgKDQgYnl0ZXMpLCBMZW5ndGggKDQgYnl0ZXMpCi0gKgotICoKLSAqICBWaWRlb051bUNvbmNlYWxlZE1CIDogTnVtYmVyIG9mIGNvbmNlYWxlZCBNQnMKLSAqCi0gKiAgVGhlIGRhdGEgYXJyYXkgY29uc2lzdHMgb2YgYW4gdW5zaWduZWQgMzItYml0IHNpemUgZmllbGQKLSAqICBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgY29uY2VhbGVkIG1hY3JvYmxvY2tzIGluIHRoZQotICogIHVuY29tcHJlc3NlZCBmcmFtZS4KLSAqCi0gKgotICogIFFPTVhfRXh0cmFEYXRhT01YSW5kZXggOiBJbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBwYXlsb2FkIGNvbnRhaW5zIGFuCi0gKiAgT3Blbk1heCBpbmRleCBhbmQgYXNzb2NpYXRlZCBwYXlsb2FkLgotICoKLSAqICBUaGUgZGF0YSBvZiB0aGUgZXh0cmEgZGF0YSBwYXlsb2FkIHNoYWxsIGNvbnRhaW4gdGhlIHZhbHVlIG9mIHRoZQotICogIE9NWF9JTkRFWFRZUEUgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiBhcyBhbiB1bnNpZ25lZAotICogIDMyIGJpdCBudW1iZXIgb2NjdXB5aW5nIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBwYXlsb2FkLiBUaGUgaW5kZXgKLSAqICB3aWxsIGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHRoZSBhc3NvY2lhdGVkIHN0cnVjdHVyZS4gUGFkZGluZyBieXRlcwotICogIGFyZSBhcHBlbmRlZCB0byBlbnN1cmUgMzIgYml0IGFkZHJlc3MgYWxpZ25tZW50IGlmIG5lZWRlZC4KLSAqLwotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fRVhUUkFEQVRBVFlQRQotewotICAgUU9NWF9FeHRyYURhdGFWaWRlb011bHRpU2xpY2VJbmZvID0gMHg3RjEwMDAwMCwKLSAgIFFPTVhfRXh0cmFEYXRhVmlkZW9OdW1Db25jZWFsZWRNQiwKLSAgIFFPTVhfRXh0cmFEYXRhT01YSW5kZXgsCi0gICBRT01YX0V4dHJhRGF0YUhEQ1BFbmNyeXB0aW9uSW5mbwotfSBRT01YX1ZJREVPX0VYVFJBREFUQVRZUEU7Ci0KLQotLyoqCi0gKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgdmlkZW8gZW5jb2RlciBtb2RlcwotICoKLSAqIEVOVU1TOgotICogIEVuY29kZXJNb2RlRGVmYXVsdCA6IERlZmF1bHQgdmlkZW8gcmVjb3JkaW5nIG1vZGUuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgQWxsIGVuY29kZXIgc2V0dGluZ3MgbWFkZSB0aHJvdWdoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgT01YX1NldFBhcmFtZXRlci9PTVhfU2V0Q29uZmlnIGFyZSBhcHBsaWVkLiBObwotICogICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpcyBvdmVycmlkZGVuLgotICogIEVuY29kZXJNb2RlTU1TIDogVmlkZW8gcmVjb3JkaW5nIG1vZGUgZm9yIE1NUyAoTXVsdGltZWRpYSBNZXNzYWdpbmcKLSAqICAgICAgICAgICAgICAgICAgIFNlcnZpY2UpLiBUaGlzIG1vZGUgaXMgc2ltaWxhciB0byBFbmNvZGVyTW9kZURlZmF1bHQKLSAqICAgICAgICAgICAgICAgICAgIGV4Y2VwdCB0aGF0IGhlcmUgdGhlIFJhdGUgY29udHJvbCBtb2RlIGlzIG92ZXJyaWRkZW4KLSAqICAgICAgICAgICAgICAgICAgIGludGVybmFsbHkgYW5kIHNldCBhcyBhIHZhcmlhbnQgb2YgdmFyaWFibGUgYml0cmF0ZSB3aXRoCi0gKiAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBmcmFtZSByYXRlLiBBZnRlciB0aGlzIG1vZGUgaXMgc2V0IGlmIHRoZSBJTAotICogICAgICAgICAgICAgICAgICAgY2xpZW50IHRyaWVzIHRvIHNldCBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIHZpYQotICogICAgICAgICAgICAgICAgICAgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUgdGhhdCB3b3VsZCBiZSByZWplY3RlZC4gRm9yCi0gKiAgICAgICAgICAgICAgICAgICB0aGlzLCBjbGllbnQgc2hvdWxkIHNldCBtb2RlIGJhY2sgdG8gRW5jb2Rlck1vZGVEZWZhdWx0Ci0gKiAgICAgICAgICAgICAgICAgICBmaXJzdCBhbmQgdGhlbiBjaGFuZ2UgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRS4KLSAqLwotdHlwZWRlZiBlbnVtIFFPTVhfVklERU9fRU5DT0RFUk1PREVUWVBFCi17Ci0gICAgUU9NWF9WSURFT19FbmNvZGVyTW9kZURlZmF1bHQgICAgICAgID0gMHgwMSwKLSAgICBRT01YX1ZJREVPX0VuY29kZXJNb2RlTU1TICAgICAgICAgICAgPSAweDAyLAotICAgIFFPTVhfVklERU9fRW5jb2Rlck1vZGVNYXggICAgICAgICAgICA9IDB4N0ZGRkZGRkYKLX0gUU9NWF9WSURFT19FTkNPREVSTU9ERVRZUEU7Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzZXQgdGhlIHZpZGVvIGVuY29kZXIgbW9kZS4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbwotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5Nb2RlIDogZGVmaW5lcyB0aGUgdmlkZW8gZW5jb2RlciBtb2RlCi0gKi8KLXR5cGVkZWYgc3RydWN0IFFPTVhfVklERU9fUEFSQU1fRU5DT0RFUk1PREVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgUU9NWF9WSURFT19FTkNPREVSTU9ERVRZUEUgbk1vZGU7Ci19IFFPTVhfVklERU9fUEFSQU1fRU5DT0RFUk1PREVUWVBFOwotCi0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzZXQgdGhlIHRlbXBvcmFsIChwaWN0dXJlIHJhdGUpIC0gc3BhdGlhbAotICogKHBpY3R1cmUgcXVhbGl0eSkgdHJhZGUtb2ZmIGZhY3Rvci4KLSAqIFRoaXMgc2V0dGluZyBpcyBvbmx5IHZhbGlkIHdoZW4gcmF0ZSBjb250cm9sIGlzIGVuYWJsZWQgYW5kIHNldCB0byBhIG1vZGUKLSAqIHdpdGggdmFyaWFibGUgZnJhbWUgcmF0ZS4gRm9yIGFsbCBvdGhlciByYXRlIGNvbnRyb2wgbW9kZXMgdGhpcyBzZXR0aW5nIGlzCi0gKiBpZ25vcmVkLgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblRTRmFjdG9yIDogdGVtcG9yYWwtc3BhdGlhbCB0cmFkZW9mZiBmYWN0b3IgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIDAtMTAwLgotICogICAgICAgICAgICAgIEEgZmFjdG9yIG9mIDAgd29uJ3QgZW1waGFzaXplcyBwaWN0dXJlIHJhdGUgaW4gcmF0ZQotICogIGNvbnRyb2wgZGVjaXNpb25zIGF0IGFsbCBpLmUgb25seSBwaWN0dXJlIHF1YWxpdHkgaXMgZW1waGFzaXplZC4gRm9yCi0gKiAgaW5jcmVhc2luZyB2YWx1ZXMgZnJvbSAxIHRvIDk5IHRoZSBlbXBoYXNpcyBvZiBwaWN0dXJlIHJhdGUgaW4gcmF0ZQotICogIGNvbnRyb2wgZGVjaXNpb25zIGluY3JlYXNlcy4gQSBmYWN0b3Igb2YgMTAwIGVtcGhhc2l6ZXMgb25seSBwaWN0dXJlIHJhdGUKLSAqICBpbiByYXRlIGNvbnRyb2wgZGVjaXNpb25zLgotICovCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX1RFTVBPUkFMU1BBVElBTFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5UU0ZhY3RvcjsKLX0gUU9NWF9WSURFT19URU1QT1JBTFNQQVRJQUxUWVBFOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIE1CIGNvbmNlYWxtZW5ldCByZXBvcnRpbmcKLSAqIGZvciB0aGUgdW5jb21wcmVzc2VkIGZyYW1lcyBlbWl0dGVkIGZyb20gdGhlIHBvcnQuCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiRW5hYmxlTUJDb25jZWFsbWVudFJlcG9ydGluZyA6IEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIE1CIGNvbmNlYWxtZW50Ci0gKiAgICAgICAgICAgICAgIHJlcG9ydGluZyBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgotICogICAgICAgICAgICAgICBPTVhfVFJVRTogRW5hYmxlcyBNQiBjb25jZWFsbWVudCByZXBvcnRpbmcKLSAqICAgICAgICAgICAgICAgT01YX0ZBTFNFOiBEaXNhYmxlcyBNQiBjb25jZWFsbWVudCByZXBvcnRpbmcKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUU9NWF9WSURFT19NQkNPTkNFQUxNRU5UUkVQT1JUSU5HVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJFbmFibGVNQkNvbmNlYWxtZW50UmVwb3J0aW5nOwotfSBRT01YX1ZJREVPX01CQ09OQ0VBTE1FTlRSRVBPUlRJTkdUWVBFOwotCi0vKioKLSAqIFNwZWNpZmllcyB0aGUgZXh0ZW5kZWQgcGljdHVyZSB0eXBlcy4gVGhlc2UgdmFsdWVzIHNob3VsZCBiZQotICogT1InZCBhbG9uZyB3aXRoIHRoZSB0eXBlcyBkZWZpbmVkIGluIE9NWF9WSURFT19QSUNUVVJFVFlQRSB0bwotICogc2lnbmFsIGFsbCBwaWN0dXJlcyB0eXBlcyB3aGljaCBhcmUgYWxsb3dlZC4KLSAqCi0gKiBFTlVNUzoKLSAqICBILjI2NCBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgIElEUgotICovCi10eXBlZGVmIGVudW0gUU9NWF9WSURFT19QSUNUVVJFVFlQRSB7Ci0gICAgUU9NWF9WSURFT19QaWN0dXJlVHlwZUlEUiA9IE9NWF9WSURFT19QaWN0dXJlVHlwZVZlbmRvclN0YXJ0VW51c2VkICsgMHgxMDAwCi19IFFPTVhfVklERU9fUElDVFVSRVRZUEU7Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIHByb2Nlc3Npbmcgb2YKLSAqIHNwZWNpZmljIHBpY3R1cmUgdHlwZXMuCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8KLSAqICBuUG9ydEluZGV4ICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuUGljdHVyZVR5cGVzIDogU3BlY2lmaWVzIHRoZSBwaWN0dXJlIHR5cGUocykKLSAqICAgICAgICAgICAgICAgICAgdGhhdCBzaGFsbCBiZSBwcm9jZXNzZWQuIFRoZSB2YWx1ZSBjb25zaXN0cwotICogICAgICAgICAgICAgICAgICBvZiB0aGUgZGVzaXJlZCBwaWN0dXJlIHR5cGVzLCBkZWZpbmVkIGJ5IHRoZQotICogICAgICAgICAgICAgICAgICBPTVhfVklERU9fUElDVFVSRVRZUEUgYW5kCi0gKiAgICAgICAgICAgICAgICAgIFFPTVhfVklERU9fUElDVFVSRVRZUEUgZW51bWVyYXRpb25zLCBPUidkIHRvCi0gKiAgICAgICAgICAgICAgICAgIHNpZ25hbCBhbGwgdGhlIHBpY3R1cmVzIHR5cGVzIHdoaWNoIGFyZQotICogICAgICAgICAgICAgICAgICBhbGxvd2VkLgotICovCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX0RFQ09ERVBJQ1RVUkVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuUGljdHVyZVR5cGVzOwotfSBRT01YX1ZJREVPX0RFQ09ERVBJQ1RVUkVUWVBFOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgc2FtcGxlIGFzcGVjdCByYXRpbyBpbmZvcm1hdGlvbi4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8KLSAqICBuUG9ydEluZGV4ICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5XaWR0aCAgICAgICA6IFNwZWNpZmllcyB0aGUgaG9yaXpvbnRhbCBhc3BlY3Qgc2l6ZSBvZgotICogICAgICAgICAgICAgICAgIHRoZSBzYW1wbGUKLSAqICBuSGVpZ2h0ICAgICAgOiBTcGVjaWZpZXMgdGhlIHZlcnRpY2FsIGFzcGVjdCBzaXplIG9mIHRoZQotICogICAgICAgICAgICAgICAgIHNhbXBsZQotICovCi10eXBlZGVmIHN0cnVjdCBRT01YX1ZJREVPX1NBTVBMRUFTUEVDVFJBVElPIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UxNiBuV2lkdGg7Ci0gICAgT01YX1UxNiBuSGVpZ2h0OwotfSBRT01YX1ZJREVPX1NBTVBMRUFTUEVDVFJBVElPOwotCi0jaWYgZGVmaW5lZCggX19jcGx1c3BsdXMgKQotfQotI2VuZGlmIC8qIGVuZCBvZiBtYWNybyBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogZW5kIG9mIG1hY3JvIF9fSF9RT01YX1ZJREVPRVhURU5TSU9OU19IX18gKi8KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL2luYy9kcm1wbGF5X3ZlcnNpb24uaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9kcm1wbGF5X3ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwYjYzMy4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9pbmMvZHJtcGxheV92ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBEUk1QTEFZX1ZFUlNJT05fSAotI2RlZmluZSBEUk1QTEFZX1ZFUlNJT05fSAotCi0jZGVmaW5lIERSTVBMQVlfQVBJX1ZFUlNJT04gIi4xMDEiCi0KLSNlbmRpZiAvKiBEUk1QTEFZX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL3FjX29teF9jb21tb24uaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9xY19vbXhfY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTkxODUuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL3FjX29teF9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vcgotICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgICAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLU9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiBNIEEgWCAgIHcgciBhIHAgcCBlIHIgcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuICBNIEEgWCAgIEMgbyByIGUKLQotKi8vKiogQGZpbGUgcWNfb214X2NvbW1vbi5oCi0gIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgT3Blbk1BWCBjb3JlLgotCi0qLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2lmbmRlZiBRQ19PTVhfQ09NTU9OX0gKLSNkZWZpbmUgUUNfT01YX0NPTU1PTl9ICi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgICAvLyBTdGFuZGFyZCBJTwotI2luY2x1ZGUgIk9NWF9Db3JlLmgiICAgICAgICAvLyBPTVggQVBJCi0jaW5jbHVkZSAiT01YX1FDT01FeHRucy5oIiAgIC8vIE9NWCBBUEkKLQotI2RlZmluZSBPTVhfQ09SRV9NQVhfQ01QICAgICAgICAgICAgICAgIDEgLy8gTUFYIENvbXBvbmVudHMgc3VwcG9ydGVkCi0jZGVmaW5lIE9NWF9DT1JFX01BWF9DTVBfUk9MRVMgICAgICAgICAgMSAvLyBNQVggUm9sZXMgcGVyIGNvbXBvbmVudAotI2RlZmluZSBPTVhfU1BFQ19WRVJTSU9OICAgICAgIDB4MDAwMDAxMDEgLy8gT01YIFZlcnNpb24KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi10eXBlZGVmIHZvaWQgKiAoKmNyZWF0ZV9xY19vbXhfY29tcG9uZW50KSh2b2lkKTsKLQotI2lmZGVmIF9BTkRST0lEXwotI2RlZmluZSBMT0dfVEFHICJRQ19DT1JFIgotI2VuZGlmCi0jaW5jbHVkZSAicWNfb214X21zZy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL3FjX29teF9jb21wb25lbnQuaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9xY19vbXhfY29tcG9uZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWViZjcuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL3FjX29teF9jb21wb25lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gTSBBIFggICB3IHIgYSBwIHAgZSByIHMKLSAgICAgICAgICAgICAgICBPIHAgZSBuICBNIEEgWCAgIEMgbyBtIHAgbyBuIGUgbiB0ICBJIG4gdCBlIHIgZiBhIGMgZQotCi0qLy8qKiBAZmlsZSBxY19vbXhfY29tcG9uZW50LmgKLSAgVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGFic3RyYWN0IGludGVyZmFjZSBmb3IgdGhlIE9wZW5NQVggY29tcG9uZW50cy4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpZm5kZWYgUUNfT01YX0NPTVBPTkVOVF9ICi0jZGVmaW5lIFFDX09NWF9DT01QT05FTlRfSAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBGaWxlcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0jaW5jbHVkZSAiT01YX0NvcmUuaCIKLSNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCi0KLWNsYXNzIHFjX29teF9jb21wb25lbnQKLXsKLQotcHVibGljOgotICAvKiBzaW5nbGUgbWVtYmVyIHRvIGhvbGQgdGhlIHZ0YWJsZSAqLwotICBPTVhfQ09NUE9ORU5UVFlQRSBtX2NtcDsKLQotcHVibGljOgotCi0gIC8vIHRoaXMgaXMgY3JpdGljYWwsIG90aGVyd2lzZSwgc3ViIGNsYXNzIGRlc3RydWN0b3Igd2lsbCBub3QgYmUgY2FsbGVkCi0gIHZpcnR1YWwgfnFjX29teF9jb21wb25lbnQoKXt9Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IGFmdGVyIGNyZWF0aW9uCi0gIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBjb21wb25lbnRfaW5pdChPTVhfSU4gT01YX1NUUklORyBjb21wb25lbnROYW1lKT0wOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgU3RhbmRhcmQgT3Blbk1BWCBNZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLy8gUXVlcnkgdGhlIGNvbXBvbmVudCBmb3IgaXRzIGluZm9ybWF0aW9uCi0gIHZpcnR1YWwKLSAgT01YX0VSUk9SVFlQRSAgZ2V0X2NvbXBvbmVudF92ZXJzaW9uKE9NWF9IQU5ETEVUWVBFICAgICAgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RSSU5HICAgICAgICAgICAgIGNtcF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZFUlNJT05UWVBFKiAgICBjbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WRVJTSU9OVFlQRSogICBzcGVjX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVVVJRFRZUEUqICAgICAgICAgIGNtcF9VVUlEKT0wOwotCi0gIC8vIEludm9rZSBhIGNvbW1hbmQgb24gdGhlIGNvbXBvbmVudAotICB2aXJ0dWFsCi0gIE9NWF9FUlJPUlRZUEUgIHNlbmRfY29tbWFuZChPTVhfSEFORExFVFlQRSBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTU1BTkRUWVBFICAgICAgIGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICBwYXJhbTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgIGNtZF9kYXRhKT0wOwotCi0gIC8vIEdldCBhIFBhcmFtZXRlciBzZXR0aW5nIGZyb20gdGhlIGNvbXBvbmVudAotICB2aXJ0dWFsCi0gIE9NWF9FUlJPUlRZUEUgIGdldF9wYXJhbWV0ZXIoT01YX0hBTkRMRVRZUEUgICAgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOREVYVFlQRSAgICAgcGFyYW1faW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgICAgIHBhcmFtX2RhdGEpPTA7Ci0KLSAgLy8gU2VuZCBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgdG8gdGhlIGNvbXBvbmVudAotICB2aXJ0dWFsCi0gIE9NWF9FUlJPUlRZUEUgIHNldF9wYXJhbWV0ZXIoT01YX0hBTkRMRVRZUEUgICAgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOREVYVFlQRSAgICAgcGFyYW1faW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgICAgIHBhcmFtX2RhdGEpPTA7Ci0KLSAgLy8gR2V0IGEgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZnJvbSB0aGUgY29tcG9uZW50Ci0gIHZpcnR1YWwKLSAgT01YX0VSUk9SVFlQRSAgZ2V0X2NvbmZpZyhPTVhfSEFORExFVFlQRSAgICAgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOREVYVFlQRSAgICAgY29uZmlnX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgICAgICBjb25maWdfZGF0YSk9MDsKLQotICAvLyBTZXQgYSBjb21wb25lbnQgY29uZmlndXJhdGlvbiB2YWx1ZQotICB2aXJ0dWFsCi0gIE9NWF9FUlJPUlRZUEUgIHNldF9jb25maWcoT01YX0hBTkRMRVRZUEUgICAgICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgICAgIGNvbmZpZ19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgY29uZmlnX2RhdGEpPTA7Ci0KLSAgLy8gVHJhbnNsYXRlIHRoZSB2ZW5kb3Igc3BlY2lmaWMgZXh0ZW5zaW9uIHN0cmluZyB0bwotICAvLyBzdGFuZGFyZGl6ZWQgaW5kZXggdHlwZQotICB2aXJ0dWFsCi0gIE9NWF9FUlJPUlRZUEUgIGdldF9leHRlbnNpb25faW5kZXgoT01YX0hBTkRMRVRZUEUgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1NUUklORyAgICAgICBwYXJhbU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOREVYVFlQRSogICBpbmRleFR5cGUpPTA7Ci0KLSAgLy8gR2V0IEN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24KLSAgdmlydHVhbAotICBPTVhfRVJST1JUWVBFICBnZXRfc3RhdGUoT01YX0hBTkRMRVRZUEUgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RBVEVUWVBFKiAgICAgICBzdGF0ZSk9MDsKLQotICAvLyBDb21wb25lbnQgVHVubmVsIFJlcXVlc3QKLSAgdmlydHVhbAotICBPTVhfRVJST1JUWVBFICBjb21wb25lbnRfdHVubmVsX3JlcXVlc3QoT01YX0hBTkRMRVRZUEUgICAgICAgICAgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFICAgICAgIHBlZXJfY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICBwZWVyX3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVFVOTkVMU0VUVVBUWVBFKiAgIHR1bm5lbF9zZXR1cCk9MDsKLQotICAvLyBVc2UgYSBidWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWQgYnkgdGhlIElMIGNsaWVudAotICAvLyBvciBhIGJ1ZmZlciBhbHJlYWR5IHN1cHBsaWVkIGJ5IGEgdHVubmVsZWQgY29tcG9uZW50Ci0gIHZpcnR1YWwKLSAgT01YX0VSUk9SVFlQRSAgdXNlX2J1ZmZlcihPTVhfSEFORExFVFlQRSAgICAgICAgICAgICAgICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogICAgICAgIGJ1ZmZlcl9oZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1U4KiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik9MDsKLQotCi0gIC8vIFJlcXVlc3QgdGhhdCB0aGUgY29tcG9uZW50IGFsbG9jYXRlIG5ldyBidWZmZXIgYW5kIGFzc29jaWF0ZWQgaGVhZGVyCi0gIHZpcnR1YWwKLSAgT01YX0VSUk9SVFlQRSAgYWxsb2NhdGVfYnVmZmVyKE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICAgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSoqICAgICAgICBidWZmZXJfaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgICAgICAgYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKT0wOwotCi0gIC8vIFJlbGVhc2UgdGhlIGJ1ZmZlciBhbmQgYXNzb2NpYXRlZCBoZWFkZXIgZnJvbSB0aGUgY29tcG9uZW50Ci0gIHZpcnR1YWwKLSAgT01YX0VSUk9SVFlQRSAgZnJlZV9idWZmZXIoT01YX0hBTkRMRVRZUEUgICAgICAgICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiAgICAgIGJ1ZmZlcik9MDsKLQotICAvLyBTZW5kIGEgZmlsbGVkIGJ1ZmZlciB0byBhbiBpbnB1dCBwb3J0IG9mIGEgY29tcG9uZW50Ci0gIHZpcnR1YWwKLSAgT01YX0VSUk9SVFlQRSAgZW1wdHlfdGhpc19idWZmZXIoT01YX0hBTkRMRVRZUEUgICAgICAgICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogICAgICBidWZmZXIpPTA7Ci0KLSAgLy8gU2VuZCBhbiBlbXB0eSBidWZmZXIgdG8gYW4gb3V0cHV0IHBvcnQgb2YgYSBjb21wb25lbnQKLSAgdmlydHVhbAotICBPTVhfRVJST1JUWVBFICBmaWxsX3RoaXNfYnVmZmVyKE9NWF9IQU5ETEVUWVBFICAgICAgICAgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogICAgICBidWZmZXIpPTA7Ci0KLSAgLy8gU2V0IGNhbGxiYWNrcwotICB2aXJ0dWFsCi0gIE9NWF9FUlJPUlRZUEUgIHNldF9jYWxsYmFja3MoIE9NWF9IQU5ETEVUWVBFICAgICAgICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ0FMTEJBQ0tUWVBFKiAgICAgIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgICAgICAgICAgYXBwX2RhdGEpPTA7Ci0KLSAgLy8gQ29tcG9uZW50IERlLUluaXRpYWxpemUKLSAgdmlydHVhbAotICBPTVhfRVJST1JUWVBFICBjb21wb25lbnRfZGVpbml0KCBPTVhfSEFORExFVFlQRSBjbXBfaGFuZGxlKT0wOwotCi0gIC8vIFVzZSB0aGUgSW1hZ2UgYWxyZWFkeSBhbGxvY2F0ZWQgdmlhIEVHTAotICB2aXJ0dWFsCi0gIE9NWF9FUlJPUlRZUEUgIHVzZV9FR0xfaW1hZ2UoT01YX0hBTkRMRVRZUEUgICAgICAgICAgICAgICAgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSoqICAgICAgICBidWZmZXJfaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgICAgICAgICAgICAgICAgICBhcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgZWdsX2ltYWdlKT0wOwotCi0gIC8vIENvbXBvbmVudCBSb2xlIGVudW0KLSAgdmlydHVhbAotICBPTVhfRVJST1JUWVBFICBjb21wb25lbnRfcm9sZV9lbnVtKCBPTVhfSEFORExFVFlQRSBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTgqICAgICAgICAgICAgICByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgIGluZGV4KT0wOwotCi19OwotI2VuZGlmIC8qIFFDX09NWF9DT01QT05FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvaW5jL3FjX29teF9tc2cuaCBiL3NkbTg0NS9tbS1jb3JlL2luYy9xY19vbXhfbXNnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjBhYjcuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvaW5jL3FjX29teF9tc2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vcgotICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgICAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLU9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gTSBBIFggICB3IHIgYSBwIHAgZSByIHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiAgTSBBIFggICBDIG8gciBlCi0KLSovLyoqIEBmaWxlIHFjX29teF9tc2cuaAotICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIE9wZW5NQVggY29yZS4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpZm5kZWYgX1FDX09NWF9NU0dfSF8KLSNkZWZpbmUgX1FDX09NWF9NU0dfSF8KLQotI2lmZGVmIF9FTkFCTEVfUUNfTVNHX0xPR18KLSAgICAjaWZkZWYgX0FORFJPSURfCi0gICAgICAgICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotICAgICAgICAjaWZkZWYgX19jcGx1c3BsdXMKLSAgICAgICAgZXh0ZXJuICJDIiB7Ci0gICAgICAgICNlbmRpZgotCi0gICAgICAgICNpZm5kZWYgTE9HRQotICAgICAgICAjZGVmaW5lIExPR0UgQUxPR0UKLSAgICAgICAgI2VuZGlmCi0KLSAgICAgICAgI2lmbmRlZiBMT0dXCi0gICAgICAgICNkZWZpbmUgTE9HVyBBTE9HVwotICAgICAgICAjZW5kaWYKLQotICAgICAgICAjaWZuZGVmIExPR0QKLSAgICAgICAgI2RlZmluZSBMT0dEIEFMT0dECi0gICAgICAgICNlbmRpZgotCi0gICAgICAgICNpZm5kZWYgTE9HVgotICAgICAgICAjZGVmaW5lIExPR1YgQUxPR1YKLSAgICAgICAgI2VuZGlmCi0KLSAgICAgICAgI2lmbmRlZiBMT0dJCi0gICAgICAgICNkZWZpbmUgTE9HSSBBTE9HSQotICAgICAgICAjZW5kaWYKLQotICAgICAgICAjaWZkZWYgX19jcGx1c3BsdXMKLSAgICAgICAgfQotICAgICAgICAjZW5kaWYKLQotICAgICAgICAjZGVmaW5lIERFQlVHX1BSSU5UX0VSUk9SIExPR0UKLSAgICAgICAgI2RlZmluZSBERUJVR19QUklOVCAgICAgICBMT0dJCi0gICAgICAgICNkZWZpbmUgREVCVUdfREVUQUlMICAgICAgTE9HVgotICAgICNlbHNlCi0gICAgICAgICNkZWZpbmUgREVCVUdfUFJJTlRfRVJST1IgcHJpbnRmCi0gICAgICAgICNkZWZpbmUgREVCVUdfUFJJTlQgICAgICAgcHJpbnRmCi0gICAgICAgICNkZWZpbmUgREVCVUdfREVUQUlMICAgICAgcHJpbnRmCi0gICAgI2VuZGlmIC8vIF9BTkRST0lEXwotI2Vsc2UKLSAgICAjZGVmaW5lIERFQlVHX1BSSU5UX0VSUk9SCi0gICAgI2RlZmluZSBERUJVR19QUklOVAotICAgICNkZWZpbmUgREVCVUdfREVUQUlMCi0jZW5kaWYgLy8gX0VOQUJMRV9RQ19NU0dfTE9HXwotCi0jZW5kaWYgLy8gX1FDX09NWF9NU0dfSF8KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL21tLWNvcmUucGMuaW4gYi9zZG04NDUvbW0tY29yZS9tbS1jb3JlLnBjLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWMyNzA2Li4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL21tLWNvcmUucGMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wcmVmaXg9QHByZWZpeEAKLWV4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKLWxpYmRpcj1AbGliZGlyQAotaW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKLQotTmFtZTogbW0tY29yZQotRGVzY3JpcHRpb246IG1tLWNvcmUgbGlicmFyeQotVmVyc2lvbjogQFZFUlNJT05ACi1MaWJzOiAtTCR7bGliZGlyfSAtbE9teENvcmUgLWxtbS1vbXhjb3JlCi1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS9tbS1jb3JlL29teGNvcmUKZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL3NyYy84OTM3L3JlZ2lzdHJ5X3RhYmxlLmMgYi9zZG04NDUvbW0tY29yZS9zcmMvODkzNy9yZWdpc3RyeV90YWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkM2FlZTk5Li4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL3NyYy84OTM3L3JlZ2lzdHJ5X3RhYmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDE0LTE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLU9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLUlGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuIE0gQSBYICAgdyByIGEgcCBwIGUgciBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gIE0gQSBYICAgQyBvIHIgZQotCi0gVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIHJlZ2lzdHJ5IHRhYmxlIGZvciB0aGUgUVRJJ3MgT3Blbk1BWCBjb3JlLgotCi0qLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2luY2x1ZGUgInFjX29teF9jb3JlLmgiCi0KLW9teF9jb3JlX2NiX3R5cGUgY29yZVtdID0KLXsKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2YyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMuZHNtb2RlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmlkZW9EU01vZGUuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMuc2VjdXJlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5maWxlLm11eGVyIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLQotICAgICJsaWJPbXhNdXguc28iLAotICAgIHsKLSAgICAgICJjb250YWluZXJfbXV4ZXIubXAyIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmhldmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmhldmMuc2VjdXJlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDgiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cDgiCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjLnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5hdmMiCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIubXBlZzRzdyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIuaDI2M3N3IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaDI2MyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52aWRlby5kZWNvZGVyLmRpdnhzdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52aWRlby5kZWNvZGVyLmRpdng0c3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmRpdngiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzRzdyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZlbmNNcGVnNC5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaDI2M3N3IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmVuY01wZWc0LnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oMjYzIgotICAgIH0KLSAgfSwKLSAgICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuZzcxMW1sYXciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhHNzExRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5nNzExIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmc3MTFhbGF3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RzcxMUVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuZzcxMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hbXJ3YiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYW1yd2IiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuZzcxMW1sYXciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhHNzExRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5nNzExIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmc3MTFhbGF3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RzcxMURlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZzcxMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hbXJ3YiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckRlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci5hbXJ3YiIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hbXJuYiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckRlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYW1ybmIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuUWNlbHAxMyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhRY2VscDEzRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5RY2VscDEzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmV2cmMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RXZyY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZXZyYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci53bWEiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYTEwUHJvIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFsYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbGFjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hbGFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLmF1ZGlvLmRlY29kZXIuYWxhYy5zdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFsYWNEZWNTdy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWxhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hcGUiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBcGVEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFwZSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS5hdWRpby5kZWNvZGVyLmFwZS5zdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFwZURlY1N3LnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hcGUiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuYWFjIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWFjRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5hYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIucWNlbHAxMyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFFjZWxwMTNFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLnFjZWxwMTMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuZXZyYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEV2cmNFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmV2cmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuYW1ybmIiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbXJFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmFtcm5iIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLm11bHRpYWFjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWFjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiCi0gICAgfQotICB9Ci19OwotCi1jb25zdCB1bnNpZ25lZCBpbnQgU0laRV9PRl9DT1JFID0gc2l6ZW9mKGNvcmUpIC8gc2l6ZW9mKG9teF9jb3JlX2NiX3R5cGUpOwotCi0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL3NyYy84OTM3L3JlZ2lzdHJ5X3RhYmxlX2FuZHJvaWQuYyBiL3NkbTg0NS9tbS1jb3JlL3NyYy84OTM3L3JlZ2lzdHJ5X3RhYmxlX2FuZHJvaWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjgzNWFmNS4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9zcmMvODkzNy9yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDE0LTE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLU9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLUlGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuIE0gQSBYICAgdyByIGEgcCBwIGUgciBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gIE0gQSBYICAgQyBvIHIgZQotCi0gIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSByZWdpc3RyeSB0YWJsZSBmb3IgdGhlIFFUSSdzIE9wZW5NQVggY29yZS4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotI2luY2x1ZGUgInFjX29teF9jb3JlLmgiCi0KLW9teF9jb3JlX2NiX3R5cGUgY29yZVtdID0KLXsKLSAgIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2Yy5kc21vZGUiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWaWRlb0RTTW9kZS5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2Yy5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmhldmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmhldmMuc2VjdXJlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDgiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnA4IgotICAgIH0KLSAgfSwKLSAgIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5hdmMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2Yy5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIubXBlZzRzdyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIuaDI2M3N3IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaDI2MyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52aWRlby5kZWNvZGVyLmRpdnhzdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52aWRlby5kZWNvZGVyLmRpdng0c3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmRpdngiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzRzdyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZlbmNNcGVnNC5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaDI2M3N3IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmVuY01wZWc0LnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oMjYzIgotICAgIH0KLSAgfSwKLSAgICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuZzcxMW1sYXciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhHNzExRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5nNzExIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmc3MTFhbGF3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RzcxMUVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuZzcxMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hbXJ3YiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYW1yd2IiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuZzcxMW1sYXciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhHNzExRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5nNzExIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmc3MTFhbGF3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RzcxMURlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZzcxMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hbXJ3YiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckRlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci5hbXJ3YiIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hbXJuYiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckRlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYW1ybmIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuUWNlbHAxMyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhRY2VscDEzRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5RY2VscDEzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmV2cmMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RXZyY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZXZyYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci53bWEiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYTEwUHJvIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYUxvc3NMZXNzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFtcndicGx1cyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICBOVUxMLAotICAgICBOVUxMLAotICAgICBOVUxMLAotICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QW1yd2JwbHVzRGVjLnNvIiwKLSAgICB7Ci0gICAgICJhdWRpb19kZWNvZGVyLmF3YnBsdXMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYWFjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWFjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYWxhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFsYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFsYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkuYXVkaW8uZGVjb2Rlci5hbGFjLnN3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWxhY0RlY1N3LnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hbGFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFwZSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFwZURlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYXBlIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLmF1ZGlvLmRlY29kZXIuYXBlLnN3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QXBlRGVjU3cuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFwZSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hYWMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5xY2VscDEzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214UWNlbHAxM0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIucWNlbHAxMyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5ldnJjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RXZyY0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuZXZyYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hbXJuYiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYW1ybmIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIubXVsdGlhYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52ZGVjLnZwcCIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWcHAuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwcCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uZmlsZS5tdXhlciIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhNdXguc28iLAotICAgIHsKLSAgICAgICJjb250YWluZXJfbXV4ZXIubXAyIgotICAgIH0KLSAgfSwKLX07Ci0KLWNvbnN0IHVuc2lnbmVkIGludCBTSVpFX09GX0NPUkUgPSBzaXplb2YoY29yZSkgLyBzaXplb2Yob214X2NvcmVfY2JfdHlwZSk7Ci0KLQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvc3JjLzg5NTIvcmVnaXN0cnlfdGFibGUuYyBiL3NkbTg0NS9tbS1jb3JlL3NyYy84OTUyL3JlZ2lzdHJ5X3RhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTQxMzguLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvc3JjLzg5NTIvcmVnaXN0cnlfdGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDU0NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi1XQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gTSBBIFggICB3IHIgYSBwIHAgZSByIHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiAgTSBBIFggICBDIG8gciBlCi0KLSBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgcmVnaXN0cnkgdGFibGUgZm9yIHRoZSBRVEkncyBPcGVuTUFYIGNvcmUuCi0KLSovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaW5jbHVkZSAicWNfb214X2NvcmUuaCIKLQotb214X2NvcmVfY2JfdHlwZSBjb3JlW10gPQotewotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWc0IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzQuc2VjdXJlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzIiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzIuc2VjdXJlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWcyIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZjMSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52YzEuc2VjdXJlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudmMxIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLndtdiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci53bXYuc2VjdXJlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudmMxIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5maWxlLm11eGVyIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLQotICAgICJsaWJPbXhNdXguc28iLAotICAgIHsKLSAgICAgICJjb250YWluZXJfbXV4ZXIubXAyIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmRpdng0IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5kaXZ4IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5kaXZ4MzExIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oMjYzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaDI2MyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oZXZjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDgiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cDgiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA5IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnA5IgotICAgIH0KLSAgfSwKLSAgIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5tcGVnNCIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLm1wZWc0IgotICAgIH0KLSAgfSwKLSAgIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oMjYzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuaDI2MyIsCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIudnA4IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIudnA4IiwKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52aWRlby5lbmNvZGVyLmhldmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZlbmNIZXZjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmhldmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLlFjZWxwMTMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214UWNlbHAxM0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuUWNlbHAxMyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5ldnJjIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEV2cmNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmV2cmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIud21hIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214V21hRGVjLnNvIiwKLSAgICB7Ci0gICAgICJhdWRpb19kZWNvZGVyLndtYSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci53bWExMFBybyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214V21hRGVjLnNvIiwKLSAgICB7Ci0gICAgICJhdWRpb19kZWNvZGVyLndtYSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hbXJ3YnBsdXMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtcndicGx1c0RlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci5hd2JwbHVzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFsYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbGFjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hbGFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFwZSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFwZURlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYXBlIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmFhYyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLnFjZWxwMTMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhRY2VscDEzRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5xY2VscDEzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmV2cmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhFdnJjRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5ldnJjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmFtcm5iIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QW1yRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5hbXJuYiIKLSAgICB9Ci0gIH0sCi0gewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLm11bHRpYWFjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWFjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZkZWMudnBwIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZwcC5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnBwIgotICAgIH0KLSAgfQotfTsKLQotY29uc3QgdW5zaWduZWQgaW50IFNJWkVfT0ZfQ09SRSA9IHNpemVvZihjb3JlKSAvIHNpemVvZihvbXhfY29yZV9jYl90eXBlKTsKLQotCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9zcmMvODk1Mi9yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMgYi9zZG04NDUvbW0tY29yZS9zcmMvODk1Mi9yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmODgyZTUuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvc3JjLzg5NTIvcmVnaXN0cnlfdGFibGVfYW5kcm9pZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLVdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi1BUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi1CRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi1CVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi1PUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi1JRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiBNIEEgWCAgIHcgciBhIHAgcCBlIHIgcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuICBNIEEgWCAgIEMgbyByIGUKLQotICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgcmVnaXN0cnkgdGFibGUgZm9yIHRoZSBRVEkncyBPcGVuTUFYIGNvcmUuCi0KLSovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0KLSNpbmNsdWRlICJxY19vbXhfY29yZS5oIgotCi1vbXhfY29yZV9jYl90eXBlIGNvcmVbXSA9Ci17Ci0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2Yy5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmRpdng0IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5kaXZ4IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5kaXZ4MzExIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNCIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5tcGVnNCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNC5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzIiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzIuc2VjdXJlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWcyIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZjMSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudmMxLnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIud212IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci53bXYuc2VjdXJlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oMjYzIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmgyNjMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaGV2YyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmhldmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaGV2Yy5zZWN1cmUiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOCIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cDgiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA5IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnA5IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLm1wZWc0IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLm1wZWc0IgotICAgIH0KLSAgfSwKLSAgIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oMjYzIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmgyNjMiCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5hdmMiCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2Yy5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLXsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci52cDgiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIudnA4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZpZGVvLmVuY29kZXIuaGV2YyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmVuY0hldmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmhldmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaGV2YyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmhldmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuUWNlbHAxMyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhRY2VscDEzRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5RY2VscDEzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmV2cmMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RXZyY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZXZyYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci53bWEiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFtcndicGx1cyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QW1yd2JwbHVzRGVjLnNvIiwKLSAgICB7Ci0gICAgICJhdWRpb19kZWNvZGVyLmF3YnBsdXMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIud21hMTBQcm8iLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIud21hTG9zc0xlc3MiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYWFjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWFjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYWxhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFsYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFsYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYXBlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QXBlRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hcGUiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuYWFjIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWFjRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5hYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIucWNlbHAxMyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFFjZWxwMTNFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLnFjZWxwMTMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuZXZyYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEV2cmNFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmV2cmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuYW1ybmIiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbXJFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmFtcm5iIgotICAgIH0KLSAgfSwKLSB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYWFjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWFjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiCi0gICAgfQotICB9LAotIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5tdWx0aWFhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJBSVYucGxheSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYkFpdlBsYXkuc28iLAotICAgIHsKLSAgICAgICJBSVYucGxheS4xMDEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmZpbGUubXV4ZXIiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214TXV4LnNvIiwKLSAgICB7Ci0gICAgICAiY29udGFpbmVyX211eGVyLm1wMiIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmRlYy52cHAiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VnBwLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cHAiCi0gICAgfQotICB9Ci19OwotCi1jb25zdCB1bnNpZ25lZCBpbnQgU0laRV9PRl9DT1JFID0gc2l6ZW9mKGNvcmUpIC8gc2l6ZW9mKG9teF9jb3JlX2NiX3R5cGUpOwotCi0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL3NyYy9jb21tb24vb214X2NvcmVfY21wLmNwcCBiL3NkbTg0NS9tbS1jb3JlL3NyYy9jb21tb24vb214X2NvcmVfY21wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzAwYWJlNC4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9zcmMvY29tbW9uL29teF9jb3JlX2NtcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yCi0gICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTi1JTkZSSU5HRU1FTlQgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuIE0gQSBYICAgdyByIGEgcCBwIGUgciBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gIE0gQSBYICAgQyBvIHIgZQotCi0gVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBPcGVuTUFYIGNvcmUgTWFjcm9zIHdoaWNoCi0gb3BlcmF0ZSBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50LgotCi0qLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBGaWxlcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0jaW5jbHVkZSAicWNfb214X2NvbW1vbi5oIgotI2luY2x1ZGUgIm9teF9jb3JlX2NtcC5oIgotI2luY2x1ZGUgInFjX29teF9jb21wb25lbnQuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi12b2lkICogcWNfb214X2NyZWF0ZV9jb21wb25lbnRfd3JhcHBlcihPTVhfUFRSIG9ial9wdHIpCi17Ci0gICAgcWNfb214X2NvbXBvbmVudCAqcFRoaXMgICAgICAgID0gKHFjX29teF9jb21wb25lbnQgKilvYmpfcHRyOwotICAgIE9NWF9DT01QT05FTlRUWVBFKiBjb21wb25lbnQgICA9ICYocFRoaXMtPm1fY21wKTsKLSAgICBtZW1zZXQoJnBUaGlzLT5tX2NtcCwwLHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOwotCi0gICAgY29tcG9uZW50LT5uU2l6ZSAgICAgICAgICAgICAgID0gc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKTsKLSAgICBjb21wb25lbnQtPm5WZXJzaW9uLm5WZXJzaW9uICAgPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgIGNvbXBvbmVudC0+cEFwcGxpY2F0aW9uUHJpdmF0ZSA9IDA7Ci0gICAgY29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSAgID0gb2JqX3B0cjsKLQotICAgIGNvbXBvbmVudC0+QWxsb2NhdGVCdWZmZXIgICAgICA9ICZxY19vbXhfY29tcG9uZW50X2FsbG9jYXRlX2J1ZmZlcjsKLSAgICBjb21wb25lbnQtPkZyZWVCdWZmZXIgICAgICAgICAgPSAmcWNfb214X2NvbXBvbmVudF9mcmVlX2J1ZmZlcjsKLSAgICBjb21wb25lbnQtPkdldFBhcmFtZXRlciAgICAgICAgPSAmcWNfb214X2NvbXBvbmVudF9nZXRfcGFyYW1ldGVyOwotICAgIGNvbXBvbmVudC0+U2V0UGFyYW1ldGVyICAgICAgICA9ICZxY19vbXhfY29tcG9uZW50X3NldF9wYXJhbWV0ZXI7Ci0gICAgY29tcG9uZW50LT5TZW5kQ29tbWFuZCAgICAgICAgID0gJnFjX29teF9jb21wb25lbnRfc2VuZF9jb21tYW5kOwotICAgIGNvbXBvbmVudC0+RmlsbFRoaXNCdWZmZXIgICAgICA9ICZxY19vbXhfY29tcG9uZW50X2ZpbGxfdGhpc19idWZmZXI7Ci0gICAgY29tcG9uZW50LT5FbXB0eVRoaXNCdWZmZXIgICAgID0gJnFjX29teF9jb21wb25lbnRfZW1wdHlfdGhpc19idWZmZXI7Ci0gICAgY29tcG9uZW50LT5HZXRTdGF0ZSAgICAgICAgICAgID0gJnFjX29teF9jb21wb25lbnRfZ2V0X3N0YXRlOwotICAgIGNvbXBvbmVudC0+R2V0Q29tcG9uZW50VmVyc2lvbiA9ICZxY19vbXhfY29tcG9uZW50X2dldF92ZXJzaW9uOwotICAgIGNvbXBvbmVudC0+R2V0Q29uZmlnICAgICAgICAgICA9ICZxY19vbXhfY29tcG9uZW50X2dldF9jb25maWc7Ci0gICAgY29tcG9uZW50LT5TZXRDb25maWcgICAgICAgICAgID0gJnFjX29teF9jb21wb25lbnRfc2V0X2NvbmZpZzsKLSAgICBjb21wb25lbnQtPkdldEV4dGVuc2lvbkluZGV4ICAgPSAmcWNfb214X2NvbXBvbmVudF9nZXRfZXh0ZW5zaW9uX2luZGV4OwotICAgIGNvbXBvbmVudC0+Q29tcG9uZW50VHVubmVsUmVxdWVzdCA9ICZxY19vbXhfY29tcG9uZW50X3R1bm5lbF9yZXF1ZXN0OwotICAgIGNvbXBvbmVudC0+VXNlQnVmZmVyICAgICAgICAgICA9ICZxY19vbXhfY29tcG9uZW50X3VzZV9idWZmZXI7Ci0gICAgY29tcG9uZW50LT5TZXRDYWxsYmFja3MgICAgICAgID0gJnFjX29teF9jb21wb25lbnRfc2V0X2NhbGxiYWNrczsKLSAgICBjb21wb25lbnQtPlVzZUVHTEltYWdlICAgICAgICAgPSAmcWNfb214X2NvbXBvbmVudF91c2VfRUdMX2ltYWdlOwotICAgIGNvbXBvbmVudC0+Q29tcG9uZW50Um9sZUVudW0gICA9ICZxY19vbXhfY29tcG9uZW50X3JvbGVfZW51bTsKLSAgICBjb21wb25lbnQtPkNvbXBvbmVudERlSW5pdCAgICAgPSAmcWNfb214X2NvbXBvbmVudF9kZWluaXQ7Ci0gICAgcmV0dXJuICh2b2lkICopY29tcG9uZW50OwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgQ09NUE9ORU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1PTVhfRVJST1JUWVBFCi1xY19vbXhfY29tcG9uZW50X2luaXQoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wLCBPTVhfSU4gT01YX1NUUklORyBjb21wb25lbnROYW1lKQotewotICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gIHFjX29teF9jb21wb25lbnQgKnBUaGlzID0gKGhDb21wKT8gKHFjX29teF9jb21wb25lbnQgKikoKChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wKS0+cENvbXBvbmVudFByaXZhdGUpOk5VTEw7Ci0gIERFQlVHX1BSSU5UKCJPTVhDT1JFOiBxY19vbXhfY29tcG9uZW50X2luaXQgJXBcbiIsIGhDb21wKTsKLQotICBpZihwVGhpcykKLSAgewotICAgIC8vIGNhbGwgdGhlIGluaXQgZnVjdGlvbgotICAgIGVSZXQgPSBwVGhpcy0+Y29tcG9uZW50X2luaXQoY29tcG9uZW50TmFtZSk7Ci0KLSAgICBpZihlUmV0ICE9IE9NWF9FcnJvck5vbmUpCi0gICAgewotICAgICAgLy8gIGluIGNhc2Ugb2YgZXJyb3IsIHBsZWFzZSBkZXN0cnVjdCB0aGUgY29tcG9uZW50IGNyZWF0ZWQKLSAgICAgICBkZWxldGUgcFRoaXM7Ci0gICAgfQotICB9Ci0gIHJldHVybiBlUmV0OwotfQotCi0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfZ2V0X3ZlcnNpb24oT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9PVVQgT01YX1NUUklORyAgICAgICAgICBjb21wb25lbnROYW1lLAotICAgICAgICAgICAgICAgICAgICBPTVhfT1VUIE9NWF9WRVJTSU9OVFlQRSogY29tcG9uZW50VmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqICAgICAgc3BlY1ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIE9NWF9PVVQgT01YX1VVSURUWVBFKiAgICAgICBjb21wb25lbnRVVUlEKQotewotICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gIHFjX29teF9jb21wb25lbnQgKnBUaGlzID0gKGhDb21wKT8gKHFjX29teF9jb21wb25lbnQgKikoKChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wKS0+cENvbXBvbmVudFByaXZhdGUpOk5VTEw7Ci0gIERFQlVHX1BSSU5UKCJPTVhDT1JFOiBxY19vbXhfY29tcG9uZW50X2dldF92ZXJzaW9uICVwLCAlcyAsICVwXG4iLCBoQ29tcCwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50VmVyc2lvbik7Ci0gIGlmKHBUaGlzKQotICB7Ci0gICAgZVJldCA9IHBUaGlzLT5nZXRfY29tcG9uZW50X3ZlcnNpb24oaENvbXAsY29tcG9uZW50TmFtZSxjb21wb25lbnRWZXJzaW9uLHNwZWNWZXJzaW9uLGNvbXBvbmVudFVVSUQpOwotICB9Ci0gIHJldHVybiBlUmV0OwotfQotCi1PTVhfRVJST1JUWVBFCi1xY19vbXhfY29tcG9uZW50X3NlbmRfY29tbWFuZChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICBPTVhfSU4gT01YX0NPTU1BTkRUWVBFICBjbWQsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICBwYXJhbTEsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgIGNtZERhdGEpCi17Ci0gIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgcWNfb214X2NvbXBvbmVudCAqcFRoaXMgPSAoaENvbXApPyAocWNfb214X2NvbXBvbmVudCAqKSgoKE9NWF9DT01QT05FTlRUWVBFICopaENvbXApLT5wQ29tcG9uZW50UHJpdmF0ZSk6TlVMTDsKLSAgREVCVUdfUFJJTlQoIk9NWENPUkU6IHFjX29teF9jb21wb25lbnRfc2VuZF9jb21tYW5kICVwLCAlZCAsICVkXG4iLCBoQ29tcCwodW5zaWduZWQpY21kLCh1bnNpZ25lZClwYXJhbTEpOwotCi0gIGlmKHBUaGlzKQotICB7Ci0gICAgZVJldCA9IHBUaGlzLT5zZW5kX2NvbW1hbmQoaENvbXAsY21kLHBhcmFtMSxjbWREYXRhKTsKLSAgfQotICByZXR1cm4gZVJldDsKLX0KLQotT01YX0VSUk9SVFlQRQotcWNfb214X2NvbXBvbmVudF9nZXRfcGFyYW1ldGVyKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgaENvbXAsCi0gICAgICAgICAgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgcGFyYW1JbmRleCwKLSAgICAgICAgICAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgcGFyYW1EYXRhKQotewotICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gIHFjX29teF9jb21wb25lbnQgKnBUaGlzID0gKGhDb21wKT8gKHFjX29teF9jb21wb25lbnQgKikoKChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wKS0+cENvbXBvbmVudFByaXZhdGUpOk5VTEw7Ci0gIERFQlVHX1BSSU5UKCJPTVhDT1JFOiBxY19vbXhfY29tcG9uZW50X2dldF9wYXJhbWV0ZXIgJXAsICVwICwgJWRcbiIsIGhDb21wLCBwYXJhbURhdGEsIHBhcmFtSW5kZXgpOwotCi0gIGlmKHBUaGlzKQotICB7Ci0gICAgZVJldCA9IHBUaGlzLT5nZXRfcGFyYW1ldGVyKGhDb21wLHBhcmFtSW5kZXgscGFyYW1EYXRhKTsKLSAgfQotICByZXR1cm4gZVJldDsKLX0KLQotT01YX0VSUk9SVFlQRQotcWNfb214X2NvbXBvbmVudF9zZXRfcGFyYW1ldGVyKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgaENvbXAsCi0gICAgICAgICAgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgcGFyYW1JbmRleCwKLSAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgcGFyYW1EYXRhKQotewotICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gIHFjX29teF9jb21wb25lbnQgKnBUaGlzID0gKGhDb21wKT8gKHFjX29teF9jb21wb25lbnQgKikoKChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wKS0+cENvbXBvbmVudFByaXZhdGUpOk5VTEw7Ci0gIERFQlVHX1BSSU5UKCJPTVhDT1JFOiBxY19vbXhfY29tcG9uZW50X3NldF9wYXJhbWV0ZXIgJXAsICVwICwgJWRcbiIsIGhDb21wLCBwYXJhbURhdGEsIHBhcmFtSW5kZXgpOwotCi0gIGlmKHBUaGlzKQotICB7Ci0gICAgZVJldCA9IHBUaGlzLT5zZXRfcGFyYW1ldGVyKGhDb21wLHBhcmFtSW5kZXgscGFyYW1EYXRhKTsKLSAgfQotICByZXR1cm4gZVJldDsKLX0KLQotIE9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfZ2V0X2NvbmZpZyhPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICBoQ29tcCwKLSAgICAgICAgICBPTVhfSU4gT01YX0lOREVYVFlQRSBjb25maWdJbmRleCwKLSAgICAgICAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgY29uZmlnRGF0YSkKLXsKLSAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICBxY19vbXhfY29tcG9uZW50ICpwVGhpcyA9IChoQ29tcCk/IChxY19vbXhfY29tcG9uZW50ICopKCgoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcCktPnBDb21wb25lbnRQcml2YXRlKTpOVUxMOwotICBERUJVR19QUklOVCgiT01YQ09SRTogcWNfb214X2NvbXBvbmVudF9nZXRfY29uZmlnICVwXG4iLCBoQ29tcCk7Ci0KLSAgaWYocFRoaXMpCi0gIHsKLSAgICAgZVJldCA9IHBUaGlzLT5nZXRfY29uZmlnKGhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdEYXRhKTsKLSAgfQotICByZXR1cm4gZVJldDsKLX0KLQotIE9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfc2V0X2NvbmZpZyhPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICBoQ29tcCwKLSAgICAgICAgICBPTVhfSU4gT01YX0lOREVYVFlQRSBjb25maWdJbmRleCwKLSAgICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgY29uZmlnRGF0YSkKLXsKLSAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICBxY19vbXhfY29tcG9uZW50ICpwVGhpcyA9IChoQ29tcCk/IChxY19vbXhfY29tcG9uZW50ICopKCgoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcCktPnBDb21wb25lbnRQcml2YXRlKTpOVUxMOwotICBERUJVR19QUklOVCgiT01YQ09SRTogcWNfb214X2NvbXBvbmVudF9zZXRfY29uZmlnICVwXG4iLCBoQ29tcCk7Ci0KLSAgaWYocFRoaXMpCi0gIHsKLSAgICAgZVJldCA9IHBUaGlzLT5zZXRfY29uZmlnKGhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdEYXRhKTsKLSAgfQotICByZXR1cm4gZVJldDsKLX0KLQotIE9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfZ2V0X2V4dGVuc2lvbl9pbmRleChPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICBoQ29tcCwKLSAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfU1RSSU5HICAgICAgcGFyYW1OYW1lLAotICAgICAgICAgICAgICAgICAgT01YX09VVCBPTVhfSU5ERVhUWVBFKiBpbmRleFR5cGUpCi17Ci0gIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgcWNfb214X2NvbXBvbmVudCAqcFRoaXMgPSAoaENvbXApPyAocWNfb214X2NvbXBvbmVudCAqKSgoKE9NWF9DT01QT05FTlRUWVBFICopaENvbXApLT5wQ29tcG9uZW50UHJpdmF0ZSk6TlVMTDsKLSAgaWYocFRoaXMpCi0gIHsKLSAgICBlUmV0ID0gcFRoaXMtPmdldF9leHRlbnNpb25faW5kZXgoaENvbXAscGFyYW1OYW1lLGluZGV4VHlwZSk7Ci0gIH0KLSAgcmV0dXJuIGVSZXQ7Ci19Ci0KLSBPTVhfRVJST1JUWVBFCi1xY19vbXhfY29tcG9uZW50X2dldF9zdGF0ZShPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wLAotICAgICAgICAgT01YX09VVCBPTVhfU1RBVEVUWVBFKiBzdGF0ZSkKLXsKLSAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICBxY19vbXhfY29tcG9uZW50ICpwVGhpcyA9IChoQ29tcCk/IChxY19vbXhfY29tcG9uZW50ICopKCgoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcCktPnBDb21wb25lbnRQcml2YXRlKTpOVUxMOwotICBERUJVR19QUklOVCgiT01YQ09SRTogcWNfb214X2NvbXBvbmVudF9nZXRfc3RhdGUgJXBcbiIsIGhDb21wKTsKLQotICBpZihwVGhpcykKLSAgewotICAgIGVSZXQgPSBwVGhpcy0+Z2V0X3N0YXRlKGhDb21wLHN0YXRlKTsKLSAgfQotICByZXR1cm4gZVJldDsKLX0KLQotIE9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfdHVubmVsX3JlcXVlc3QoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICAgIGhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgcGVlckNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgIHBlZXJQb3J0LAotICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5PVVQgT01YX1RVTk5FTFNFVFVQVFlQRSogdHVubmVsU2V0dXApCi17Ci0gICh2b2lkKSBoQ29tcCwgKHZvaWQpIHBvcnQsICh2b2lkKSBwZWVyQ29tcG9uZW50LCAodm9pZCkgcGVlclBvcnQsICh2b2lkKSB0dW5uZWxTZXR1cDsKLSAgREVCVUdfUFJJTlQoIkVycm9yOiBxY19vbXhfY29tcG9uZW50X3R1bm5lbF9yZXF1ZXN0IE5vdCBJbXBsZW1lbnRlZFxuIik7Ci0gIHJldHVybiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZDsKLX0KLQotIE9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfdXNlX2J1ZmZlcihPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICAgICAgaENvbXAsCi0gICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogYnVmZmVySGRyLAotICAgICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzLAotICAgICAgICAgIE9NWF9JTiBPTVhfVTgqICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikKLXsKLSAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICBxY19vbXhfY29tcG9uZW50ICpwVGhpcyA9IChoQ29tcCk/IChxY19vbXhfY29tcG9uZW50ICopKCgoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcCktPnBDb21wb25lbnRQcml2YXRlKTpOVUxMOwotICBERUJVR19QUklOVCgiT01YQ09SRTogcWNfb214X2NvbXBvbmVudF91c2VfYnVmZmVyICVwXG4iLCBoQ29tcCk7Ci0KLSAgaWYocFRoaXMpCi0gIHsKLSAgICAgZVJldCA9IHBUaGlzLT51c2VfYnVmZmVyKGhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7Ci0gIH0KLSAgcmV0dXJuIGVSZXQ7Ci19Ci0KLQotLy8gcWNfb214X2NvbXBvbmVudF9hbGxvY2F0ZV9idWZmZXIgIC0tIEFQSSBDYWxsCi0gT01YX0VSUk9SVFlQRQotcWNfb214X2NvbXBvbmVudF9hbGxvY2F0ZV9idWZmZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICAgIGhDb21wLAotICAgICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogYnVmZmVySGRyLAotICAgICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKQotewotCi0gIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgcWNfb214X2NvbXBvbmVudCAqcFRoaXMgPSAoaENvbXApPyAocWNfb214X2NvbXBvbmVudCAqKSgoKE9NWF9DT01QT05FTlRUWVBFICopaENvbXApLT5wQ29tcG9uZW50UHJpdmF0ZSk6TlVMTDsKLSAgREVCVUdfUFJJTlQoIk9NWENPUkU6IHFjX29teF9jb21wb25lbnRfYWxsb2NhdGVfYnVmZmVyICVwLCAlcCAsICVkXG4iLGhDb21wLCBidWZmZXJIZHIsKHVuc2lnbmVkKXBvcnQpOwotCi0gIGlmKHBUaGlzKQotICB7Ci0gICAgZVJldCA9IHBUaGlzLT5hbGxvY2F0ZV9idWZmZXIoaENvbXAsYnVmZmVySGRyLHBvcnQsYXBwRGF0YSxieXRlcyk7Ci0gIH0KLSAgcmV0dXJuIGVSZXQ7Ci19Ci0KLSBPTVhfRVJST1JUWVBFCi1xY19vbXhfY29tcG9uZW50X2ZyZWVfYnVmZmVyKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgIGhDb21wLAotICAgICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBidWZmZXIpCi17Ci0KLSAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICBxY19vbXhfY29tcG9uZW50ICpwVGhpcyA9IChoQ29tcCk/IChxY19vbXhfY29tcG9uZW50ICopKCgoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcCktPnBDb21wb25lbnRQcml2YXRlKTpOVUxMOwotICBERUJVR19QUklOVCgiT01YQ09SRTogcWNfb214X2NvbXBvbmVudF9mcmVlX2J1ZmZlclslZF0gJXAsICVwXG4iLCAodW5zaWduZWQpcG9ydCwgaENvbXAsIGJ1ZmZlcik7Ci0KLSAgaWYocFRoaXMpCi0gIHsKLSAgICBlUmV0ID0gcFRoaXMtPmZyZWVfYnVmZmVyKGhDb21wLHBvcnQsYnVmZmVyKTsKLSAgfQotICByZXR1cm4gZVJldDsKLX0KLQotIE9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfZW1wdHlfdGhpc19idWZmZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBidWZmZXIpCi17Ci0gIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgcWNfb214X2NvbXBvbmVudCAqcFRoaXMgPSAoaENvbXApPyAocWNfb214X2NvbXBvbmVudCAqKSgoKE9NWF9DT01QT05FTlRUWVBFICopaENvbXApLT5wQ29tcG9uZW50UHJpdmF0ZSk6TlVMTDsKLSAgREVCVUdfUFJJTlQoIk9NWENPUkU6IHFjX29teF9jb21wb25lbnRfZW1wdHlfdGhpc19idWZmZXIgJXAsICVwXG4iLGhDb21wLCBidWZmZXIpOwotCi0gIGlmKHBUaGlzKQotICB7Ci0gICAgZVJldCA9IHBUaGlzLT5lbXB0eV90aGlzX2J1ZmZlcihoQ29tcCxidWZmZXIpOwotICB9Ci0gIHJldHVybiBlUmV0OwotfQotCi0gT01YX0VSUk9SVFlQRQotcWNfb214X2NvbXBvbmVudF9maWxsX3RoaXNfYnVmZmVyKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgIGhDb21wLAotICAgICAgICAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBidWZmZXIpCi17Ci0gIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgcWNfb214X2NvbXBvbmVudCAqcFRoaXMgPSAoaENvbXApPyAocWNfb214X2NvbXBvbmVudCAqKSgoKE9NWF9DT01QT05FTlRUWVBFICopaENvbXApLT5wQ29tcG9uZW50UHJpdmF0ZSk6TlVMTDsKLSAgREVCVUdfUFJJTlQoIk9NWENPUkU6IHFjX29teF9jb21wb25lbnRfZmlsbF90aGlzX2J1ZmZlciAlcCwgJXBcbiIsIGhDb21wLCBidWZmZXIpOwotICBpZihwVGhpcykKLSAgewotICAgIGVSZXQgPSBwVGhpcy0+ZmlsbF90aGlzX2J1ZmZlcihoQ29tcCxidWZmZXIpOwotICB9Ci0gIHJldHVybiBlUmV0OwotfQotCi0gT01YX0VSUk9SVFlQRQotcWNfb214X2NvbXBvbmVudF9zZXRfY2FsbGJhY2tzKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgaENvbXAsCi0gICAgICAgICAgICAgT01YX0lOIE9NWF9DQUxMQkFDS1RZUEUqIGNhbGxiYWNrcywKLSAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICBhcHBEYXRhKQotewotICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gIHFjX29teF9jb21wb25lbnQgKnBUaGlzID0gKGhDb21wKT8gKHFjX29teF9jb21wb25lbnQgKikoKChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wKS0+cENvbXBvbmVudFByaXZhdGUpOk5VTEw7Ci0gIERFQlVHX1BSSU5UKCJPTVhDT1JFOiBxY19vbXhfY29tcG9uZW50X3NldF9jYWxsYmFja3MgJXAsICVwICwgJXBcbiIsIGhDb21wLCBjYWxsYmFja3MsIGFwcERhdGEpOwotCi0gIGlmKHBUaGlzKQotICB7Ci0gICAgZVJldCA9IHBUaGlzLT5zZXRfY2FsbGJhY2tzKGhDb21wLGNhbGxiYWNrcyxhcHBEYXRhKTsKLSAgfQotICByZXR1cm4gZVJldDsKLX0KLQotIE9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfZGVpbml0KE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcCkKLXsKLSAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICBxY19vbXhfY29tcG9uZW50ICpwVGhpcyA9IChoQ29tcCk/IChxY19vbXhfY29tcG9uZW50ICopKCgoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcCktPnBDb21wb25lbnRQcml2YXRlKTpOVUxMOwotICBERUJVR19QUklOVCgiT01YQ09SRTogcWNfb214X2NvbXBvbmVudF9kZWluaXQgJXBcbiIsIGhDb21wKTsKLQotICBpZihwVGhpcykKLSAgewotICAgIC8vIGNhbGwgdGhlIGRlaW5pdCBmdWN0aW9uIGZpcnN0Ci0gICAgT01YX1NUQVRFVFlQRSBzdGF0ZTsKLSAgICBwVGhpcy0+Z2V0X3N0YXRlKGhDb21wLCZzdGF0ZSk7Ci0gICAgREVCVUdfUFJJTlQoIkNhbGxpbmcgRnJlZUhhbmRsZSBpbiBzdGF0ZSAlZCBcbiIsIHN0YXRlKTsKLSAgICBlUmV0ID0gcFRoaXMtPmNvbXBvbmVudF9kZWluaXQoaENvbXApOwotICAgIC8vIGRlc3Ryb3kgdGhlIGNvbXBvbmVudC4KLSAgICBkZWxldGUgcFRoaXM7Ci0gIH0KLSAgcmV0dXJuIGVSZXQ7Ci19Ci0KLSBPTVhfRVJST1JUWVBFCi1xY19vbXhfY29tcG9uZW50X3VzZV9FR0xfaW1hZ2UoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICAgIGhDb21wLAotICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogYnVmZmVySGRyLAotICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICAgICAgT01YX0lOIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIGVnbEltYWdlKQotewotICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gIHFjX29teF9jb21wb25lbnQgKnBUaGlzID0gKGhDb21wKT8gKHFjX29teF9jb21wb25lbnQgKikoKChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wKS0+cENvbXBvbmVudFByaXZhdGUpOk5VTEw7Ci0gIERFQlVHX1BSSU5UKCJPTVhDT1JFOiBxY19vbXhfY29tcG9uZW50X3VzZV9FR0xfaW1hZ2UgJXAsICVwICwgJWRcbiIsIGhDb21wLCBidWZmZXJIZHIsKHVuc2lnbmVkKXBvcnQpOwotICBpZihwVGhpcykKLSAgewotICAgIGVSZXQgPSBwVGhpcy0+dXNlX0VHTF9pbWFnZShoQ29tcCxidWZmZXJIZHIscG9ydCxhcHBEYXRhLGVnbEltYWdlKTsKLSAgfQotICByZXR1cm4gZVJldDsKLX0KLQotIE9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfcm9sZV9lbnVtKE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICAgIE9NWF9PVVQgT01YX1U4KiAgICAgICAgcm9sZSwKLSAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICBpbmRleCkKLXsKLSAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICBxY19vbXhfY29tcG9uZW50ICpwVGhpcyA9IChoQ29tcCk/IChxY19vbXhfY29tcG9uZW50ICopKCgoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcCktPnBDb21wb25lbnRQcml2YXRlKTpOVUxMOwotICBERUJVR19QUklOVCgiT01YQ09SRTogcWNfb214X2NvbXBvbmVudF9yb2xlX2VudW0gJXAsICVwICwgJWRcbiIsIGhDb21wLCByb2xlLCh1bnNpZ25lZClpbmRleCk7Ci0KLSAgaWYocFRoaXMpCi0gIHsKLSAgICBlUmV0ID0gcFRoaXMtPmNvbXBvbmVudF9yb2xlX2VudW0oaENvbXAscm9sZSxpbmRleCk7Ci0gIH0KLSAgcmV0dXJuIGVSZXQ7Ci19CmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9zcmMvY29tbW9uL29teF9jb3JlX2NtcC5oIGIvc2RtODQ1L21tLWNvcmUvc3JjL2NvbW1vbi9vbXhfY29yZV9jbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjNjOWRmNS4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9zcmMvY29tbW9uL29teF9jb3JlX2NtcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vcgotICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgICAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLU9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiBNIEEgWCAgIHcgciBhIHAgcCBlIHIgcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuICBNIEEgWCAgIEMgbyByIGUKLQotIE9wZW5NQVggQ29yZSBNYWNyb3MgaW50ZXJmYWNlLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBGaWxlcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0jaWZuZGVmIE9NWF9DT1JFX0NNUF9ICi0jZGVmaW5lIE9NWF9DT1JFX0NNUF9ICi0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotdm9pZCAqIHFjX29teF9jcmVhdGVfY29tcG9uZW50X3dyYXBwZXIoT01YX1BUUiBvYmpfcHRyKTsKLQotCi1PTVhfRVJST1JUWVBFCi1xY19vbXhfY29tcG9uZW50X2luaXQoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wLCBPTVhfSU4gT01YX1NUUklORyBjb21wb25lbnROYW1lKTsKLQotCi1PTVhfRVJST1JUWVBFCi1xY19vbXhfY29tcG9uZW50X2dldF92ZXJzaW9uKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgICAgICAgIGhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfT1VUIE9NWF9TVFJJTkcgICAgICAgICAgY29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqIGNvbXBvbmVudFZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9PVVQgT01YX1ZFUlNJT05UWVBFKiAgICAgIHNwZWNWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfT1VUIE9NWF9VVUlEVFlQRSogICAgICAgY29tcG9uZW50VVVJRCk7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfc2VuZF9jb21tYW5kKE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfQ09NTUFORFRZUEUgIGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgIHBhcmFtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSICAgICAgY21kRGF0YSk7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfZ2V0X3BhcmFtZXRlcihPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgIGhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFIHBhcmFtSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgIHBhcmFtRGF0YSk7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfc2V0X3BhcmFtZXRlcihPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgIGhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFIHBhcmFtSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBhcmFtRGF0YSk7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfZ2V0X2NvbmZpZyhPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICBoQ29tcCwKLSAgICAgICAgICBPTVhfSU4gT01YX0lOREVYVFlQRSBjb25maWdJbmRleCwKLSAgICAgICAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgY29uZmlnRGF0YSk7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfc2V0X2NvbmZpZyhPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICBoQ29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX0lOREVYVFlQRSBjb25maWdJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgY29uZmlnRGF0YSk7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfZ2V0X2V4dGVuc2lvbl9pbmRleChPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICBoQ29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1NUUklORyAgICAgIHBhcmFtTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUqIGluZGV4VHlwZSk7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfZ2V0X3N0YXRlKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaENvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfT1VUIE9NWF9TVEFURVRZUEUqIHN0YXRlKTsKLQotT01YX0VSUk9SVFlQRQotcWNfb214X2NvbXBvbmVudF90dW5uZWxfcmVxdWVzdChPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICBwZWVyQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICAgcGVlclBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfVFVOTkVMU0VUVVBUWVBFKiB0dW5uZWxTZXR1cCk7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfdXNlX2J1ZmZlcihPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogYnVmZmVySGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfVTgqICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7Ci0KLQotLy8gcWNfb214X2NvbXBvbmVudF9hbGxvY2F0ZV9idWZmZXIgIC0tIEFQSSBDYWxsCi1PTVhfRVJST1JUWVBFCi1xY19vbXhfY29tcG9uZW50X2FsbG9jYXRlX2J1ZmZlcihPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqKiBidWZmZXJIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpOwotCi1PTVhfRVJST1JUWVBFCi1xY19vbXhfY29tcG9uZW50X2ZyZWVfYnVmZmVyKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgIGhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBidWZmZXIpOwotCi1PTVhfRVJST1JUWVBFCi1xY19vbXhfY29tcG9uZW50X2VtcHR5X3RoaXNfYnVmZmVyKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgIGhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIGJ1ZmZlcik7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfZmlsbF90aGlzX2J1ZmZlcihPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICBoQ29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIGJ1ZmZlcik7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfc2V0X2NhbGxiYWNrcyhPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgIGhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfQ0FMTEJBQ0tUWVBFKiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgYXBwRGF0YSk7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfZGVpbml0KE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcCk7Ci0KLU9NWF9FUlJPUlRZUEUKLXFjX29teF9jb21wb25lbnRfdXNlX0VHTF9pbWFnZShPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogYnVmZmVySGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIGVnbEltYWdlKTsKLQotT01YX0VSUk9SVFlQRQotcWNfb214X2NvbXBvbmVudF9yb2xlX2VudW0oT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX09VVCBPTVhfVTgqICAgICAgICByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgIGluZGV4KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL3NyYy9jb21tb24vcWNfb214X2NvcmUuYyBiL3NkbTg0NS9tbS1jb3JlL3NyYy9jb21tb24vcWNfb214X2NvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmOWM1ZS4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9zcmMvY29tbW9uL3FjX29teF9jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MzIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yCi0gICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTi1JTkZSSU5HRU1FTlQgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuIE0gQSBYICAgdyByIGEgcCBwIGUgciBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gIE0gQSBYICAgQyBvIHIgZQotCi0gIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3Blbk1BWCBjb3JlLgotCi0qLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBGaWxlcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSNpbmNsdWRlIDxkbGZjbi5oPiAgICAgICAgICAgLy8gZHluYW1pYyBsaWJyYXJ5Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgInFjX29teF9jb3JlLmgiCi0jaW5jbHVkZSAib214X2NvcmVfY21wLmgiCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotZXh0ZXJuIG9teF9jb3JlX2NiX3R5cGUgY29yZVtdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBTSVpFX09GX0NPUkU7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IGxvY2tfY29yZSA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgaW50IG51bWJlcl9vZl9hZGVjX250X3Nlc3Npb247Ci0KLSNkZWZpbmUgTUFYX0FVRElPX05UX1NFU1NJT04gMgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTgotICBvbXhfY29yZV9sb2FkX2NtcF9saWJyYXJ5Ci0KLURFU0NSSVBUSU9OCi0gIExvYWRzIHVwIHRoZSBsaWJhcnkgbmFtZSBtZW50aW9uZWQgaW4gdGhlIGFyZ3VtZW50Ci0KLVBBUkFNRVRFUlMKLSAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgQ29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGNvbXBvbmVudCBpbnN0YW5jZXMuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotc3RhdGljIGNyZWF0ZV9xY19vbXhfY29tcG9uZW50Ci1vbXhfY29yZV9sb2FkX2NtcF9saWJyYXJ5KGNoYXIgKmxpYm5hbWUsIHZvaWQgKipoYW5kbGVfcHRyKQotewotICBjcmVhdGVfcWNfb214X2NvbXBvbmVudCBmbl9wdHIgPSBOVUxMOwotICBpZihoYW5kbGVfcHRyKQotICB7Ci0gICAgREVCVUdfUFJJTlQoIkR5bmFtaWNhbGx5IExvYWRpbmcgdGhlIGxpYnJhcnkgOiAlc1xuIixsaWJuYW1lKTsKLSAgICAqaGFuZGxlX3B0ciA9IGRsb3BlbihsaWJuYW1lLFJUTERfTk9XKTsKLSAgICBpZigqaGFuZGxlX3B0cikKLSAgICB7Ci0gICAgICBmbl9wdHIgPSBkbHN5bSgqaGFuZGxlX3B0ciwgImdldF9vbXhfY29tcG9uZW50X2ZhY3RvcnlfZm4iKTsKLQotICAgICAgaWYoZm5fcHRyID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgIERFQlVHX1BSSU5UKCJFcnJvcjogTGlicmFyeSAlcyBpbmNvbXBhdGlibGUgYXMgUUNPTSBPTVggY29tcG9uZW50IGxvYWRlciAtICVzXG4iLAotICAgICAgICAgICAgICAgICAgbGlibmFtZSwgZGxlcnJvcigpKTsKLSAgICAgICAgKmhhbmRsZV9wdHIgPSBOVUxMOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgREVCVUdfUFJJTlQoIkVycm9yOiBDb3VsZG4ndCBsb2FkICVzOiAlc1xuIixsaWJuYW1lLGRsZXJyb3IoKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmbl9wdHI7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OCi0gIE9NWF9Jbml0Ci0KLURFU0NSSVBUSU9OCi0gIFRoaXMgaXMgdGhlIGZpcnN0IGZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gIFRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZSBzaW5jZSBjb21wb25lbnRzIHNoYWxsIGJlIGxvYWRlZAotICB3aGVuZXZlciB0aGUgZ2V0IGhhbmRsZSBtZXRob2QgaXMgY2FsbGVkLgotCi1QQVJBTUVURVJTCi0gIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gIE5vbmUuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWQotT01YX0luaXQoKQotewotICBERUJVR19QUklOVCgiT01YQ09SRSBBUEkgLSBPTVhfSW5pdCBcbiIpOwotICAvKiBOb3RoaW5nIHRvIGRvIGhlcmUgOyBzaGFyZWQgb2JqZWN0cyBzaGFsbCBiZSBsb2FkZWQgYXQgdGhlIGdldCBoYW5kbGUgbWV0aG9kICovCi0gIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTgotICBnZXRfY21wX2luZGV4Ci0KLURFU0NSSVBUSU9OCi0gIE9idGFpbnMgdGhlICBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUuCi0KLVBBUkFNRVRFUlMKLSAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgRXJyb3IgTm9uZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1zdGF0aWMgaW50IGdldF9jbXBfaW5kZXgoY2hhciAqY21wX25hbWUpCi17Ci0gIGludCByYyA9IC0xLGk9MDsKLSAgREVCVUdfUFJJTlQoImJlZm9yZSBnZXRfY21wX2luZGV4ICoqKioqKioqKiolZFxuIiwgcmMpOwotCi0gIGZvcihpPTA7IGk8IChpbnQpU0laRV9PRl9DT1JFOyBpKyspCi0gIHsKLSAgIERFQlVHX1BSSU5UKCJnZXRfY21wX2luZGV4OiBjbXBfbmFtZSA9ICVzICwgY29yZVtpXS5uYW1lID0gJXMgLGNvdW50ID0gJWQgXG4iLGNtcF9uYW1lLGNvcmVbaV0ubmFtZSxpKTsKLQotICAgIGlmKCFzdHJjbXAoY21wX25hbWUsIGNvcmVbaV0ubmFtZSkpCi0gICAgewotICAgICAgICByYyA9IGk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBERUJVR19QUklOVCgicmV0dXJuaW5nIGluZGV4ICVkXG4iLCByYyk7Ci0gIHJldHVybiByYzsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04KLSAgY2xlYXJfY21wX2hhbmRsZQotCi1ERVNDUklQVElPTgotICBDbGVhcnMgdGhlIGNvbXBvbmVudCBoYW5kbGUgZnJvbSB0aGUgY29tcG9uZW50IHRhYmxlLgotCi1QQVJBTUVURVJTCi0gIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gIE5vbmUuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotc3RhdGljIHZvaWQgY2xlYXJfY21wX2hhbmRsZShPTVhfSEFORExFVFlQRSBpbnN0KQotewotICB1bnNpZ25lZCBpID0gMCxqPTA7Ci0KLSAgaWYoTlVMTCA9PSBpbnN0KQotICAgICByZXR1cm47Ci0KLSAgZm9yKGk9MDsgaTwgU0laRV9PRl9DT1JFOyBpKyspCi0gIHsKLSAgICBmb3Ioaj0wOyBqPCBPTVhfQ09NUF9NQVhfSU5TVDsgaisrKQotICAgIHsKLSAgICAgIGlmKGluc3QgPT0gY29yZVtpXS5pbnN0W2pdKQotICAgICAgewotICAgICAgICBjb3JlW2ldLmluc3Rbal0gPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybjsKLX0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OCi0gIGlzX2NtcF9oYW5kbGVfZXhpc3RzCi0KLURFU0NSSVBUSU9OCi0gIENoZWNrIGlmIHRoZSBjb21wb25lbnQgaGFuZGxlIGFscmVhZHkgZXhpc3RzIG9yIG5vdC4KLQotUEFSQU1FVEVSUwotICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICBpbmRleCBwb2ludGVyIGlmIHRoZSBoYW5kbGUgZXhpc3RzCi0gIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXN0YXRpYyBpbnQgaXNfY21wX2hhbmRsZV9leGlzdHMoT01YX0hBTkRMRVRZUEUgaW5zdCkKLXsKLSAgdW5zaWduZWQgaT0wLGo9MDsKLSAgaW50IHJjID0gLTE7Ci0KLSAgaWYoTlVMTCA9PSBpbnN0KQotICAgICByZXR1cm4gcmM7Ci0KLSAgcHRocmVhZF9tdXRleF9sb2NrKCZsb2NrX2NvcmUpOwotICBmb3IoaT0wOyBpPCBTSVpFX09GX0NPUkU7IGkrKykKLSAgewotICAgIGZvcihqPTA7IGo8IE9NWF9DT01QX01BWF9JTlNUOyBqKyspCi0gICAgewotICAgICAgaWYoaW5zdCA9PSBjb3JlW2ldLmluc3Rbal0pCi0gICAgICB7Ci0gICAgICAgIHJjID0gaTsKLSAgICAgICAgZ290byBmaW5pc2g7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1maW5pc2g6Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2NrX2NvcmUpOwotICByZXR1cm4gcmM7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OCi0gIGdldF9jb21wX2hhbmRsZV9pbmRleAotCi1ERVNDUklQVElPTgotICBHZXRzIHRoZSBpbmRleCB0byBzdG9yZSB0aGUgbmV4dCBoYW5kbGUgZm9yIHNwZWNpZmllZCBjb21wb25lbnQgbmFtZS4KLQotUEFSQU1FVEVSUwotICBjbXBfbmFtZSA6IENvbXBvbmVudCBOYW1lCi0KLVJFVFVSTiBWQUxVRQotICBJbmRleCBvZiBuZXh0IGhhbmRsZSB0byBiZSBzdG9yZWQKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1zdGF0aWMgaW50IGdldF9jb21wX2hhbmRsZV9pbmRleChjaGFyICpjbXBfbmFtZSkKLXsKLSAgdW5zaWduZWQgaT0wLGo9MDsKLSAgaW50IHJjID0gLTE7Ci0gIGZvcihpPTA7IGk8IFNJWkVfT0ZfQ09SRTsgaSsrKQotICB7Ci0gICAgaWYoIXN0cmNtcChjbXBfbmFtZSwgY29yZVtpXS5uYW1lKSkKLSAgICB7Ci0gICAgICBmb3Ioaj0wOyBqPCBPTVhfQ09NUF9NQVhfSU5TVDsgaisrKQotICAgICAgewotICAgICAgICBpZihOVUxMID09IGNvcmVbaV0uaW5zdFtqXSkKLSAgICAgICAgewotICAgICAgICAgIHJjID0gajsKLSAgICAgICAgICBERUJVR19QUklOVCgiZnJlZSBoYW5kbGUgc2xvdCBleGlzdHMgJWRcbiIsIHJjKTsKLSAgICAgICAgICByZXR1cm4gcmM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gcmM7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OCi0gIGNoZWNrX2xpYl91bmxvYWQKLQotREVTQ1JJUFRJT04KLSAgQ2hlY2sgaWYgYW55IGNvbXBvbmVudCBpbnN0YW5jZSBpcyB1c2luZyB0aGUgbGlicmFyeQotCi1QQVJBTUVURVJTCi0gIGluZGV4OiBDb21wb25lbnQgSW5kZXggaW4gY29yZSBhcnJheS4KLQotUkVUVVJOIFZBTFVFCi0gIDE6IExpYnJhcnkgVW51c2VkIGFuZCBjYW4gYmUgdW5sb2FkZWQuCi0gIDA6ICBMaWJyYXJ5IHVzZWQgYW5kIHNob3VsZG50IGJlIHVubG9hZGVkLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXN0YXRpYyBpbnQgY2hlY2tfbGliX3VubG9hZChpbnQgaW5kZXgpCi17Ci0gIHVuc2lnbmVkIGk9MDsKLSAgaW50IHJjID0gMTsKLQotICBmb3IoaT0wOyBpPCBPTVhfQ09NUF9NQVhfSU5TVDsgaSsrKQotICB7Ci0gICAgaWYoY29yZVtpbmRleF0uaW5zdFtpXSkKLSAgICB7Ci0gICAgICByYyA9IDA7Ci0gICAgICBERUJVR19QUklOVCgiTGlicmFyeSBVc2VkIFxuIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJjOwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04KLSAgaXNfY21wX2FscmVhZHlfZXhpc3RzCi0KLURFU0NSSVBUSU9OCi0gIENoZWNrIGlmIHRoZSBjb21wb25lbnQgYWxyZWFkeSBleGlzdHMgb3Igbm90LiBVc2VkIGluIHRoZQotICBtYW5hZ2VtZW50IG9mIGNvbXBvbmVudCBoYW5kbGVzLgotCi1QQVJBTUVURVJTCi0gIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gIEVycm9yIE5vbmUuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotc3RhdGljIGludCBpc19jbXBfYWxyZWFkeV9leGlzdHMoY2hhciAqY21wX25hbWUpCi17Ci0gIHVuc2lnbmVkIGkgICAgPTAsaj0wOwotICBpbnQgcmMgPSAtMTsKLSAgZm9yKGk9MDsgaTwgU0laRV9PRl9DT1JFOyBpKyspCi0gIHsKLSAgICBpZighc3RyY21wKGNtcF9uYW1lLCBjb3JlW2ldLm5hbWUpKQotICAgIHsKLSAgICAgIGZvcihqPTA7IGo8IE9NWF9DT01QX01BWF9JTlNUOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGlmKGNvcmVbaV0uaW5zdFtqXSkKLSAgICAgICAgewotICAgICAgICAgIHJjID0gaTsKLSAgICAgICAgICBERUJVR19QUklOVCgiQ29tcG9uZW50IGV4aXN0cyAlZFxuIiwgcmMpOwotICAgICAgICAgIHJldHVybiByYzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiByYzsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04KLSAgZ2V0X2NtcF9oYW5kbGUKLQotREVTQ1JJUFRJT04KLSAgR2V0IGNvbXBvbmVudCBoYW5kbGUuCi0KLVBBUkFNRVRFUlMKLSAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgRXJyb3IgTm9uZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi12b2lkKiBnZXRfY21wX2hhbmRsZShjaGFyICpjbXBfbmFtZSkKLXsKLSAgdW5zaWduZWQgaSAgICA9MCxqPTA7Ci0KLSAgREVCVUdfUFJJTlQoImdldF9jbXBfaGFuZGxlIFxuIik7Ci0gIGZvcihpPTA7IGk8IFNJWkVfT0ZfQ09SRTsgaSsrKQotICB7Ci0gICAgaWYoIXN0cmNtcChjbXBfbmFtZSwgY29yZVtpXS5uYW1lKSkKLSAgICB7Ci0gICAgICBmb3Ioaj0wOyBqPCBPTVhfQ09NUF9NQVhfSU5TVDsgaisrKQotICAgICAgewotICAgICAgICBpZihjb3JlW2ldLmluc3Rbal0pCi0gICAgICAgIHsKLSAgICAgICAgICBERUJVR19QUklOVCgiZ2V0X2NtcF9oYW5kbGUgbWF0Y2hcbiIpOwotICAgICAgICAgIHJldHVybiBjb3JlW2ldLmluc3Rbal07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgREVCVUdfUFJJTlQoImdldF9jbXBfaGFuZGxlIHJldHVybmluZyBOVUxMIFxuIik7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTgotICBPTVhfRGVJbml0Ci0KLURFU0NSSVBUSU9OCi0gIERlSW5pdGlhbGl6ZSBhbGwgdGhlIHRoZSByZWxldmFudCBPTVggY29tcG9uZW50cy4KLQotUEFSQU1FVEVSUwotICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICBFcnJvciBOb25lLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkKLU9NWF9EZWluaXQoKQotewotICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04KLSAgT01YX0dldEhhbmRsZQotCi1ERVNDUklQVElPTgotICBDb25zdHJ1Y3RzIHJlcXVlc3RlZCBjb21wb25lbnQuIFJlbGV2YW50IGxpYnJhcnkgaXMgbG9hZGVkIGlmIG5lZWRlZC4KLQotUEFSQU1FVEVSUwotICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICBFcnJvciBOb25lICBpZiBldmVyeXRoaW5nIGdvZXMgZmluZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSBPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZCi1PTVhfR2V0SGFuZGxlKE9NWF9PVVQgT01YX0hBTkRMRVRZUEUqICAgICBoYW5kbGUsCi0gICAgICAgICAgICAgIE9NWF9JTiBPTVhfU1RSSU5HICAgIGNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgICAgICAgIE9NWF9JTiBPTVhfQ0FMTEJBQ0tUWVBFKiBjYWxsQmFja3MpCi17Ci0gIE9NWF9FUlJPUlRZUEUgIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICBpbnQgY21wX2luZGV4ID0gLTE7Ci0gIGludCBobmRfaW5kZXggPSAtMTsKLSAgaW50IHZwcF9jbXBfaW5kZXggPSAtMTsKLQotICBERUJVR19QUklOVCgiT01YQ09SRSBBUEkgOiAgR2V0SGFuZGxlICVwICVzICVwXG4iLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcERhdGEpOwotICBwdGhyZWFkX211dGV4X2xvY2soJmxvY2tfY29yZSk7Ci0gIGlmKGhhbmRsZSkKLSAgewotICAgIHN0cnVjdCBzdGF0IHNkOwotICAgICpoYW5kbGUgPSBOVUxMOwotICAgIGNoYXIgb3B0Q29tcG9uZW50TmFtZVtPTVhfTUFYX1NUUklOR05BTUVfU0laRV07Ci0gICAgc3RybGNweShvcHRDb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0KLSAgICBpZihzdHJzdHIoY29tcG9uZW50TmFtZSwgImF2YyIpICYmIHN0cnN0cihjb21wb25lbnROYW1lLCAiZGVjb2RlciIpKQotICAgIHsKLSAgICAgIHZvaWQgKmxpYmhhbmRsZSA9IGRsb3BlbigibGliT214VmlkZW9EU01vZGUuc28iLCBSVExEX05PVyk7Ci0gICAgICBpZihsaWJoYW5kbGUpCi0gICAgICB7Ci0gICAgICAgIGludCAoKmZuX3B0cikoKSAgPSBkbHN5bShsaWJoYW5kbGUsICJpc0RTTW9kZUFjdGl2ZSIpOwotCi0gICAgICAgIGlmKGZuX3B0ciA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVycm9yOiBpc0RTTW9kZUFjdGl2ZSBOb3QgRm91bmQgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgIGRsZXJyb3IoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGlzQWN0aXZlID0gZm5fcHRyKCk7Ci0gICAgICAgICAgY2hhciAqcFN1YlN0cmluZyA9IHN0cnN0cihjb21wb25lbnROYW1lLCAiLmRzbW9kZSIpOwotICAgICAgICAgIGlmKHBTdWJTdHJpbmcpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3B0Q29tcG9uZW50TmFtZVtwU3ViU3RyaW5nIC0gY29tcG9uZW50TmFtZV0gPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmKGlzQWN0aXZlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN0cmxjYXQob3B0Q29tcG9uZW50TmFtZSwgIi5kc21vZGUiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNtcF9pbmRleCA9IGdldF9jbXBfaW5kZXgob3B0Q29tcG9uZW50TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGxjbG9zZShsaWJoYW5kbGUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIGxvYWQgZHNtb2RlIGxpYnJhcnkiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihjbXBfaW5kZXggPCAwKQotICAgIHsKLSAgICAgIGNtcF9pbmRleCA9IGdldF9jbXBfaW5kZXgoY29tcG9uZW50TmFtZSk7Ci0gICAgICBzdHJsY3B5KG9wdENvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICB9Ci0gICAgaWYoY21wX2luZGV4ID49IDApCi0gICAgewotICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgREVCVUdfUFJJTlQoImdldHRpbmcgZm4gcG9pbnRlclxuIik7Ci0KLSAgICAgIC8vIExvYWQgVlBQIG9teCBjb21wb25lbnQgZm9yIGRlY29kZXIgaWYgdnBwCi0gICAgICAvLyBwcm9wZXJ0eSBpcyBlbmFibGVkCi0gICAgICBpZiAoKHByb3BlcnR5X2dldCgibWVkaWEudnBwLmVuYWJsZSIsIHZhbHVlLCBOVUxMKSkKLSAgICAgICAgICAgJiYgKCFzdHJjbXAoIjEiLCB2YWx1ZSkgfHwgIXN0cmNtcCgidHJ1ZSIsIHZhbHVlKSkpIHsKLSAgICAgICAgREVCVUdfUFJJTlQoIlZQUCBwcm9wZXJ0eSBpcyBlbmFibGVkIik7Ci0gICAgICAgIGlmICghc3RyY21wKGNvcmVbY21wX2luZGV4XS5zb19saWJfbmFtZSwgImxpYk9teFZkZWMuc28iKSkgewotICAgICAgICAgIHZwcF9jbXBfaW5kZXggPSBnZXRfY21wX2luZGV4KCJPTVgucXRpLnZkZWMudnBwIik7Ci0gICAgICAgICAgaWYgKHZwcF9jbXBfaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiVW5hYmxlIHRvIGZpbmQgVlBQIE9NWCBsaWIgaW4gcmVnaXN0cnkgIik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UKCJMb2FkaW5nIHZwcCBmb3IgdmRlYyIpOwotICAgICAgICAgICAgY21wX2luZGV4ID0gdnBwX2NtcF9pbmRleDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgIC8vIGR5bmFtaWNhbGx5IGxvYWQgdGhlIHNvCi0gICAgICBjb3JlW2NtcF9pbmRleF0uZm5fcHRyID0KLSAgICAgICAgb214X2NvcmVfbG9hZF9jbXBfbGlicmFyeShjb3JlW2NtcF9pbmRleF0uc29fbGliX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcmVbY21wX2luZGV4XS5zb19saWJfaGFuZGxlKTsKLQotCi0gICAgICBpZihjb3JlW2NtcF9pbmRleF0uZm5fcHRyKQotICAgICAgewotICAgICAgICAvL0RvIG5vdCBhbGxvdyBtb3JlIHRoYW4gTUFYIGxpbWl0IGZvciBEU1AgYXVkaW8gZGVjb2RlcnMKLSAgICAgICAgaWYoKCFzdHJjbXAoY29yZVtjbXBfaW5kZXhdLnNvX2xpYl9uYW1lLCJsaWJPbXhXbWFEZWMuc28iKSAgfHwKLSAgICAgICAgICAgICFzdHJjbXAoY29yZVtjbXBfaW5kZXhdLnNvX2xpYl9uYW1lLCJsaWJPbXhBYWNEZWMuc28iKSAgfHwKLSAgICAgICAgICAgICFzdHJjbXAoY29yZVtjbXBfaW5kZXhdLnNvX2xpYl9uYW1lLCJsaWJPbXhHNzExRGVjLnNvIikgIHx8Ci0gICAgICAgICAgICAhc3RyY21wKGNvcmVbY21wX2luZGV4XS5zb19saWJfbmFtZSwibGliT214QWxhY0RlYy5zbyIpIHx8Ci0gICAgICAgICAgICAhc3RyY21wKGNvcmVbY21wX2luZGV4XS5zb19saWJfbmFtZSwibGliT214QXBlRGVjLnNvIikpICYmCi0gICAgICAgICAgICAobnVtYmVyX29mX2FkZWNfbnRfc2Vzc2lvbisxID4gTUFYX0FVRElPX05UX1NFU1NJT04pKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiUmVqZWN0aW5nIG5ldyBzZXNzaW9uLi5SZWFjaGVkIG1heCBsaW1pdCBmb3IgRFNQIGF1ZGlvIGRlY29kZXIgc2Vzc2lvbiIpOwotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2tfY29yZSk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgY29tcG9uZW50IHJlcXVlc3RlZAotICAgICAgICAvLyBGdW5jdGlvbiByZXR1cm5zIHRoZSBvcGFxdWUgaGFuZGxlCi0gICAgICAgIHZvaWQqIHBUaGlzID0gKCooY29yZVtjbXBfaW5kZXhdLmZuX3B0cikpKCk7Ci0gICAgICAgIGlmKHBUaGlzKQotICAgICAgICB7Ci0gICAgICAgICAgdm9pZCAqaENvbXAgPSBOVUxMOwotICAgICAgICAgIGhDb21wID0gcWNfb214X2NyZWF0ZV9jb21wb25lbnRfd3JhcHBlcigoT01YX1BUUilwVGhpcyk7Ci0gICAgICAgICAgaWYoKGVSZXQgPSBxY19vbXhfY29tcG9uZW50X2luaXQoaENvbXAsIG9wdENvbXBvbmVudE5hbWUpKSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0Vycm9yTm9uZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIERFQlVHX1BSSU5UKCJDb21wb25lbnQgbm90IGNyZWF0ZWQgc3VjY2VzZnVsbHlcbiIpOwotICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja19jb3JlKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGVSZXQ7Ci0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcWNfb214X2NvbXBvbmVudF9zZXRfY2FsbGJhY2tzKGhDb21wLGNhbGxCYWNrcyxhcHBEYXRhKTsKLQotICAgICAgICAgIGlmICh2cHBfY21wX2luZGV4ID49IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgaG5kX2luZGV4ID0gZ2V0X2NvbXBfaGFuZGxlX2luZGV4KCJPTVgucXRpLnZkZWMudnBwIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBobmRfaW5kZXggPSBnZXRfY29tcF9oYW5kbGVfaW5kZXgob3B0Q29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYoaG5kX2luZGV4ID49IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgY29yZVtjbXBfaW5kZXhdLmluc3RbaG5kX2luZGV4XT0gKmhhbmRsZSA9IChPTVhfSEFORExFVFlQRSkgaENvbXA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19QUklOVCgiT01YX0dldEhhbmRsZTpOTyBmcmVlIHNsb3QgYXZhaWxhYmxlIHRvIHN0b3JlIENvbXBvbmVudCBIYW5kbGVcbiIpOwotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2tfY29yZSk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgIH0KLSAgICAgICAgICBERUJVR19QUklOVCgiQ29tcG9uZW50ICVwIFN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4iLCpoYW5kbGUpOwotICAgICAgICAgIGlmKCFzdHJjbXAoY29yZVtjbXBfaW5kZXhdLnNvX2xpYl9uYW1lLCJsaWJPbXhXbWFEZWMuc28iKSAgfHwKLSAgICAgICAgICAgICAhc3RyY21wKGNvcmVbY21wX2luZGV4XS5zb19saWJfbmFtZSwibGliT214QWFjRGVjLnNvIikgIHx8Ci0gICAgICAgICAgICAgIXN0cmNtcChjb3JlW2NtcF9pbmRleF0uc29fbGliX25hbWUsImxpYk9teEc3MTFEZWMuc28iKSAgfHwKLSAgICAgICAgICAgICAhc3RyY21wKGNvcmVbY21wX2luZGV4XS5zb19saWJfbmFtZSwibGliT214QWxhY0RlYy5zbyIpIHx8Ci0gICAgICAgICAgICAgIXN0cmNtcChjb3JlW2NtcF9pbmRleF0uc29fbGliX25hbWUsImxpYk9teEFwZURlYy5zbyIpKSB7Ci0KLSAgICAgICAgICAgICBudW1iZXJfb2ZfYWRlY19udF9zZXNzaW9uKys7Ci0gICAgICAgICAgICAgREVCVUdfUFJJTlQoIk9NWF9HZXRIYW5kbGU6IG51bWJlcl9vZl9hZGVjX250X3Nlc3Npb24gOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2FkZWNfbnRfc2Vzc2lvbik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgREVCVUdfUFJJTlQoIkNvbXBvbmVudCBDcmVhdGlvbiBmYWlsZWRcbiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZDsKLSAgICAgICAgREVCVUdfUFJJTlQoImxpYnJhcnkgY291bGRudCByZXR1cm4gY3JlYXRlIGluc3RhbmNlIGZuXG4iKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZVJldCA9IE9NWF9FcnJvck5vdEltcGxlbWVudGVkOwotICAgICAgREVCVUdfUFJJTlQoIkVSUk9SOiBBbHJlYWR5IGFub3RoZXIgaW5zdGFuY2UgYWN0aXZlICA7cmVqZWN0aW5nIFxuIik7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIGVSZXQgPSAgT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIERFQlVHX1BSSU5UKCJcbiBPTVhfR2V0SGFuZGxlOiBOVUxMIGhhbmRsZSBcbiIpOwotICB9Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2NrX2NvcmUpOwotICByZXR1cm4gZVJldDsKLX0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OCi0gIE9NWF9GcmVlSGFuZGxlCi0KLURFU0NSSVBUSU9OCi0gIERlc3RydWN0cyB0aGUgY29tcG9uZW50IGhhbmRsZXMuCi0KLVBBUkFNRVRFUlMKLSAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgRXJyb3IgTm9uZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZCi1PTVhfRnJlZUhhbmRsZShPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXApCi17Ci0gIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gIGludCBlcnIgPSAwLCBpID0gMDsKLSAgREVCVUdfUFJJTlQoIk9NWENPUkUgQVBJIDogIEZyZWVIYW5kbGUgJXBcbiIsIGhDb21wKTsKLQotICAvLyAwLiBDaGVjayB0aGF0IHdlIGhhdmUgYW4gYWN0aXZlIGluc3RhbmNlCi0gIGlmKChpPWlzX2NtcF9oYW5kbGVfZXhpc3RzKGhDb21wKSkgPj0wKQotICB7Ci0gICAgLy8gMS4gRGVsZXRlIHRoZSBjb21wb25lbnQKLSAgICBpZiAoKGVSZXQgPSBxY19vbXhfY29tcG9uZW50X2RlaW5pdChoQ29tcCkpID09IE9NWF9FcnJvck5vbmUpCi0gICAgewotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmxvY2tfY29yZSk7Ci0gICAgICAgIGNsZWFyX2NtcF9oYW5kbGUoaENvbXApOwotICAgICAgICAvKiBVbmxvYWQgY29tcG9uZW50IGxpYnJhcnkgKi8KLSAgICBpZiggKGkgPCAoaW50KVNJWkVfT0ZfQ09SRSkgJiYgY29yZVtpXS5zb19saWJfaGFuZGxlKQotICAgIHsKLSAgICAgICAgICAgaWYoY2hlY2tfbGliX3VubG9hZChpKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiIFVubG9hZGluZyB0aGUgZHluYW1pYyBsaWJyYXJ5IGZvciAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlW2ldLm5hbWUpOwotICAgICAgICAgICAgICBlcnIgPSBkbGNsb3NlKGNvcmVbaV0uc29fbGliX2hhbmRsZSk7Ci0gICAgICAgICAgICAgIGlmKGVycikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVycm9yICVkIGluIGRsY2xvc2Ugb2YgbGliICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixjb3JlW2ldLm5hbWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNvcmVbaV0uc29fbGliX2hhbmRsZSA9IE5VTEw7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYoIXN0cmNtcChjb3JlW2ldLnNvX2xpYl9uYW1lLCJsaWJPbXhXbWFEZWMuc28iKSAgfHwKLSAgICAgICAgICAgICAgIXN0cmNtcChjb3JlW2ldLnNvX2xpYl9uYW1lLCJsaWJPbXhBYWNEZWMuc28iKSAgfHwKLSAgICAgICAgICAgICAgIXN0cmNtcChjb3JlW2ldLnNvX2xpYl9uYW1lLCJsaWJPbXhBbGFjRGVjLnNvIikgfHwKLSAgICAgICAgICAgICAgIXN0cmNtcChjb3JlW2ldLnNvX2xpYl9uYW1lLCJsaWJPbXhBcGVEZWMuc28iKSkgewotICAgICAgICAgICAgICAgaWYobnVtYmVyX29mX2FkZWNfbnRfc2Vzc2lvbj4wKQotICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9hZGVjX250X3Nlc3Npb24tLTsKLSAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJPTVhfRnJlZUhhbmRsZTogcmVkdWNlZCBudW1iZXJfb2ZfYWRlY19udF9zZXNzaW9uICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfYWRlY19udF9zZXNzaW9uKTsKLSAgICAgICAgICAgfQotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja19jb3JlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlQoIiBPTVhfRnJlZUhhbmRsZSBmYWlsZWQgb24gJXBcbiIsIGhDb21wKTsKLSAgICAgICAgcmV0dXJuIGVSZXQ7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIERFQlVHX1BSSU5UX0VSUk9SKCJPTVhDT1JFIFdhcm5pbmc6IEZyZWUgSGFuZGxlIGNhbGxlZCB3aXRoIG5vIGFjdGl2ZSBpbnN0YW5jZXNcbiIpOwotICB9Ci0gIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04KLSAgT01YX1NldHVwVHVubmVsCi0KLURFU0NSSVBUSU9OCi0gIE5vdCBJbXBsZW1lbnRlZC4KLQotUEFSQU1FVEVSUwotICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICBOb25lLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkKLU9NWF9TZXR1cFR1bm5lbChPTVhfSU4gT01YX0hBTkRMRVRZUEUgb3V0cHV0Q29tcG9uZW50LAotICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgIG91dHB1dFBvcnQsCi0gICAgICAgICAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICBpbnB1dENvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgaW5wdXRQb3J0KQotewotICAodm9pZCkgb3V0cHV0Q29tcG9uZW50LCAodm9pZCkgb3V0cHV0UG9ydCwgKHZvaWQpIGlucHV0Q29tcG9uZW50LCAodm9pZCkgaW5wdXRQb3J0OwotICAvKiBOb3Qgc3VwcG9ydGVkIHJpZ2h0IG5vdyAqLwotICBERUJVR19QUklOVCgiT01YQ09SRSBBUEk6IE9NWF9TZXR1cFR1bm5lbCBOb3QgaW1wbGVtZW50ZWQgXG4iKTsKLSAgcmV0dXJuIE9NWF9FcnJvck5vdEltcGxlbWVudGVkOwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04KLSAgT01YX0dldENvbnRlbnRQaXBlCi0KLURFU0NSSVBUSU9OCi0gIE5vdCBJbXBsZW1lbnRlZC4KLQotUEFSQU1FVEVSUwotICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICBOb25lLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRQotT01YX0dldENvbnRlbnRQaXBlKE9NWF9PVVQgT01YX0hBTkRMRVRZUEUqIHBpcGUsCi0gICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICAgIHVyaSkKLXsKLSAgKHZvaWQpIHBpcGUsICh2b2lkKSB1cmk7Ci0gIC8qIE5vdCBzdXBwb3J0ZWQgcmlnaHQgbm93ICovCi0gIERFQlVHX1BSSU5UKCJPTVhDT1JFIEFQSTogT01YX0dldENvbnRlbnRQaXBlIE5vdCBpbXBsZW1lbnRlZCBcbiIpOwotICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OCi0gIE9NWF9HZXRDb21wb25lbnROYW1lRW51bQotCi1ERVNDUklQVElPTgotICBSZXR1cm5zIHRoZSBjb21wb25lbnQgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGluZGV4LgotCi1QQVJBTUVURVJTCi0gIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gIE5vbmUuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWQotT01YX0NvbXBvbmVudE5hbWVFbnVtKE9NWF9PVVQgT01YX1NUUklORyBjb21wb25lbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiAgT01YX1UzMiAgICAgICAgICBuYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiAgT01YX1UzMiAgICAgICAgICAgIGluZGV4KQotewotICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICBERUJVR19QUklOVCgiT01YQ09SRSBBUEkgLSBPTVhfQ29tcG9uZW50TmFtZUVudW0gJXAgJWQgJWRcbiIsIGNvbXBvbmVudE5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCh1bnNpZ25lZCluYW1lTGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwodW5zaWduZWQpaW5kZXgpOwotICBpZihpbmRleCA8IFNJWkVfT0ZfQ09SRSkKLSAgewotICAgICNpZmRlZiBfQU5EUk9JRF8KLSAgICBzdHJsY3B5KGNvbXBvbmVudE5hbWUsIGNvcmVbaW5kZXhdLm5hbWUsbmFtZUxlbik7Ci0gICAgI2Vsc2UKLSAgICBzdHJuY3B5KGNvbXBvbmVudE5hbWUsIGNvcmVbaW5kZXhdLm5hbWUsbmFtZUxlbik7Ci0gICAgI2VuZGlmCi0gIH0KLSAgZWxzZQotICB7Ci0gICAgZVJldCA9IE9NWF9FcnJvck5vTW9yZTsKLSAgfQotICByZXR1cm4gZVJldDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04KLSAgT01YX0dldENvbXBvbmVudHNPZlJvbGUKLQotREVTQ1JJUFRJT04KLSAgUmV0dXJucyB0aGUgY29tcG9uZW50IG5hbWUgd2hpY2ggY2FuIGZ1bGZpbGwgdGhlIHJvbGVzIHBhc3NlZCBpbiB0aGUKLSAgYXJndW1lbnQuCi0KLVBBUkFNRVRFUlMKLSAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgTm9uZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUKLU9NWF9HZXRDb21wb25lbnRzT2ZSb2xlKE9NWF9JTiBPTVhfU1RSSU5HICAgICAgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfVTMyKiBudW1Db21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfVTgqKiBjb21wTmFtZXMpCi17Ci0gIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gIHVuc2lnbmVkIGksaixuYW1lY291bnQ9MDsKLQotICBwcmludGYoIiBJbnNpZGUgT01YX0dldENvbXBvbmVudHNPZlJvbGUgXG4iKTsKLQotICAvKklmIENvbXBOYW1lcyBpcyBOVUxMIHRoZW4gcmV0dXJuKi8KLSAgaWYgKGNvbXBOYW1lcyA9PSBOVUxMKQotICB7Ci0gICAgICBpZiAobnVtQ29tcHMgPT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgfQotICAgICAgZWxzZQotICB7Ci0gICAgKm51bUNvbXBzICAgICAgICAgID0gMDsKLSAgICBmb3IgKGk9MDsgaTxTSVpFX09GX0NPUkU7aSsrKQotICAgIHsKLSAgICAgIGZvcihqPTA7IGo8T01YX0NPUkVfTUFYX0NNUF9ST0xFUyAmJiBjb3JlW2ldLnJvbGVzW2pdIDsgaisrKQotICAgICAgewotICAgICAgICBpZighc3RyY21wKHJvbGUsY29yZVtpXS5yb2xlc1tqXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICgqbnVtQ29tcHMpKys7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZVJldDsKLSAgfQotCi0gIGlmKG51bUNvbXBzKQotICB7Ci0gICAgICBuYW1lY291bnQgPSAqbnVtQ29tcHM7Ci0KLSAgICAgIGlmIChuYW1lY291bnQgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgfQotCi0gICAgKm51bUNvbXBzICAgICAgICAgID0gMDsKLQotICAgIGZvciAoaT0wOyBpPFNJWkVfT0ZfQ09SRTtpKyspCi0gICAgewotICAgICAgZm9yKGo9MDsgajxPTVhfQ09SRV9NQVhfQ01QX1JPTEVTICYmIGNvcmVbaV0ucm9sZXNbal0gOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGlmKCFzdHJjbXAocm9sZSxjb3JlW2ldLnJvbGVzW2pdKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAjaWZkZWYgX0FORFJPSURfCi0gICAgICAgICAgICBzdHJsY3B5KChjaGFyICopY29tcE5hbWVzWypudW1Db21wc10sY29yZVtpXS5uYW1lLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgICAgICAjZWxzZQotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKWNvbXBOYW1lc1sqbnVtQ29tcHNdLGNvcmVbaV0ubmFtZSwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgKCpudW1Db21wcykrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgICAgIGlmICgqbnVtQ29tcHMgPT0gbmFtZWNvdW50KQotICAgICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICB9Ci0KLSAgcHJpbnRmKCIgTGVhdmluZyBPTVhfR2V0Q29tcG9uZW50c09mUm9sZSBcbiIpOwotICByZXR1cm4gZVJldDsKLX0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OCi0gIE9NWF9HZXRSb2xlc09mQ29tcG9uZW50Ci0KLURFU0NSSVBUSU9OCi0gIFJldHVybnMgdGhlIHByaW1hcnkgcm9sZSBvZiB0aGUgY29tcG9uZW50cyBzdXBwb3J0ZWQuCi0KLVBBUkFNRVRFUlMKLSAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgTm9uZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUKLU9NWF9HZXRSb2xlc09mQ29tcG9uZW50KE9NWF9JTiBPTVhfU1RSSU5HIGNvbXBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9VMzIqIG51bVJvbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX09VVCBPTVhfVTgqKiByb2xlcykKLXsKLSAgLyogTm90IHN1cHBvcnRlZCByaWdodCBub3cgKi8KLSAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgdW5zaWduZWQgaSxqLG51bW9mcm9sZXMgPSAwOzsKLSAgREVCVUdfUFJJTlQoIkdldFJvbGVzT2ZDb21wb25lbnQgJXNcbiIsY29tcE5hbWUpOwotCi0gIGlmIChyb2xlcyA9PSBOVUxMKQotICB7Ci0gICAgICBpZiAobnVtUm9sZXMgPT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAqbnVtUm9sZXMgPSAwOwotICAgICAgICAgZm9yKGk9MDsgaTwgU0laRV9PRl9DT1JFOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgIGlmKCFzdHJjbXAoY29tcE5hbWUsY29yZVtpXS5uYW1lKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGZvcihqPTA7IChqPE9NWF9DT1JFX01BWF9DTVBfUk9MRVMpICYmIGNvcmVbaV0ucm9sZXNbal07aisrKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKm51bVJvbGVzKSsrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICByZXR1cm4gZVJldDsKLSAgfQotCi0gIGlmKG51bVJvbGVzKQotICB7Ci0gICAgaWYgKCpudW1Sb2xlcyA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBudW1vZnJvbGVzID0gKm51bVJvbGVzOwotICAgICpudW1Sb2xlcyA9IDA7Ci0gICAgZm9yKGk9MDsgaTwgU0laRV9PRl9DT1JFOyBpKyspCi0gICAgewotICAgICAgaWYoIXN0cmNtcChjb21wTmFtZSxjb3JlW2ldLm5hbWUpKQotICAgICAgewotICAgICAgICBmb3Ioaj0wOyAoajxPTVhfQ09SRV9NQVhfQ01QX1JPTEVTKSAmJiBjb3JlW2ldLnJvbGVzW2pdO2orKykKLSAgICAgICAgewotICAgICAgICAgIGlmKHJvbGVzICYmIHJvbGVzWypudW1Sb2xlc10pCi0gICAgICAgICAgewotICAgICAgICAgICAgI2lmZGVmIF9BTkRST0lEXwotICAgICAgICAgICAgc3RybGNweSgoY2hhciAqKXJvbGVzWypudW1Sb2xlc10sY29yZVtpXS5yb2xlc1tqXSxPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgICAgICAjZWxzZQotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXJvbGVzWypudW1Sb2xlc10sY29yZVtpXS5yb2xlc1tqXSxPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICB9Ci0gICAgICAgICAgKCpudW1Sb2xlcykrKzsKLSAgICAgICAgICBpZiAobnVtb2Zyb2xlcyA9PSAqbnVtUm9sZXMpCi0gICAgICAgICAgewotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIERFQlVHX1BSSU5UKCJFUlJPUjogQm90aCBSb2xlcyBhbmQgbnVtUm9sZXMgSW52YWxpZFxuIik7Ci0gICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgfQotICByZXR1cm4gZVJldDsKLX0KLQotT01YX0FQSSBPTVhfQk9PTAotT01YQ29uZmlnUGFyc2VyKAotICAgIE9NWF9QVFIgYUlucHV0UGFyYW1ldGVycywKLSAgICBPTVhfUFRSIGFPdXRwdXRQYXJhbWV0ZXJzKQotewotICAgIE9NWF9CT09MIFN0YXR1cyA9IE9NWF9UUlVFOwotICAgIFZpZGVvT01YQ29uZmlnUGFyc2VyT3V0cHV0cyAqYU9teE91dHB1dFBhcmFtZXRlcnM7Ci0gICAgT01YQ29uZmlnUGFyc2VySW5wdXRzICphT214SW5wdXRQYXJhbWV0ZXJzOwotICAgIGFPbXhPdXRwdXRQYXJhbWV0ZXJzID0gKFZpZGVvT01YQ29uZmlnUGFyc2VyT3V0cHV0cyAqKWFPdXRwdXRQYXJhbWV0ZXJzOwotICAgIGFPbXhJbnB1dFBhcmFtZXRlcnMgPSAoT01YQ29uZmlnUGFyc2VySW5wdXRzICopYUlucHV0UGFyYW1ldGVyczsKLQotICAgIGFPbXhPdXRwdXRQYXJhbWV0ZXJzLT53aWR0aCA9IDE3NjsgLy9zZXR0aW5nIHdpZHRoIHRvIFFDSUYKLSAgICBhT214T3V0cHV0UGFyYW1ldGVycy0+aGVpZ2h0ID0gMTQ0OyAvL3NldHRpbmcgaGVpZ2h0IHRvIFFDSUYKLQotICAgIC8vVE9ETwotICAgIC8vUWNvbSBjb21wb25lbnQgZG8gbm90IHVzZSB0aGUgbGV2ZWwvcHJvZmlsZSBmcm9tIElMIGNsaWVudCAuVGhleSBhcmUgcGFyc2luZyB0aGUgZmlyc3QgYnVmZmVyCi0gICAgLy9zZW50IGluIEVUQiBzbyBmb3Igbm93IHNldHRpbmcgdGhlIGRlZmFsdXQgdmFsdWVzIC4gR29pbmcgZmFyd2FyZCB3ZSBjYW4gY2FsbAotICAgIC8vUUMgcGFyc2VyIGhlcmUuCi0gICAgaWYgKDAgPT0gc3RyY21wKGFPbXhJbnB1dFBhcmFtZXRlcnMtPmNDb21wb25lbnRSb2xlLCAoT01YX1NUUklORykidmlkZW9fZGVjb2Rlci5hdmMiKSkKLSAgICB7Ci0gICAgICAgYU9teE91dHB1dFBhcmFtZXRlcnMtPnByb2ZpbGUgPSA2NjsgLy9taW5pbXVtIHN1cHBvcnRlZCBoMjY0IHByb2ZpbGUgLSBzZXR0aW5nIHRvIGJhc2VsaW5lIHByb2ZpbGUKLSAgICAgICBhT214T3V0cHV0UGFyYW1ldGVycy0+bGV2ZWwgPSAwOyAgLy8gbWluaW11bSBzdXBwb3J0ZWQgaDI2NCBsZXZlbAotICAgIH0KLSAgICBlbHNlIGlmICgoMCA9PSBzdHJjbXAoYU9teElucHV0UGFyYW1ldGVycy0+Y0NvbXBvbmVudFJvbGUsIChPTVhfU1RSSU5HKSJ2aWRlb19kZWNvZGVyLm1wZWc0IikpIHx8ICgwID09IHN0cmNtcChhT214SW5wdXRQYXJhbWV0ZXJzIC0+Y0NvbXBvbmVudFJvbGUsIChPTVhfU1RSSU5HKSJ2aWRlb19kZWNvZGVyLmgyNjMiKSkpCi0gICAgewotICAgICAgIGFPbXhPdXRwdXRQYXJhbWV0ZXJzLT5wcm9maWxlID0gODsgLy9taW5pbXVtIHN1cHBvcnRlZCBoMjYzL21wZWc0IHByb2ZpbGUKLSAgICAgICBhT214T3V0cHV0UGFyYW1ldGVycy0+bGV2ZWwgPSAwOyAvLyBtaW5pbXVtIHN1cHBvcnRlZCBoMjYzL21wZWc0IGxldmVsCi0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL3NyYy9jb21tb24vcWNfb214X2NvcmUuaCBiL3NkbTg0NS9tbS1jb3JlL3NyYy9jb21tb24vcWNfb214X2NvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhMTc3Ni4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9zcmMvY29tbW9uL3FjX29teF9jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gTSBBIFggICB3IHIgYSBwIHAgZSByIHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiAgTSBBIFggICBDIG8gciBlCi0KLSBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIE9wZW5NQVggY29yZS4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpZm5kZWYgUUNfT01YX0NPUkVfSAotI2RlZmluZSBRQ19PTVhfQ09SRV9ICi0KLSNpbmNsdWRlICJxY19vbXhfY29tbW9uLmgiICAgICAgICAvLyBPTVggQVBJCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgT01YX0NPTVBfTUFYX0lOU1QgMTYKLQotdHlwZWRlZiBzdHJ1Y3QgX29teF9jb3JlX2NiX3R5cGUKLXsKLSAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsvLyBDb21wb25lbnQgbmFtZQotICBjcmVhdGVfcWNfb214X2NvbXBvbmVudCAgICAgZm5fcHRyOy8vIGNyZWF0ZSBpbnN0YW5jZSBmbiBwdHIKLSAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgaW5zdFtPTVhfQ09NUF9NQVhfSU5TVF07Ly8gSW5zdGFuY2UgaGFuZGxlCi0gIHZvaWQqICAgICAgICAgICAgICAgIHNvX2xpYl9oYW5kbGU7Ly8gU28gTGlicmFyeSBoYW5kbGUKLSAgY2hhciogICAgICAgICAgICAgICAgICBzb19saWJfbmFtZTsvLyBzbyBkaXJlY3RvcnkKLSAgY2hhciogcm9sZXNbT01YX0NPUkVfTUFYX0NNUF9ST0xFU107Ly8gcm9sZXMgcGxheWVkCi19b214X2NvcmVfY2JfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBPTVhfVTMyIHdpZHRoOwotICAgIE9NWF9VMzIgaGVpZ2h0OwotICAgIE9NWF9VMzIgcHJvZmlsZTsKLSAgICBPTVhfVTMyIGxldmVsOwotfSBWaWRlb09NWENvbmZpZ1BhcnNlck91dHB1dHM7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBPTVhfVTgqIGluUHRyOyAgICAgICAgICAgICAvL3BvaW50ZXIgdG8gY29kZWMgY29uZmlndXJhdGlvbiBoZWFkZXIKLSAgICBPTVhfVTMyIGluQnl0ZXM7ICAgICAgICAgICAvL2xlbmd0aCBvZiBjb2RlYyBjb25maWd1cmF0aW9uIGhlYWRlcgotICAgIE9NWF9TVFJJTkcgY0NvbXBvbmVudFJvbGU7IC8vT01YIGNvbXBvbmVudCBjb2RlYyB0eXBlCi0gICAgT01YX1NUUklORyBjQ29tcG9uZW50TmFtZTsgIC8vT01YIGNvbXBvbmVudCBuYW1lCi19IE9NWENvbmZpZ1BhcnNlcklucHV0czsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL3NyYy9kZWZhdWx0L3FjX3JlZ2lzdHJ5X3RhYmxlLmMgYi9zZG04NDUvbW0tY29yZS9zcmMvZGVmYXVsdC9xY19yZWdpc3RyeV90YWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDBhYjU2Li4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL3NyYy9kZWZhdWx0L3FjX3JlZ2lzdHJ5X3RhYmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gTSBBIFggICB3IHIgYSBwIHAgZSByIHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiAgTSBBIFggICBDIG8gciBlCi0KLSBUaGlzIG1vZHVsZSBjb250YWlucyBhIGR1bW15IHJlZ2lzdHJ5IHRhYmxlIGZvciB0aGUgUUNPTSdzIE9wZW5NQVggY29yZQotIHdpdGggcGxhY2Vob2xkZXJzIGZvciBhY3R1YWwgdmFsdWVzCi0KLSovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaW5jbHVkZSAicWNfb214X2NvcmUuaCIKLQotb214X2NvcmVfY2JfdHlwZSBjb3JlW10gPQotewotICB7Ci0gICAgIk9NWC5xY29tLnh4eC55eXkuenp6IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAjaWZkZWYgX0FORFJPSURfCi0gICAgImFiYy5zbyIsCi0gICAgI2Vsc2UKLSAgICAiZWZnLnNvLjEiLAotICAgICNlbmRpZgotICAgIHsKLSAgICAgICJpamsubG1uIgotICAgIH0KLSAgfQotfTsKLQotY29uc3QgdW5zaWduZWQgaW50IFNJWkVfT0ZfQ09SRSA9IHNpemVvZihjb3JlKSAvIHNpemVvZihvbXhfY29yZV9jYl90eXBlKTsKLQotCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9zcmMvZGVmYXVsdC9xY19yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMgYi9zZG04NDUvbW0tY29yZS9zcmMvZGVmYXVsdC9xY19yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjE3MGMuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvc3JjL2RlZmF1bHQvcWNfcmVnaXN0cnlfdGFibGVfYW5kcm9pZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yCi0gICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTi1JTkZSSU5HRU1FTlQgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuIE0gQSBYICAgdyByIGEgcCBwIGUgciBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gIE0gQSBYICAgQyBvIHIgZQotCi0gIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgZHVtbXkgcmVnaXN0cnkgdGFibGUgZm9yIHRoZSBRQ09NJ3MgT3Blbk1BWCBjb3JlCi0gIHdpdGggcGxhY2Vob2xkZXJzIGZvciBhY3R1YWwgdmFsdWVzCi0KLSovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0KLSNpbmNsdWRlICJxY19vbXhfY29yZS5oIgotCi1vbXhfY29yZV9jYl90eXBlIGNvcmVbXSA9Ci17Ci0gIHsKLSAgICAiT01YLnFjb20ueHh4Lnl5eS56enoiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAiYWJjLnNvIiwKLSAgICB7Ci0gICAgICAiZWZnLmlqayIKLSAgICB9Ci0gIH0KLX07Ci0KLWNvbnN0IHVuc2lnbmVkIGludCBTSVpFX09GX0NPUkUgPSBzaXplb2YoY29yZSkgLyBzaXplb2Yob214X2NvcmVfY2JfdHlwZSk7Ci0KLQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvc3JjL21zbTg5NTMvcmVnaXN0cnlfdGFibGUuYyBiL3NkbTg0NS9tbS1jb3JlL3NyYy9tc204OTUzL3JlZ2lzdHJ5X3RhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmZWI0ODMuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvc3JjL21zbTg5NTMvcmVnaXN0cnlfdGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDcyMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLVdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi1BUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi1CRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi1CVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi1PUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi1JRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiBNIEEgWCAgIHcgciBhIHAgcCBlIHIgcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuICBNIEEgWCAgIEMgbyByIGUKLQotIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSByZWdpc3RyeSB0YWJsZSBmb3IgdGhlIFFUSSdzIE9wZW5NQVggY29yZS4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJxY19vbXhfY29yZS5oIgotCi1vbXhfY29yZV9jYl90eXBlIGNvcmVbXSA9Ci17Ci0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzQiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5tcGVnNCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNC5zZWN1cmUiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5tcGVnNCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMiIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5tcGVnMiIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMi5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudmMxIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudmMxIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZjMS5zZWN1cmUiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIud212IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudmMxIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLndtdi5zZWN1cmUiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmZpbGUubXV4ZXIiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotCi0gICAgImxpYk9teE11eC5zbyIsCi0gICAgewotICAgICAgImNvbnRhaW5lcl9tdXhlci5tcDIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmZpbGUubXV4ZXIiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhNdXguc28iLAotICAgIHsKLSAgICAgICJjb250YWluZXJfbXV4ZXIubXA0IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmRpdng0IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5kaXZ4IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5kaXZ4MzExIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oMjYzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaDI2MyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oZXZjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDgiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cDgiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA5IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnA5IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFtcndiIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QW1yRGVjLnNvIiwKLSAgICB7Ci0gICAgICJhdWRpb19kZWNvZGVyLmFtcndiIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFtcm5iIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QW1yRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hbXJuYiIKLSAgICB9Ci0gIH0sCi0gICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzQiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5tcGVnNCIKLSAgICB9Ci0gIH0sCi0gICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaDI2MyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmgyNjMiLAotICAgIH0KLSAgfSwKLSAgIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5hdmMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLnZwOCIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLnZwOCIsCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkudmlkZW8uZW5jb2Rlci5oZXZjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214U3dWZW5jSGV2Yy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oZXZjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oZXZjLnNlY3VyZSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmhldmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuUWNlbHAxMyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhRY2VscDEzRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5RY2VscDEzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmV2cmMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RXZyY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZXZyYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci53bWEiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYTEwUHJvIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFtcndicGx1cyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QW1yd2JwbHVzRGVjLnNvIiwKLSAgICB7Ci0gICAgICJhdWRpb19kZWNvZGVyLmF3YnBsdXMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYWxhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFsYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFsYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuZzcxMW1sYXciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhHNzExRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5nNzExIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmc3MTFhbGF3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RzcxMURlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZzcxMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS5hdWRpby5kZWNvZGVyLmFsYWMuc3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbGFjRGVjU3cuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFsYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYXBlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QXBlRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hcGUiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkuYXVkaW8uZGVjb2Rlci5hcGUuc3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBcGVEZWNTdy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYXBlIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLmF1ZGlvLmRlY29kZXIuZmxhYy5zdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEZsYWNEZWNTdy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZmxhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hYWMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5xY2VscDEzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214UWNlbHAxM0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIucWNlbHAxMyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5ldnJjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RXZyY0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuZXZyYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hbXJuYiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYW1ybmIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuYW1yd2IiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbXJFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmFtcndiIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmc3MTFtbGF3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RzcxMUVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuZzcxMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5nNzExYWxhdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEc3MTFFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmc3MTEiCi0gICAgfQotICB9LAotIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5tdWx0aWFhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZkZWMudnBwIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZwcC5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnBwIgotICAgIH0KLSAgfQotfTsKLQotY29uc3QgdW5zaWduZWQgaW50IFNJWkVfT0ZfQ09SRSA9IHNpemVvZihjb3JlKSAvIHNpemVvZihvbXhfY29yZV9jYl90eXBlKTsKLQotCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9zcmMvbXNtODk1My9yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMgYi9zZG04NDUvbW0tY29yZS9zcmMvbXNtODk1My9yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjYWIyZGYuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvc3JjL21zbTg5NTMvcmVnaXN0cnlfdGFibGVfYW5kcm9pZC5jCisrKyAvZGV2L251bGwKQEAgLTEsODEyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLU9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLUlGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuIE0gQSBYICAgdyByIGEgcCBwIGUgciBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gIE0gQSBYICAgQyBvIHIgZQotCi0gIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSByZWdpc3RyeSB0YWJsZSBmb3IgdGhlIFFUSSdzIE9wZW5NQVggY29yZS4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotI2luY2x1ZGUgInFjX29teF9jb3JlLmgiCi0KLW9teF9jb3JlX2NiX3R5cGUgY29yZVtdID0KLXsKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2YyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjLnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuZGl2eDQiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5kaXZ4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmRpdngiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5kaXZ4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmRpdngzMTEiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5kaXZ4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWc0IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWc0LnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5tcGVnNCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMiIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5tcGVnMiIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMi5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudmMxIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52YzEuc2VjdXJlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci53bXYiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudmMxIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLndtdi5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudmMxIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmgyNjMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaDI2MyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oZXZjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oZXZjLnNlY3VyZSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmhldmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA4IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwOCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDkiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cDkiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA4LnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cDgiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA5LnNlY3VyZSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwOSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hbXJuYiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckRlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYW1ybmIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYW1yd2IiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbXJEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFtcndiIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLm1wZWc0IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLm1wZWc0IgotICAgIH0KLSAgfSwKLSAgIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oMjYzIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmgyNjMiCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5hdmMiCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2Yy5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLXsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci52cDgiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIudnA4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZpZGVvLmVuY29kZXIuaGV2YyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmVuY0hldmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmhldmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaGV2YyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmhldmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaGV2Yy5zZWN1cmUiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLlFjZWxwMTMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214UWNlbHAxM0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuUWNlbHAxMyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5ldnJjIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEV2cmNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmV2cmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIud21hIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214V21hRGVjLnNvIiwKLSAgICB7Ci0gICAgICJhdWRpb19kZWNvZGVyLndtYSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hbXJ3YnBsdXMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtcndicGx1c0RlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci5hd2JwbHVzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYTEwUHJvIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYUxvc3NMZXNzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFsYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbGFjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hbGFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmc3MTFtbGF3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RzcxMURlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZzcxMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5nNzExYWxhdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEc3MTFEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmc3MTEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkuYXVkaW8uZGVjb2Rlci5hbGFjLnN3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWxhY0RlY1N3LnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hbGFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFwZSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFwZURlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYXBlIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLmF1ZGlvLmRlY29kZXIuYXBlLnN3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QXBlRGVjU3cuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFwZSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS5hdWRpby5kZWNvZGVyLmZsYWMuc3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhGbGFjRGVjU3cuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmZsYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuYWFjIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWFjRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5hYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIucWNlbHAxMyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFFjZWxwMTNFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLnFjZWxwMTMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuZXZyYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEV2cmNFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmV2cmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmVuY29kZXIuYW1ybmIiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbXJFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmFtcm5iIgotICAgIH0KLSAgfSwKLXsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hbXJ3YiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYW1yd2IiCi0gICAgfQotICB9LAotewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmc3MTFtbGF3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RzcxMUVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuZzcxMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5nNzExYWxhdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEc3MTFFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmc3MTEiCi0gICAgfQotICB9LAotIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLm11bHRpYWFjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWFjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIkFJVi5wbGF5IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliQWl2UGxheS5zbyIsCi0gICAgewotICAgICAgIkFJVi5wbGF5LjEwMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uZmlsZS5tdXhlciIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhNdXguc28iLAotICAgIHsKLSAgICAgICJjb250YWluZXJfbXV4ZXIubXAyIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5maWxlLm11eGVyIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214TXV4LnNvIiwKLSAgICB7Ci0gICAgICAiY29udGFpbmVyX211eGVyLm1wNCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52ZGVjLnZwcCIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWcHAuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwcCIKLSAgICB9Ci0gIH0KLX07Ci0KLWNvbnN0IHVuc2lnbmVkIGludCBTSVpFX09GX0NPUkUgPSBzaXplb2YoY29yZSkgLyBzaXplb2Yob214X2NvcmVfY2JfdHlwZSk7Ci0KLQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvc3JjL21zbTg5OTgvcmVnaXN0cnlfdGFibGUuYyBiL3NkbTg0NS9tbS1jb3JlL3NyYy9tc204OTk4L3JlZ2lzdHJ5X3RhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDM3MWUuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvc3JjL21zbTg5OTgvcmVnaXN0cnlfdGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTYgLSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLU9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLUlGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuIE0gQSBYICAgdyByIGEgcCBwIGUgciBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gIE0gQSBYICAgQyBvIHIgZQotCi0gVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIHJlZ2lzdHJ5IHRhYmxlIGZvciB0aGUgT3Blbk1BWCBjb3JlLgotCi0qLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2luY2x1ZGUgInFjX29teF9jb3JlLmgiCi0KLW9teF9jb3JlX2NiX3R5cGUgY29yZVtdID0KLXsKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2YyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMuZHNtb2RlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmlkZW9EU01vZGUuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNCIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZjMSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci53bXYiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmZpbGUubXV4ZXIiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotCi0gICAgImxpYk9teE11eC5zbyIsCi0gICAgewotICAgICAgImNvbnRhaW5lcl9tdXhlci5tcDIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuZGl2eDQiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5kaXZ4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmRpdngiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5kaXZ4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmRpdngzMTEiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5kaXZ4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmgyNjMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5oMjYzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmhldmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOCIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwOCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDkiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cDkiCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLm1wZWc0IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmgyNjMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oMjYzIiwKLSAgICB9Ci0gIH0sCi0gICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIudnA4IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIudnA4IiwKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oZXZjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5RY2VscDEzIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFFjZWxwMTNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLlFjZWxwMTMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuZXZyYyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhFdnJjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5ldnJjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIud21hMTBQcm8iLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYWxhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFsYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFsYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYXBlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QXBlRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hcGUiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkuYXVkaW8uZGVjb2Rlci5kc2QiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhEc2REZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmRzZCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hYWMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5xY2VscDEzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214UWNlbHAxM0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIucWNlbHAxMyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5ldnJjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RXZyY0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuZXZyYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hbXJuYiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYW1ybmIiCi0gICAgfQotICB9LAotIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5tdWx0aWFhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZkZWMudnBwIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZwcC5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnBwIgotICAgIH0KLSAgfQotfTsKLQotY29uc3QgdW5zaWduZWQgaW50IFNJWkVfT0ZfQ09SRSA9IHNpemVvZihjb3JlKSAvIHNpemVvZihvbXhfY29yZV9jYl90eXBlKTsKLQotCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9zcmMvbXNtODk5OC9yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMgYi9zZG04NDUvbW0tY29yZS9zcmMvbXNtODk5OC9yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjgyMzkuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvc3JjL21zbTg5OTgvcmVnaXN0cnlfdGFibGVfYW5kcm9pZC5jCisrKyAvZGV2L251bGwKQEAgLTEsODEzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxNiAtIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi1XQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuIE0gQSBYICAgdyByIGEgcCBwIGUgciBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gIE0gQSBYICAgQyBvIHIgZQotCi0gIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSByZWdpc3RyeSB0YWJsZSBmb3IgdGhlIE9wZW5NQVggY29yZS4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotI2luY2x1ZGUgInFjX29teF9jb3JlLmgiCi0KLW9teF9jb3JlX2NiX3R5cGUgY29yZVtdID0KLXsKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2YyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjLmRzbW9kZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgICAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZpZGVvRFNNb2RlLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjLnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjLnNlY3VyZS5kc21vZGUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmlkZW9EU01vZGUuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0KLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmRpdng0IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5kaXZ4IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5kaXZ4MzExIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNCIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5tcGVnNCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNC5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzIiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzIuc2VjdXJlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWcyIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZjMSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudmMxLnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIud212IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci53bXYuc2VjdXJlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oMjYzIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmgyNjMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaGV2YyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmhldmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaGV2Yy5zZWN1cmUiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOCIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cDgiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA5IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwOSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDkuc2VjdXJlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwOSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5tcGVnNCIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5tcGVnNCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oMjYzIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmgyNjMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5hdmMuc2VjdXJlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci52cDgiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIudnA4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmhldmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmhldmMuc2VjdXJlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5RY2VscDEzIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFFjZWxwMTNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLlFjZWxwMTMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuZXZyYyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhFdnJjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5ldnJjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIud21hMTBQcm8iLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIud21hTG9zc0xlc3MiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYW1yd2JwbHVzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbXJ3YnBsdXNEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIuYXdicGx1cyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hbGFjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWxhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWxhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS5hdWRpby5kZWNvZGVyLmFsYWMuc3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFsYWNEZWNTdy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWxhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hcGUiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBcGVEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFwZSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS5hdWRpby5kZWNvZGVyLmFwZS5zdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QXBlRGVjU3cuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFwZSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS5hdWRpby5kZWNvZGVyLmRzZCIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teERzZERlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZHNkIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmFhYyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLnFjZWxwMTMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhRY2VscDEzRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5xY2VscDEzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmV2cmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhFdnJjRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5ldnJjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmFtcm5iIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QW1yRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5hbXJuYiIKLSAgICB9Ci0gIH0sCi0gewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIubXVsdGlhYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiQUlWLnBsYXkuZ2VuZXJpYyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYkFpdlBsYXkuc28iLAotICAgIHsKLSAgICAgICJBSVYucGxheS5yb2xlLmdlbmVyaWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmZpbGUubXV4ZXIiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214TXV4LnNvIiwKLSAgICB7Ci0gICAgICAiY29udGFpbmVyX211eGVyLm1wMiIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52ZGVjLnZwcCIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWcHAuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwcCIKLSAgICB9Ci0gIH0KLX07Ci0KLWNvbnN0IHVuc2lnbmVkIGludCBTSVpFX09GX0NPUkUgPSBzaXplb2YoY29yZSkgLyBzaXplb2Yob214X2NvcmVfY2JfdHlwZSk7Ci0KLQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvc3JjL3NkbTY2MC9yZWdpc3RyeV90YWJsZS5jIGIvc2RtODQ1L21tLWNvcmUvc3JjL3NkbTY2MC9yZWdpc3RyeV90YWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzBiMTI1Li4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS1jb3JlL3NyYy9zZG02NjAvcmVnaXN0cnlfdGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDU3NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTYgLSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLU9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLUlGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuIE0gQSBYICAgdyByIGEgcCBwIGUgciBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gIE0gQSBYICAgQyBvIHIgZQotCi0gVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIHJlZ2lzdHJ5IHRhYmxlIGZvciB0aGUgT3Blbk1BWCBjb3JlLgotCi0qLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2luY2x1ZGUgInFjX29teF9jb3JlLmgiCi0KLW9teF9jb3JlX2NiX3R5cGUgY29yZVtdID0KLXsKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2YyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMuZHNtb2RlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmlkZW9EU01vZGUuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNCIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZjMSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci53bXYiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmZpbGUubXV4ZXIiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotCi0gICAgImxpYk9teE11eC5zbyIsCi0gICAgewotICAgICAgImNvbnRhaW5lcl9tdXhlci5tcDIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuZGl2eDQiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5kaXZ4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmRpdngiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5kaXZ4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmRpdngzMTEiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5kaXZ4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmgyNjMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5oMjYzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmhldmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOCIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwOCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDkiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cDkiCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLm1wZWc0IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmgyNjMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oMjYzIiwKLSAgICB9Ci0gIH0sCi0gICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIudnA4IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIudnA4IiwKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oZXZjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5RY2VscDEzIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFFjZWxwMTNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLlFjZWxwMTMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuZXZyYyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhFdnJjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5ldnJjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIud21hMTBQcm8iLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYWxhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFsYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFsYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYXBlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QXBlRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hcGUiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkuYXVkaW8uZGVjb2Rlci5kc2QiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhEc2REZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmRzZCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hYWMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5xY2VscDEzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214UWNlbHAxM0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIucWNlbHAxMyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5ldnJjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RXZyY0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuZXZyYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hbXJuYiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYW1ybmIiCi0gICAgfQotICB9LAotIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5tdWx0aWFhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5wb3N0cHJvY2Vzc2luZyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZHBwLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9wb3N0cHJvY2Vzc2luZyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52ZGVjLnZwcCIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWcHAuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwcCIKLSAgICB9Ci0gIH0KLX07Ci0KLWNvbnN0IHVuc2lnbmVkIGludCBTSVpFX09GX0NPUkUgPSBzaXplb2YoY29yZSkgLyBzaXplb2Yob214X2NvcmVfY2JfdHlwZSk7Ci0KLQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLWNvcmUvc3JjL3NkbTY2MC9yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMgYi9zZG04NDUvbW0tY29yZS9zcmMvc2RtNjYwL3JlZ2lzdHJ5X3RhYmxlX2FuZHJvaWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhYzIwYi4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tY29yZS9zcmMvc2RtNjYwL3JlZ2lzdHJ5X3RhYmxlX2FuZHJvaWQuYworKysgL2Rldi9udWxsCkBAIC0xLDgyOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTYgLSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLU9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLUlGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiBNIEEgWCAgIHcgciBhIHAgcCBlIHIgcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuICBNIEEgWCAgIEMgbyByIGUKLQotICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgcmVnaXN0cnkgdGFibGUgZm9yIHRoZSBPcGVuTUFYIGNvcmUuCi0KLSovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0KLSNpbmNsdWRlICJxY19vbXhfY29yZS5oIgotCi1vbXhfY29yZV9jYl90eXBlIGNvcmVbXSA9Ci17Ci0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2Yy5kc21vZGUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgICAgICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWaWRlb0RTTW9kZS5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2Yy5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2Yy5zZWN1cmUuZHNtb2RlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZpZGVvRFNNb2RlLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5hdmMiCi0gICAgfQotICB9LAotCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5kaXZ4NCIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmRpdngiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuZGl2eCIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmRpdngiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuZGl2eDMxMSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmRpdngiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzQiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzQuc2VjdXJlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWcyIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWcyIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWcyLnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5tcGVnMiIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52YzEiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudmMxIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZjMS5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudmMxIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLndtdiIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIud212LnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaDI2MyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5oMjYzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmhldmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmhldmMuc2VjdXJlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDgiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnA4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cDkiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA5LnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cDkiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzQiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaDI2MyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oMjYzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjLnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIudnA4IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLnZwOCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oZXZjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oZXZjLnNlY3VyZSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmhldmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuUWNlbHAxMyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhRY2VscDEzRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5RY2VscDEzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmV2cmMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RXZyY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZXZyYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci53bWEiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYTEwUHJvIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYUxvc3NMZXNzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhXbWFEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIud21hIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFtcndicGx1cyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICBOVUxMLAotICAgICBOVUxMLAotICAgICBOVUxMLAotICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QW1yd2JwbHVzRGVjLnNvIiwKLSAgICB7Ci0gICAgICJhdWRpb19kZWNvZGVyLmF3YnBsdXMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYWxhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFsYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFsYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkuYXVkaW8uZGVjb2Rlci5hbGFjLnN3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbGFjRGVjU3cuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFsYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYXBlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QXBlRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hcGUiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkuYXVkaW8uZGVjb2Rlci5hcGUuc3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFwZURlY1N3LnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hcGUiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkuYXVkaW8uZGVjb2Rlci5kc2QiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhEc2REZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmRzZCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hYWMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNFbmMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19lbmNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5xY2VscDEzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214UWNlbHAxM0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIucWNlbHAxMyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5ldnJjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214RXZyY0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuZXZyYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZW5jb2Rlci5hbXJuYiIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFtckVuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYW1ybmIiCi0gICAgfQotICB9LAotIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLm11bHRpYWFjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWFjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIkFJVi5wbGF5LmdlbmVyaWMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJBaXZQbGF5LnNvIiwKLSAgICB7Ci0gICAgICAiQUlWLnBsYXkucm9sZS5nZW5lcmljIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5maWxlLm11eGVyIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teE11eC5zbyIsCi0gICAgewotICAgICAgImNvbnRhaW5lcl9tdXhlci5tcDIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLnBvc3Rwcm9jZXNzaW5nIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkcHAuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb3Bvc3Rwcm9jZXNzaW5nIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZkZWMudnBwIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZwcC5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnBwIgotICAgIH0KLSAgfQotfTsKLQotY29uc3QgdW5zaWduZWQgaW50IFNJWkVfT0ZfQ09SRSA9IHNpemVvZihjb3JlKSAvIHNpemVvZihvbXhfY29yZV9jYl90eXBlKTsKLQotCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tY29yZS9zcmMvc2RtODQ1L3JlZ2lzdHJ5X3RhYmxlLmMgYi9zZG04NDUvbW0tY29yZS9zcmMvc2RtODQ1L3JlZ2lzdHJ5X3RhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3M2RlNjguLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvc3JjL3NkbTg0NS9yZWdpc3RyeV90YWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxNiAtIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi1XQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gTSBBIFggICB3IHIgYSBwIHAgZSByIHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiAgTSBBIFggICBDIG8gciBlCi0KLSBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgcmVnaXN0cnkgdGFibGUgZm9yIHRoZSBPcGVuTUFYIGNvcmUuCi0KLSovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaW5jbHVkZSAicWNfb214X2NvcmUuaCIKLQotb214X2NvcmVfY2JfdHlwZSBjb3JlW10gPQotewotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIudmMxc3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52aWRlby5kZWNvZGVyLndtdnN3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214U3dWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmZpbGUubXV4ZXIiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotCi0gICAgImxpYk9teE11eC5zbyIsCi0gICAgewotICAgICAgImNvbnRhaW5lcl9tdXhlci5tcDIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaGV2YyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmhldmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA4IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnA4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwOSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52aWRlby5kZWNvZGVyLm1wZWc0c3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIuZGl2eHN3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214U3dWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5kaXZ4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIuZGl2eDRzdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuZGl2eCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52aWRlby5kZWNvZGVyLmgyNjNzdyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmgyNjMiCi0gICAgfQotICB9LAotICAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLm1wZWc0c3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZlbmNNcGVnNC5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaDI2M3N3IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmVuY01wZWc0LnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oMjYzIgotICAgIH0KLSAgfSwKLSAgIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5hdmMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuYXZjIgotICAgIH0KLSAgfSwKLSAgIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci52cDgiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci52cDgiLAotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmhldmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLlFjZWxwMTMiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214UWNlbHAxM0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuUWNlbHAxMyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5ldnJjIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEV2cmNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmV2cmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIud21hIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICBOVUxMLAotICAgICBOVUxMLAotICAgICBOVUxMLAotICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214V21hRGVjLnNvIiwKLSAgICB7Ci0gICAgICJhdWRpb19kZWNvZGVyLndtYSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci53bWExMFBybyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICBOVUxMLAotICAgICBOVUxMLAotICAgICBOVUxMLAotICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214V21hRGVjLnNvIiwKLSAgICB7Ci0gICAgICJhdWRpb19kZWNvZGVyLndtYSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hbGFjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWxhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWxhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hcGUiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBcGVEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFwZSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS5hdWRpby5kZWNvZGVyLmRzZCIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teERzZERlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZHNkIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmFhYyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLnFjZWxwMTMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhRY2VscDEzRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5xY2VscDEzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmV2cmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhFdnJjRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5ldnJjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmFtcm5iIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QW1yRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5hbXJuYiIKLSAgICB9Ci0gIH0sCi0gewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLm11bHRpYWFjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWFjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkudmRlYy52cHAiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VnBwLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52cHAiCi0gICAgfQotICB9Ci19OwotCi1jb25zdCB1bnNpZ25lZCBpbnQgU0laRV9PRl9DT1JFID0gc2l6ZW9mKGNvcmUpIC8gc2l6ZW9mKG9teF9jb3JlX2NiX3R5cGUpOwotCi0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS1jb3JlL3NyYy9zZG04NDUvcmVnaXN0cnlfdGFibGVfYW5kcm9pZC5jIGIvc2RtODQ1L21tLWNvcmUvc3JjL3NkbTg0NS9yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNTk1NjYuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLWNvcmUvc3JjL3NkbTg0NS9yZWdpc3RyeV90YWJsZV9hbmRyb2lkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi1XQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuIE0gQSBYICAgdyByIGEgcCBwIGUgciBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gIE0gQSBYICAgQyBvIHIgZQotCi0gIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSByZWdpc3RyeSB0YWJsZSBmb3IgdGhlIE9wZW5NQVggY29yZS4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotI2luY2x1ZGUgInFjX29teF9jb3JlLmgiCi0KLW9teF9jb3JlX2NiX3R5cGUgY29yZVtdID0KLXsKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2YyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjLnNlY3VyZSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5hdmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzIiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzIiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzIuc2VjdXJlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWcyIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIudmMxc3ciLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214U3dWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci52YzEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkudmlkZW8uZGVjb2Rlci53bXZzdyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZjMSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oZXZjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oZXZjLnNlY3VyZSIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmhldmMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA4IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwOCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDkiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnA5IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOS5zZWN1cmUiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIudnA5IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIubXBlZzRzdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIubXBlZzQiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkudmlkZW8uZGVjb2Rlci5kaXZ4c3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhTd1ZkZWMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLmRpdngiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xdGkudmlkZW8uZGVjb2Rlci5kaXZ4NHN3IiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214U3dWZGVjLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZGVjb2Rlci5kaXZ4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIuaDI2M3N3IiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmRlYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2RlY29kZXIuaDI2MyIKLSAgICB9Ci0gIH0sCi0gICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzRzdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFN3VmVuY01wZWc0LnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5tcGVnNCIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oMjYzc3ciLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214U3dWZW5jTXBlZzQuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmgyNjMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5hdmMuc2VjdXJlIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFZlbmMuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19lbmNvZGVyLmF2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20udmlkZW8uZW5jb2Rlci52cDgiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIudnA4IgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmhldmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWZW5jLnNvIiwKLSAgICB7Ci0gICAgICAidmlkZW9fZW5jb2Rlci5oZXZjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmhldmMuc2VjdXJlIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214VmVuYy5zbyIsCi0gICAgewotICAgICAgInZpZGVvX2VuY29kZXIuaGV2YyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5RY2VscDEzIiwKLSAgICBOVUxMLCAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFFjZWxwMTNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLlFjZWxwMTMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuZXZyYyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhFdnJjRGVjLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZGVjb2Rlci5ldnJjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLndtYSIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIud21hMTBQcm8iLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIud21hTG9zc0xlc3MiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTCwKLSAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teFdtYURlYy5zbyIsCi0gICAgewotICAgICAiYXVkaW9fZGVjb2Rlci53bWEiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIuYW1yd2JwbHVzIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwsCi0gICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBbXJ3YnBsdXNEZWMuc28iLAotICAgIHsKLSAgICAgImF1ZGlvX2RlY29kZXIuYXdicGx1cyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hbGFjIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QWxhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWxhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS5hdWRpby5kZWNvZGVyLmFsYWMuc3ciLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFsYWNEZWNTdy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWxhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnFjb20uYXVkaW8uZGVjb2Rlci5hcGUiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBcGVEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFwZSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS5hdWRpby5kZWNvZGVyLmFwZS5zdyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QXBlRGVjU3cuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFwZSIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS5hdWRpby5kZWNvZGVyLmRzZCIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teERzZERlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuZHNkIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmFhYyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0VuYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2VuY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLnFjZWxwMTMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhRY2VscDEzRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5xY2VscDEzIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmV2cmMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhFdnJjRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5ldnJjIgotICAgIH0KLSAgfSwKLSAgewotICAgICJPTVgucWNvbS5hdWRpby5lbmNvZGVyLmFtcm5iIiwKLSAgICBOVUxMLCAgIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214QW1yRW5jLnNvIiwKLSAgICB7Ci0gICAgICAiYXVkaW9fZW5jb2Rlci5hbXJuYiIKLSAgICB9Ci0gIH0sCi0gewotICAgICJPTVgucWNvbS5hdWRpby5kZWNvZGVyLmFhYyIsCi0gICAgTlVMTCwgICAvLyBDcmVhdGUgaW5zdGFuY2UgZnVuY3Rpb24KLSAgICAvLyBVbmlxdWUgaW5zdGFuY2UgaGFuZGxlCi0gICAgewotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0sCi0gICAgTlVMTCwgICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYk9teEFhY0RlYy5zbyIsCi0gICAgewotICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIgotICAgIH0KLSAgfSwKLSB7Ci0gICAgIk9NWC5xY29tLmF1ZGlvLmRlY29kZXIubXVsdGlhYWMiLAotICAgIE5VTEwsICAgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhBYWNEZWMuc28iLAotICAgIHsKLSAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiQUlWLnBsYXkuZ2VuZXJpYyIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAvLyBTaGFyZWQgb2JqZWN0IGxpYnJhcnkgaGFuZGxlCi0gICAgImxpYkFpdlBsYXkuc28iLAotICAgIHsKLSAgICAgICJBSVYucGxheS5yb2xlLmdlbmVyaWMiCi0gICAgfQotICB9LAotICB7Ci0gICAgIk9NWC5xY29tLmZpbGUubXV4ZXIiLAotICAgIE5VTEwsIC8vIENyZWF0ZSBpbnN0YW5jZSBmdW5jdGlvbgotICAgIC8vIFVuaXF1ZSBpbnN0YW5jZSBoYW5kbGUKLSAgICB7Ci0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfSwKLSAgICBOVUxMLCAgIC8vIFNoYXJlZCBvYmplY3QgbGlicmFyeSBoYW5kbGUKLSAgICAibGliT214TXV4LnNvIiwKLSAgICB7Ci0gICAgICAiY29udGFpbmVyX211eGVyLm1wMiIKLSAgICB9Ci0gIH0sCi0gIHsKLSAgICAiT01YLnF0aS52ZGVjLnZwcCIsCi0gICAgTlVMTCwgLy8gQ3JlYXRlIGluc3RhbmNlIGZ1bmN0aW9uCi0gICAgLy8gVW5pcXVlIGluc3RhbmNlIGhhbmRsZQotICAgIHsKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9LAotICAgIE5VTEwsICAgLy8gU2hhcmVkIG9iamVjdCBsaWJyYXJ5IGhhbmRsZQotICAgICJsaWJPbXhWcHAuc28iLAotICAgIHsKLSAgICAgICJ2aWRlb19kZWNvZGVyLnZwcCIKLSAgICB9Ci0gIH0KLX07Ci0KLWNvbnN0IHVuc2lnbmVkIGludCBTSVpFX09GX0NPUkUgPSBzaXplb2YoY29yZSkgLyBzaXplb2Yob214X2NvcmVfY2JfdHlwZSk7Ci0KLQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvQW5kcm9pZC5tayBiL3NkbTg0NS9tbS12aWRlby12NGwyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjFmOWIuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvTWFrZWZpbGUuYW0gYi9zZG04NDUvbW0tdmlkZW8tdjRsMi9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2NWRmOS4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBNYWtlZmlsZS5hbSAtIEF1dG9tYWtlIHNjcmlwdCBmb3IgbW0tb214dmlkZW8KLSMKLUFDTE9DQUxfQU1GTEFHUyA9IC1JIG00Ci0KLVNVQkRJUlMgPSB2aWRjCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL0FuZHJvaWQubWsgYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDY5ZmUuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCAkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy9NYWtlZmlsZS5hbSBiL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYTFmM2QuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBNYWtlZmlsZS5hbSAtIEF1dG9tYWtlIHNjcmlwdCBmb3IgbW0tb214dmlkZW8KLSMKLUFDTE9DQUxfQU1GTEFHUyA9IC1JIG00Ci0KLVNVQkRJUlMgPSB2ZGVjIHZlbmMKZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvY29tbW9uL0FuZHJvaWQubWsgYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL2NvbW1vbi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzI1YzA4Li4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvY29tbW9uL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1ST09UX0RJUiA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1BBVEg6PSAkKFJPT1RfRElSKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAJCQkJQ29tbW9uIGRlZmluaXRvbnMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWxpYm1tLXZpZGMtZGVmIDo9IC1nIC1PMyAtRGxyaW50Zj1fZmZpeF9yCi1saWJtbS12aWRjLWRlZiArPSAtRF9fYWxpZ249X19hbGlnbngKLWxpYm1tLXZpZGMtZGVmICs9IC1EX19hbGlnbnhcKHhcKT1fX2F0dHJpYnV0ZV9fXChcKF9fYWxpZ25lZF9fXCh4XClcKVwpCi1saWJtbS12aWRjLWRlZiArPSAtRFRfQVJNCi1saWJtbS12aWRjLWRlZiArPSAtRGlubGluZT1fX2lubGluZQotbGlibW0tdmlkYy1kZWYgKz0gLURfQU5EUk9JRF8KLWxpYm1tLXZpZGMtZGVmICs9IC1XZXJyb3IKLWxpYm1tLXZpZGMtZGVmICs9IC1EX0FORFJPSURfSUNTXwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAJCQlNYWtlIHRoZSBTaGFyZWQgbGlicmFyeSAobGliT214VmlkY0NvbW1vbikKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWxpYm1tLXZpZGMtaW5jICAgICAgOj0gJChMT0NBTF9QQVRIKS9pbmMKLWxpYm1tLXZpZGMtaW5jICAgICAgKz0gJChUT1ApL2hhcmR3YXJlL3Fjb20vbWVkaWEvc2RtODQ1L21tLWNvcmUvaW5jCi1saWJtbS12aWRjLWluYyAgICAgICs9ICQoVEFSR0VUX09VVF9IRUFERVJTKS9xY29tL2Rpc3BsYXkKLWxpYm1tLXZpZGMtaW5jICAgICAgKz0gJChUT1ApL2hhcmR3YXJlL3Fjb20vbWVkaWEvc2RtODQ1L2xpYmMyZGNvbG9yY29udmVydAotbGlibW0tdmlkYy1pbmMgICAgICArPSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvS0VSTkVMX09CSi91c3IvaW5jbHVkZQotCi1MT0NBTF9NT0RVTEUgICAgICAgICAgICAgICAgICAgIDo9IGxpYk9teFZpZGNDb21tb24KLUxPQ0FMX01PRFVMRV9UQUdTICAgICAgICAgICAgICAgOj0gb3B0aW9uYWwKLUxPQ0FMX0NGTEFHUyAgICAgICAgICAgICAgICAgICAgOj0gJChsaWJtbS12aWRjLWRlZikKLUxPQ0FMX0NfSU5DTFVERVMgICAgICAgICAgICAgICAgOj0gJChsaWJtbS12aWRjLWluYykKLQotTE9DQUxfUFJFTElOS19NT0RVTEUgICAgICA6PSBmYWxzZQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgICA6PSBsaWJsb2cgbGliY3V0aWxzIGxpYmRsCi0KLUxPQ0FMX1NSQ19GSUxFUyAgICs9IHNyYy92aWRjX2NvbW1vbi5jcHAKLUxPQ0FMX1NSQ19GSUxFUyAgICs9IHNyYy92aWRjX3ZlbmRvcl9leHRlbnNpb25zLmNwcAotCi1MT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyArPSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvS0VSTkVMX09CSi91c3IKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAJCQkJCUVORAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvY29tbW9uL2luYy92aWRjX2RlYnVnLmggYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL2NvbW1vbi9pbmMvdmlkY19kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODQyNWZkLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvY29tbW9uL2luYy92aWRjX2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDEzIC0gMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vcgotICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgICAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLU9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIF9fVklEQ19ERUJVR19IX18KLSNkZWZpbmUgX19WSURDX0RFQlVHX0hfXwotCi0jaWZkZWYgX0FORFJPSURfCi0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi1lbnVtIHsKLSAgIFBSSU9fRVJST1I9MHgxLAotICAgUFJJT19JTkZPPTB4MSwKLSAgIFBSSU9fSElHSD0weDIsCi0gICBQUklPX0xPVz0weDQsCi0gICBQUklPX1RSQUNFX0hJR0ggPSAweDEwLAotICAgUFJJT19UUkFDRV9MT1cgPSAweDIwLAotfTsKLQotZXh0ZXJuIGludCBkZWJ1Z19sZXZlbDsKLQotI3VuZGVmIERFQlVHX1BSSU5UX0VSUk9SCi0jZGVmaW5lIERFQlVHX1BSSU5UX0VSUk9SKGZtdCwgYXJncy4uLikgKHsgXAotICAgICAgaWYgKGRlYnVnX2xldmVsICYgUFJJT19FUlJPUikgXAotICAgICAgICAgIEFMT0dFKGZtdCwjI2FyZ3MpOyBcCi0gICAgICB9KQotI3VuZGVmIERFQlVHX1BSSU5UX0lORk8KLSNkZWZpbmUgREVCVUdfUFJJTlRfSU5GTyhmbXQsIGFyZ3MuLi4pICh7IFwKLSAgICAgIGlmIChkZWJ1Z19sZXZlbCAmIFBSSU9fSU5GTykgXAotICAgICAgICAgIEFMT0dJKGZtdCwjI2FyZ3MpOyBcCi0gICAgICB9KQotI3VuZGVmIERFQlVHX1BSSU5UX0xPVwotI2RlZmluZSBERUJVR19QUklOVF9MT1coZm10LCBhcmdzLi4uKSAoeyBcCi0gICAgICBpZiAoZGVidWdfbGV2ZWwgJiBQUklPX0xPVykgXAotICAgICAgICAgIEFMT0dEKGZtdCwjI2FyZ3MpOyBcCi0gICAgICB9KQotI3VuZGVmIERFQlVHX1BSSU5UX0hJR0gKLSNkZWZpbmUgREVCVUdfUFJJTlRfSElHSChmbXQsIGFyZ3MuLi4pICh7IFwKLSAgICAgIGlmIChkZWJ1Z19sZXZlbCAmIFBSSU9fSElHSCkgXAotICAgICAgICAgIEFMT0dEKGZtdCwjI2FyZ3MpOyBcCi0gICAgICB9KQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfUFJJTlRfRVJST1IgcHJpbnRmCi0jZGVmaW5lIERFQlVHX1BSSU5UX0lORk8gcHJpbnRmCi0jZGVmaW5lIERFQlVHX1BSSU5UX0xPVyBwcmludGYKLSNkZWZpbmUgREVCVUdfUFJJTlRfSElHSCBwcmludGYKLSNlbmRpZgotCi0jZGVmaW5lIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHB0ciwgcGFyYW1UeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHB0ciA9PSBOVUxMKSB7IHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7IH0gICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBhcmFtVHlwZSAqcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8cGFyYW1UeXBlICo+KHB0cik7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAocC0+blNpemUgPCBzaXplb2YocGFyYW1UeXBlKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEFMT0dFKCJJbnN1ZmZpY2llbnQgb2JqZWN0IHNpemUoJXUpIHYvcyBleHBlY3RlZCglenUpIGZvciB0eXBlICVzIixcCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcC0+blNpemUsIHNpemVvZihwYXJhbVR5cGUpLCAjcGFyYW1UeXBlKTsgICAgXAotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCi0vKgotICogVmFsaWRhdGUgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFIHR5cGUgcGFyYW0KLSAqICphc3N1bWVzKiBWQUxJREFURV9PTVhfUEFSQU1fREFUQSBjaGVja3MgaGF2ZSBwYXNzZWQKLSAqIENoZWNrcyBmb3IgblBhcmFtQ291bnQgY2Fubm90IGJlIGdlbmVyYWxpemVkIGhlcmUuIGl0IGlzIGltcGVyYXRpdmUgdGhhdAotICogIHRoZSBjYWxsaW5nIGNvZGUgaGFuZGxlcyBpdC4KLSAqLwotI2RlZmluZSBWQUxJREFURV9PTVhfVkVORE9SX0VYVEVOU0lPTl9QQVJBTV9EQVRBKGV4dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGV4dC0+blBhcmFtU2l6ZVVzZWQgPCAxIHx8IGV4dC0+blBhcmFtU2l6ZVVzZWQgPiBPTVhfTUFYX0FORFJPSURfVkVORE9SX1BBUkFNQ09VTlQpIHsgXAotICAgICAgICAgICAgQUxPR0UoIlZlbmRvckV4dGVuc2lvbjogc3ViLXBhcmFtcygldSkgbm90IGluIGV4cGVjdGVkIHJhbmdlKCV1IC0gJXUpIiwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGV4dC0+blBhcmFtU2l6ZVVzZWQsIDEsIE9NWF9NQVhfQU5EUk9JRF9WRU5ET1JfUEFSQU1DT1VOVCk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIE9NWF9VMzIgZXhwZWN0ZWRTaXplID0gKE9NWF9VMzIpc2l6ZW9mKE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSkgKyAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoKGV4dC0+blBhcmFtU2l6ZVVzZWQgLSAxKSAqIChPTVhfVTMyKXNpemVvZihPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX1BBUkFNVFlQRSkpO1wKLSAgICAgICAgaWYgKGV4dC0+blNpemUgPCBleHBlY3RlZFNpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgQUxPR0UoIlZlbmRvckV4dGVuc2lvbjogSW5zaWZmaWNpZW50IHNpemUoJXUpIHYvcyBleHBlY3RlZCgldSkiLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGV4dC0+blNpemUsIGV4cGVjdGVkU2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotY2xhc3MgYXV0b19sb2NrIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGF1dG9fbG9jayhwdGhyZWFkX211dGV4X3QgJmxvY2spCi0gICAgICAgICAgICA6IG1Mb2NrKGxvY2spIHsKLSAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1Mb2NrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfmF1dG9fbG9jaygpIHsKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTG9jayk7Ci0gICAgICAgIH0KLSAgICBwcml2YXRlOgotICAgICAgICBwdGhyZWFkX211dGV4X3QgJm1Mb2NrOwotfTsKLQotY2xhc3MgQXV0b1VubWFwIHsKLSAgICB2b2lkICp2YWRkcjsKLSAgICBpbnQgc2l6ZTsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgQXV0b1VubWFwKHZvaWQgKnZhZGRyLCBpbnQgc2l6ZSkgewotICAgICAgICAgICAgdGhpcy0+dmFkZHIgPSB2YWRkcjsKLSAgICAgICAgICAgIHRoaXMtPnNpemUgPSBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgfkF1dG9Vbm1hcCgpIHsKLSAgICAgICAgICAgIGlmICh2YWRkcikKLSAgICAgICAgICAgICAgICBtdW5tYXAodmFkZHIsIHNpemUpOwotICAgICAgICB9Ci19OwotCi1jbGFzcyBTaWduYWwgewotICAgIGJvb2wgc2lnbmFsbGVkOwotICAgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKLSAgICBwdGhyZWFkX2NvbmRfdCBjb25kaXRpb247Ci1wdWJsaWM6Ci0gICAgU2lnbmFsKCkgewotICAgICAgICBzaWduYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgcHRocmVhZF9jb25kX2luaXQoJmNvbmRpdGlvbiwgTlVMTCk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXgsIE5VTEwpOwotICAgIH0KLQotICAgIH5TaWduYWwoKSB7Ci0gICAgICAgICAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmY29uZGl0aW9uKTsKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXgpOwotICAgIH0KLQotICAgIHZvaWQgc2lnbmFsKCkgewotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKLSAgICAgICAgc2lnbmFsbGVkID0gdHJ1ZTsKLSAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmY29uZGl0aW9uKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKLSAgICB9Ci0KLSAgICBpbnQgd2FpdCh1aW50NjRfdCB0aW1lb3V0X25zZWMpIHsKLSAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRzOwotCi0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwotICAgICAgICBpZiAoc2lnbmFsbGVkKSB7Ci0gICAgICAgICAgICBzaWduYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpOwotICAgICAgICB0cy50dl9zZWMgKz0gdGltZW91dF9uc2VjIC8gMTAwMDAwMDAwMDsKLSAgICAgICAgdHMudHZfbnNlYyArPSB0aW1lb3V0X25zZWMgJSAxMDAwMDAwMDAwOwotICAgICAgICBpZiAodHMudHZfbnNlYyA+PSAxMDAwMDAwMDAwKSB7Ci0gICAgICAgICAgICB0cy50dl9uc2VjIC09IDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICB0cy50dl9zZWMgICs9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHJldCA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJmNvbmRpdGlvbiwgJm11dGV4LCAmdHMpOwotICAgICAgICBzaWduYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19OwotCi0jaWZkZWYgX0FORFJPSURfCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTwotI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+Ci0KLWNsYXNzIEF1dG9UcmFjZXIgewotICAgIGludCBtUHJpbzsKLXB1YmxpYzoKLSAgICBBdXRvVHJhY2VyKGludCBwcmlvLCBjb25zdCBjaGFyKiBtc2cpCi0gICAgICAgIDogbVByaW8ocHJpbykgewotICAgICAgICBpZiAoZGVidWdfbGV2ZWwgJiBwcmlvKSB7Ci0gICAgICAgICAgICBBVFJBQ0VfQkVHSU4obXNnKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB+QXV0b1RyYWNlcigpIHsKLSAgICAgICAgaWYgKGRlYnVnX2xldmVsICYgbVByaW8pIHsKLSAgICAgICAgICAgIEFUUkFDRV9FTkQoKTsKLSAgICAgICAgfQotICAgIH0KLX07Ci0KLSNkZWZpbmUgVklEQ19UUkFDRV9OQU1FX0xPVyhfbmFtZSkgQXV0b1RyYWNlciBfdHJhY2VyKFBSSU9fVFJBQ0VfTE9XLCBfbmFtZSk7Ci0jZGVmaW5lIFZJRENfVFJBQ0VfTkFNRV9ISUdIKF9uYW1lKSBBdXRvVHJhY2VyIF90cmFjZXIoUFJJT19UUkFDRV9ISUdILCBfbmFtZSk7Ci0KLSNkZWZpbmUgVklEQ19UUkFDRV9JTlRfTE9XKF9uYW1lLCBfaW50KSBcCi0gICAgaWYgKGRlYnVnX2xldmVsICYgUFJJT19UUkFDRV9MT1cpIHsgXAotICAgICAgICBBVFJBQ0VfSU5UKF9uYW1lLCBfaW50KTsgICAgICAgIFwKLSAgICB9Ci0KLSNkZWZpbmUgVklEQ19UUkFDRV9JTlRfSElHSChfbmFtZSwgX2ludCkgXAotICAgIGlmIChkZWJ1Z19sZXZlbCAmIFBSSU9fVFJBQ0VfSElHSCkgeyBcCi0gICAgICAgIEFUUkFDRV9JTlQoX25hbWUsIF9pbnQpOyAgICAgICAgXAotICAgIH0KLQotI2Vsc2UgLy8gX0FORFJPSURfCi0KLSNkZWZpbmUgVklEQ19UUkFDRV9OQU1FX0xPVyhfbmFtZSkKLSNkZWZpbmUgVklEQ19UUkFDRV9OQU1FX0hJR0goX25hbWUpCi0jZGVmaW5lIFZJRENfVFJBQ0VfSU5UX0xPVyhfbmFtZSwgX2ludCkKLSNkZWZpbmUgVklEQ19UUkFDRV9JTlRfSElHSChfbmFtZSwgX2ludCkKLQotI2VuZGlmIC8vICFfQU5EUk9JRF8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL2NvbW1vbi9pbmMvdmlkY192ZW5kb3JfZXh0ZW5zaW9ucy5oIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy9jb21tb24vaW5jL3ZpZGNfdmVuZG9yX2V4dGVuc2lvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc2M2QxNi4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL2NvbW1vbi9pbmMvdmlkY192ZW5kb3JfZXh0ZW5zaW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLVdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi1BUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi1CRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi1CVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi1PUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi1JRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBfVklEQ19WRU5ET1JfRU5YVEVOU0lPTlNfSF8KLSNkZWZpbmUgX1ZJRENfVkVORE9SX0VOWFRFTlNJT05TX0hfCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8qCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBWZW5kb3ItRXh0ZW5zaW9uIChleGNlcHQgZm9yIHRoZSBkYXRhKS4KLSAqIEEgVmVuZG9yIGV4dGVuc2lvbiBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIGV4dGVuc2lvbi1uYW1lIGFuZAotICogaXMgbWFwcGVkIHRvIGEgc3BlY2lmaWMgT01YLWV4dGVuc2lvbi4gaXQgY29udGFpbnMgcGFyYW1zIHRoYXQKLSAqIHNpZ25pZnkgaW5kaXZpZHVhbCBwYXJhbWV0ZXItZmllbGQKLSAqICAgIFZlbmRvckV4dGVuc2lvbjo6bU5hbWUgICAgICAgICA9PiBzaW1pbGFyIHRvIE9NWCBleHRlbnNpb24gc3RyaW5nLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOYW1lIG11c3QgYmUgdW5pcXVlKQotICogICAgVmVuZG9yRXh0ZW5zaW9uOjptSWQgICAgICAgICAgID0+IHNpbWlsYXIgdG8gT01YIGV4dGVuc2lvbiBJRAotICogICAgVmVuZG9yRXh0ZW5zaW9uOjptUGFyYW1bMCwxLi5dID0+IHNpbWlsYXIgdG8gYW4gaW5kaXZpZHVhbCBmaWVsZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIE9NWCBleHRlbnNpb24gc3RydWN0Ci0gKiAgICBWZW5kb3JFeHRlbnNpb246Om1Jc1NldCAgICAgICAgPT4gZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gd2FzIHNldCBieSB0aGUgY2xpZW50LgotICogVGhpcyBhbHNvIHByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyB0bzoKLSAqICAgLSBjb3B5IGluZm8oa2V5cy90eXBlcy4uKSB0byBjbGllbnQncyBleHRlbnNpb24gc3RyY3V0dXJlCi0gKiAgICAgICAgaW5jbHVkaW5nIGNvcHlpbmcgb2YgcGFyYW0ta2V5IGFuZCB0eXBlIG9mIGVhY2ggcGFyYW0KLSAqICAgLSBjb3B5IGRhdGEgZnJvbS90byB0aGUgY2xpZW50J3MgZXh0ZW5zaW9uIHN0cnVjdHVyZSwgZ2l2ZW4gdGhlCi0gKiAgICAgICAgcGFyYW0ta2V5ICh0aGlzIGlzIHR5cGUtYXdhcmUgY29weSkKLSAqICAgLSBzYW5pdHkgY2hlY2tzCi0gKgotICogRXh0ZW5zaW9uIG5hbWUgLSBuYW1pbmcgY29udmVudGlvbgotICogICAtIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAqICAgLSBtdXN0IGJlIHByZWZpeGVkIHdpdGggImV4dC0iIGZvbGxvd2VkIGJ5IGNvbXBvbmVudC10eXBlCi0gKiAgICAgRWc6ICJlbmMiICJkZWMiICJ2cHAiCi0gKiAgIC0gU0hPVUxEIE5PVCBjb250YWluICIuIgotICogICAtIGtleXdvcmRzIFNIT1VMRCBiZSBzZXBhcmF0ZWQgYnkgIi0iCi0gKiAgIC0gbmFtZSBtYXkgY29udGFpbiBmZWF0dXJlLW5hbWUgYW5kL29yIHBhcmFtZXRlci1uYW1lCi0gKiAgIEVnOiAgImV4dC1lbmMtcHJlcHJvY2Vzcy1yb3RhdGUiCi0gKiAgICAgICAgImV4dC1kZWMtcGljdHVyZS1vcmRlciIKLSAqCi0gKiBPdmVyYWxsIHBhcmFtdGVyLWtleSA9PiB2ZW5kb3IgKGRvdCkgZXh0ZW5zaW9uLW5hbWUgKGRvdCkgcGFyYW0ta2V5Ci0qLwotc3RydWN0IFZlbmRvckV4dGVuc2lvbiB7Ci0KLSAgICAvKgotICAgICAqIFBhcmFtIHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBwYXJhbWV0ZXIgKGZpZWxkKSBvZiBhIFZlbmRvckV4dGVuc2lvbi4KLSAgICAgKiBUaGlzIGlzIGEgdmFyaWFudCBob2xkaW5nIHZhbHVlcyBvZiB0eXBlIFtpbnQzMiwgaW50NjQgb3IgU3RyaW5nXS4KLSAgICAgKiBFYWNoIFBhcmFtIGhhcyBhIG5hbWUgKHVuaXF1ZSB3aXRoaW4gdGhlIGV4dGVuc2lvbikgdGhhdCBpcyBhcHBlbmRlZAotICAgICAqIHRvIHRoZSAnZXh0ZW5zaW9uLW5hbWUnIGFuZCBwcmVmaXhlZCB3aXRoICJ2ZW5kb3IuIiB0byBnZW5lcmF0ZSB0aGUKLSAgICAgKiBrZXkgdGhhdCB3aWxsIGJlIGV4cG9zZWQgdG8gdGhlIGNsaWVudC4KLSAgICAgKgotICAgICAqIFBhcmFtIG5hbWUoa2V5KSAtIG5hbWluZyBjb252ZW50aW9uCi0gICAgICogICAtIGtleSBtdXN0IGJlIHVuaXF1ZSAod2l0aGluIHRoZSBleHRlbnNpb24pCi0gICAgICogICAtIFNIT1VMRCBub3QgY29udGFpbiAiLiIKLSAgICAgKiAgIC0gS2V5d29yZHMgc2VwZXJhdGVkIGJ5ICItIiBPTkxZIGlmIHJlcXVpcmVkCi0gICAgICogICBFZzogImFuZ2xlIgotICAgICAqICAgICAgICJuLWlkci1wZXJpb2QiCi0gICAgICoKLSAgICAgKi8KLSAgICBzdHJ1Y3QgUGFyYW0gewotICAgICAgICBQYXJhbSAoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIE9NWF9BTkRST0lEX1ZFTkRPUl9WQUxVRVRZUEUgdHlwZSkKLSAgICAgICAgICAgIDogbU5hbWUobmFtZSksIG1UeXBlKHR5cGUpIHt9Ci0KLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZS5jX3N0cigpOwotICAgICAgICB9Ci0gICAgICAgIE9NWF9BTkRST0lEX1ZFTkRPUl9WQUxVRVRZUEUgdHlwZSgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBtVHlwZTsKLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG1OYW1lOwotICAgICAgICBPTVhfQU5EUk9JRF9WRU5ET1JfVkFMVUVUWVBFIG1UeXBlOwotICAgIH07Ci0KLSAgICAvLyBoZWxwZXIgdG8gYnVpbGQgYSBsaXN0IG9mIHZhcmlhYmxlIG51bWJlciBvciBwYXJhbXMKLSAgICBzdHJ1Y3QgUGFyYW1MaXN0QnVpbGRlciB7Ci0gICAgICAgIFBhcmFtTGlzdEJ1aWxkZXIgKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxQYXJhbT4gbCkKLSAgICAgICAgICAgIDogbVBhcmFtcyhsKSB7fQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBzdHJ1Y3QgVmVuZG9yRXh0ZW5zaW9uOwotICAgICAgICBzdGQ6OnZlY3RvcjxQYXJhbT4gbVBhcmFtczsKLSAgICB9OwotCi0gICAgVmVuZG9yRXh0ZW5zaW9uKE9NWF9JTkRFWFRZUEUgaWQsIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9ESVJUWVBFIGRpciwKLSAgICAgICAgICAgIGNvbnN0IFBhcmFtTGlzdEJ1aWxkZXImIHApOwotCi0gICAgLy8gZ2V0dGVycwotICAgIE9NWF9JTkRFWFRZUEUgZXh0ZW5zaW9uSW5kZXgoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAoT01YX0lOREVYVFlQRSltSWQ7Ci0gICAgfQotICAgIGNvbnN0IGNoYXIgKm5hbWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtTmFtZS5jX3N0cigpOwotICAgIH0KLSAgICBPTVhfVTMyIHBhcmFtQ291bnQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAoT01YX1UzMiltUGFyYW1zLnNpemUoKTsKLSAgICB9Ci0gICAgYm9vbCBpc1NldCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Jc1NldDsKLSAgICB9Ci0KLSAgICAvLyAodGhlIG9ubHkpIHNldHRlcgotICAgIHZvaWQgc2V0KCkgY29uc3QgewotICAgICAgICBtSXNTZXQgPSB0cnVlOwotICAgIH0KLQotICAgIC8vIGNvcHkgZXh0ZW5zaW9uIEluZm8gdG8gT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFKiBzdHJ1Y3QgcGFzc2VkIChleGNlcHQgZGF0YSkKLSAgICBPTVhfRVJST1JUWVBFIGNvcHlJbmZvVG8oT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICpleHQpIGNvbnN0OwotCi0gICAgLy8gVHlwZS1hd2FyZSBkYXRhIGNvcHkgbWV0aG9kcwotICAgIC8vIChOT1RFOiBkYXRhIGhlcmUgaXMgcGFzc2VkIGV4cGxpY2l0bHkgdG8gYXZvaWQgdGhpcyBjbGFzcyBoYXZpbmcgdG8ga25vdyBhbGwgdHlwZXMpCi0gICAgLy8gcmV0dXJucyB0cnVlIGlmIHZhbHVlIHdhcyB3cml0dGVuCi0gICAgYm9vbCBzZXRQYXJhbUludDMyKE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0LCBjb25zdCBjaGFyICpwYXJhbUtleSwKLSAgICAgICAgICAgIE9NWF9TMzIgc2V0SW50MzIpIGNvbnN0OwotICAgIGJvb2wgc2V0UGFyYW1JbnQ2NChPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX0VYVEVOU0lPTlRZUEUgKmV4dCwgY29uc3QgY2hhciAqcGFyYW1LZXksCi0gICAgICAgICAgICBPTVhfUzMyIHNldEludDY0KSBjb25zdDsKLSAgICBib29sIHNldFBhcmFtU3RyaW5nKE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0LCBjb25zdCBjaGFyICpwYXJhbUtleSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNldFN0cikgY29uc3Q7Ci0KLSAgICAvLyByZWFkLXZhbHVlcyBhcmUgdXBkYXRlZCBPTkxZIElGIHRoZSBwYXJhbVtwYXJhbUluZGV4XSBpcyBzZXQgYnkgY2xpZW50Ci0gICAgLy8gcmV0dXJucyB0cnVlIGlmIHZhbHVlIHdhcyByZWFkCi0gICAgYm9vbCByZWFkUGFyYW1JbnQzMihPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX0VYVEVOU0lPTlRZUEUgKmV4dCwgY29uc3QgY2hhciAqcGFyYW1LZXksCi0gICAgICAgICAgICBPTVhfUzMyICpyZWFkSW50MzIpIGNvbnN0OwotICAgIGJvb2wgcmVhZFBhcmFtSW50NjQoT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICpleHQsIGNvbnN0IGNoYXIgKnBhcmFtS2V5LAotICAgICAgICAgICAgT01YX1MzMiAqcmVhZEludDY0KSBjb25zdDsKLSAgICBib29sIHJlYWRQYXJhbUludDY0KE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0LCBjb25zdCBjaGFyICpwYXJhbUtleSwKLSAgICAgICAgICAgIGNoYXIgKnJlYWRTdHIpIGNvbnN0OwotCi0gICAgLy8gU2FuaXR5IGNoZWNrZXJzCi0gICAgLy8gQ2hlY2sgaWYgdGhlIGV4dGVuc2lvbi1uYW1lLCBwb3J0LWRpciwgYWxsb3R0ZWQgcGFyYW1zIG1hdGNoCi0gICAgLy8gICAgZm9yIGVhY2ggcGFyYW0sIGNoZWNrIGlmIGtleSBhbmQgdHlwZSBib3RoIG1hdGNoCi0gICAgLy8gTXVzdCBiZSBjYWxsZWQgdG8gY2hlY2sgd2hldGhlciBjb25maWcgZGF0YSBwcm92aWRlZCB3aXRoIHNldENvbmZpZyBpcyB2YWxpZAotICAgIE9NWF9FUlJPUlRZUEUgaXNDb25maWdWYWxpZChPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX0VYVEVOU0lPTlRZUEUgKmV4dCkgY29uc3Q7Ci0KLSAgICAvLyB1dGlscwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiB0eXBlU3RyaW5nKE9NWF9BTkRST0lEX1ZFTkRPUl9WQUxVRVRZUEUgdHlwZSk7Ci0gICAgc3RkOjpzdHJpbmcgZGVidWdTdHJpbmcoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICAvLyBJZCBhc3NpZ25lZCB0byB0aGUgZXh0ZW5zaW9uCi0gICAgT01YX0lOREVYVFlQRSBtSWQ7Ci0gICAgLy8gTmFtZSBvZiB0aGUgZXh0ZW5zaW9uCi0gICAgc3RkOjpzdHJpbmcgbU5hbWU7Ci0gICAgLy8gUG9ydCB0aGF0IHRoaXMgc2V0dGluZyBhcHBsaWVzIHRvCi0gICAgT01YX0RJUlRZUEUgbVBvcnREaXI7Ci0gICAgLy8gcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgdGhpcyBleHRlbnNpb24KLSAgICBzdGQ6OnZlY3RvcjxQYXJhbT4gbVBhcmFtczsKLSAgICAvLyBGbGFnIHRoYXQgaW5kaWNhdGVzIGNsaWVudCBoYXMgc2V0IHRoaXMgZXh0ZW5zaW9uLgotICAgIG11dGFibGUgYm9vbCBtSXNTZXQ7Ci0KLSAgICAvLyBjaGVjayBpZiB0aGUgaW5kZXggaXMgdmFsaWQsIG5hbWUgbWF0Y2hlcywgdHlwZSBtYXRjaGVzIGFuZCBpcyBzZXQKLSAgICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHRvIHZlcmlmeSBjb25maWctZGF0YSBwYXNzZWQgd2l0aCBzZXRDb25maWcoKQotICAgIGJvb2wgX2lzUGFyYW1BY2Nlc3NPSygKLSAgICAgICAgICAgIE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0LCBpbnQgcGFyYW1JbmRleCkgY29uc3Q7Ci0KLSAgICAvLyBjaGVjayBpZiB0aGUgaW5kZXggaXMgdmFsaWQsIGNoZWNrIGFnYWluc3QgZXhwbGljaXQgdHlwZQotICAgIGJvb2wgX2lzUGFyYW1BY2Nlc3NUeXBlT0soCi0gICAgICAgICAgICBPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX0VYVEVOU0lPTlRZUEUgKmV4dCwgaW50IHBhcmFtSW5kZXgsCi0gICAgICAgICAgICBPTVhfQU5EUk9JRF9WRU5ET1JfVkFMVUVUWVBFIHR5cGUpIGNvbnN0OwotCi0gICAgaW50IGluZGV4T2ZQYXJhbShjb25zdCBjaGFyICprZXkpIGNvbnN0OwotfTsKLQotLyoKLSAqIFN0b3JlKExpc3QpIG9mIGFsbCB2ZW5kb3IgZXh0ZW5zaW9ucyAqdGhhdCBhcmUgc3VwcG9ydGVkKiBieSBhIGNvbXBvbmVudC4KLSAqIFRoZSBsaXN0IGlzIHBvcHVsYXRlZCAocGVyLWNvbXBvbmVudCkgYXQgaW5pdCwgYmFzZWQgb24gdGhlIGNhcGFiaWxpdGllcy4KLSAqIFRoZSBzdG9yZSBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLCBleGNlcHQgZm9yIHNldHRpbmcgdGhlIGZsYWcgdG8gaW5kaWNhdGUKLSAqIC13aGV0aGVyIHRoZSBleHRlbnNpb24gd2FzIHNldCBieSB0aGUgQ2xpZW50Ci0gKi8KLXN0cnVjdCBWZW5kb3JFeHRlbnNpb25TdG9yZSB7Ci0gICAgVmVuZG9yRXh0ZW5zaW9uU3RvcmUoKQotICAgICAgICA6IG1JbnZhbGlkKFZlbmRvckV4dGVuc2lvbigoT01YX0lOREVYVFlQRSktMSwgImludmFsaWQiLCBPTVhfRGlyTWF4LCB7e319KSkgewotICAgIH0KLQotICAgIFZlbmRvckV4dGVuc2lvblN0b3JlKGNvbnN0IFZlbmRvckV4dGVuc2lvblN0b3JlJikgPSBkZWxldGU7Ci0gICAgVmVuZG9yRXh0ZW5zaW9uU3RvcmUmIG9wZXJhdG9yPSAoY29uc3QgVmVuZG9yRXh0ZW5zaW9uU3RvcmUmKSA9IGRlbGV0ZTsKLQotICAgIHZvaWQgYWRkKGNvbnN0IFZlbmRvckV4dGVuc2lvbiYgX2UpIHsKLSAgICAgICAgbUV4dC5wdXNoX2JhY2soX2UpOwotICAgIH0KLSAgICBjb25zdCBWZW5kb3JFeHRlbnNpb24mIG9wZXJhdG9yW10gKE9NWF9VMzIgaW5kZXgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGluZGV4IDwgbUV4dC5zaXplKCkgPyBtRXh0W2luZGV4XSA6IG1JbnZhbGlkOwotICAgIH0KLSAgICBPTVhfVTMyIHNpemUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtRXh0LnNpemUoKTsKLSAgICB9Ci0gICAgdm9pZCBkdW1wRXh0ZW5zaW9ucyhjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHN0ZDo6dmVjdG9yPFZlbmRvckV4dGVuc2lvbj4gbUV4dDsKLSAgICBWZW5kb3JFeHRlbnNpb24gbUludmFsaWQ7Ci19OwotCi0vLyBNYWNyb3MgdG8gaGVscCBhZGQgZXh0ZW5zaW9ucwotI2RlZmluZSBBRERfRVhURU5TSU9OKF9uYW1lLCBfZXh0SW5kZXgsIF9kaXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3RvcmUuYWRkKFZlbmRvckV4dGVuc2lvbigoT01YX0lOREVYVFlQRSlfZXh0SW5kZXgsIF9uYW1lLCBfZGlyLCB7ICAgICAgICAgIFwKLQotI2RlZmluZSBBRERfUEFSQU0oX2tleSwgX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7X2tleSwgX3R5cGV9LAotCi0jZGVmaW5lIEFERF9QQVJBTV9FTkQoX2tleSwgX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7X2tleSwgX3R5cGV9IH0pKTsKLQotI2VuZGlmIC8vIF9WSURDX1ZFTkRPUl9FTlhURU5TSU9OU19IXwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy9jb21tb24vc3JjL3ZpZGNfY29tbW9uLmNwcCBiL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvY29tbW9uL3NyYy92aWRjX2NvbW1vbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMWU3YzUuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy9jb21tb24vc3JjL3ZpZGNfY29tbW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLVdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi1BUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi1CRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi1CVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi1PUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi1JRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgTE9HX1RBRyAiT01YX0NPTU1PTiIKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgInZpZGNfZGVidWcuaCIKLQotaW50IGRlYnVnX2xldmVsID0gUFJJT19FUlJPUjsKZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvY29tbW9uL3NyYy92aWRjX3ZlbmRvcl9leHRlbnNpb25zLmNwcCBiL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvY29tbW9uL3NyYy92aWRjX3ZlbmRvcl9leHRlbnNpb25zLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2OWIxZi4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL2NvbW1vbi9zcmMvdmlkY192ZW5kb3JfZXh0ZW5zaW9ucy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLU9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLUlGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIExPR19UQUcgIk9NWC1WRU5ET1ItRVhUIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgInZpZGNfZGVidWcuaCIKLQotI2luY2x1ZGUgIk9NWF9Db3JlLmgiCi0jaW5jbHVkZSAiT01YX1FDT01FeHRucy5oIgotI2luY2x1ZGUgIk9NWF9WaWRlb0V4dC5oIgotI2luY2x1ZGUgIk9NWF9JbmRleEV4dC5oIgotI2luY2x1ZGUgInZpZGNfdmVuZG9yX2V4dGVuc2lvbnMuaCIKLQotVmVuZG9yRXh0ZW5zaW9uOjpWZW5kb3JFeHRlbnNpb24oT01YX0lOREVYVFlQRSBpZCwgY29uc3QgY2hhciAqbmFtZSwgT01YX0RJUlRZUEUgZGlyLAotICAgICAgICBjb25zdCBQYXJhbUxpc3RCdWlsZGVyJiBwKQotICAgIDogbUlkKGlkKSwKLSAgICAgIG1OYW1lKG5hbWUpLAotICAgICAgbVBvcnREaXIoZGlyKSwKLSAgICAgIG1QYXJhbXMoc3RkOjptb3ZlKHAubVBhcmFtcykpLAotICAgICAgbUlzU2V0KGZhbHNlKSB7Ci19Ci0KLS8vIGNvcHkgZXh0ZW5zaW9uIEluZm8gdG8gT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFKiBzdHJ1Y3QgcGFzc2VkCi1PTVhfRVJST1JUWVBFIFZlbmRvckV4dGVuc2lvbjo6Y29weUluZm9UbygKLSAgICAgICAgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICpleHQpIGNvbnN0IHsKLQotICAgIC8vIEV4dGVuc2lvbiBpbmZvCi0gICAgc3RybmNweSgoY2hhciAqKWV4dC0+Y05hbWUsIG1OYW1lLmNfc3RyKCksIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICBleHQtPmVEaXIgPSBtUG9ydERpcjsKLSAgICBleHQtPm5QYXJhbUNvdW50ID0gcGFyYW1Db3VudCgpOwotCi0gICAgLy8gUGVyLXBhcmFtZXRlciBpbmZvCi0gICAgLy8gTXVzdCBiZSBjb3BpZWQgb25seSBpZiB0aGVyZSBhcmUgZW5vdWdoIHBhcmFtcyB0byBmaWxsLWluCi0gICAgaWYgKGV4dC0+blBhcmFtU2l6ZVVzZWQgPCBleHQtPm5QYXJhbUNvdW50KSB7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLQotICAgIGludCBpID0gMDsKLSAgICBmb3IgKGNvbnN0IFBhcmFtJiBwIDogbVBhcmFtcykgewotICAgICAgICBzdHJuY3B5KChjaGFyICopZXh0LT5uUGFyYW1baV0uY0tleSwgcC5uYW1lKCksIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgZXh0LT5uUGFyYW1baV0uYlNldCA9IG1Jc1NldCA/IE9NWF9UUlVFIDogT01YX0ZBTFNFOwotICAgICAgICBleHQtPm5QYXJhbVtpXS5lVmFsdWVUeXBlID0gcC50eXBlKCk7Ci0gICAgICAgICsraTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLWJvb2wgVmVuZG9yRXh0ZW5zaW9uOjpzZXRQYXJhbUludDMyKAotICAgICAgICBPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX0VYVEVOU0lPTlRZUEUgKmV4dCwgY29uc3QgY2hhciAqcGFyYW1LZXksCi0gICAgICAgIE9NWF9TMzIgc2V0SW50MzIpIGNvbnN0IHsKLSAgICBpbnQgcGFyYW1JbmRleCA9IGluZGV4T2ZQYXJhbShwYXJhbUtleSk7Ci0gICAgaWYgKCFfaXNQYXJhbUFjY2Vzc1R5cGVPSyhleHQsIHBhcmFtSW5kZXgsIE9NWF9BbmRyb2lkVmVuZG9yVmFsdWVJbnQzMikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBleHQtPm5QYXJhbVtwYXJhbUluZGV4XS5uSW50MzIgPSBzZXRJbnQzMjsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBWZW5kb3JFeHRlbnNpb246OnNldFBhcmFtSW50NjQoCi0gICAgICAgIE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0LCBjb25zdCBjaGFyICpwYXJhbUtleSwKLSAgICAgICAgT01YX1MzMiBzZXRJbnQ2NCkgY29uc3QgewotICAgIGludCBwYXJhbUluZGV4ID0gaW5kZXhPZlBhcmFtKHBhcmFtS2V5KTsKLSAgICBpZiAoIV9pc1BhcmFtQWNjZXNzVHlwZU9LKGV4dCwgcGFyYW1JbmRleCwgT01YX0FuZHJvaWRWZW5kb3JWYWx1ZUludDY0KSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGV4dC0+blBhcmFtW3BhcmFtSW5kZXhdLm5JbnQ2NCA9IHNldEludDY0OwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFZlbmRvckV4dGVuc2lvbjo6c2V0UGFyYW1TdHJpbmcoCi0gICAgICAgIE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0LCBjb25zdCBjaGFyICpwYXJhbUtleSwKLSAgICAgICAgY29uc3QgY2hhciAqc2V0U3RyKSBjb25zdCB7Ci0gICAgaW50IHBhcmFtSW5kZXggPSBpbmRleE9mUGFyYW0ocGFyYW1LZXkpOwotICAgIGlmICghX2lzUGFyYW1BY2Nlc3NUeXBlT0soZXh0LCBwYXJhbUluZGV4LCBPTVhfQW5kcm9pZFZlbmRvclZhbHVlU3RyaW5nKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHN0cm5jcHkoKGNoYXIgKilleHQtPm5QYXJhbVtwYXJhbUluZGV4XS5jU3RyaW5nLCBzZXRTdHIsIE9NWF9NQVhfU1RSSU5HVkFMVUVfU0laRSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgVmVuZG9yRXh0ZW5zaW9uOjpyZWFkUGFyYW1JbnQzMigKLSAgICAgICAgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICpleHQsIGNvbnN0IGNoYXIgKnBhcmFtS2V5LAotICAgICAgICBPTVhfUzMyICpyZWFkSW50MzIpIGNvbnN0IHsKLSAgICBpbnQgcGFyYW1JbmRleCA9IGluZGV4T2ZQYXJhbShwYXJhbUtleSk7Ci0gICAgaWYgKCFfaXNQYXJhbUFjY2Vzc1R5cGVPSyhleHQsIHBhcmFtSW5kZXgsIE9NWF9BbmRyb2lkVmVuZG9yVmFsdWVJbnQzMikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoZXh0LT5uUGFyYW1bcGFyYW1JbmRleF0uYlNldCA9PSBPTVhfVFJVRSkgewotICAgICAgICAqcmVhZEludDMyID0gZXh0LT5uUGFyYW1bcGFyYW1JbmRleF0ubkludDMyOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFZlbmRvckV4dGVuc2lvbjo6cmVhZFBhcmFtSW50NjQoCi0gICAgICAgIE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0LCBjb25zdCBjaGFyICpwYXJhbUtleSwKLSAgICAgICAgT01YX1MzMiAqcmVhZEludDY0KSBjb25zdCB7Ci0gICAgaW50IHBhcmFtSW5kZXggPSBpbmRleE9mUGFyYW0ocGFyYW1LZXkpOwotICAgIGlmICghX2lzUGFyYW1BY2Nlc3NUeXBlT0soZXh0LCBwYXJhbUluZGV4LCBPTVhfQW5kcm9pZFZlbmRvclZhbHVlSW50NjQpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGV4dC0+blBhcmFtW3BhcmFtSW5kZXhdLmJTZXQgPT0gT01YX1RSVUUpIHsKLSAgICAgICAgKnJlYWRJbnQ2NCA9IGV4dC0+blBhcmFtW3BhcmFtSW5kZXhdLm5JbnQ2NDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBWZW5kb3JFeHRlbnNpb246OnJlYWRQYXJhbUludDY0KAotICAgICAgICAgICAgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICpleHQsIGNvbnN0IGNoYXIgKnBhcmFtS2V5LAotICAgICAgICAgICAgY2hhciAqcmVhZFN0cikgY29uc3QgewotICAgIGludCBwYXJhbUluZGV4ID0gaW5kZXhPZlBhcmFtKHBhcmFtS2V5KTsKLSAgICBpZiAoIV9pc1BhcmFtQWNjZXNzVHlwZU9LKGV4dCwgcGFyYW1JbmRleCwgT01YX0FuZHJvaWRWZW5kb3JWYWx1ZVN0cmluZykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoZXh0LT5uUGFyYW1bcGFyYW1JbmRleF0uYlNldCA9PSBPTVhfVFJVRSkgewotICAgICAgICBzdHJuY3B5KHJlYWRTdHIsCi0gICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilleHQtPm5QYXJhbVtwYXJhbUluZGV4XS5jU3RyaW5nLCBPTVhfTUFYX1NUUklOR1ZBTFVFX1NJWkUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBDaGVja2VycwotT01YX0VSUk9SVFlQRSBWZW5kb3JFeHRlbnNpb246OmlzQ29uZmlnVmFsaWQoCi0gICAgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICpleHQpIGNvbnN0IHsKLSAgICBBTE9HSSgiaXNDb25maWdWYWxpZCIpOwotCi0gICAgaWYgKGV4dC0+blBhcmFtU2l6ZVVzZWQgPCBleHQtPm5QYXJhbUNvdW50KSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJhbGxvdHRlZCBwYXJhbXMoJXUpIDwgcmVxdWlyZWQoJXUpIGZvciAlcyIsCi0gICAgICAgICAgICAgICAgZXh0LT5uUGFyYW1TaXplVXNlZCwgZXh0LT5uUGFyYW1Db3VudCwgbU5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotICAgIGlmIChleHQtPm5QYXJhbUNvdW50ICE9IHBhcmFtQ291bnQoKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiaW5jb3JyZWN0IHBhcmFtIGNvdW50KCV1KSB2L3MgcmVxdWlyZWQoJXUpIGZvciAlcyIsCi0gICAgICAgICAgICAgICAgZXh0LT5uUGFyYW1Db3VudCwgcGFyYW1Db3VudCgpLCBtTmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgaWYgKHN0cm5jbXAoKGNoYXIgKilleHQtPmNOYW1lLCBtTmFtZS5jX3N0cigpLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkgIT0gMCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZXh0ZW5zaW9uIG5hbWUgbWlzbWF0Y2goJXMpIHYvcyBleHBlY3RlZCglcykiLAotICAgICAgICAgICAgICAgIChjaGFyICopZXh0LT5jTmFtZSwgbU5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgcGFyYW1Db3VudCgpOyArK2kpIHsKLSAgICAgICAgaWYgKCFfaXNQYXJhbUFjY2Vzc09LKGV4dCwgaSkpIHsKLSAgICAgICAgICAgIEFMT0dJKCJfaXNQYXJhbUFjY2Vzc09LIGZhaWxlZCBmb3IgJXUiLCBpKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IGNoYXIqIFZlbmRvckV4dGVuc2lvbjo6dHlwZVN0cmluZyhPTVhfQU5EUk9JRF9WRU5ET1JfVkFMVUVUWVBFIHR5cGUpIHsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBPTVhfQW5kcm9pZFZlbmRvclZhbHVlSW50MzI6IHJldHVybiAiSW50MzIiOwotICAgICAgICBjYXNlIE9NWF9BbmRyb2lkVmVuZG9yVmFsdWVJbnQ2NDogcmV0dXJuICJJbnQ2NCI7Ci0gICAgICAgIGNhc2UgT01YX0FuZHJvaWRWZW5kb3JWYWx1ZVN0cmluZzogcmV0dXJuICJTdHJpbmciOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gIkludmFsaWRUeXBlIjsKLSAgICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIFZlbmRvckV4dGVuc2lvbjo6ZGVidWdTdHJpbmcoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgc3RyID0gInZlbmRvci4iICsgbU5hbWUgKyAieyI7Ci0gICAgZm9yIChjb25zdCBQYXJhbSYgcCA6IG1QYXJhbXMpIHsKLSAgICAgICAgc3RyICs9ICJ7ICI7Ci0gICAgICAgIHN0ciArPSBwLm5hbWUoKTsKLSAgICAgICAgc3RyICs9ICIgOiAiOwotICAgICAgICBzdHIgKz0gdHlwZVN0cmluZyhwLnR5cGUoKSk7Ci0gICAgICAgIHN0ciArPSAiIH0sICAiOwotICAgIH0KLSAgICBzdHIgKz0gIn0iOwotICAgIHJldHVybiBzdHI7Ci19Ci0KLWJvb2wgVmVuZG9yRXh0ZW5zaW9uOjpfaXNQYXJhbUFjY2Vzc1R5cGVPSygKLSAgICAgICAgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICpleHQsIGludCBwYXJhbUluZGV4LAotICAgICAgICBPTVhfQU5EUk9JRF9WRU5ET1JfVkFMVUVUWVBFIHR5cGUpIGNvbnN0IHsKLSAgICBpZiAocGFyYW1JbmRleCA8IDAKLSAgICAgICAgICAgIHx8IHBhcmFtSW5kZXggPj0gKGludClleHQtPm5QYXJhbVNpemVVc2VkCi0gICAgICAgICAgICB8fCBwYXJhbUluZGV4ID49IChpbnQpcGFyYW1Db3VudCgpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIFBhcmFtIGluZGV4KCVkKSBmb3IgJXMgKG1heD0ldSkiLAotICAgICAgICAgICAgICAgIHBhcmFtSW5kZXgsIG1OYW1lLmNfc3RyKCksIHBhcmFtQ291bnQoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgIT0gbVBhcmFtc1twYXJhbUluZGV4XS50eXBlKCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgVHlwZSBmb3IgZmllbGQoJXMpIGZvciAlcy4lcyAoZXhwZWN0ZWQ9JXMpIiwKLSAgICAgICAgICAgICAgICB0eXBlU3RyaW5nKHR5cGUpLCBtTmFtZS5jX3N0cigpLCBtUGFyYW1zW3BhcmFtSW5kZXhdLm5hbWUoKSwKLSAgICAgICAgICAgICAgICB0eXBlU3RyaW5nKG1QYXJhbXNbcGFyYW1JbmRleF0udHlwZSgpKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgVmVuZG9yRXh0ZW5zaW9uOjpfaXNQYXJhbUFjY2Vzc09LKAotICAgICAgICBPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX0VYVEVOU0lPTlRZUEUgKmV4dCwgaW50IHBhcmFtSW5kZXgpIGNvbnN0IHsKLSAgICBpZiAocGFyYW1JbmRleCA8IDAKLSAgICAgICAgICAgIHx8IHBhcmFtSW5kZXggPj0gKGludClleHQtPm5QYXJhbVNpemVVc2VkCi0gICAgICAgICAgICB8fCBwYXJhbUluZGV4ID49IChpbnQpcGFyYW1Db3VudCgpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIFBhcmFtIGluZGV4KCVkKSBmb3IgJXMgKG1heD0ldSkiLAotICAgICAgICAgICAgICAgIHBhcmFtSW5kZXgsIG1OYW1lLmNfc3RyKCksIHBhcmFtQ291bnQoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGV4dC0+blBhcmFtW3BhcmFtSW5kZXhdLmVWYWx1ZVR5cGUgIT0gbVBhcmFtc1twYXJhbUluZGV4XS50eXBlKCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgVHlwZSBmb3IgZmllbGQoJXMpIGZvciAlcy4lcyAoZXhwZWN0ZWQ9JXMpIiwKLSAgICAgICAgICAgICAgICB0eXBlU3RyaW5nKGV4dC0+blBhcmFtW3BhcmFtSW5kZXhdLmVWYWx1ZVR5cGUpLAotICAgICAgICAgICAgICAgIG1OYW1lLmNfc3RyKCksIG1QYXJhbXNbcGFyYW1JbmRleF0ubmFtZSgpLAotICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcobVBhcmFtc1twYXJhbUluZGV4XS50eXBlKCkpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKWV4dC0+blBhcmFtW3BhcmFtSW5kZXhdLmNLZXksCi0gICAgICAgICAgICBtUGFyYW1zW3BhcmFtSW5kZXhdLm5hbWUoKSwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpICE9IDApIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgS2V5IGZvciBmaWVsZCglcykgZm9yICVzLiVzIChleHBlY3RlZD0lcykiLAotICAgICAgICAgICAgICAgIGV4dC0+blBhcmFtW3BhcmFtSW5kZXhdLmNLZXksCi0gICAgICAgICAgICAgICAgbU5hbWUuY19zdHIoKSwgbVBhcmFtc1twYXJhbUluZGV4XS5uYW1lKCksCi0gICAgICAgICAgICAgICAgbVBhcmFtc1twYXJhbUluZGV4XS5uYW1lKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgVmVuZG9yRXh0ZW5zaW9uOjppbmRleE9mUGFyYW0oY29uc3QgY2hhciAqa2V5KSBjb25zdCB7Ci0gICAgaW50IGkgPSAwOwotICAgIGZvciAoY29uc3QgUGFyYW0mIHAgOiBtUGFyYW1zKSB7Ci0gICAgICAgIGlmICghc3RybmNtcChrZXksIHAubmFtZSgpLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgICAgICsraTsKLSAgICB9Ci0gICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBsb29rdXAgcGFyYW0oJXMpIGluIGV4dGVuc2lvbiglcykiLAotICAgICAgICAgICAga2V5LCBtTmFtZS5jX3N0cigpKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQgVmVuZG9yRXh0ZW5zaW9uU3RvcmU6OmR1bXBFeHRlbnNpb25zKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3QgewotICAgIERFQlVHX1BSSU5UX0hJR0goIiVzIDogVmVuZG9yIGV4dGVuc2lvbnMgc3VwcG9ydGVkICgldSkiLCBwcmVmaXgsIHNpemUoKSk7Ci0gICAgZm9yIChjb25zdCBWZW5kb3JFeHRlbnNpb24mIHYgOiBtRXh0KSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIiAgICVzIiwgdi5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9BbmRyb2lkLm1rIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0ZWIxZTguLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIAkJCQlDb21tb24gZGVmaW5pdG9ucwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbGlibW0tdmRlYy1kZWYgOj0gLURfX2FsaWdueFwoeFwpPV9fYXR0cmlidXRlX19cKFwoX19hbGlnbmVkX19cKHhcKVwpXCkKLWxpYm1tLXZkZWMtZGVmICs9IC1EX19hbGlnbj1fX2FsaWdueAotbGlibW0tdmRlYy1kZWYgKz0gLURpbmxpbmU9X19pbmxpbmUKLWxpYm1tLXZkZWMtZGVmICs9IC1nIC1PMwotbGlibW0tdmRlYy1kZWYgKz0gLURJTUFHRV9BUFBTX1BST0MKLWxpYm1tLXZkZWMtZGVmICs9IC1EX0FORFJPSURfCi1saWJtbS12ZGVjLWRlZiArPSAtRENERUNMCi1saWJtbS12ZGVjLWRlZiArPSAtRFRfQVJNCi1saWJtbS12ZGVjLWRlZiArPSAtRE5PX0FSTV9DTFoKLWxpYm1tLXZkZWMtZGVmICs9IC1VRU5BQkxFX0RFQlVHX0xPVwotbGlibW0tdmRlYy1kZWYgKz0gLVVFTkFCTEVfREVCVUdfSElHSAotbGlibW0tdmRlYy1kZWYgKz0gLURFTkFCTEVfREVCVUdfRVJST1IKLWxpYm1tLXZkZWMtZGVmICs9IC1VSU5QVVRfQlVGRkVSX0xPRwotbGlibW0tdmRlYy1kZWYgKz0gLVVPVVRQVVRfQlVGRkVSX0xPRwotbGlibW0tdmRlYy1kZWYgKz0gLVduby1wYXJlbnRoZXNlcwotbGlibW0tdmRlYy1kZWYgKz0gLURfQU5EUk9JRF9JQ1NfCi1saWJtbS12ZGVjLWRlZiArPSAtRFBST0NFU1NfRVhUUkFEQVRBX0lOX09VVFBVVF9QT1JUCi0KLVRBUkdFVFNfVEhBVF9IQVZFX1ZFTlVTX0hFVkMgOj0gYXBxODA4NCBtc204OTk0IG1zbTg5OTYKLVRBUkdFVFNfVEhBVF9TVVBQT1JUX1VCV0MgOj0gbXNtODk5NiBtc204OTUzIG1zbTg5OTggc2RtNjYwIHNkbTg0NQotVEFSR0VUU19USEFUX05FRURfU1dfVkRFQyA6PSBtc204OTM3IHNkbTg0NQotCi1pZmVxICgkKGNhbGwgaXMtYm9hcmQtcGxhdGZvcm0taW4tbGlzdCwgJChUQVJHRVRTX1RIQVRfSEFWRV9WRU5VU19IRVZDKSksdHJ1ZSkKLWxpYm1tLXZkZWMtZGVmICs9IC1EVkVOVVNfSEVWQwotZW5kaWYKLQotaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLG1zbTg2MTApCi1saWJtbS12ZGVjLWRlZiArPSAtRFNNT09USF9TVFJFQU1JTkdfRElTQUJMRUQKLWVuZGlmCi0KLWlmZXEgKCQoY2FsbCBpcy1ib2FyZC1wbGF0Zm9ybS1pbi1saXN0LCAkKFRBUkdFVFNfVEhBVF9TVVBQT1JUX1VCV0MpKSx0cnVlKQotbGlibW0tdmRlYy1kZWYgKz0gLURfVUJXQ18KLWVuZGlmCi0KLWlmZXEgKCQoVEFSR0VUX1VTRVNfSU9OKSx0cnVlKQotbGlibW0tdmRlYy1kZWYgKz0gLURVU0VfSU9OCi1lbmRpZgotCi1pZm5lcSAoMSwkKGZpbHRlciAxLCQoc2hlbGwgZWNobyAiJCQoKCAkKFBMQVRGT1JNX1NES19WRVJTSU9OKSA+PSAxOCApKSIgKSkpCi1saWJtbS12ZGVjLWRlZiArPSAtREFORFJPSURfSkVMTFlCRUFOX01SMT0xCi1lbmRpZgotCi1pZmVxICgkKGNhbGwgaXMtYm9hcmQtcGxhdGZvcm0taW4tbGlzdCwgJChNQVNURVJfU0lERV9DUF9UQVJHRVRfTElTVCkpLHRydWUpCi1saWJtbS12ZGVjLWRlZiArPSAtRE1BU1RFUl9TSURFX0NQCi1lbmRpZgotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBDb21tb24gSW5jbHVkZXMKLWxpYm1tLXZkZWMtaW5jICAgICAgICAgIDo9ICQoTE9DQUxfUEFUSCkvaW5jCi1saWJtbS12ZGVjLWluYyAgICAgICAgICArPSAkKFRPUCkvaGFyZHdhcmUvcWNvbS9tZWRpYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL2NvbW1vbi9pbmMKLWxpYm1tLXZkZWMtaW5jICAgICAgICAgICs9ICQoVE9QKS9oYXJkd2FyZS9xY29tL21lZGlhL3NkbTg0NS9tbS1jb3JlL2luYwotbGlibW0tdmRlYy1pbmMgICAgICAgICAgKz0gJChUQVJHRVRfT1VUX0hFQURFUlMpL3Fjb20vZGlzcGxheQotbGlibW0tdmRlYy1pbmMgICAgICAgICAgKz0gJChUQVJHRVRfT1VUX0hFQURFUlMpL2FkcmVubwotbGlibW0tdmRlYy1pbmMgICAgICAgICAgKz0gJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotbGlibW0tdmRlYy1pbmMgICAgICAgICAgKz0gJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUKLWxpYm1tLXZkZWMtaW5jICAgICAgCSs9ICQoVE9QKS9oYXJkd2FyZS9xY29tL21lZGlhL3NkbTg0NS9saWJjMmRjb2xvcmNvbnZlcnQKLWxpYm1tLXZkZWMtaW5jICAgICAgCSs9ICQoVEFSR0VUX09VVF9IRUFERVJTKS9tbS12aWRlby9Td1ZkZWMKLWxpYm1tLXZkZWMtaW5jICAgICAgCSs9ICQoVEFSR0VUX09VVF9IRUFERVJTKS9tbS12aWRlby9zd3ZkZWMKLWxpYm1tLXZkZWMtaW5jICAgICAgCSs9ICQoVEFSR0VUX09VVF9JTlRFUk1FRElBVEVTKS9LRVJORUxfT0JKL3Vzci9pbmNsdWRlCi1saWJtbS12ZGVjLWluYyAgICAgIAkrPSAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9uYXRpdmViYXNlL2luY2x1ZGUKLQotaWZlcSAoJChQTEFURk9STV9TREtfVkVSU0lPTiksIDE4KSAgI0pCX01SMgotbGlibW0tdmRlYy1kZWYgKz0gLURBTkRST0lEX0pFTExZQkVBTl9NUjI9MQotbGlibW0tdmRlYy1pbmMgKz0gJChUT1ApL2hhcmR3YXJlL3Fjb20vbWVkaWEvc2RtODQ1L2xpYnN0YWdlZnJpZ2h0aHcKLWVuZGlmCi0KLSMgQ29tbW9uIERlcGVuZGVuY2llcwotbGlibW0tdmRlYy1hZGQtZGVwIDo9ICQoVEFSR0VUX09VVF9JTlRFUk1FRElBVEVTKS9LRVJORUxfT0JKL3VzcgotCi1pZmVxICgkKGNhbGwgaXMtcGxhdGZvcm0tc2RrLXZlcnNpb24tYXQtbGVhc3QsIDE5KSx0cnVlKQotIyBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBmb3IgQW5kcm9pZCBLSysKLWxpYm1tLXZkZWMtZGVmICs9IC1EQURBUFRJVkVfUExBWUJBQ0tfU1VQUE9SVEVECi1lbmRpZgotCi1pZmVxICgkKGNhbGwgaXMtcGxhdGZvcm0tc2RrLXZlcnNpb24tYXQtbGVhc3QsIDIyKSx0cnVlKQotIyBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBmb3IgQW5kcm9pZCBMTVIxCi1saWJtbS12ZGVjLWRlZiArPSAtREZMRVhZVVZfU1VQUE9SVEVECi1lbmRpZgotCi1pZmVxICgkKFRBUkdFVF9VU0VTX01FRElBX0VYVEVOU0lPTlMpLHRydWUpCi1saWJtbS12ZGVjLWRlZiArPSAtREFMTE9DQVRFX09VVFBVVF9OQVRJVkVIQU5ETEUKLWVuZGlmCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIAkJCU1ha2UgdGhlIFNoYXJlZCBsaWJyYXJ5IChsaWJPbXhWZGVjKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSAgICAgICAgICAgICAgICAgICAgOj0gbGliT214VmRlYwotTE9DQUxfTU9EVUxFX1RBR1MgICAgICAgICAgICAgICA6PSBvcHRpb25hbAotTE9DQUxfVkVORE9SX01PRFVMRSAgICAgICAgICAgICA6PSB0cnVlCi1MT0NBTF9DRkxBR1MgICAgICAgICAgICAgICAgICAgIDo9ICQobGlibW0tdmRlYy1kZWYpIC1XZXJyb3IKLUxPQ0FMX0NfSU5DTFVERVMgICAgICAgICAgICAgICAgKz0gJChsaWJtbS12ZGVjLWluYykKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTICAgOj0gJChsaWJtbS12ZGVjLWFkZC1kZXApCi1MT0NBTF9IRUFERVJfTElCUkFSSUVTICAgICAgICAgIDo9IGxpYm5hdGl2ZWJhc2VfaGVhZGVycwotCi1MT0NBTF9QUkVMSU5LX01PRFVMRSAgICA6PSBmYWxzZQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgOj0gbGlibG9nIGxpYmN1dGlscyBsaWJkbCBsaWJ1aQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGliYzJkY29sb3Jjb252ZXJ0Ci1MT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJxZE1ldGFEYXRhCi0KLUxPQ0FMX1NSQ19GSUxFUyAgICAgICAgIDo9IHNyYy90c19wYXJzZXIuY3BwCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTICA6PSBsaWJPbXhWaWRjQ29tbW9uCi1MT0NBTF9TUkNfRklMRVMgICAgICAgICArPSBzcmMvb214X3ZkZWNfdjRsMi5jcHAKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgCQkJTWFrZSB0aGUgU2hhcmVkIGxpYnJhcnkgKGxpYk9teFN3VmRlYykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotaWZuZXEgIiQod2lsZGNhcmQgJChRQ1BBVEgpICkiICIiCi1pZmVxICgkKGNhbGwgaXMtYm9hcmQtcGxhdGZvcm0taW4tbGlzdCwgJChUQVJHRVRTX1RIQVRfTkVFRF9TV19WREVDKSksdHJ1ZSkKLQotTE9DQUxfTU9EVUxFICAgICAgICAgICAgICAgICAgOj0gbGliT214U3dWZGVjCi1MT0NBTF9NT0RVTEVfVEFHUyAgICAgICAgICAgICA6PSBvcHRpb25hbAotTE9DQUxfVkVORE9SX01PRFVMRSAgICAgICAgICAgOj0gdHJ1ZQotTE9DQUxfQ0ZMQUdTICAgICAgICAgICAgICAgICAgOj0gJChsaWJtbS12ZGVjLWRlZikKLUxPQ0FMX0NfSU5DTFVERVMgICAgICAgICAgICAgICs9ICQobGlibW0tdmRlYy1pbmMpCi1MT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKGxpYm1tLXZkZWMtYWRkLWRlcCkKLQotTE9DQUxfUFJFTElOS19NT0RVTEUgICAgICAgICAgOj0gZmFsc2UKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICAgICAgIDo9IGxpYmxvZyBsaWJjdXRpbHMgbGliYzJkY29sb3Jjb252ZXJ0Ci1MT0NBTF9TSEFSRURfTElCUkFSSUVTICAgICAgICArPSBsaWJzd3ZkZWMKLQotTE9DQUxfU1JDX0ZJTEVTICAgICAgICAgICAgICAgOj0gc3JjL29teF9zd3ZkZWMuY3BwCi1MT0NBTF9TUkNfRklMRVMgICAgICAgICAgICAgICArPSBzcmMvb214X3N3dmRlY191dGlscy5jcHAKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotZW5kaWYKLWVuZGlmCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jICAgICAgICAgICAgICAgIEVORAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9NYWtlZmlsZS5hbSBiL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE3OGQwOC4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1BTV9DRkxBR1MgPSAtV2FsbAotQU1fQ0ZMQUdTICs9IC1XdW5kZWYKLUFNX0NGTEFHUyArPSAtV3N0cmljdC1wcm90b3R5cGVzCi1BTV9DRkxBR1MgKz0gLVduby10cmlncmFwaHMKLUFNX0NGTEFHUyArPSAtZyAtTzMKLQotQU1fQ1BQRkxBR1MgOj0gLURfX2FsaWdueFwoeFwpPV9fYXR0cmlidXRlX19cKFwoX19hbGlnbmVkX19cKHhcKVwpXCkKLUFNX0NQUEZMQUdTICs9IC1EX19hbGlnbj1fX2FsaWdueAotQU1fQ1BQRkxBR1MgKz0gLURpbmxpbmU9X19pbmxpbmUKLUFNX0NQUEZMQUdTICs9IC1nIC1PMwotQU1fQ1BQRkxBR1MgKz0gLURJTUFHRV9BUFBTX1BST0MKLUFNX0NQUEZMQUdTICs9IC1EX0FORFJPSURfCi1BTV9DUFBGTEFHUyArPSAtRENERUNMCi1BTV9DUFBGTEFHUyArPSAtRFRfQVJNCi1BTV9DUFBGTEFHUyArPSAtRE5PX0FSTV9DTFoKLUFNX0NQUEZMQUdTICs9IC1VRU5BQkxFX0RFQlVHX0xPVwotQU1fQ1BQRkxBR1MgKz0gLVVFTkFCTEVfREVCVUdfSElHSAotQU1fQ1BQRkxBR1MgKz0gLURFTkFCTEVfREVCVUdfRVJST1IKLUFNX0NQUEZMQUdTICs9IC1VSU5QVVRfQlVGRkVSX0xPRwotQU1fQ1BQRkxBR1MgKz0gLVVPVVRQVVRfQlVGRkVSX0xPRwotQU1fQ1BQRkxBR1MgKz0gLVduby1wYXJlbnRoZXNlcwotQU1fQ1BQRkxBR1MgKz0gLURfQU5EUk9JRF9JQ1NfCi1BTV9DUFBGTEFHUyArPSAtRFBST0NFU1NfRVhUUkFEQVRBX0lOX09VVFBVVF9QT1JUCi0jQU1fQ1BQRkxBR1MgKz0gIi1pbmNsdWRlIHN0ZGludC5oIgotQU1fQ1BQRkxBR1MgKz0gIi1Ec3RybGNweT1nX3N0cmxjcHkiCi1BTV9DUFBGTEFHUyArPSAiLURzdHJsY2F0PWdfc3RybGNhdCIKLUFNX0NQUEZMQUdTICs9ICItc3RkPWMrKzExIgotQU1fQ1BQRkxBR1MgKz0gIi1ESEFWRV9BTkRST0lEX09TIgotQU1fQ1BQRkxBR1MgKz0gLURTWVNfSU9DVEwKLQotaWYgVVNFX0dMSUIKLUFNX0NQUEZMQUdTICs9IC1EX1VTRV9HTElCXwotZW5kaWYKLQotaWYgVEFSR0VUX01TTTg2MTAKLUFNX0NQUEZMQUdTICs9IC1EVkVOVVNfSEVWQwotZW5kaWYKLQotaWYgVEFSR0VUU19USEFUX1NVUFBPUlRfVUJXQwotQU1fQ1BQRkxBR1MgKz0gLURfVUJXQ18KLWVuZGlmCi0KLWlmIFRBUkdFVF9VU0VTX0lPTgotQU1fQ1BQRkxBR1MgKz0gLURVU0VfSU9OCi1lbmRpZgotCi1pZiBNQVNURVJfU0lERV9DUF9UQVJHRVRfTElTVAotQU1fQ1BQRkxBR1MgKz0gLURNQVNURVJfU0lERV9DUAotZW5kaWYKLQotQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL21tLXZpZGVvLXY0bDIvdmlkYy9jb21tb24vaW5jLwotQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy8KLUFNX0NQUEZMQUdTICs9IC1JJCh0b3Bfc3JjZGlyKS9saWJjMmRjb2xvcmNvbnZlcnQvCi1BTV9DUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvbW0tY29yZS9pbmMvCi1BTV9DUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvbW0tY29yZS9zcmMvY29tbW9uLwotCi1jX3NvdXJjZXMgICAgICAgICA6PSBzcmMvZnJhbWVwYXJzZXIuY3BwCi1jX3NvdXJjZXMgICAgICAgICArPSBzcmMvaDI2NF91dGlscy5jcHAKLWNfc291cmNlcyAgICAgICAgICs9IHNyYy90c19wYXJzZXIuY3BwCi1jX3NvdXJjZXMgICAgICAgICArPSBzcmMvbXA0X3V0aWxzLmNwcAotY19zb3VyY2VzICAgICAgICAgKz0gc3JjL2hldmNfdXRpbHMuY3BwCi1jX3NvdXJjZXMgICAgICAgICArPSBzcmMvb214X3ZkZWNfdjRsMi5jcHAKLQotbGliX0xUTElCUkFSSUVTID0gbGliT214VmRlYy5sYQotbGliT214VmRlY19sYV9TT1VSQ0VTID0gJChjX3NvdXJjZXMpCi1saWJPbXhWZGVjX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKEFNX0NQUEZMQUdTKSAtZlBJQwotbGliT214VmRlY19sYV9DRkxBR1MgKz0gLi4vbGliYzJkMmNvbG9yY29udmVydC9saWJjMmRjb2xvcmNvbnZlcnQubGEKLWxpYk9teFZkZWNfbGFfTERGTEFHUyA9IC1sZ2xpYi0yLjAgLXNoYXJlZCAtdmVyc2lvbi1pbmZvIDAKZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9pbmMvTWFwLmggYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL01hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjIyZWIyLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9pbmMvTWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIDIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgX01BUF9IXwotI2RlZmluZSBfTUFQX0hfCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCx0eXBlbmFtZSBUMj4KLWNsYXNzIE1hcAotewotICAgIHN0cnVjdCBub2RlIHsKLSAgICAgICAgVCAgICBkYXRhOwotICAgICAgICBUMiAgIGRhdGEyOwotICAgICAgICBub2RlKiBwcmV2OwotICAgICAgICBub2RlKiBuZXh0OwotICAgICAgICBub2RlKFQgdCwgVDIgdDIsbm9kZSogcCwgbm9kZSogbikgOgotICAgICAgICAgICAgZGF0YSh0KSwgZGF0YTIodDIpLCBwcmV2KHApLCBuZXh0KG4pIHt9Ci0gICAgfTsKLSAgICBub2RlKiBoZWFkOwotICAgIG5vZGUqIHRhaWw7Ci0gICAgbm9kZSogdG1wOwotICAgIHVuc2lnbmVkIHNpemVfb2ZfbGlzdDsKLSAgICBzdGF0aWMgTWFwPFQsVDI+ICptX3NlbGY7Ci0gICAgcHVibGljOgotICAgIE1hcCgpIDogaGVhZCggTlVMTCApLCB0YWlsICggTlVMTCApLHRtcChoZWFkKSxzaXplX29mX2xpc3QoMCkge30KLSAgICBib29sIGVtcHR5KCkgY29uc3QgewotICAgICAgICByZXR1cm4gKCAhaGVhZCB8fCAhdGFpbCApOwotICAgIH0KLSAgICBvcGVyYXRvciBib29sKCkgY29uc3QgewotICAgICAgICByZXR1cm4gIWVtcHR5KCk7Ci0gICAgfQotICAgIHZvaWQgaW5zZXJ0KFQsVDIpOwotICAgIHZvaWQgc2hvdygpOwotICAgIGludCAgc2l6ZSgpOwotICAgIFQyIGZpbmQoVCk7IC8vIFJldHVybiBWQUxVRQotICAgIFQgZmluZF9lbGUoVCk7Ly8gQ2hlY2sgaWYgdGhlIEtFWSBpcyBwcmVzZW50IG9yIG5vdAotICAgIFQyIGJlZ2luKCk7IC8vZ2l2ZSB0aGUgZmlyc3QgZWxlCi0gICAgYm9vbCBlcmFzZShUKTsKLSAgICBib29sIGVyYXNlYWxsKCk7Ci0gICAgYm9vbCBpc2VtcHR5KCk7Ci0gICAgfk1hcCgpIHsKLSAgICAgICAgd2hpbGUgKGhlYWQpIHsKLSAgICAgICAgICAgIG5vZGUqIHRlbXAoaGVhZCk7Ci0gICAgICAgICAgICBoZWFkPWhlYWQtPm5leHQ7Ci0gICAgICAgICAgICBzaXplX29mX2xpc3QtLTsKLSAgICAgICAgICAgIGRlbGV0ZSB0ZW1wOwotICAgICAgICB9Ci0gICAgfQotfTsKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULHR5cGVuYW1lIFQyPgotVDIgTWFwPFQsVDI+OjpmaW5kKFQgZDEpCi17Ci0gICAgdG1wID0gaGVhZDsKLQotICAgIHdoaWxlICh0bXApIHsKLSAgICAgICAgaWYgKHRtcC0+ZGF0YSA9PSBkMSkgewotICAgICAgICAgICAgcmV0dXJuIHRtcC0+ZGF0YTI7Ci0gICAgICAgIH0KLQotICAgICAgICB0bXAgPSB0bXAtPm5leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCx0eXBlbmFtZSBUMj4KLVQgTWFwPFQsVDI+OjpmaW5kX2VsZShUIGQxKQotewotICAgIHRtcCA9IGhlYWQ7Ci0KLSAgICB3aGlsZSAodG1wKSB7Ci0gICAgICAgIGlmICh0bXAtPmRhdGEgPT0gZDEpIHsKLSAgICAgICAgICAgIHJldHVybiB0bXAtPmRhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICB0bXAgPSB0bXAtPm5leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCx0eXBlbmFtZSBUMj4KLVQyIE1hcDxULFQyPjo6YmVnaW4oKQotewotICAgIHRtcCA9IGhlYWQ7Ci0KLSAgICBpZiAodG1wKSB7Ci0gICAgICAgIHJldHVybiAodG1wLT5kYXRhMik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCx0eXBlbmFtZSBUMj4KLXZvaWQgTWFwPFQsVDI+OjpzaG93KCkKLXsKLSAgICB0bXAgPSBoZWFkOwotCi0gICAgd2hpbGUgKHRtcCkgewotICAgICAgICBwcmludGYoIiVkLS0+JWRcbiIsdG1wLT5kYXRhLHRtcC0+ZGF0YTIpOwotICAgICAgICB0bXAgPSB0bXAtPm5leHQ7Ci0gICAgfQotfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsdHlwZW5hbWUgVDI+Ci1pbnQgTWFwPFQsVDI+OjpzaXplKCkKLXsKLSAgICBpbnQgY291bnQgPTA7Ci0gICAgdG1wID0gaGVhZDsKLQotICAgIHdoaWxlICh0bXApIHsKLSAgICAgICAgdG1wID0gdG1wLT5uZXh0OwotICAgICAgICBjb3VudCsrOwotICAgIH0KLQotICAgIHJldHVybiBjb3VudDsKLX0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULHR5cGVuYW1lIFQyPgotdm9pZCBNYXA8VCxUMj46Omluc2VydChUIGRhdGEsIFQyIGRhdGEyKQotewotICAgIHRhaWwgPSBuZXcgbm9kZShkYXRhLCBkYXRhMix0YWlsLCBOVUxMKTsKLQotICAgIGlmICggdGFpbC0+cHJldiApCi0gICAgICAgIHRhaWwtPnByZXYtPm5leHQgPSB0YWlsOwotCi0gICAgaWYgKCBlbXB0eSgpICkgewotICAgICAgICBoZWFkID0gdGFpbDsKLSAgICAgICAgdG1wPWhlYWQ7Ci0gICAgfQotCi0gICAgdG1wID0gaGVhZDsKLSAgICBzaXplX29mX2xpc3QrKzsKLX0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULHR5cGVuYW1lIFQyPgotYm9vbCBNYXA8VCxUMj46OmVyYXNlKFQgZCkKLXsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgdG1wID0gaGVhZDsKLSAgICBub2RlKiBwcmV2bm9kZSA9IHRtcDsKLSAgICBub2RlICp0ZW1wbm9kZTsKLQotICAgIHdoaWxlICh0bXApIHsKLSAgICAgICAgaWYgKChoZWFkID09IHRhaWwpICYmIChoZWFkLT5kYXRhID09IGQpKSB7Ci0gICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB0ZW1wbm9kZSA9IGhlYWQ7Ci0gICAgICAgICAgICBoZWFkID0gdGFpbCA9IE5VTEw7Ci0gICAgICAgICAgICBkZWxldGUgdGVtcG5vZGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgodG1wID09aGVhZCkgJiYgKHRtcC0+ZGF0YSA9PWQpKSB7Ci0gICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB0ZW1wbm9kZSA9IHRtcDsKLSAgICAgICAgICAgIHRtcCA9IHRtcC0+bmV4dDsKLSAgICAgICAgICAgIHRtcC0+cHJldiA9IE5VTEw7Ci0gICAgICAgICAgICBoZWFkID0gdG1wOwotICAgICAgICAgICAgdGVtcG5vZGUtPm5leHQgPSBOVUxMOwotICAgICAgICAgICAgZGVsZXRlIHRlbXBub2RlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHRtcCA9PSB0YWlsKSAmJiAodG1wLT5kYXRhID09ZCkpIHsKLSAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIHRlbXBub2RlID0gdG1wOwotICAgICAgICAgICAgcHJldm5vZGUtPm5leHQgPSBOVUxMOwotICAgICAgICAgICAgdG1wLT5wcmV2ID0gTlVMTDsKLSAgICAgICAgICAgIHRhaWwgPSBwcmV2bm9kZTsKLSAgICAgICAgICAgIGRlbGV0ZSB0ZW1wbm9kZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRtcC0+ZGF0YSA9PSBkKSB7Ci0gICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBwcmV2bm9kZS0+bmV4dCA9IHRtcC0+bmV4dDsKLSAgICAgICAgICAgIHRtcC0+bmV4dC0+cHJldiA9IHByZXZub2RlLT5uZXh0OwotICAgICAgICAgICAgdGVtcG5vZGUgPSB0bXA7Ci0gICAgICAgICAgICAvL3RtcCA9IHRtcC0+bmV4dDsKLSAgICAgICAgICAgIGRlbGV0ZSB0ZW1wbm9kZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJldm5vZGUgPSB0bXA7Ci0gICAgICAgIHRtcCA9IHRtcC0+bmV4dDsKLSAgICB9Ci0KLSAgICBpZiAoZm91bmQpc2l6ZV9vZl9saXN0LS07Ci0KLSAgICByZXR1cm4gZm91bmQ7Ci19Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCx0eXBlbmFtZSBUMj4KLWJvb2wgTWFwPFQsVDI+OjplcmFzZWFsbCgpCi17Ci0gICAgbm9kZSAqdGVtcG5vZGU7Ci0gICAgdG1wID0gaGVhZDsKLQotICAgIHdoaWxlIChoZWFkKSB7Ci0gICAgICAgIHRlbXBub2RlID0gaGVhZDsKLSAgICAgICAgdGVtcG5vZGUtPm5leHQgPSBOVUxMOwotICAgICAgICBoZWFkID0gaGVhZC0+bmV4dDsKLSAgICAgICAgZGVsZXRlIHRlbXBub2RlOwotICAgIH0KLQotICAgIHRhaWwgPSBoZWFkID0gTlVMTDsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsdHlwZW5hbWUgVDI+Ci1ib29sIE1hcDxULFQyPjo6aXNlbXB0eSgpCi17Ci0gICAgaWYgKCFzaXplX29mX2xpc3QpIHJldHVybiB0cnVlOwotICAgIGVsc2UgcmV0dXJuIGZhbHNlOwotfQotCi0jZW5kaWYgLy8gX01BUF9IXwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy9oZXZjX3V0aWxzLmggYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL2hldmNfdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3ZDFkMi4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL2hldmNfdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0jaWZuZGVmIEhFVkNfVVRJTFNfSAotI2RlZmluZSBIRVZDX1VUSUxTX0gKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiBNIE0KLSAgICAgICAgIFUgdCBpIGwgaSB0IGkgZSBzICAgYSBuIGQgICBIIGUgbCBwIGUgciAgIFIgbyB1IHQgaSBuIGUgcwotCi0qLy8qKiBAZmlsZSBIRVZDX1V0aWxzLmgKLVRoaXMgbW9kdWxlIGNvbnRhaW5zIEgyNjQgdmlkZW8gZGVjb2RlciB1dGlsaXRpZXMgYW5kIGhlbHBlciByb3V0aW5lcy4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUyBGT1IgTU9EVUxFCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlICJNYXAuaCIKLSNpbmNsdWRlICJxdHlwZXMuaCIKLSNpbmNsdWRlICJPTVhfQ29yZS5oIgotI2luY2x1ZGUgIk9NWF9RQ09NRXh0bnMuaCIKLQotCi1jbGFzcyBIRVZDX1V0aWxzCi17Ci0gICAgcHVibGljOgotICAgICAgICBIRVZDX1V0aWxzKCk7Ci0gICAgICAgIH5IRVZDX1V0aWxzKCk7Ci0KLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBOQUxfVU5JVF9DT0RFRF9TTElDRV9UUkFJTF9OLCAgICAvLyAwCi0gICAgICAgICAgICBOQUxfVU5JVF9DT0RFRF9TTElDRV9UUkFJTF9SLCAgICAvLyAxCi0gICAgICAgICAgICBOQUxfVU5JVF9DT0RFRF9TTElDRV9UU0FfTiwgICAgICAgIC8vIDIKLSAgICAgICAgICAgIE5BTF9VTklUX0NPREVEX1NMSUNFX1RMQSwgICAgICAgIC8vIDMKLSAgICAgICAgICAgIE5BTF9VTklUX0NPREVEX1NMSUNFX1NUU0FfTiwgICAgLy8gNAotICAgICAgICAgICAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfU1RTQV9SLCAgICAvLyA1Ci0gICAgICAgICAgICBOQUxfVU5JVF9DT0RFRF9TTElDRV9SQURMX04sICAgIC8vIDYKLSAgICAgICAgICAgIE5BTF9VTklUX0NPREVEX1NMSUNFX0RMUCwgICAgICAgIC8vIDcKLSAgICAgICAgICAgIE5BTF9VTklUX0NPREVEX1NMSUNFX1JBU0xfTiwgICAgLy8gOAotICAgICAgICAgICAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfVEZELCAgICAgICAgLy8gOQotICAgICAgICAgICAgTkFMX1VOSVRfUkVTRVJWRURfMTAsCi0gICAgICAgICAgICBOQUxfVU5JVF9SRVNFUlZFRF8xMSwKLSAgICAgICAgICAgIE5BTF9VTklUX1JFU0VSVkVEXzEyLAotICAgICAgICAgICAgTkFMX1VOSVRfUkVTRVJWRURfMTMsCi0gICAgICAgICAgICBOQUxfVU5JVF9SRVNFUlZFRF8xNCwKLSAgICAgICAgICAgIE5BTF9VTklUX1JFU0VSVkVEXzE1LAotICAgICAgICAgICAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBLCAgICAgICAgLy8gMTYKLSAgICAgICAgICAgIE5BTF9VTklUX0NPREVEX1NMSUNFX0JMQU5ULCAgICAgICAgLy8gMTcKLSAgICAgICAgICAgIE5BTF9VTklUX0NPREVEX1NMSUNFX0JMQV9OX0xQLCAgICAvLyAxOAotICAgICAgICAgICAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSLCAgICAgICAgLy8gMTkKLSAgICAgICAgICAgIE5BTF9VTklUX0NPREVEX1NMSUNFX0lEUl9OX0xQLCAgICAvLyAyMAotICAgICAgICAgICAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfQ1JBLCAgICAgICAgLy8gMjEKLSAgICAgICAgICAgIE5BTF9VTklUX1JFU0VSVkVEXzIyLAotICAgICAgICAgICAgTkFMX1VOSVRfUkVTRVJWRURfMjMsCi0gICAgICAgICAgICBOQUxfVU5JVF9SRVNFUlZFRF8yNCwKLSAgICAgICAgICAgIE5BTF9VTklUX1JFU0VSVkVEXzI1LAotICAgICAgICAgICAgTkFMX1VOSVRfUkVTRVJWRURfMjYsCi0gICAgICAgICAgICBOQUxfVU5JVF9SRVNFUlZFRF8yNywKLQotICAgICAgICAgICAgTkFMX1VOSVRfUkVTRVJWRURfMjgsCi0gICAgICAgICAgICBOQUxfVU5JVF9SRVNFUlZFRF8yOSwKLSAgICAgICAgICAgIE5BTF9VTklUX1JFU0VSVkVEXzMwLAotICAgICAgICAgICAgTkFMX1VOSVRfUkVTRVJWRURfMzEsCi0KLSAgICAgICAgICAgIE5BTF9VTklUX1ZQUywgICAgICAgICAgICAgICAgICAgIC8vIDMyCi0gICAgICAgICAgICBOQUxfVU5JVF9TUFMsICAgICAgICAgICAgICAgICAgICAvLyAzMwotICAgICAgICAgICAgTkFMX1VOSVRfUFBTLCAgICAgICAgICAgICAgICAgICAgLy8gMzQKLSAgICAgICAgICAgIE5BTF9VTklUX0FDQ0VTU19VTklUX0RFTElNSVRFUiwgLy8gMzUKLSAgICAgICAgICAgIE5BTF9VTklUX0VPUywgICAgICAgICAgICAgICAgICAgIC8vIDM2Ci0gICAgICAgICAgICBOQUxfVU5JVF9FT0IsICAgICAgICAgICAgICAgICAgICAvLyAzNwotICAgICAgICAgICAgTkFMX1VOSVRfRklMTEVSX0RBVEEsICAgICAgICAgICAgLy8gMzgKLSAgICAgICAgICAgIE5BTF9VTklUX1NFSSwgICAgICAgICAgICAgICAgICAgIC8vIDM5IFByZWZpeCBTRUkKLSAgICAgICAgICAgIE5BTF9VTklUX1NFSV9TVUZGSVgsICAgICAgICAgICAgLy8gNDAgU3VmZml4IFNFSQotCi0gICAgICAgICAgICBOQUxfVU5JVF9SRVNFUlZFRF80MSwKLSAgICAgICAgICAgIE5BTF9VTklUX1JFU0VSVkVEXzQyLAotICAgICAgICAgICAgTkFMX1VOSVRfUkVTRVJWRURfNDMsCi0gICAgICAgICAgICBOQUxfVU5JVF9SRVNFUlZFRF80NCwKLSAgICAgICAgICAgIE5BTF9VTklUX1JFU0VSVkVEXzQ1LAotICAgICAgICAgICAgTkFMX1VOSVRfUkVTRVJWRURfNDYsCi0gICAgICAgICAgICBOQUxfVU5JVF9SRVNFUlZFRF80NywKLSAgICAgICAgICAgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzQ4LAotICAgICAgICAgICAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNDksCi0gICAgICAgICAgICBOQUxfVU5JVF9VTlNQRUNJRklFRF81MCwKLSAgICAgICAgICAgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzUxLAotICAgICAgICAgICAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNTIsCi0gICAgICAgICAgICBOQUxfVU5JVF9VTlNQRUNJRklFRF81MywKLSAgICAgICAgICAgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzU0LAotICAgICAgICAgICAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNTUsCi0gICAgICAgICAgICBOQUxfVU5JVF9VTlNQRUNJRklFRF81NiwKLSAgICAgICAgICAgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzU3LAotICAgICAgICAgICAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNTgsCi0gICAgICAgICAgICBOQUxfVU5JVF9VTlNQRUNJRklFRF81OSwKLSAgICAgICAgICAgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzYwLAotICAgICAgICAgICAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNjEsCi0gICAgICAgICAgICBOQUxfVU5JVF9VTlNQRUNJRklFRF82MiwKLSAgICAgICAgICAgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzYzLAotICAgICAgICAgICAgTkFMX1VOSVRfSU5WQUxJRCwKLSAgICAgICAgfTsKLQotCi0gICAgICAgIHZvaWQgaW5pdGlhbGl6ZV9mcmFtZV9jaGVja2luZ19lbnZpcm9ubWVudCgpOwotICAgICAgICBib29sIGlzTmV3RnJhbWUoT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmX2hkciwKLSAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBzaXplX29mX25hbF9sZW5ndGhfZmllbGQsCi0gICAgICAgICAgICAgICAgT01YX09VVCBPTVhfQk9PTCAmaXNOZXdGcmFtZSk7Ci0KLSAgICBwcml2YXRlOgotCi0gICAgICAgIGJvb2wgICAgICAgICAgICAgIG1fZm9yY2VUb1N0aWNoTmV4dE5BTDsKLSAgICAgICAgYm9vbCAgICAgICAgICAgICAgbV9hdV9kYXRhOwotICAgICAgICB1aW50MzIgbmFsdV90eXBlOwotfTsKLQotI2VuZGlmIC8qIEhFVkNfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy9tZXNzYWdlX3F1ZXVlLmggYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL21lc3NhZ2VfcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhZTE1NC4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL21lc3NhZ2VfcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMC0yMDExLCAyMDEzIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgUVVFVUVfSAotI2RlZmluZSBRVUVVRV9ICi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyogTWVzc2FnZSBRdWV1ZSBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCB2aWRlb19tc2dxIHsKLSAgICAvKiBDb21tYW5kIHRvIGJlIGV4ZWN1dGVkICovCi0gICAgdW5zaWduZWQgaW50IGNtZDsKLQotICAgIHVuc2lnbmVkIGludCBzdGF0dXM7Ci0KLSAgICAvKiBDbGllbnQtc3BlY2lmaWMgZGF0YSAqLwotICAgIHZvaWQgKmNsaWVudGRhdGE7Ci19OwotCi0KLS8qIFRocmVhZCAmIE1lc3NhZ2UgUXVldWUgaW5mb3JtYXRpb24gKi8KLXN0cnVjdCB2aWRlb19xdWV1ZV9jb250ZXh0IHsKLSAgICAvKiBNZXNzYWdlIFF1ZXVlIHJlbGF0ZWQgbWVtYmVycyAqLwotICAgIHB0aHJlYWRfbXV0ZXhfdCAgbXV0ZXg7Ci0gICAgc2VtX3Qgc2VtX21lc3NhZ2U7Ci0gICAgaW50IGNvbW1hbmRxX3NpemU7Ci0gICAgaW50IGRhdGFxX3NpemU7Ci0gICAgc3RydWN0IHZpZGVvX21zZ3EgKnB0cl9kYXRhcTsKLSAgICBzdHJ1Y3QgdmlkZW9fbXNncSAqcHRyX2NtZHE7Ci0gICAgaW50IHdyaXRlX2RhdGFxIDsKLSAgICBpbnQgcmVhZF9kYXRhcTsKLSAgICBpbnQgd3JpdGVfY29tcSA7Ci0gICAgaW50IHJlYWRfY29tcSA7Ci0KLX07Ci0KLWludCBjaGVja19pZl9xdWV1ZV9lbXB0eSAoIHVuc2lnbmVkIGludCBxdWV1ZXRvY2hlY2ssdm9pZCogcXVldWVjb250ZXh0ICk7Ci0KLXN0cnVjdCB2aWRlb19tc2dxICogcXVldWVfZ2V0X2NtZCAoIHZvaWQqIHF1ZXVlY29udGV4dCApOwotCi1pbnQgcXVldWVfcG9zdF9jbWRxICggdm9pZCAqcXVldWVjb250ZXh0LAotICAgICAgICBzdHJ1Y3QgdmlkZW9fbXNncSAqcG9zdF9tc2cKLSAgICAgICAgKTsKLQotaW50IHF1ZXVlX3Bvc3RfZGF0YXEgKCB2b2lkICpxdWV1ZWNvbnRleHQsCi0gICAgICAgIHN0cnVjdCB2aWRlb19tc2dxICpwb3N0X21zZwotICAgICAgICApOwotCi0jZW5kaWYgLyogUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy9vbXhfc3d2ZGVjLmggYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL29teF9zd3ZkZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjMjlhZC4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL29teF9zd3ZkZWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vKioKLSAqIEBjb3B5cmlnaHQKLSAqCi0gKiAgIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICogICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICogICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAqICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqICAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiAgIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFIERJU0NMQUlNRUQuCi0gKiAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiAgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogICBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogICBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqICAgREFNQUdFLgotICoKLSAqIEBmaWxlCi0gKgotICogICBvbXhfc3d2ZGVjLmgKLSAqCi0gKiBAYnJpZWYKLSAqCi0gKiAgIE9NWCBzb2Z0d2FyZSB2aWRlbyBkZWNvZGVyIGNvbXBvbmVudCBoZWFkZXIuCi0gKi8KLQotI2lmbmRlZiBfT01YX1NXVkRFQ19IXwotI2RlZmluZSBfT01YX1NXVkRFQ19IXwotCi0vLyN1bmRlZiBOREVCVUcgLy8gdW5jb21tZW50IHRvIGVuYWJsZSBhc3NlcnRpb25zCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c2VtYXBob3JlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0KLSNpbmNsdWRlICJxY19vbXhfY29tcG9uZW50LmgiCi0KLSNpbmNsdWRlICJvbXhfc3d2ZGVjX3V0aWxzLmgiCi0KLSNpbmNsdWRlICJzd3ZkZWNfdHlwZXMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLS8vLyBPTVggU3dWZGVjIHZlcnNpb24gZGF0ZQotI2RlZmluZSBPTVhfU1dWREVDX1ZFUlNJT05fREFURSAiMjAxNi0xMC0yNFQxNzozNzozMyswNTMwIgotCi0jZGVmaW5lIE9NWF9TUEVDX1ZFUlNJT04gMHgwMDAwMDEwMSAvLy88IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24KLQotI2RlZmluZSBPTVhfU1dWREVDX05VTV9JTlNUQU5DRVMgMSAvLy88IG51bWJlciBvZiBPTVggU3dWZGVjIGluc3RhbmNlcwotCi0jZGVmaW5lIE9NWF9TV1ZERUNfSVBfQlVGRkVSX0NPVU5UX01JTiA1IC8vLzwgT01YIFN3VmRlYyBtaW5pbXVtIGlwIGJ1ZmZlciBjb3VudAotCi0jZGVmaW5lIE9NWF9TV1ZERUNfTUFYX0ZSQU1FU19QRVJfRVRCIDIgLy8vPCBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgcGVyIEVUQgotCi0vLy8gZnJhbWUgZGltZW5zaW9ucyBzdHJ1Y3R1cmUKLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBpbnQgd2lkdGg7ICAvLy88IGZyYW1lIHdpZHRoCi0gICAgdW5zaWduZWQgaW50IGhlaWdodDsgLy8vPCBmcmFtZSBoZWlnaHQKLX0gRlJBTUVfRElNRU5TSU9OUzsKLQotLy8vIGZyYW1lIGF0dHJpYnV0ZXMgc3RydWN0dXJlCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgaW50IHN0cmlkZTsgICAgLy8vPCBmcmFtZSBzdHJpZGUKLSAgICB1bnNpZ25lZCBpbnQgc2NhbmxpbmVzOyAvLy88IGZyYW1lIHNjYW5saW5lcwotICAgIHVuc2lnbmVkIGludCBzaXplOyAgICAgIC8vLzwgZnJhbWUgc2l6ZQotfSBGUkFNRV9BVFRSSUJVVEVTOwotCi0vLy8gYXN5bmNocm9ub3VzIHRocmVhZCBzdHJ1Y3R1cmUKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzZW1fdCAgICAgc2VtX3RocmVhZF9jcmVhdGVkOyAvLy88IHRocmVhZCBjcmVhdGVkIHNlbWFwaG9yZQotICAgIHNlbV90ICAgICBzZW1fZXZlbnQ7ICAgICAgICAgIC8vLzwgZXZlbnQgc2VtYXBob3JlCi0gICAgcHRocmVhZF90IGhhbmRsZTsgICAgICAgICAgICAgLy8vPCB0aHJlYWQgaGFuZGxlCi0gICAgYm9vbCAgICAgIGNyZWF0ZWQ7ICAgICAgICAgICAgLy8vPCB0aHJlYWQgY3JlYXRlZD8KLSAgICBib29sICAgICAgZXhpdDsgICAgICAgICAgICAgICAvLy88IHRocmVhZCBleGl0IHZhcmlhYmxlCi19IEFTWU5DX1RIUkVBRDsKLQotLy8vIEBjb25kCi0KLXN0cnVjdCB2ZGVjX2lvbiB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaW9uX2ZkX2RldmljZTsKLSAgICBzdHJ1Y3QgaW9uX2ZkX2RhdGEgICAgICAgICBpb25fZmRfZGF0YTsKLSAgICBzdHJ1Y3QgaW9uX2FsbG9jYXRpb25fZGF0YSBpb25fYWxsb2NfZGF0YTsKLX07Ci0KLXN0cnVjdCB2ZGVjX2J1ZmZlcnBheWxvYWQgewotCXZvaWQgKmJ1ZmZlcmFkZHI7Ci0Jc2l6ZV90IGJ1ZmZlcl9sZW47Ci0JaW50IHBtZW1fZmQ7Ci0Jc2l6ZV90IG9mZnNldDsKLQlzaXplX3QgbW1hcGVkX3NpemU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICAgICBidWZmZXJfaGVhZGVyOwotICAgIHN0cnVjdCB2ZGVjX2lvbiAgICAgICAgICAgaW9uX2luZm87Ci0gICAgc3RydWN0IHZkZWNfYnVmZmVycGF5bG9hZCBidWZmZXJfcGF5bG9hZDsKLSAgICBTV1ZERUNfQlVGRkVSICAgICAgICAgICAgIGJ1ZmZlcl9zd3ZkZWM7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfcG9wdWxhdGVkOwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgc3BsaXRfY291bnQ7Ci19IE9NWF9TV1ZERUNfQlVGRkVSX0lORk87Ci0KLS8vLyBAZW5kY29uZAotCi0vLy8gcG9ydCBzdHJ1Y3R1cmUKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsgICAgICAgICAgICAgICAgIC8vLzwgZGVmaW5pdGlvbgotICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDsgICAgICAgICAgICAgLy8vPCBlbmFibGVkPwotICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVkOyAgICAgICAgICAgLy8vPCBwb3B1bGF0ZWQ/Ci0gICAgT01YX0JPT0wgICAgICAgICAgICAgICAgICAgICB1bnBvcHVsYXRlZDsgICAgICAgICAvLy88IHVucG9wdWxhdGVkPwotICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgICAgZmx1c2hfaW5wcm9ncmVzczsgICAgLy8vPCBmbHVzaCBpbnByb2dyZXNzPwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgbnVtX3BlbmRpbmdfYnVmZmVyczsgLy8vPCAjIG9mIHBlbmRpbmcgYnVmZmVycwotfSBPTVhfU1dWREVDX1BPUlQ7Ci0KLS8vLyBtZXRhX2J1ZmZlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgZmQ7ICAgICAgICAvLy88IGZpbGUgZGVzY3JpcHRvcgotICAgIGludCByZWZfY291bnQ7IC8vLzwgcmVmZXJlbmNlIGNvdW50Ci19IE9NWF9TV1ZERUNfTUVUQV9CVUZGRVJfSU5GTzsKLQotI2RlZmluZSBERUZBVUxUX0ZSQU1FX1dJRFRIICAxOTIwIC8vLzwgZGVmYXVsdCBmcmFtZSB3aWR0aAotI2RlZmluZSBERUZBVUxUX0ZSQU1FX0hFSUdIVCAxMDgwIC8vLzwgZGVmYXVsdCBmcmFtZSBoZWlnaHQKLQotI2RlZmluZSBNQVgoeCwgeSkgKCgoeCkgPiAoeSkpID8gKHgpIDogKHkpKSAvLy88IG1heGltdW0KLSNkZWZpbmUgTUlOKHgsIHkpICgoKHgpIDwgKHkpKSA/ICh4KSA6ICh5KSkgLy8vPCBtaW5pbXVtCi0jZGVmaW5lIEFMSUdOKHgsIHkpICgoKHgpICsgKCh5KSAtIDEpKSAmICh+KCh5KSAtIDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGFsaWduICd4JyB0byBuZXh0IGhpZ2hlc3QgbXVsdGlwbGUgb2YgJ3knCi0KLS8vLyBtYWNybyB0byBwcmludCAnY29tbWFuZCB0eXBlJyBzdHJpbmcKLSNkZWZpbmUgT01YX0NPTU1BTkRUWVBFX1NUUklORyh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKHggPT0gT01YX0NvbW1hbmRTdGF0ZVNldCkgPyAiT01YX0NvbW1hbmRTdGF0ZVNldCIgOiAgICAgICAgIFwKLSAgICAgKCh4ID09IE9NWF9Db21tYW5kRmx1c2gpID8gIk9NWF9Db21tYW5kRmx1c2giIDogICAgICAgICAgICAgIFwKLSAgICAgICgoeCA9PSBPTVhfQ29tbWFuZFBvcnREaXNhYmxlKSA/ICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIiA6IFwKLSAgICAgICAoKHggPT0gT01YX0NvbW1hbmRQb3J0RW5hYmxlKSA/ICJPTVhfQ29tbWFuZFBvcnRFbmFibGUiIDogIFwKLSAgICAgICAgInVua25vd24iKSkpKQotCi0vLy8gbWFjcm8gdG8gcHJpbnQgJ3N0YXRlIHR5cGUnIHN0cmluZwotI2RlZmluZSBPTVhfU1RBVEVUWVBFX1NUUklORyh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoeCA9PSBPTVhfU3RhdGVJbnZhbGlkKSA/ICJPTVhfU3RhdGVJbnZhbGlkIiA6ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAoKHggPT0gT01YX1N0YXRlTG9hZGVkKSA/ICJPTVhfU3RhdGVMb2FkZWQiIDogICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKCh4ID09IE9NWF9TdGF0ZUlkbGUpID8gIk9NWF9TdGF0ZUlkbGUiIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICgoeCA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpID8gIk9NWF9TdGF0ZUV4ZWN1dGluZyIgOiAgICAgICAgICAgICAgICAgXAotICAgICAgICAoKHggPT0gT01YX1N0YXRlUGF1c2UpID8gIk9NWF9TdGF0ZVBhdXNlIiA6ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgKCh4ID09IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpID8gIk9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMiIDogXAotICAgICAgICAgICJ1bmtub3duIikpKSkpKQotCi1lbnVtIHsKLSAgICBPTVhfQ09SRV9QT1JUX0lOREVYX0lQID0gMCwgLy8vPCAgaW5wdXQgcG9ydCBpbmRleAotICAgIE9NWF9DT1JFX1BPUlRfSU5ERVhfT1AgPSAxICAvLy88IG91dHB1dCBwb3J0IGluZGV4Ci19OwotCi1leHRlcm4gIkMiIHsKLSAgICBPTVhfQVBJIHZvaWQgKmdldF9vbXhfY29tcG9uZW50X2ZhY3RvcnlfZm4odm9pZCk7Ci19OwotCi0vLy8gT01YIFN3VmRlYyBjb21wb25lbnQgY2xhc3M7IGRlcml2ZWQgZnJvbSBRQyBPTVggY29tcG9uZW50IGJhc2UgY2xhc3MKLWNsYXNzIG9teF9zd3ZkZWMgOiBwdWJsaWMgcWNfb214X2NvbXBvbmVudAotewotcHVibGljOgotCi0gICAgb214X3N3dmRlYygpOwotCi0gICAgdmlydHVhbCB+b214X3N3dmRlYygpOwotCi0gICAgLy8gZGVyaXZlZCBjbGFzcyB2ZXJzaW9ucyBvZiBiYXNlIGNsYXNzIHB1cmUgdmlydHVhbCBmdW5jdGlvbnMKLQotICAgIE9NWF9FUlJPUlRZUEUgY29tcG9uZW50X2luaXQoT01YX1NUUklORyBjbXBfbmFtZSk7Ci0gICAgT01YX0VSUk9SVFlQRSBjb21wb25lbnRfZGVpbml0KE9NWF9IQU5ETEVUWVBFIGNtcF9oYW5kbGUpOwotICAgIE9NWF9FUlJPUlRZUEUgZ2V0X2NvbXBvbmVudF92ZXJzaW9uKE9NWF9IQU5ETEVUWVBFICAgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RSSU5HICAgICAgIGNtcF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WRVJTSU9OVFlQRSAqcF9jbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkVSU0lPTlRZUEUgKnBfc3BlY192ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VVUlEVFlQRSAgICAqcF9jbXBfVVVJRCk7Ci0gICAgT01YX0VSUk9SVFlQRSBzZW5kX2NvbW1hbmQoT01YX0hBTkRMRVRZUEUgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTU1BTkRUWVBFIGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgIHBfY21kX2RhdGEpOwotICAgIE9NWF9FUlJPUlRZUEUgZ2V0X3BhcmFtZXRlcihPTVhfSEFORExFVFlQRSBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFICBwYXJhbV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgcF9wYXJhbV9kYXRhKTsKLSAgICBPTVhfRVJST1JUWVBFIHNldF9wYXJhbWV0ZXIoT01YX0hBTkRMRVRZUEUgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOREVYVFlQRSAgcGFyYW1faW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgIHBfcGFyYW1fZGF0YSk7Ci0gICAgT01YX0VSUk9SVFlQRSBnZXRfY29uZmlnKE9NWF9IQU5ETEVUWVBFIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgIGNvbmZpZ19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgcF9jb25maWdfZGF0YSk7Ci0gICAgT01YX0VSUk9SVFlQRSBzZXRfY29uZmlnKE9NWF9IQU5ETEVUWVBFIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgIGNvbmZpZ19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgcF9jb25maWdfZGF0YSk7Ci0gICAgT01YX0VSUk9SVFlQRSBnZXRfZXh0ZW5zaW9uX2luZGV4KE9NWF9IQU5ETEVUWVBFIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TVFJJTkcgICAgIHBhcmFtX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgKnBfaW5kZXhfdHlwZSk7Ci0gICAgT01YX0VSUk9SVFlQRSBnZXRfc3RhdGUoT01YX0hBTkRMRVRZUEUgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RBVEVUWVBFICpwX3N0YXRlKTsKLSAgICBPTVhfRVJST1JUWVBFIGNvbXBvbmVudF90dW5uZWxfcmVxdWVzdChPTVhfSEFORExFVFlQRSAgICAgICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgICAgICAgcGVlcl9jb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgcGVlcl9wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9UVU5ORUxTRVRVUFRZUEUgKnBfdHVubmVsX3NldHVwKTsKLSAgICBPTVhfRVJST1JUWVBFIHVzZV9idWZmZXIoT01YX0hBTkRMRVRZUEUgICAgICAgICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwX2J1ZmZlcl9oZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgICAgICAgICBwX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTggICAgICAgICAgICAgICAgKnBfYnVmZmVyKTsKLSAgICBPTVhfRVJST1JUWVBFIGFsbG9jYXRlX2J1ZmZlcihPTVhfSEFORExFVFlQRSAgICAgICAgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcF9idWZmZXJfaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICAgIHBfYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICBieXRlcyk7Ci0gICAgT01YX0VSUk9SVFlQRSBmcmVlX2J1ZmZlcihPTVhfSEFORExFVFlQRSAgICAgICAgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmZmVyKTsKLSAgICBPTVhfRVJST1JUWVBFIGVtcHR5X3RoaXNfYnVmZmVyKE9NWF9IQU5ETEVUWVBFICAgICAgICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmZmVyX2hkcik7Ci0gICAgT01YX0VSUk9SVFlQRSBmaWxsX3RoaXNfYnVmZmVyKE9NWF9IQU5ETEVUWVBFICAgICAgICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9idWZmZXJfaGRyKTsKLSAgICBPTVhfRVJST1JUWVBFIHNldF9jYWxsYmFja3MoT01YX0hBTkRMRVRZUEUgICAgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NBTExCQUNLVFlQRSAqcF9jYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgICAgIHBfYXBwX2RhdGEpOwotICAgIE9NWF9FUlJPUlRZUEUgdXNlX0VHTF9pbWFnZShPTVhfSEFORExFVFlQRSAgICAgICAgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqcHBfYnVmZmVyX2hkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICAgIHBfYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqZWdsX2ltYWdlKTsKLSAgICBPTVhfRVJST1JUWVBFIGNvbXBvbmVudF9yb2xlX2VudW0oT01YX0hBTkRMRVRZUEUgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1U4ICAgICAgICAqcF9yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICBpbmRleCk7Ci0KLSAgICAvLyBTd1ZkZWMgY2FsbGJhY2sgZnVuY3Rpb25zCi0KLSAgICBzdGF0aWMgU1dWREVDX1NUQVRVUyBzd3ZkZWNfZW1wdHlfYnVmZmVyX2RvbmVfY2FsbGJhY2soCi0gICAgICAgIFNXVkRFQ19IQU5ETEUgIHN3dmRlY19oYW5kbGUsCi0gICAgICAgIFNXVkRFQ19CVUZGRVIgKnBfYnVmZmVyX2lwLAotICAgICAgICB2b2lkICAgICAgICAgICpwX2NsaWVudF9oYW5kbGUpOwotICAgIHN0YXRpYyBTV1ZERUNfU1RBVFVTIHN3dmRlY19maWxsX2J1ZmZlcl9kb25lX2NhbGxiYWNrKAotICAgICAgICBTV1ZERUNfSEFORExFICBzd3ZkZWNfaGFuZGxlLAotICAgICAgICBTV1ZERUNfQlVGRkVSICpwX2J1ZmZlcl9vcCwKLSAgICAgICAgdm9pZCAgICAgICAgICAqcF9jbGllbnRfaGFuZGxlKTsKLSAgICBzdGF0aWMgU1dWREVDX1NUQVRVUyBzd3ZkZWNfZXZlbnRfaGFuZGxlcl9jYWxsYmFjaygKLSAgICAgICAgU1dWREVDX0hBTkRMRSBzd3ZkZWNfaGFuZGxlLAotICAgICAgICBTV1ZERUNfRVZFTlQgIGV2ZW50LAotICAgICAgICB2b2lkICAgICAgICAgKnBfZGF0YSwKLSAgICAgICAgdm9pZCAgICAgICAgICpwX2NsaWVudF9oYW5kbGUpOwotCi1wcml2YXRlOgotCi0gICAgT01YX1NUQVRFVFlQRSBtX3N0YXRlOyAvLy88IGNvbXBvbmVudCBzdGF0ZQotCi0gICAgdW5zaWduZWQgaW50IG1fc3RhdHVzX2ZsYWdzOyAvLy88IHN0YXR1cyBmbGFncwotCi0gICAgY2hhciBtX2NtcF9uYW1lW09NWF9NQVhfU1RSSU5HTkFNRV9TSVpFXTsgIC8vLzwgY29tcG9uZW50IG5hbWUKLSAgICBjaGFyIG1fcm9sZV9uYW1lW09NWF9NQVhfU1RSSU5HTkFNRV9TSVpFXTsgLy8vPCBjb21wb25lbnQgcm9sZSBuYW1lCi0KLSAgICBTV1ZERUNfQ09ERUMgIG1fc3d2ZGVjX2NvZGVjOyAgIC8vLzwgU3dWZGVjIGNvZGVjIHR5cGUKLSAgICBTV1ZERUNfSEFORExFIG1fc3d2ZGVjX2hhbmRsZTsgIC8vLzwgU3dWZGVjIGhhbmRsZQotICAgIGJvb2wgICAgICAgICAgbV9zd3ZkZWNfY3JlYXRlZDsgLy8vPCBTd1ZkZWMgY3JlYXRlZD8KLQotICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIG1fb214X3ZpZGVvX2NvZGluZ3R5cGU7IC8vLzwgT01YIHZpZGVvIGNvZGluZyB0eXBlCi0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbV9vbXhfY29sb3JfZm9ybWF0dHlwZTsgLy8vPCBPTVggY29sb3IgZm9ybWF0IHR5cGUKLQotICAgIEZSQU1FX0RJTUVOU0lPTlMgbV9mcmFtZV9kaW1lbnNpb25zOyAvLy88IGZyYW1lIGRpbWVuc2lvbnMKLSAgICBGUkFNRV9BVFRSSUJVVEVTIG1fZnJhbWVfYXR0cmlidXRlczsgLy8vPCBmcmFtZSBhdHRyaWJ1dGVzCi0KLSAgICBGUkFNRV9ESU1FTlNJT05TIG1fZnJhbWVfZGltZW5zaW9uc19tYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG1heCBmcmFtZSBkaW1lbnNpb25zIGZvciBhZGFwdGl2ZSBwbGF5YmFjawotCi0gICAgQVNZTkNfVEhSRUFEIG1fYXN5bmNfdGhyZWFkOyAvLy88IGFzeW5jaHJvbm91cyB0aHJlYWQKLQotICAgIG9teF9zd3ZkZWNfcXVldWUgbV9xdWV1ZV9jb21tYW5kOyAvLy88IGNvbW1hbmQgcXVldWUKLSAgICBvbXhfc3d2ZGVjX3F1ZXVlIG1fcXVldWVfcG9ydF9pcDsgLy8vPCAgaW5wdXQgcG9ydCBxdWV1ZSBmb3IgRVRCcyAmIEVCRHMKLSAgICBvbXhfc3d2ZGVjX3F1ZXVlIG1fcXVldWVfcG9ydF9vcDsgLy8vPCBvdXRwdXQgcG9ydCBxdWV1ZSBmb3IgRlRCcyAmIEZCRHMKLQotICAgIE9NWF9TV1ZERUNfUE9SVCBtX3BvcnRfaXA7IC8vLzwgIGlucHV0IHBvcnQKLSAgICBPTVhfU1dWREVDX1BPUlQgbV9wb3J0X29wOyAvLy88IG91dHB1dCBwb3J0Ci0KLSAgICBPTVhfQ0FMTEJBQ0tUWVBFIG1fY2FsbGJhY2s7IC8vLzwgSUwgY2xpZW50IGNhbGxiYWNrIHN0cnVjdHVyZQotICAgIE9NWF9QVFIgICAgICAgICAgbV9hcHBfZGF0YTsgLy8vPCBJTCBjbGllbnQgYXBwIGRhdGEgcG9pbnRlcgotCi0gICAgT01YX1BSSU9SSVRZTUdNVFRZUEUgbV9wcmlvX21nbXQ7IC8vLzwgcHJpb3JpdHkgbWFuYWdlbWVudAotCi0gICAgYm9vbCBtX3N5bmNfZnJhbWVfZGVjb2RpbmdfbW9kZTsgLy8vPCBzeW5jIGZyYW1lIGRlY29kaW5nIG1vZGUgZW5hYmxlZD8KLSAgICBib29sIG1fYW5kcm9pZF9uYXRpdmVfYnVmZmVyczsgICAvLy88IGFuZHJvaWQgbmF0aXZlIGJ1ZmZlcnMgZW5hYmxlZD8KLQotICAgIGJvb2wgbV9tZXRhX2J1ZmZlcl9tb2RlX2Rpc2FibGVkOyAvLy88IG1ldGEgYnVmZmVyIG1vZGUgZGlzYWJsZWQ/Ci0gICAgYm9vbCBtX21ldGFfYnVmZmVyX21vZGU7ICAgICAgICAgIC8vLzwgbWV0YSBidWZmZXIgbW9kZSBlbmFibGVkPwotICAgIGJvb2wgbV9hZGFwdGl2ZV9wbGF5YmFja19tb2RlOyAgICAvLy88IGFkYXB0aXZlIHBsYXliYWNrIG1vZGUgZW5hYmxlZD8KLSAgICBib29sIG1fYXJiaXRyYXJ5X2J5dGVzX21vZGU7ICAgICAgLy8vPCBhcmJpdHJhcnkgYnl0ZXMgbW9kZSBlbmFibGVkPwotCi0gICAgYm9vbCBtX3BvcnRfcmVjb25maWdfaW5wcm9ncmVzczsgLy8vPCBwb3J0IHJlY29uZmlndXJhdGlvbiBpbiBwcm9ncmVzcz8KLQotICAgIGJvb2wgbV9kaW1lbnNpb25zX3VwZGF0ZV9pbnByb2dyZXNzOyAvLy88IGRpbWVuc2lvbnMgdXBkYXRlIGluIHByb2dyZXNzPwotCi0gICAgc2VtX3QgbV9zZW1fY21kOyAvLy88IHNlbWFwaG9yZSBmb3IgY29tbWFuZCBwcm9jZXNzaW5nCi0KLSAgICBPTVhfU1dWREVDX0JVRkZFUl9JTkZPICptX2J1ZmZlcl9hcnJheV9pcDsgLy8vPCAgaW5wdXQgYnVmZmVyIGluZm8gYXJyYXkKLSAgICBPTVhfU1dWREVDX0JVRkZFUl9JTkZPICptX2J1ZmZlcl9hcnJheV9vcDsgLy8vPCBvdXRwdXQgYnVmZmVyIGluZm8gYXJyYXkKLQotICAgIE9NWF9TV1ZERUNfTUVUQV9CVUZGRVJfSU5GTyAqbV9tZXRhX2J1ZmZlcl9hcnJheTsgLy8vPCBtZXRhYnVmZmVyIGluZm8gYXJyYXkKLSAgICBwdGhyZWFkX211dGV4X3QgICAgICAgICAgICAgIG1fbWV0YV9idWZmZXJfYXJyYXlfbXV0ZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbXV0ZXggZm9yIG1ldGFidWZmZXIgaW5mbyBhcnJheQotCi0gICAgc3RkOjpwcmlvcml0eV9xdWV1ZSA8T01YX1RJQ0tTLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE9NWF9USUNLUz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpncmVhdGVyPE9NWF9USUNLUz4gPiBtX3F1ZXVlX3RpbWVzdGFtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdGltZXN0YW1wIHByaW9yaXR5IHF1ZXVlCi0KLSAgICBvbXhfc3d2ZGVjX2RpYWcgbV9kaWFnOyAvLy88IGRpYWdub3N0aWNzIGNsYXNzIHZhcmlhYmxlCi0KLSAgICBPTVhfRVJST1JUWVBFIHNldF9mcmFtZV9kaW1lbnNpb25zKHVuc2lnbmVkIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBoZWlnaHQpOwotICAgIE9NWF9FUlJPUlRZUEUgc2V0X2ZyYW1lX2F0dHJpYnV0ZXMoT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JfZm9ybWF0KTsKLSAgICBPTVhfRVJST1JUWVBFIHNldF9hZGFwdGl2ZV9wbGF5YmFjayh1bnNpZ25lZCBpbnQgbWF4X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfaGVpZ2h0KTsKLQotICAgIE9NWF9FUlJPUlRZUEUgZ2V0X3ZpZGVvX3BvcnRfZm9ybWF0KAotICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKnBfcG9ydF9mb3JtYXQpOwotICAgIE9NWF9FUlJPUlRZUEUgc2V0X3ZpZGVvX3BvcnRfZm9ybWF0KAotICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKnBfcG9ydF9mb3JtYXQpOwotCi0gICAgT01YX0VSUk9SVFlQRSBnZXRfcG9ydF9kZWZpbml0aW9uKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBfcG9ydF9kZWYpOwotICAgIE9NWF9FUlJPUlRZUEUgc2V0X3BvcnRfZGVmaW5pdGlvbihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwX3BvcnRfZGVmKTsKLQotICAgIE9NWF9FUlJPUlRZUEUgZ2V0X3N1cHBvcnRlZF9wcm9maWxlbGV2ZWwoCi0gICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwX3Byb2ZpbGVsZXZlbCk7Ci0KLSAgICBPTVhfRVJST1JUWVBFIGRlc2NyaWJlX2NvbG9yX2Zvcm1hdChEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICpwX3BhcmFtcyk7Ci0KLSAgICBPTVhfRVJST1JUWVBFIHNldF9wb3J0X2RlZmluaXRpb25fcWNvbSgKLSAgICAgICAgT01YX1FDT01fUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwX3BvcnRfZGVmKTsKLQotICAgIC8vIGZ1bmN0aW9ucyB0byBzZXQgU3dWZGVjIHByb3BlcnRpZXMgd2l0aCBPTVggY29tcG9uZW50IHByb3BlcnRpZXMKLQotICAgIE9NWF9FUlJPUlRZUEUgc2V0X2ZyYW1lX2RpbWVuc2lvbnNfc3d2ZGVjKCk7Ci0gICAgT01YX0VSUk9SVFlQRSBzZXRfZnJhbWVfYXR0cmlidXRlc19zd3ZkZWMoKTsKLSAgICBPTVhfRVJST1JUWVBFIHNldF9hZGFwdGl2ZV9wbGF5YmFja19zd3ZkZWMoKTsKLQotICAgIC8vIGZ1bmN0aW9ucyB0byBnZXQgU3dWZGVjIHByb3BlcnRpZXMgYW5kIHNldCBPTVggY29tcG9uZW50IHByb3BlcnRpZXMKLQotICAgIE9NWF9FUlJPUlRZUEUgZ2V0X2ZyYW1lX2RpbWVuc2lvbnNfc3d2ZGVjKCk7Ci0gICAgT01YX0VSUk9SVFlQRSBnZXRfZnJhbWVfYXR0cmlidXRlc19zd3ZkZWMoKTsKLSAgICBPTVhfRVJST1JUWVBFIGdldF9idWZmZXJfcmVxdWlyZW1lbnRzX3N3dmRlYyh1bnNpZ25lZCBpbnQgcG9ydF9pbmRleCk7Ci0KLSAgICAvLyBidWZmZXIgYWxsb2NhdGlvbiAmIGRlLWFsbG9jYXRpb24gZnVuY3Rpb25zCi0gICAgT01YX0VSUk9SVFlQRSBidWZmZXJfYWxsb2NhdGVfaXAoT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcF9idWZmZXJfaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgcF9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgIHNpemUpOwotICAgIE9NWF9FUlJPUlRZUEUgYnVmZmVyX2FsbG9jYXRlX29wKE9NWF9CVUZGRVJIRUFERVJUWVBFICoqcHBfYnVmZmVyX2hkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICAgIHBfYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICBzaXplKTsKLSAgICBPTVhfRVJST1JUWVBFIGJ1ZmZlcl9hbGxvY2F0ZV9pcF9pbmZvX2FycmF5KCk7Ci0gICAgT01YX0VSUk9SVFlQRSBidWZmZXJfYWxsb2NhdGVfb3BfaW5mb19hcnJheSgpOwotICAgIE9NWF9FUlJPUlRZUEUgYnVmZmVyX3VzZV9vcChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwX2J1ZmZlcl9oZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgcF9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTggICAgICAgICAgICAgICAgKnBfYnVmZmVyKTsKLSAgICBPTVhfRVJST1JUWVBFIGJ1ZmZlcl9kZWFsbG9jYXRlX2lwKE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1ZmZlcl9oZHIpOwotICAgIE9NWF9FUlJPUlRZUEUgYnVmZmVyX2RlYWxsb2NhdGVfb3AoT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmZmVyX2hkcik7Ci0gICAgdm9pZCAgICAgICAgICBidWZmZXJfZGVhbGxvY2F0ZV9pcF9pbmZvX2FycmF5KCk7Ci0gICAgdm9pZCAgICAgICAgICBidWZmZXJfZGVhbGxvY2F0ZV9vcF9pbmZvX2FycmF5KCk7Ci0KLSAgICBPTVhfRVJST1JUWVBFIG1ldGFfYnVmZmVyX2FycmF5X2FsbG9jYXRlKCk7Ci0gICAgdm9pZCAgICAgICAgICBtZXRhX2J1ZmZlcl9hcnJheV9kZWFsbG9jYXRlKCk7Ci0gICAgdm9pZCAgICAgICAgICBtZXRhX2J1ZmZlcl9yZWZfYWRkKHVuc2lnbmVkIGludCBpbmRleCwgaW50IGZkKTsKLSAgICB2b2lkICAgICAgICAgIG1ldGFfYnVmZmVyX3JlZl9yZW1vdmUodW5zaWduZWQgaW50IGluZGV4KTsKLQotICAgIE9NWF9CT09MIHBvcnRfaXBfcG9wdWxhdGVkKCk7Ci0gICAgT01YX0JPT0wgcG9ydF9vcF9wb3B1bGF0ZWQoKTsKLQotICAgIE9NWF9FUlJPUlRZUEUgZmx1c2godW5zaWduZWQgaW50IHBvcnRfaW5kZXgpOwotCi0gICAgaW50ICBpb25fbWVtb3J5X2FsbG9jX21hcChzdHJ1Y3QgaW9uX2FsbG9jYXRpb25fZGF0YSAqcF9hbGxvY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlvbl9mZF9kYXRhICAgICAgICAgKnBfZmRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCk7Ci0gICAgdm9pZCBpb25fbWVtb3J5X2ZyZWUoc3RydWN0IHZkZWNfaW9uICpwX2lvbl9idWZfaW5mbyk7Ci0gICAgdm9pZCBpb25fZmx1c2hfb3AodW5zaWduZWQgaW50IGluZGV4KTsKLQotICAgIC8vIGNvbXBvbmVudCBjYWxsYmFjayBmdW5jdGlvbnMKLQotICAgIHZvaWQgc3d2ZGVjX2VtcHR5X2J1ZmZlcl9kb25lKFNXVkRFQ19CVUZGRVIgKnBfYnVmZmVyX2lwKTsKLSAgICB2b2lkIHN3dmRlY19maWxsX2J1ZmZlcl9kb25lKFNXVkRFQ19CVUZGRVIgKnBfYnVmZmVyX29wKTsKLSAgICB2b2lkIHN3dmRlY19ldmVudF9oYW5kbGVyKFNXVkRFQ19FVkVOVCBldmVudCwgdm9pZCAqcF9kYXRhKTsKLQotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsX3N3dmRlYzJvbXgoU1dWREVDX1NUQVRVUyByZXR2YWxfc3d2ZGVjKTsKLQotICAgIC8vIHN0YXR1cyBiaXRzIGZvciBwZW5kaW5nIGV2ZW50cwotICAgIGVudW0gewotICAgICAgICBQRU5ESU5HX1NUQVRFX0xPQURFRF9UT19JRExFLCAgICAvLy88IGxvYWRlZCB0byBpZGxlIHN0YXRlCi0gICAgICAgIFBFTkRJTkdfU1RBVEVfRVhFQ1VUSU5HX1RPX0lETEUsIC8vLzwgZXhlY3V0aW5nIHRvIGlkbGUgc3RhdGUKLSAgICAgICAgUEVORElOR19TVEFURV9JRExFX1RPX0xPQURFRCwgICAgLy8vPCBpZGxlIHRvIGxvYWRlZCBzdGF0ZQotICAgICAgICBQRU5ESU5HX1BPUlRfRU5BQkxFX0lQLCAgICAgICAgICAvLy88IGVuYWJsZW1lbnQgb2YgaXAgcG9ydAotICAgICAgICBQRU5ESU5HX1BPUlRfRU5BQkxFX09QLCAgICAgICAgICAvLy88IGVuYWJsZW1lbnQgb2Ygb3AgcG9ydAotICAgICAgICBQRU5ESU5HX1BPUlRfRElTQUJMRV9JUCwgICAgICAgICAvLy88IGRpc2FibGVtZW50IG9mIGlwIHBvcnQKLSAgICAgICAgUEVORElOR19QT1JUX0RJU0FCTEVfT1AsICAgICAgICAgLy8vPCBkaXNhYmxlbWVudCBvZiBvcCBwb3J0Ci0gICAgICAgIFBFTkRJTkdfUE9SVF9GTFVTSF9JUCwgICAgICAgICAgIC8vLzwgZmx1c2ggb2YgaXAgcG9ydAotICAgICAgICBQRU5ESU5HX1BPUlRfRkxVU0hfT1AgICAgICAgICAgICAvLy88IGZsdXNoIG9mIG9wIHBvcnQKLSAgICB9OwotCi0gICAgLy8gZXZlbnRzIHJhaXNlZCBpbnRlcm5hbGx5Ci0gICAgZW51bSB7Ci0gICAgICAgIE9NWF9TV1ZERUNfRVZFTlRfQ01ELCAgICAgICAgICAgICAgIC8vLzwgY29tbWFuZCBldmVudAotICAgICAgICBPTVhfU1dWREVDX0VWRU5UX0NNRF9BQ0ssICAgICAgICAgICAvLy88IGNvbW1hbmQgYWNrbm93bGVkZ2VtZW50Ci0gICAgICAgIE9NWF9TV1ZERUNfRVZFTlRfRVJST1IsICAgICAgICAgICAgIC8vLzwgZXJyb3IgZXZlbnQKLSAgICAgICAgT01YX1NXVkRFQ19FVkVOVF9FVEIsICAgICAgICAgICAgICAgLy8vPCBFVEIgZXZlbnQKLSAgICAgICAgT01YX1NXVkRFQ19FVkVOVF9FQkQsICAgICAgICAgICAgICAgLy8vPCBFQkQgZXZlbnQKLSAgICAgICAgT01YX1NXVkRFQ19FVkVOVF9GVEIsICAgICAgICAgICAgICAgLy8vPCBGVEIgZXZlbnQKLSAgICAgICAgT01YX1NXVkRFQ19FVkVOVF9GQkQsICAgICAgICAgICAgICAgLy8vPCBGQkQgZXZlbnQKLSAgICAgICAgT01YX1NXVkRFQ19FVkVOVF9FT1MsICAgICAgICAgICAgICAgLy8vPCBFT1MgZXZlbnQKLSAgICAgICAgT01YX1NXVkRFQ19FVkVOVF9GTFVTSF9QT1JUX0lQLCAgICAgLy8vPCBmbHVzaCBpcCBwb3J0IGV2ZW50Ci0gICAgICAgIE9NWF9TV1ZERUNfRVZFTlRfRkxVU0hfUE9SVF9PUCwgICAgIC8vLzwgZmx1c2ggb3AgcG9ydCBldmVudAotICAgICAgICBPTVhfU1dWREVDX0VWRU5UX1BPUlRfUkVDT05GSUcsICAgICAvLy88IHBvcnQgcmVjb25maWcgZXZlbnQKLSAgICAgICAgT01YX1NXVkRFQ19FVkVOVF9ESU1FTlNJT05TX1VQREFURUQgLy8vPCBkaW1lbnNpb25zIHVwZGF0ZWQgZXZlbnQKLSAgICB9OwotCi0gICAgT01YX0VSUk9SVFlQRSBhc3luY190aHJlYWRfY3JlYXRlKCk7Ci0gICAgdm9pZCAgICAgICAgICBhc3luY190aHJlYWRfZGVzdHJveSgpOwotCi0gICAgc3RhdGljIHZvaWQgICBhc3luY190aHJlYWQodm9pZCAqcF9jbXApOwotCi0gICAgdm9pZCAgICAgICAgICBhc3luY19wb3N0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZXZlbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnRfcGFyYW0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50X3BhcmFtMik7Ci0KLSAgICBzdGF0aWMgdm9pZCAgIGFzeW5jX3Byb2Nlc3NfZXZlbnQodm9pZCAqcF9jbXApOwotCi0gICAgT01YX0VSUk9SVFlQRSBhc3luY19wcm9jZXNzX2V2ZW50X2NtZChPTVhfQ09NTUFORFRZUEUgY21kLCBPTVhfVTMyIHBhcmFtKTsKLSAgICBPTVhfRVJST1JUWVBFIGFzeW5jX3Byb2Nlc3NfZXZlbnRfY21kX2FjayhPTVhfQ09NTUFORFRZUEUgY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICBwYXJhbSk7Ci0gICAgT01YX0VSUk9SVFlQRSBhc3luY19wcm9jZXNzX2V2ZW50X2Vycm9yKE9NWF9FUlJPUlRZUEUgZXJyb3JfY29kZSk7Ci0gICAgT01YX0VSUk9SVFlQRSBhc3luY19wcm9jZXNzX2V2ZW50X2NtZF9zdGF0ZV9zZXQoYm9vbCAgICAgICAgICpwX2NtZF9hY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1NUQVRFVFlQRSBzdGF0ZV9uZXcpOwotICAgIE9NWF9FUlJPUlRZUEUgYXN5bmNfcHJvY2Vzc19ldmVudF9jbWRfZmx1c2godW5zaWduZWQgaW50IHBvcnRfaW5kZXgpOwotICAgIE9NWF9FUlJPUlRZUEUgYXN5bmNfcHJvY2Vzc19ldmVudF9jbWRfcG9ydF9kaXNhYmxlKAotICAgICAgICBib29sICAgICAgICAgKnBfY21kX2FjaywKLSAgICAgICAgdW5zaWduZWQgaW50ICBwb3J0X2luZGV4KTsKLSAgICBPTVhfRVJST1JUWVBFIGFzeW5jX3Byb2Nlc3NfZXZlbnRfY21kX3BvcnRfZW5hYmxlKGJvb2wgICAgICAgICpwX2NtZF9hY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcG9ydF9pbmRleCk7Ci0gICAgT01YX0VSUk9SVFlQRSBhc3luY19wcm9jZXNzX2V2ZW50X2V0YihPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9idWZmZXJfaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGluZGV4KTsKLSAgICBPTVhfRVJST1JUWVBFIGFzeW5jX3Byb2Nlc3NfZXZlbnRfZnRiKE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1ZmZlcl9oZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgaW5kZXgpOwotICAgIE9NWF9FUlJPUlRZUEUgYXN5bmNfcHJvY2Vzc19ldmVudF9lYmQoT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmZmVyX2hkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICBpbmRleCk7Ci0gICAgT01YX0VSUk9SVFlQRSBhc3luY19wcm9jZXNzX2V2ZW50X2ZiZChPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9idWZmZXJfaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGluZGV4KTsKLSAgICBPTVhfRVJST1JUWVBFIGFzeW5jX3Byb2Nlc3NfZXZlbnRfZW9zKCk7Ci0gICAgT01YX0VSUk9SVFlQRSBhc3luY19wcm9jZXNzX2V2ZW50X2ZsdXNoX3BvcnRfaXAoKTsKLSAgICBPTVhfRVJST1JUWVBFIGFzeW5jX3Byb2Nlc3NfZXZlbnRfZmx1c2hfcG9ydF9vcCgpOwotICAgIE9NWF9FUlJPUlRZUEUgYXN5bmNfcHJvY2Vzc19ldmVudF9wb3J0X3JlY29uZmlnKCk7Ci0gICAgT01YX0VSUk9SVFlQRSBhc3luY19wcm9jZXNzX2V2ZW50X2RpbWVuc2lvbnNfdXBkYXRlZCgpOwotfTsKLQotI2VuZGlmIC8vICNpZm5kZWYgX09NWF9TV1ZERUNfSF8KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9pbmMvb214X3N3dmRlY191dGlscy5oIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy9vbXhfc3d2ZGVjX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYjQ2MWMuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy9vbXhfc3d2ZGVjX3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqCi0gKiBAY29weXJpZ2h0Ci0gKgotICogICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiAgICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogICBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELgotICogICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSAqICAgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqICAgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiAgIERBTUFHRS4KLSAqCi0gKiBAZmlsZQotICoKLSAqICAgb214X3N3dmRlY191dGlscy5oCi0gKgotICogQGJyaWVmCi0gKgotICogICBPTVggc29mdHdhcmUgdmlkZW8gZGVjb2RlciB1dGlsaXR5IGZ1bmN0aW9ucyBoZWFkZXIuCi0gKi8KLQotI2lmbmRlZiBfT01YX1NXVkRFQ19VVElMU19IXwotI2RlZmluZSBfT01YX1NXVkRFQ19VVElMU19IXwotCi0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCi1leHRlcm4gdW5zaWduZWQgaW50IGdfb214X3N3dmRlY19sb2dtYXNrOwotICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZ2xvYmFsIE9NWCBTd1ZkZWMgbG9nbWFzayB2YXJpYWJsZSBleHRlcm4gZGVjbGFyYXRpb24KLQotdm9pZCBvbXhfc3d2ZGVjX2xvZ19pbml0KCk7Ci0KLSNkZWZpbmUgT01YX1NXVkRFQ19MT0dNQVNLX0xPVyAgIDQgLy8vPCAxMDA6IGxvZ21hc2sgZm9yIGxvdyBwcmlvcml0eSBsb2dzCi0jZGVmaW5lIE9NWF9TV1ZERUNfTE9HTUFTS19ISUdIICAyIC8vLzwgMDEwOiBsb2dtYXNrIGZvciBoaWdoIHByaW9yaXR5IGxvZ3MKLSNkZWZpbmUgT01YX1NXVkRFQ19MT0dNQVNLX0VSUk9SIDEgLy8vPCAwMDE6IGxvZ21hc2sgZm9yIGVycm9yIHByaW9yaXR5IGxvZ3MKLQotI2lmZGVmIExPR19UQUcKLSN1bmRlZiBMT0dfVEFHCi0jZW5kaWYKLSNkZWZpbmUgTE9HX1RBRyAiT01YX1NXVkRFQyIgLy8vPCBPTVggU3dWZGVjIGxvZyB0YWcKLQotLy8vIGxvdyBwcmlvcml0eSBsb2cgbWVzc2FnZQotI2RlZmluZSBPTVhfU1dWREVDX0xPR19MT1coc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoZ19vbXhfc3d2ZGVjX2xvZ21hc2sgJiBPTVhfU1dWREVDX0xPR01BU0tfTE9XKSAgICAgICAgICAgXAotICAgICAgICAgICAgQUxPR0QoIi0tLSAlcygpOiAiIHN0cmluZywgX19GVU5DVElPTl9fLCAjI19fVkFfQVJHU19fKTsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8vLyBoaWdoIHByaW9yaXR5IGxvZyBtZXNzYWdlCi0jZGVmaW5lIE9NWF9TV1ZERUNfTE9HX0hJR0goc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChnX29teF9zd3ZkZWNfbG9nbWFzayAmIE9NWF9TV1ZERUNfTE9HTUFTS19ISUdIKSAgICAgICAgICBcCi0gICAgICAgICAgICBBTE9HSSgiLS0tICVzKCk6ICIgc3RyaW5nLCBfX0ZVTkNUSU9OX18sICMjX19WQV9BUkdTX18pOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLy8vIGVycm9yIHByaW9yaXR5IGxvZyBtZXNzYWdlCi0jZGVmaW5lIE9NWF9TV1ZERUNfTE9HX0VSUk9SKHN0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChnX29teF9zd3ZkZWNfbG9nbWFzayAmIE9NWF9TV1ZERUNfTE9HTUFTS19FUlJPUikgICAgICAgICBcCi0gICAgICAgICAgICBBTE9HRSgiISEhICVzKCk6ICIgc3RyaW5nLCBfX0ZVTkNUSU9OX18sICMjX19WQV9BUkdTX18pOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLy8vIGhpZ2ggcHJpb3JpdHkgbG9nIG1lc3NhZ2UgZm9yIE9NWCBTd1ZkZWMgQVBJIGNhbGxzCi0jZGVmaW5lIE9NWF9TV1ZERUNfTE9HX0FQSShzdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChnX29teF9zd3ZkZWNfbG9nbWFzayAmIE9NWF9TV1ZERUNfTE9HTUFTS19ISUdIKSAgICAgICAgICBcCi0gICAgICAgICAgICBBTE9HSSgiPj4+ICVzKCk6ICIgc3RyaW5nLCBfX0ZVTkNUSU9OX18sICMjX19WQV9BUkdTX18pOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLy8vIGhpZ2ggcHJpb3JpdHkgbG9nIG1lc3NhZ2UgZm9yIE9NWCBTd1ZkZWMgY2FsbGJhY2tzCi0jZGVmaW5lIE9NWF9TV1ZERUNfTE9HX0NBTExCQUNLKHN0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChnX29teF9zd3ZkZWNfbG9nbWFzayAmIE9NWF9TV1ZERUNfTE9HTUFTS19ISUdIKSAgICAgICAgICBcCi0gICAgICAgICAgICBBTE9HSSgiPDw8ICVzKCk6ICIgc3RyaW5nLCBfX0ZVTkNUSU9OX18sICMjX19WQV9BUkdTX18pOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLy8vIE9NWCBTd1ZkZWMgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgbG9uZyBldmVudF9pZDsgICAgIC8vLzwgZXZlbnQgSUQKLSAgICB1bnNpZ25lZCBsb25nIGV2ZW50X3BhcmFtMTsgLy8vPCBldmVudCBwYXJhbWV0ZXIgMQotICAgIHVuc2lnbmVkIGxvbmcgZXZlbnRfcGFyYW0yOyAvLy88IGV2ZW50IHBhcmFtZXRlciAyCi19IE9NWF9TV1ZERUNfRVZFTlRfSU5GTzsKLQotLy8vIE9NWCBTd1ZkZWMgcXVldWUgY2xhc3MKLWNsYXNzIG9teF9zd3ZkZWNfcXVldWUKLXsKLXB1YmxpYzoKLSAgICBvbXhfc3d2ZGVjX3F1ZXVlKCk7Ci0gICAgfm9teF9zd3ZkZWNfcXVldWUoKTsKLQotICAgIHZvaWQgcHVzaChPTVhfU1dWREVDX0VWRU5UX0lORk8gKnBfZXZlbnRfaW5mbyk7Ci0gICAgYm9vbCBwb3AoT01YX1NXVkRFQ19FVkVOVF9JTkZPICpwX2V2ZW50X2luZm8pOwotCi1wcml2YXRlOgotICAgIHN0ZDo6cXVldWU8T01YX1NXVkRFQ19FVkVOVF9JTkZPPiBtX3F1ZXVlOyAvLy88IHF1ZXVlCi0gICAgcHRocmVhZF9tdXRleF90ICAgICAgICAgICAgICAgICAgIG1fbXV0ZXg7IC8vLzwgbXV0ZXgKLX07Ci0KLSNkZWZpbmUgRElBR19GSUxFX1BBVEggIi9kYXRhL21pc2MvbWVkaWEiIC8vLzwgZmlsZSBwYXRoCi0KLS8vLyBPTVggU3dWZGVjIGRpYWdub3N0aWNzIGNsYXNzCi1jbGFzcyBvbXhfc3d2ZGVjX2RpYWcKLXsKLXB1YmxpYzoKLSAgICBvbXhfc3d2ZGVjX2RpYWcoKTsKLSAgICB+b214X3N3dmRlY19kaWFnKCk7Ci0KLSAgICB2b2lkIGR1bXBfaXAodW5zaWduZWQgY2hhciAqcF9idWZmZXIsIHVuc2lnbmVkIGludCBmaWxsZWRfbGVuZ3RoKTsKLSAgICB2b2lkIGR1bXBfb3AodW5zaWduZWQgY2hhciAqcF9idWZmZXIsCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIHdpZHRoLAotICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBoZWlnaHQsCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgc2NhbmxpbmVzKTsKLQotcHJpdmF0ZToKLSAgICB1bnNpZ25lZCBpbnQgbV9kdW1wX2lwOyAvLy88IGR1bXAgIGlucHV0IGJpdHN0cmVhbQotICAgIHVuc2lnbmVkIGludCBtX2R1bXBfb3A7IC8vLzwgZHVtcCBvdXRwdXQgWVVWCi0KLSAgICBjaGFyICptX2ZpbGVuYW1lX2lwOyAvLy88ICBpbnB1dCBmaWxlbmFtZSBzdHJpbmcKLSAgICBjaGFyICptX2ZpbGVuYW1lX29wOyAvLy88IG91dHB1dCBmaWxlbmFtZSBzdHJpbmcKLQotICAgIEZJTEUgKm1fZmlsZV9pcDsgLy8vPCAgaW5wdXQgZmlsZSBoYW5kbGUKLSAgICBGSUxFICptX2ZpbGVfb3A7IC8vLzwgb3V0cHV0IGZpbGUgaGFuZGxlCi19OwotCi0jZW5kaWYgLy8gI2lmbmRlZiBfT01YX1NXVkRFQ19VVElMU19IXwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy9vbXhfdmRlYy5oIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy9vbXhfdmRlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzE3NmVmLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9pbmMvb214X3ZkZWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MDkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDEwIC0gMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICBhcmUgbWV0OgotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLVdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi1BUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi1CRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi1CVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi1PUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi1JRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgX19PTVhfVkRFQ19IX18KLSNkZWZpbmUgX19PTVhfVkRFQ19IX18KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gTSBBIFggICBDb21wb25lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW8gRGVjb2RlcgotCi0qLy8qKiBAZmlsZSBjb214X3ZkZWMuaAotICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgY2xhc3MgZGVmaW5pdGlvbiBmb3Igb3Blbk1BWCBkZWNvZGVyIGNvbXBvbmVudC4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgRmlsZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotI2luY2x1ZGUgPHFkTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxjb2xvcl9tZXRhZGF0YS5oPgotI2luY2x1ZGUgIlZpZGVvQVBJLmgiCi0jaW5jbHVkZSAiSGFyZHdhcmVBUEkuaCIKLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPG1lZGlhL21zbV9tZWRpYV9pbmZvLmg+Ci0KLSNpbmNsdWRlICJDMkRDb2xvckNvbnZlcnRlci5oIgotCi1zdGF0aWMgcHRyZGlmZl90IHg7Ci0KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotfQotCi0jaWZkZWYgX0FORFJPSURfCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJPTVgtVkRFQy0xMDgwUCIKLQotI2lmZGVmIFVTRV9JT04KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0vLyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcElvbi5oPgotLy8jZWxzZQotI2VuZGlmCi0jaW5jbHVkZSA8dWkvQU5hdGl2ZU9iamVjdEJhc2UuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNkZWZpbmUgVkFMSURfVFModHMpICAgICAgKCh0cyA8IExMT05HX01BWCk/IHRydWUgOiBmYWxzZSkKLSNpbmNsdWRlIDxwb2xsLmg+Ci0jaW5jbHVkZSAiaGV2Y191dGlscy5oIgotI2RlZmluZSBUSU1FT1VUIDUwMDAKLSNlbmRpZiAvLyBfQU5EUk9JRF8KLQotI2lmIGRlZmluZWQgKF9BTkRST0lEX0hPTkVZQ09NQl8pIHx8IGRlZmluZWQgKF9BTkRST0lEX0lDU18pCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpZiBkZWZpbmVkIChfQU5EUk9JRF9JQ1NfKQotI2luY2x1ZGUgPGdyYWxsb2NfcHJpdi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaWZuZGVmIFBDX0RFQlVHCi0jaW5jbHVkZSA8c2VtYXBob3JlLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJPTVhfQ29yZS5oIgotI2luY2x1ZGUgIk9NWF9RQ09NRXh0bnMuaCIKLSNpbmNsdWRlICJPTVhfU2t5cGVfVmlkZW9FeHRlbnNpb25zLmgiCi0jaW5jbHVkZSAiT01YX1ZpZGVvRXh0LmgiCi0jaW5jbHVkZSAiT01YX0luZGV4RXh0LmgiCi0jaW5jbHVkZSAicWNfb214X2NvbXBvbmVudC5oIgotI2luY2x1ZGUgPG1lZGlhL21zbV92aWRjLmg+Ci0jaW5jbHVkZSAidHNfcGFyc2VyLmgiCi0jaW5jbHVkZSAidmlkY19kZWJ1Zy5oIgotI2luY2x1ZGUgInZpZGNfdmVuZG9yX2V4dGVuc2lvbnMuaCIKLSNpZmRlZiBfQU5EUk9JRF8KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2Vsc2UKLSNkZWZpbmUgUFJPUEVSVFlfVkFMVUVfTUFYIDkyCi0jZW5kaWYKLWV4dGVybiAiQyIgewotICAgIE9NWF9BUEkgdm9pZCAqIGdldF9vbXhfY29tcG9uZW50X2ZhY3RvcnlfZm4odm9pZCk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSBzcGVjaWZpYyBnbG9iYWxzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNkZWZpbmUgT01YX1NQRUNfVkVSU0lPTiAgMHgwMDAwMDEwMQotI2RlZmluZSBPTVhfSU5JVF9TVFJVQ1QoX3NfLCBfbmFtZV8pICAgICAgICAgXAotICAgIG1lbXNldCgoX3NfKSwgMHgwLCBzaXplb2YoX25hbWVfKSk7ICAgICAgXAotKF9zXyktPm5TaXplID0gc2l6ZW9mKF9uYW1lXyk7ICAgICAgICAgICAgICAgXAotKF9zXyktPm5WZXJzaW9uLm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTiAgXAotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgICAgICAgICBNYWNyb3MKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotI2RlZmluZSBQcmludEZyYW1lSGRyKGJ1ZkhkcikgREVCVUdfUFJJTlQoImJ1ZkhkciAleCBidWYgJXggc2l6ZSAlZCBUUyAlZFxuIixcCi0gICAgICAgICh1bnNpZ25lZCkgYnVmSGRyLFwKLSAgICAgICAgKHVuc2lnbmVkKSgoT01YX0JVRkZFUkhFQURFUlRZUEUgKilidWZIZHIpLT5wQnVmZmVyLFwKLSAgICAgICAgKHVuc2lnbmVkKSgoT01YX0JVRkZFUkhFQURFUlRZUEUgKilidWZIZHIpLT5uRmlsbGVkTGVuLFwKLSAgICAgICAgKHVuc2lnbmVkKSgoT01YX0JVRkZFUkhFQURFUlRZUEUgKilidWZIZHIpLT5uVGltZVN0YW1wKQotCi0vLyBCaXRNYXNrIE1hbmFnZW1lbnQgbG9naWMKLSNkZWZpbmUgQklUU19QRVJfSU5ERVggICAgICAgIDY0Ci0jZGVmaW5lIEJJVE1BU0tfU0laRShtSW5kZXgpICgoKG1JbmRleCkgKyBCSVRTX1BFUl9JTkRFWCAtIDEpL0JJVFNfUEVSX0lOREVYKQotI2RlZmluZSBCSVRNQVNLX09GRlNFVChtSW5kZXgpICgobUluZGV4KS9CSVRTX1BFUl9JTkRFWCkKLSNkZWZpbmUgQklUTUFTS19GTEFHKG1JbmRleCkgKCh1aW50NjRfdCkxIDw8ICgobUluZGV4KSAlIEJJVFNfUEVSX0lOREVYKSkKLSNkZWZpbmUgQklUTUFTS19DTEVBUihtQXJyYXksbUluZGV4KSAobUFycmF5KVtCSVRNQVNLX09GRlNFVChtSW5kZXgpXSBcCi0gICAgJj0gIH4oQklUTUFTS19GTEFHKG1JbmRleCkpCi0jZGVmaW5lIEJJVE1BU0tfU0VUKG1BcnJheSxtSW5kZXgpICAobUFycmF5KVtCSVRNQVNLX09GRlNFVChtSW5kZXgpXSBcCi0gICAgfD0gIEJJVE1BU0tfRkxBRyhtSW5kZXgpCi0jZGVmaW5lIEJJVE1BU0tfUFJFU0VOVChtQXJyYXksbUluZGV4KSAoKG1BcnJheSlbQklUTUFTS19PRkZTRVQobUluZGV4KV0gXAotICAgICAgICAmIEJJVE1BU0tfRkxBRyhtSW5kZXgpKQotI2RlZmluZSBCSVRNQVNLX0FCU0VOVChtQXJyYXksbUluZGV4KSAoKChtQXJyYXkpW0JJVE1BU0tfT0ZGU0VUKG1JbmRleCldIFwKLSAgICAgICAgICAgICYgQklUTUFTS19GTEFHKG1JbmRleCkpID09IDB4MCkKLSNkZWZpbmUgQklUTUFTS19QUkVTRU5UKG1BcnJheSxtSW5kZXgpICgobUFycmF5KVtCSVRNQVNLX09GRlNFVChtSW5kZXgpXSBcCi0gICAgICAgICYgQklUTUFTS19GTEFHKG1JbmRleCkpCi0jZGVmaW5lIEJJVE1BU0tfQUJTRU5UKG1BcnJheSxtSW5kZXgpICgoKG1BcnJheSlbQklUTUFTS19PRkZTRVQobUluZGV4KV0gXAotICAgICAgICAgICAgJiBCSVRNQVNLX0ZMQUcobUluZGV4KSkgPT0gMHgwKQotCi0jZGVmaW5lIE9NWF9DT1JFX0NPTlRST0xfQ01EUV9TSVpFICAgMTAwCi0jZGVmaW5lIE9NWF9DT1JFX1FDSUZfSEVJR0hUICAgICAgICAgMTQ0Ci0jZGVmaW5lIE9NWF9DT1JFX1FDSUZfV0lEVEggICAgICAgICAgMTc2Ci0jZGVmaW5lIE9NWF9DT1JFX1ZHQV9IRUlHSFQgICAgICAgICAgNDgwCi0jZGVmaW5lIE9NWF9DT1JFX1ZHQV9XSURUSCAgICAgICAgICAgNjQwCi0jZGVmaW5lIE9NWF9DT1JFX1dWR0FfSEVJR0hUICAgICAgICAgNDgwCi0jZGVmaW5lIE9NWF9DT1JFX1dWR0FfV0lEVEggICAgICAgICAgODAwCi0jZGVmaW5lIE9NWF9DT1JFX0ZXVkdBX0hFSUdIVCAgICAgICAgNDgwCi0jZGVmaW5lIE9NWF9DT1JFX0ZXVkdBX1dJRFRIICAgICAgICAgODY0Ci0KLSNkZWZpbmUgREVTQ19CVUZGRVJfU0laRSAoODE5MiAqIDE2KQotCi0jaWZkZWYgX0FORFJPSURfCi0jZGVmaW5lIE1BWF9OVU1fSU5QVVRfT1VUUFVUX0JVRkZFUlMgNjQKLSNlbmRpZgotCi0jZGVmaW5lIE1JTl9OVU1fSU5QVVRfT1VUUFVUX0VYVFJBREFUQV9CVUZGRVJTIDMyIC8vIDMyIChtYXggY2FwIHdoZW4gVlBQIGVuYWJsZWQpCi0KLSNkZWZpbmUgT01YX0ZSQU1FSU5GT19FWFRSQURBVEEgMHgwMDAxMDAwMAotI2RlZmluZSBPTVhfSU5URVJMQUNFX0VYVFJBREFUQSAweDAwMDIwMDAwCi0jZGVmaW5lIE9NWF9USU1FSU5GT19FWFRSQURBVEEgIDB4MDAwNDAwMDAKLSNkZWZpbmUgT01YX1BPUlRERUZfRVhUUkFEQVRBICAgMHgwMDA4MDAwMAotI2RlZmluZSBPTVhfRVhUTlVTRVJfRVhUUkFEQVRBICAweDAwMTAwMDAwCi0jZGVmaW5lIE9NWF9GUkFNRURJTUVOU0lPTl9FWFRSQURBVEEgIDB4MDAyMDAwMDAKLSNkZWZpbmUgT01YX0ZSQU1FUEFDS19FWFRSQURBVEEgMHgwMDQwMDAwMAotI2RlZmluZSBPTVhfUVBfRVhUUkFEQVRBICAgICAgICAweDAwODAwMDAwCi0jZGVmaW5lIE9NWF9CSVRTSU5GT19FWFRSQURBVEEgIDB4MDEwMDAwMDAKLSNkZWZpbmUgT01YX1ZRWklQU0VJX0VYVFJBREFUQSAgMHgwMjAwMDAwMAotI2RlZmluZSBPTVhfT1VUUFVUQ1JPUF9FWFRSQURBVEEgMHgwNDAwMDAwMAotI2RlZmluZSBPTVhfTUJfRVJST1JfTUFQX0VYVFJBREFUQSAweDA4MDAwMDAwCi0KLSNkZWZpbmUgT01YX1ZVSV9ESVNQTEFZX0lORk9fRVhUUkFEQVRBICAweDA4MDAwMDAwCi0jZGVmaW5lIE9NWF9NUEVHMl9TRVFESVNQX0lORk9fRVhUUkFEQVRBIDB4MTAwMDAwMDAKLSNkZWZpbmUgT01YX1ZQWF9DT0xPUlNQQUNFX0lORk9fRVhUUkFEQVRBICAweDIwMDAwMDAwCi0jZGVmaW5lIE9NWF9WQzFfU0VRRElTUF9JTkZPX0VYVFJBREFUQSAgMHg0MDAwMDAwMAotI2RlZmluZSBPTVhfRElTUExBWV9JTkZPX0VYVFJBREFUQSAgMHg4MDAwMDAwMAotI2RlZmluZSBPTVhfSERSX0NPTE9SX0lORk9fRVhUUkFEQVRBICAweDEwMDAwMDAwMAotI2RlZmluZSBEUklWRVJfRVhUUkFEQVRBX01BU0sgICAweDAwMDBGRkZGCi0KLSNkZWZpbmUgT01YX0lOVEVSTEFDRV9FWFRSQURBVEFfU0laRSAoKHNpemVvZihPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSkgK1wKLSAgICAgICAgICAgIHNpemVvZihPTVhfU1RSRUFNSU5URVJMQUNFRk9STUFUKSArIDMpJih+MykpCi0jZGVmaW5lIE9NWF9GUkFNRUlORk9fRVhUUkFEQVRBX1NJWkUgKChzaXplb2YoT01YX09USEVSX0VYVFJBREFUQVRZUEUpICtcCi0gICAgICAgICAgICBzaXplb2YoT01YX1FDT01fRVhUUkFEQVRBX0ZSQU1FSU5GTykgKyAzKSYofjMpKQotI2RlZmluZSBPTVhfUE9SVERFRl9FWFRSQURBVEFfU0laRSAoKHNpemVvZihPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSkgK1wKLSAgICAgICAgICAgIHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSArIDMpJih+MykpCi0jZGVmaW5lIE9NWF9GUkFNRURJTUVOU0lPTl9FWFRSQURBVEFfU0laRSAoc2l6ZW9mKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFKSArXAotICAgICAgICAgICAgc2l6ZW9mKE9NWF9RQ09NX0VYVFJBREFUQV9GUkFNRURJTUVOU0lPTikgKyAzKSYofjMpCi0jZGVmaW5lIE9NWF9GUkFNRVBBQ0tfRVhUUkFEQVRBX1NJWkUgKChzaXplb2YoT01YX09USEVSX0VYVFJBREFUQVRZUEUpICtcCi0gICAgICAgICAgICBzaXplb2YoT01YX1FDT01fRlJBTUVfUEFDS19BUlJBTkdFTUVOVCkgKyAzKSYofjMpKQotI2RlZmluZSBPTVhfUVBfRVhUUkFEQVRBX1NJWkUgKChzaXplb2YoT01YX09USEVSX0VYVFJBREFUQVRZUEUpICtcCi0gICAgICAgICAgICBzaXplb2YoT01YX1FDT01fRVhUUkFEQVRBX1FQKSArIDMpJih+MykpCi0jZGVmaW5lIE9NWF9CSVRTSU5GT19FWFRSQURBVEFfU0laRSAoKHNpemVvZihPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSkgK1wKLSAgICAgICAgICAgIHNpemVvZihPTVhfUUNPTV9FWFRSQURBVEFfQklUU19JTkZPKSArIDMpJih+MykpCi0jZGVmaW5lIE9NWF9WUVpJUFNFSV9FWFRSQURBVEFfU0laRSAoKHNpemVvZihPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSkgK1wKLSAgICAgICAgICAgIHNpemVvZihPTVhfUUNPTV9FWFRSQURBVEFfVlFaSVBTRUkpICsgMykmKH4zKSkKLSNkZWZpbmUgT01YX1VTRVJEQVRBX0VYVFJBREFUQV9TSVpFICgoc2l6ZW9mKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFKSArXAotICAgICAgICAgICAgKyAzKSYofjMpKQotI2RlZmluZSBPTVhfT1VUUFVUQ1JPUF9FWFRSQURBVEFfU0laRSAoKHNpemVvZihPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSkgK1wKLSAgICAgICAgICAgIHNpemVvZihPTVhfUUNPTV9PVVRQVVRfQ1JPUCkgKyAzKSYofjMpKQotCi0vKiBTVEFUVVMgQ09ERVMgKi8KLS8qIEJhc2UgdmFsdWUgZm9yIHN0YXR1cyBjb2RlcyAqLwotI2RlZmluZSBWREVDX1NfQkFTRQkweDQwMDAwMDAwCi0vKiBTdWNjZXNzICovCi0jZGVmaW5lIFZERUNfU19TVUNDRVNTCShWREVDX1NfQkFTRSkKLS8qIEdlbmVyYWwgZmFpbHVyZSAqLwotI2RlZmluZSBWREVDX1NfRUZBSUwJKFZERUNfU19CQVNFICsgMSkKLS8qIEZhdGFsIGlycmVjb3ZlcmFibGUgIGZhaWx1cmUuIE5lZWQgdG8gIHRlYXIgZG93biBzZXNzaW9uLiAqLwotI2RlZmluZSBWREVDX1NfRUZBVEFMICAgKFZERUNfU19CQVNFICsgMikKLS8qIEVycm9yIHdpdGggaW5wdXQgYmlzdHJlYW0gKi8KLSNkZWZpbmUgVkRFQ19TX0lOUFVUX0JJVFNUUkVBTV9FUlIgKFZERUNfU19CQVNFICsgMykKLQotI2RlZmluZSBWREVDX01TR19CQVNFCTB4MDAwMDAwMAotLyogQ29kZXMgdG8gaWRlbnRpZnkgYXN5bmNocm9ub3VzIG1lc3NhZ2UgcmVzcG9uc2VzIGFuZCBldmVudHMgdGhhdCBkcml2ZXIKLSAgd2FudHMgdG8gY29tbXVuaWNhdGUgdG8gdGhlIGFwcC4qLwotI2RlZmluZSBWREVDX01TR19SRVNQX0lOUFVUX0JVRkZFUl9ET05FCShWREVDX01TR19CQVNFICsgMSkKLSNkZWZpbmUgVkRFQ19NU0dfUkVTUF9PVVRQVVRfQlVGRkVSX0RPTkUJKFZERUNfTVNHX0JBU0UgKyAyKQotI2RlZmluZSBWREVDX01TR19SRVNQX0lOUFVUX0ZMVVNIRUQJKFZERUNfTVNHX0JBU0UgKyAzKQotI2RlZmluZSBWREVDX01TR19SRVNQX09VVFBVVF9GTFVTSEVECShWREVDX01TR19CQVNFICsgNCkKLSNkZWZpbmUgVkRFQ19NU0dfUkVTUF9GTFVTSF9JTlBVVF9ET05FCShWREVDX01TR19CQVNFICsgNSkKLSNkZWZpbmUgVkRFQ19NU0dfUkVTUF9GTFVTSF9PVVRQVVRfRE9ORQkoVkRFQ19NU0dfQkFTRSArIDYpCi0jZGVmaW5lIFZERUNfTVNHX1JFU1BfU1RBUlRfRE9ORQkoVkRFQ19NU0dfQkFTRSArIDcpCi0jZGVmaW5lIFZERUNfTVNHX1JFU1BfU1RPUF9ET05FCShWREVDX01TR19CQVNFICsgOCkKLSNkZWZpbmUgVkRFQ19NU0dfUkVTUF9QQVVTRV9ET05FCShWREVDX01TR19CQVNFICsgOSkKLSNkZWZpbmUgVkRFQ19NU0dfUkVTUF9SRVNVTUVfRE9ORQkoVkRFQ19NU0dfQkFTRSArIDEwKQotI2RlZmluZSBWREVDX01TR19FVlRfQ09ORklHX0NIQU5HRUQJKFZERUNfTVNHX0JBU0UgKyAxMSkKLSNkZWZpbmUgVkRFQ19NU0dfRVZUX0hXX0VSUk9SCShWREVDX01TR19CQVNFICsgMTIpCi0jZGVmaW5lIFZERUNfTVNHX0VWVF9JTkZPX0ZJRUxEX0RST1BQRUQJKFZERUNfTVNHX0JBU0UgKyAxMykKLSNkZWZpbmUgVkRFQ19NU0dfRVZUX0hXX09WRVJMT0FECShWREVDX01TR19CQVNFICsgMTQpCi0jZGVmaW5lIFZERUNfTVNHX0VWVF9NQVhfQ0xJRU5UUwkoVkRFQ19NU0dfQkFTRSArIDE1KQotI2RlZmluZSBWREVDX01TR19FVlRfSFdfVU5TVVBQT1JURUQJKFZERUNfTVNHX0JBU0UgKyAxNikKLQotLy8gIERlZmluZSBuZXh0IG1hY3JvIHdpdGggcmVxdWlyZWQgdmFsdWVzIHRvIGVuYWJsZSBkZWZhdWx0IGV4dHJhZGF0YSwKLS8vICAgIFZERUNfRVhUUkFEQVRBX01CX0VSUk9SX01BUAotLy8gICAgT01YX0lOVEVSTEFDRV9FWFRSQURBVEEKLS8vICAgIE9NWF9GUkFNRUlORk9fRVhUUkFEQVRBCi0vLyAgICBPTVhfVElNRUlORk9fRVhUUkFEQVRBCi0KLS8vI2RlZmluZSBERUZBVUxUX0VYVFJBREFUQSAoT01YX0ZSQU1FSU5GT19FWFRSQURBVEF8T01YX0lOVEVSTEFDRV9FWFRSQURBVEEpCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1lbnVtIHBvcnRfaW5kZXhlcyB7Ci0gICAgT01YX0NPUkVfSU5QVVRfUE9SVF9JTkRFWCAgICAgICAgPTAsCi0gICAgT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVggICAgICAgPTEsCi0gICAgT01YX0NPUkVfSU5QVVRfRVhUUkFEQVRBX0lOREVYICAgPTIsCi0gICAgT01YX0NPUkVfT1VUUFVUX0VYVFJBREFUQV9JTkRFWCAgPTMKLX07Ci0KLQotY2xhc3MgcGVyZl9tZXRyaWNzCi17Ci0gICAgcHVibGljOgotICAgICAgICBwZXJmX21ldHJpY3MoKSA6Ci0gICAgICAgICAgICBzdGFydF90aW1lKDApLAotICAgICAgICAgICAgcHJvY190aW1lKDApLAotICAgICAgICAgICAgYWN0aXZlKGZhbHNlKSB7Ci0gICAgICAgICAgICB9OwotICAgICAgICB+cGVyZl9tZXRyaWNzKCkge307Ci0gICAgICAgIHZvaWQgc3RhcnQoKTsKLSAgICAgICAgdm9pZCBzdG9wKCk7Ci0gICAgICAgIHZvaWQgZW5kKE9NWF9VMzIgdW5pdHNfY250ciA9IDApOwotICAgICAgICB2b2lkIHJlc2V0KCk7Ci0gICAgICAgIE9NWF9VNjQgcHJvY2Vzc2luZ190aW1lX3VzKCk7Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgaW5saW5lIE9NWF9VNjQgZ2V0X2FjdF90aW1lKCk7Ci0gICAgICAgIE9NWF9VNjQgc3RhcnRfdGltZTsKLSAgICAgICAgT01YX1U2NCBwcm9jX3RpbWU7Ci0gICAgICAgIGJvb2wgYWN0aXZlOwotfTsKLQotZW51bSB2ZGVjX2NvZGVjIHsKLQlWREVDX0NPREVDVFlQRV9IMjY0ID0gMHgxLAotCVZERUNfQ09ERUNUWVBFX0gyNjMgPSAweDIsCi0JVkRFQ19DT0RFQ1RZUEVfTVBFRzQgPSAweDMsCi0JVkRFQ19DT0RFQ1RZUEVfRElWWF8zID0gMHg0LAotCVZERUNfQ09ERUNUWVBFX0RJVlhfNCA9IDB4NSwKLQlWREVDX0NPREVDVFlQRV9ESVZYXzUgPSAweDYsCi0JVkRFQ19DT0RFQ1RZUEVfRElWWF82ID0gMHg3LAotCVZERUNfQ09ERUNUWVBFX1hWSUQgPSAweDgsCi0JVkRFQ19DT0RFQ1RZUEVfTVBFRzEgPSAweDksCi0JVkRFQ19DT0RFQ1RZUEVfTVBFRzIgPSAweGEsCi0JVkRFQ19DT0RFQ1RZUEVfVkMxID0gMHhiLAotCVZERUNfQ09ERUNUWVBFX1ZDMV9SQ1YgPSAweGMsCi0JVkRFQ19DT0RFQ1RZUEVfSEVWQyA9IDB4ZCwKLQlWREVDX0NPREVDVFlQRV9NVkMgPSAweGUsCi0JVkRFQ19DT0RFQ1RZUEVfVlA4ID0gMHhmLAotCVZERUNfQ09ERUNUWVBFX1ZQOSA9IDB4MTAsCi19OwotCi1lbnVtIHZkZWNfb3V0cHV0X2Zvcm1hdCB7Ci0JVkRFQ19ZVVZfRk9STUFUX05WMTIgPSAweDEsCi0JVkRFQ19ZVVZfRk9STUFUX1RJTEVfNHgyID0gMHgyLAotCVZERUNfWVVWX0ZPUk1BVF9OVjEyX1VCV0MgPSAweDMsCi0JVkRFQ19ZVVZfRk9STUFUX05WMTJfVFAxMF9VQldDID0gMHg0Ci19OwotCi1lbnVtIHZkZWNfaW50ZXJsYWNlZF9mb3JtYXQgewotICAgIFZERUNfSW50ZXJsYWNlRnJhbWVQcm9ncmVzc2l2ZSA9IDB4MSwKLSAgICBWREVDX0ludGVybGFjZUludGVybGVhdmVGcmFtZVRvcEZpZWxkRmlyc3QgPSAweDIsCi0gICAgVkRFQ19JbnRlcmxhY2VJbnRlcmxlYXZlRnJhbWVCb3R0b21GaWVsZEZpcnN0ID0gMHg0LAotICAgIFZERUNfSW50ZXJsYWNlRnJhbWVUb3BGaWVsZEZpcnN0ID0gMHg4LAotICAgIFZERUNfSW50ZXJsYWNlRnJhbWVCb3R0b21GaWVsZEZpcnN0ID0gMHgxMCwKLX07Ci0KLWVudW0gdmRlY19vdXRwdXRfb3JkZXIgewotCVZERUNfT1JERVJfRElTUExBWSA9IDB4MSwKLQlWREVDX09SREVSX0RFQ09ERSA9IDB4MgotfTsKLQotc3RydWN0IHZkZWNfZnJhbWVzaXplIHsKLQl1aW50MzJfdCAgIGxlZnQ7Ci0JdWludDMyX3QgICB0b3A7Ci0JdWludDMyX3QgICByaWdodDsKLQl1aW50MzJfdCAgIGJvdHRvbTsKLX07Ci0KLXN0cnVjdCB2ZGVjX3BpY3NpemUgewotCXVpbnQzMl90IGZyYW1lX3dpZHRoOwotCXVpbnQzMl90IGZyYW1lX2hlaWdodDsKLQl1aW50MzJfdCBzdHJpZGU7Ci0JdWludDMyX3Qgc2Nhbl9saW5lczsKLX07Ci0KLWVudW0gdmRlY19idWZmZXIgewotCVZERUNfQlVGRkVSX1RZUEVfSU5QVVQsCi0JVkRFQ19CVUZGRVJfVFlQRV9PVVRQVVQKLX07Ci0KLXN0cnVjdCB2ZGVjX2FsbG9jYXRvcnByb3BlcnR5IHsKLQllbnVtIHZkZWNfYnVmZmVyIGJ1ZmZlcl90eXBlOwotCXVpbnQzMl90IG1pbmNvdW50OwotCXVpbnQzMl90IG1heGNvdW50OwotCXVpbnQzMl90IGFjdHVhbGNvdW50OwotCXNpemVfdCBidWZmZXJfc2l6ZTsKLQl1aW50MzJfdCBhbGlnbm1lbnQ7Ci0JdWludDMyX3QgYnVmX3Bvb2xpZDsKLQlzaXplX3QgbWV0YV9idWZmZXJfc2l6ZTsKLX07Ci0KLXN0cnVjdCB2ZGVjX2J1ZmZlcnBheWxvYWQgewotCXZvaWQgKmJ1ZmZlcmFkZHI7Ci0Jc2l6ZV90IGJ1ZmZlcl9sZW47Ci0JaW50IHBtZW1fZmQ7Ci0Jc2l6ZV90IG9mZnNldDsKLQlzaXplX3QgbW1hcGVkX3NpemU7Ci19OwotCi1lbnVtIHZkZWNfcGljdHVyZSB7Ci0JUElDVFVSRV9UWVBFX0ksCi0JUElDVFVSRV9UWVBFX1AsCi0JUElDVFVSRV9UWVBFX0IsCi0JUElDVFVSRV9UWVBFX0JJLAotCVBJQ1RVUkVfVFlQRV9TS0lQLAotCVBJQ1RVUkVfVFlQRV9JRFIsCi0JUElDVFVSRV9UWVBFX1VOS05PV04KLX07Ci0KLXN0cnVjdCB2ZGVjX2FzcGVjdHJhdGlvaW5mbyB7Ci0JdWludDMyX3QgYXNwZWN0X3JhdGlvOwotCXVpbnQzMl90IHBhcl93aWR0aDsKLQl1aW50MzJfdCBwYXJfaGVpZ2h0OwotfTsKLQotc3RydWN0IHZkZWNfc2VwX21ldGFkYXRhaW5mbyB7Ci0Jdm9pZCAqbWV0YWJ1ZmFkZHI7Ci0JdWludDMyX3Qgc2l6ZTsKLQlpbnQgZmQ7Ci0JaW50IG9mZnNldDsKLQl1aW50MzJfdCBidWZmZXJfc2l6ZTsKLX07Ci0KLXN0cnVjdCB2ZGVjX21pc3JpbmZvIHsKLSAgICAgICAgdWludDMyX3QgbWlzcl9kcGJfbHVtYTsKLSAgICAgICAgdWludDMyX3QgbWlzcl9kcGJfY2hyb21hOwotICAgICAgICB1aW50MzJfdCBtaXNyX29wYl9sdW1hOwotICAgICAgICB1aW50MzJfdCBtaXNyX29wYl9jaHJvbWE7Ci19OwotCi1zdHJ1Y3QgdmRlY19vdXRwdXRfZnJhbWVpbmZvIHsKLQl2b2lkICpidWZmZXJhZGRyOwotCXNpemVfdCBvZmZzZXQ7Ci0Jc2l6ZV90IGxlbjsKLQl1aW50MzJfdCBmbGFnczsKLQlpbnQ2NF90IHRpbWVfc3RhbXA7Ci0JZW51bSB2ZGVjX3BpY3R1cmUgcGljX3R5cGU7Ci0Jdm9pZCAqY2xpZW50X2RhdGE7Ci0Jdm9pZCAqaW5wdXRfZnJhbWVfY2xpZW50ZGF0YTsKLQlzdHJ1Y3QgdmRlY19waWNzaXplIHBpY3NpemU7Ci0Jc3RydWN0IHZkZWNfZnJhbWVzaXplIGZyYW1lc2l6ZTsKLQllbnVtIHZkZWNfaW50ZXJsYWNlZF9mb3JtYXQgaW50ZXJsYWNlZF9mb3JtYXQ7Ci0Jc3RydWN0IHZkZWNfYXNwZWN0cmF0aW9pbmZvIGFzcGVjdF9yYXRpb19pbmZvOwotCXN0cnVjdCB2ZGVjX3NlcF9tZXRhZGF0YWluZm8gbWV0YWRhdGFfaW5mbzsKLSAgICAgICAgc3RydWN0IHZkZWNfbWlzcmluZm8gbWlzcmluZm9bMl07Ci19OwotCi11bmlvbiB2ZGVjX21zZ2RhdGEgewotCXN0cnVjdCB2ZGVjX291dHB1dF9mcmFtZWluZm8gb3V0cHV0X2ZyYW1lOwotCXZvaWQgKmlucHV0X2ZyYW1lX2NsaWVudGRhdGE7Ci19OwotCi1zdHJ1Y3QgdmRlY19tc2dpbmZvIHsKLQl1aW50MzJfdCBzdGF0dXNfY29kZTsKLQl1aW50MzJfdCBtc2djb2RlOwotCXVuaW9uIHZkZWNfbXNnZGF0YSBtc2dkYXRhOwotCXNpemVfdCBtc2dkYXRhc2l6ZTsKLX07Ci0KLXN0cnVjdCB2ZGVjX2ZyYW1lcmF0ZSB7Ci0JdW5zaWduZWQgbG9uZyBmcHNfZGVub21pbmF0b3I7Ci0JdW5zaWduZWQgbG9uZyBmcHNfbnVtZXJhdG9yOwotfTsKLQotI2lmZGVmIFVTRV9JT04KLXN0cnVjdCB2ZGVjX2lvbiB7Ci0gICAgaW50IGlvbl9kZXZpY2VfZmQ7Ci0gICAgc3RydWN0IGlvbl9mZF9kYXRhIGZkX2lvbl9kYXRhOwotICAgIHN0cnVjdCBpb25fYWxsb2NhdGlvbl9kYXRhIGlvbl9hbGxvY19kYXRhOwotfTsKLSNlbmRpZgotCi1zdHJ1Y3QgZXh0cmFkYXRhX2J1ZmZlcl9pbmZvIHsKLSAgICB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9zaXplOwotICAgIGNoYXIqIHVhZGRyOwotICAgIGludCBjb3VudDsKLSAgICBpbnQgc2l6ZTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgc3RydWN0IHZkZWNfaW9uIGlvbjsKLSNlbmRpZgotfTsKLQotc3RydWN0IHZpZGVvX2RyaXZlcl9jb250ZXh0IHsKLSAgICBpbnQgdmlkZW9fZHJpdmVyX2ZkOwotICAgIGVudW0gdmRlY19jb2RlYyBkZWNvZGVyX2Zvcm1hdDsKLSAgICBlbnVtIHZkZWNfb3V0cHV0X2Zvcm1hdCBvdXRwdXRfZm9ybWF0OwotICAgIGVudW0gdmRlY19pbnRlcmxhY2VkX2Zvcm1hdCBpbnRlcmxhY2U7Ci0gICAgZW51bSB2ZGVjX291dHB1dF9vcmRlciBwaWN0dXJlX29yZGVyOwotICAgIHN0cnVjdCB2ZGVjX2ZyYW1lc2l6ZSBmcmFtZV9zaXplOwotICAgIHN0cnVjdCB2ZGVjX3BpY3NpemUgdmlkZW9fcmVzb2x1dGlvbjsKLSAgICBzdHJ1Y3QgdmRlY19hbGxvY2F0b3Jwcm9wZXJ0eSBpcF9idWY7Ci0gICAgc3RydWN0IHZkZWNfYWxsb2NhdG9ycHJvcGVydHkgb3BfYnVmOwotICAgIHN0cnVjdCB2ZGVjX2J1ZmZlcnBheWxvYWQgKnB0cl9pbnB1dGJ1ZmZlcjsKLSAgICBzdHJ1Y3QgdmRlY19idWZmZXJwYXlsb2FkICpwdHJfb3V0cHV0YnVmZmVyOwotICAgIHN0cnVjdCB2ZGVjX291dHB1dF9mcmFtZWluZm8gKnB0cl9yZXNwYnVmZmVyOwotI2lmZGVmIFVTRV9JT04KLSAgICBzdHJ1Y3QgdmRlY19pb24gKmlwX2J1Zl9pb25faW5mbzsKLSAgICBzdHJ1Y3QgdmRlY19pb24gKm9wX2J1Zl9pb25faW5mbzsKLSAgICBzdHJ1Y3QgdmRlY19pb24gaDI2NF9tdjsKLSAgICBzdHJ1Y3QgdmRlY19pb24gbWV0YV9idWZmZXI7Ci0gICAgc3RydWN0IHZkZWNfaW9uIG1ldGFfYnVmZmVyX2lvbW11OwotI2VuZGlmCi0gICAgc3RydWN0IHZkZWNfZnJhbWVyYXRlIGZyYW1lX3JhdGU7Ci0gICAgdW5zaWduZWQgZXh0cmFkYXRhOwotICAgIGJvb2wgdGltZXN0YW1wX2FkanVzdDsKLSAgICBjaGFyIGtpbmRbMTI4XTsKLSAgICBib29sIGlkcl9vbmx5X2RlY29kaW5nOwotICAgIHVuc2lnbmVkIGRpc2FibGVfZG14OwotICAgIHN0cnVjdCBleHRyYWRhdGFfYnVmZmVyX2luZm8gZXh0cmFkYXRhX2luZm87Ci0gICAgaW50IG51bV9wbGFuZXM7Ci19OwotCi1zdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9jYXBhYmlsaXR5IHsKLSAgICB1bnNpZ25lZCBpbnQgbWluX3dpZHRoOwotICAgIHVuc2lnbmVkIGludCBtYXhfd2lkdGg7Ci0gICAgdW5zaWduZWQgaW50IG1pbl9oZWlnaHQ7Ci0gICAgdW5zaWduZWQgaW50IG1heF9oZWlnaHQ7Ci19OwotCi1zdHJ1Y3QgZGVidWdfY2FwIHsKLSAgICBib29sIGluX2J1ZmZlcl9sb2c7Ci0gICAgYm9vbCBvdXRfYnVmZmVyX2xvZzsKLSAgICBib29sIG91dF9tZXRhX2J1ZmZlcl9sb2c7Ci0gICAgY2hhciBpbmZpbGVfbmFtZVtQUk9QRVJUWV9WQUxVRV9NQVggKyAzNl07Ci0gICAgY2hhciBvdXRmaWxlX25hbWVbUFJPUEVSVFlfVkFMVUVfTUFYICsgMzZdOwotICAgIGNoYXIgb3V0X3ltZXRhZmlsZV9uYW1lW1BST1BFUlRZX1ZBTFVFX01BWCArIDM2XTsKLSAgICBjaGFyIG91dF91dm1ldGFmaWxlX25hbWVbUFJPUEVSVFlfVkFMVUVfTUFYICsgMzZdOwotICAgIGNoYXIgbG9nX2xvY1tQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIEZJTEUgKmluZmlsZTsKLSAgICBGSUxFICpvdXRmaWxlOwotICAgIEZJTEUgKm91dF95bWV0YV9maWxlOwotICAgIEZJTEUgKm91dF91dm1ldGFfZmlsZTsKLX07Ci0KLXN0cnVjdCBkeW5hbWljX2J1Zl9saXN0IHsKLSAgICBsb25nIGZkOwotICAgIGxvbmcgZHVwX2ZkOwotICAgIE9NWF9VMzIgb2Zmc2V0OwotICAgIE9NWF9VMzIgcmVmX2NvdW50OwotICAgIHZvaWQgKmJ1ZmZhZGRyOwotICAgIGxvbmcgbWFwcGVkX3NpemU7Ci19OwotCi1zdHJ1Y3QgZXh0cmFkYXRhX2luZm8gewotICAgIE9NWF9CT09MIG91dHB1dF9jcm9wX3VwZGF0ZWQ7Ci0gICAgT01YX0NPTkZJR19SRUNUVFlQRSBvdXRwdXRfY3JvcF9yZWN0OwotICAgIE9NWF9VMzIgb3V0cHV0X3dpZHRoOwotICAgIE9NWF9VMzIgb3V0cHV0X2hlaWdodDsKLSAgICBPTVhfUUNPTV9NSVNSX0lORk8gbWlzcl9pbmZvWzJdOwotfTsKLQotdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXAgPGludCwgaW50PiBDb2xvclN1Yk1hcHBpbmc7Ci10eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcCA8aW50LCBDb2xvclN1Yk1hcHBpbmc+IERlY0NvbG9yTWFwcGluZzsKLQotLy8gT01YIHZpZGVvIGRlY29kZXIgY2xhc3MKLWNsYXNzIG9teF92ZGVjOiBwdWJsaWMgcWNfb214X2NvbXBvbmVudAotewotCi0gICAgcHVibGljOgotICAgICAgICBvbXhfdmRlYygpOyAgLy8gY29uc3RydWN0b3IKLSAgICAgICAgdmlydHVhbCB+b214X3ZkZWMoKTsgIC8vIGRlc3RydWN0b3IKLQotICAgICAgICBzdGF0aWMgaW50IGFzeW5jX21lc3NhZ2VfcHJvY2VzcyAodm9pZCAqY29udGV4dCwgdm9pZCogbWVzc2FnZSk7Ci0gICAgICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfZXZlbnRfY2Iodm9pZCAqY3R4dCk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBhbGxvY2F0ZV9idWZmZXIoCi0gICAgICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZHIsCi0gICAgICAgICAgICAgICAgT01YX1UzMiBwb3J0LAotICAgICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKLSAgICAgICAgICAgICAgICBPTVhfVTMyIGJ5dGVzCi0gICAgICAgICAgICAgICAgKTsKLQotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgY29tcG9uZW50X2RlaW5pdChPTVhfSEFORExFVFlQRSBoQ29tcCk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBjb21wb25lbnRfaW5pdChPTVhfU1RSSU5HIHJvbGUpOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgY29tcG9uZW50X3JvbGVfZW51bSgKLSAgICAgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfVTggKnJvbGUsCi0gICAgICAgICAgICAgICAgT01YX1UzMiBpbmRleAotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBjb21wb25lbnRfdHVubmVsX3JlcXVlc3QoCi0gICAgICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX1UzMiBwb3J0LAotICAgICAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFICBwZWVyQ29tcG9uZW50LAotICAgICAgICAgICAgICAgIE9NWF9VMzIgcGVlclBvcnQsCi0gICAgICAgICAgICAgICAgT01YX1RVTk5FTFNFVFVQVFlQRSAqdHVubmVsU2V0dXAKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgZW1wdHlfdGhpc19idWZmZXIoCi0gICAgICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcgotICAgICAgICAgICAgICAgICk7Ci0KLQotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgZmlsbF90aGlzX2J1ZmZlcigKLSAgICAgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyCi0gICAgICAgICAgICAgICAgKTsKLQotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgZnJlZV9idWZmZXIoCi0gICAgICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX1UzMiBwb3J0LAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgZ2V0X2NvbXBvbmVudF92ZXJzaW9uKAotICAgICAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICAgICBPTVhfVkVSU0lPTlRZUEUgKmNvbXBvbmVudFZlcnNpb24sCi0gICAgICAgICAgICAgICAgT01YX1ZFUlNJT05UWVBFICpzcGVjVmVyc2lvbiwKLSAgICAgICAgICAgICAgICBPTVhfVVVJRFRZUEUgKmNvbXBvbmVudFVVSUQKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgZ2V0X2NvbmZpZygKLSAgICAgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGNvbmZpZ0luZGV4LAotICAgICAgICAgICAgICAgIE9NWF9QVFIgY29uZmlnRGF0YQotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBnZXRfZXh0ZW5zaW9uX2luZGV4KAotICAgICAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9TVFJJTkcgcGFyYW1OYW1lLAotICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgKmluZGV4VHlwZQotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBnZXRfcGFyYW1ldGVyKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgIHBhcmFtSW5kZXgsCi0gICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgcGFyYW1EYXRhKTsKLQotICAgICAgICBPTVhfRVJST1JUWVBFIGdldF9zdGF0ZShPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfU1RBVEVUWVBFICpzdGF0ZSk7Ci0KLQotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgc2VuZF9jb21tYW5kKE9NWF9IQU5ETEVUWVBFICBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICBwYXJhbTEsCi0gICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgIGNtZERhdGEpOwotCi0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBzZXRfY2FsbGJhY2tzKE9NWF9IQU5ETEVUWVBFICAgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgICAgYXBwRGF0YSk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBzZXRfY29uZmlnKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgIGNvbmZpZ0luZGV4LAotICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgIGNvbmZpZ0RhdGEpOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgc2V0X3BhcmFtZXRlcihPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFICBwYXJhbUluZGV4LAotICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgIHBhcmFtRGF0YSk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSB1c2VfYnVmZmVyKE9NWF9IQU5ETEVUWVBFICAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZHIsCi0gICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgIGJ5dGVzLAotICAgICAgICAgICAgICAgIE9NWF9VOCAgICAgICAgICAgICAgICpidWZmZXIpOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgIHVzZV9pbnB1dF9oZWFwX2J1ZmZlcnMoCi0gICAgICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIGJ1ZmZlckhkciwKLSAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgYnl0ZXMsCi0gICAgICAgICAgICAgICAgT01YX1U4KiAgICAgICAgICAgICAgICAgICBidWZmZXIpOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgdXNlX0VHTF9pbWFnZShPTVhfSEFORExFVFlQRSAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZHIsCi0gICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgIGVnbEltYWdlKTsKLSAgICAgICAgdm9pZCBjb21wbGV0ZV9wZW5kaW5nX2J1ZmZlcl9kb25lX2NicygpOwotICAgICAgICBzdHJ1Y3QgdmlkZW9fZHJpdmVyX2NvbnRleHQgZHJ2X2N0eDsKLSAgICAgICAgaW50IG1fcG9sbF9lZmQ7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgYWxsb2NhdGVfZXh0cmFkYXRhKCk7Ci0gICAgICAgIHZvaWQgZnJlZV9leHRyYWRhdGEoKTsKLSAgICAgICAgaW50IHVwZGF0ZV9yZXNvbHV0aW9uKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgaW50IHNjYW5fbGluZXMpOwotICAgICAgICBPTVhfRVJST1JUWVBFIGlzX3ZpZGVvX3Nlc3Npb25fc3VwcG9ydGVkKCk7Ci0gICAgICAgIFNpZ25hbCBzaWduYWw7Ci0gICAgICAgIHB0aHJlYWRfdCBtc2dfdGhyZWFkX2lkOwotICAgICAgICBwdGhyZWFkX3QgYXN5bmNfdGhyZWFkX2lkOwotICAgICAgICBib29sIGlzX2NvbXBvbmVudF9zZWN1cmUoKTsKLSAgICAgICAgdm9pZCBidWZfcmVmX2FkZChpbnQgblBvcnRJbmRleCk7Ci0gICAgICAgIHZvaWQgYnVmX3JlZl9yZW1vdmUoKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIGdldF9vbXhfb3V0cHV0X2J1ZmZlcl9oZWFkZXIoaW50IGluZGV4KTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBzZXRfZHBiKGJvb2wgaXNfc3BsaXRfbW9kZSwgaW50IGRwYl9jb2xvcl9mb3JtYXQpOwotICAgICAgICBPTVhfRVJST1JUWVBFIGRlY2lkZV9kcGJfYnVmZmVyX21vZGUoYm9vbCBzcGxpdF9vcGJfZHBiX3dpdGhfc2FtZV9jb2xvcl9mbXQpOwotICAgICAgICBpbnQgZHBiX2JpdF9kZXB0aDsKLSAgICAgICAgYm9vbCBhc3luY190aHJlYWRfZm9yY2Vfc3RvcDsKLSAgICAgICAgdm9sYXRpbGUgYm9vbCBtZXNzYWdlX3RocmVhZF9zdG9wOwotICAgICAgICBzdHJ1Y3QgZXh0cmFkYXRhX2luZm8gbV9leHRyYWRhdGFfaW5mbzsKLSAgICAgICAgaW50IG1fcHJvZ3Jlc3NpdmU7Ci0KLSAgICAgICAgZW51bSBkaXRoZXJfdHlwZSB7Ci0gICAgICAgICAgICBESVRIRVJfRElTQUJMRSA9IDAsCi0gICAgICAgICAgICBESVRIRVJfQ09MT1JTUEFDRV9FWENFUFRCVDIwMjAsCi0gICAgICAgICAgICBESVRIRVJfQUxMX0NPTE9SU1BBQ0UKLSAgICAgICAgfTsKLSAgICAgICAgZW51bSBkaXRoZXJfdHlwZSBtX2RpdGhlcl9jb25maWc7Ci0KLSAgICAgICAgZW51bSBjb2xvcl9zcGFjZV90eXBlIHsKLSAgICAgICAgICAgIEJUMjAyMCA9IDAsCi0gICAgICAgICAgICBFWENFUFRfQlQyMDIwLAotICAgICAgICAgICAgVU5LTk9XTgotICAgICAgICB9OwotICAgICAgICBlbnVtIGNvbG9yX3NwYWNlX3R5cGUgbV9jb2xvcl9zcGFjZTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIEJpdCBQb3NpdGlvbnMKLSAgICAgICAgZW51bSBmbGFnc19iaXRfcG9zaXRpb25zIHsKLSAgICAgICAgICAgIC8vIERlZmVyIHRyYW5zaXRpb24gdG8gSURMRQotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcgICAgICAgICAgICA9MHgxLAotICAgICAgICAgICAgLy8gRGVmZXIgdHJhbnNpdGlvbiB0byBMT0FESU5HCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0xPQURJTkdfUEVORElORyAgICAgICAgID0weDIsCi0gICAgICAgICAgICAvLyBGaXJzdCAgQnVmZmVyIFBlbmRpbmcKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfRklSU1RfQlVGRkVSX1BFTkRJTkcgICAgPTB4MywKLSAgICAgICAgICAgIC8vIFNlY29uZCBCdWZmZXIgUGVuZGluZwotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9TRUNPTkRfQlVGRkVSX1BFTkRJTkcgICA9MHg0LAotICAgICAgICAgICAgLy8gRGVmZXIgdHJhbnNpdGlvbiB0byBFbmFibGUKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfSU5QVVRfRU5BQkxFX1BFTkRJTkcgICAgPTB4NSwKLSAgICAgICAgICAgIC8vIERlZmVyIHRyYW5zaXRpb24gdG8gRW5hYmxlCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX09VVFBVVF9FTkFCTEVfUEVORElORyAgID0weDYsCi0gICAgICAgICAgICAvLyBEZWZlciB0cmFuc2l0aW9uIHRvIERpc2FibGUKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfSU5QVVRfRElTQUJMRV9QRU5ESU5HICAgPTB4NywKLSAgICAgICAgICAgIC8vIERlZmVyIHRyYW5zaXRpb24gdG8gRGlzYWJsZQotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9PVVRQVVRfRElTQUJMRV9QRU5ESU5HICA9MHg4LAotICAgICAgICAgICAgLy9kZWZlciBmbHVzaCBub3RpZmljYXRpb24KLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfT1VUUFVUX0ZMVVNIX1BFTkRJTkcgICAgPTB4OSwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfSU5QVVRfRkxVU0hfUEVORElORyAgICA9MHhBLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9QQVVTRV9QRU5ESU5HICAgICAgICAgID0weEIsCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0VYRUNVVEVfUEVORElORyAgICAgICAgPTB4QywKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfT1VUUFVUX0ZMVVNIX0lOX0RJU0FCTEVfUEVORElORyA9MHhELAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9ESVNBQkxFX09VVFBVVF9ERUZFUlJFRD0weEUsCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0ZMVVNIX0RFRkVSUkVEID0gMHhGCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gRGVmZXJyZWQgY2FsbGJhY2sgaWRlbnRpZmllcnMKLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICAvL0V2ZW50IENhbGxiYWNrcyBmcm9tIHRoZSB2ZGVjIGNvbXBvbmVudCB0aHJlYWQgY29udGV4dAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCAgICAgICA9IDB4MSwKLSAgICAgICAgICAgIC8vQnVmZmVyIERvbmUgY2FsbGJhY2tzIGZyb20gdGhlIHZkZWMgY29tcG9uZW50IHRocmVhZCBjb250ZXh0Ci0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0JVRkZFUl9ET05FID0gMHgyLAotICAgICAgICAgICAgLy9GcmFtZSBEb25lIGNhbGxiYWNrcyBmcm9tIHRoZSB2ZGVjIGNvbXBvbmVudCB0aHJlYWQgY29udGV4dAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GUkFNRV9ET05FICA9IDB4MywKLSAgICAgICAgICAgIC8vQnVmZmVyIERvbmUgY2FsbGJhY2tzIGZyb20gdGhlIHZkZWMgY29tcG9uZW50IHRocmVhZCBjb250ZXh0Ci0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZUQiAgICAgICAgID0gMHg0LAotICAgICAgICAgICAgLy9GcmFtZSBEb25lIGNhbGxiYWNrcyBmcm9tIHRoZSB2ZGVjIGNvbXBvbmVudCB0aHJlYWQgY29udGV4dAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVEIgICAgICAgICA9IDB4NSwKLSAgICAgICAgICAgIC8vQ29tbWFuZAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9DT01NQU5EICAgICA9IDB4NiwKLSAgICAgICAgICAgIC8vUHVzaC1QZW5kaW5nIEJ1ZmZlcnMKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfUFVTSF9QRU5ESU5HX0JVRlMgICAgPSAweDcsCi0gICAgICAgICAgICAvLyBFbXB0eSBCdWZmZXIgRG9uZSBjYWxsYmFja3MKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRUJEICAgICAgICAgPSAweDgsCi0gICAgICAgICAgICAvL0ZsdXNoIEV2ZW50IENhbGxiYWNrcyBmcm9tIHRoZSB2ZGVjIGNvbXBvbmVudCB0aHJlYWQgY29udGV4dAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVF9GTFVTSCAgICAgICA9IDB4OSwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlRfSU5QVVRfRkxVU0ggPSAweDBBLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVF9PVVRQVVRfRkxVU0ggPSAweDBCLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GQkQgPSAweGMsCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1NUQVJUX0RPTkUgPSAweEQsCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1BBVVNFX0RPTkUgPSAweEUsCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1JFU1VNRV9ET05FID0gMHhGLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9TVE9QX0RPTkUgPSAweDEwLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9IQVJEV0FSRV9FUlJPUiA9IDB4MTEsCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQl9BUkJJVFJBUlkgPSAweDEyLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9QT1JUX1JFQ09ORklHID0gMHgxMywKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRU9TX0RPTkUgPSAweDE0LAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9JTkZPX1BPUlRfUkVDT05GSUcgPSAweDE1LAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9JTkZPX0ZJRUxEX0RST1BQRUQgPSAweDE2LAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9VTlNVUFBPUlRFRF9TRVRUSU5HID0gMHgxNywKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfSEFSRFdBUkVfT1ZFUkxPQUQgPSAweDE4LAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9DTE9TRV9NU0cgPSAweDE5Ci0gICAgICAgIH07Ci0KLSAgICAgICAgZW51bSB2YzFfcHJvZmlsZV90eXBlIHsKLSAgICAgICAgICAgIFZDMV9TUF9NUF9SQ1YgPSAxLAotICAgICAgICAgICAgVkMxX0FQID0gMgotICAgICAgICB9OwotCi0gICAgICAgIGVudW0gdjRsMl9wb3J0cyB7Ci0gICAgICAgICAgICBDQVBUVVJFX1BPUlQsCi0gICAgICAgICAgICBPVVRQVVRfUE9SVCwKLSAgICAgICAgICAgIE1BWF9QT1JUCi0gICAgICAgIH07Ci0KLSAgICAgICAgc3RydWN0IG9teF9ldmVudCB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBhcmFtMTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcGFyYW0yOwotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpZDsKLSAgICAgICAgfTsKLQotICAgICAgICBzdHJ1Y3Qgb214X2NtZF9xdWV1ZSB7Ci0gICAgICAgICAgICBvbXhfZXZlbnQgbV9xW09NWF9DT1JFX0NPTlRST0xfQ01EUV9TSVpFXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbV9yZWFkOwotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBtX3dyaXRlOwotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBtX3NpemU7Ci0KLSAgICAgICAgICAgIG9teF9jbWRfcXVldWUoKTsKLSAgICAgICAgICAgIH5vbXhfY21kX3F1ZXVlKCk7Ci0gICAgICAgICAgICBib29sIGluc2VydF9lbnRyeSh1bnNpZ25lZCBsb25nIHAxLCB1bnNpZ25lZCBsb25nIHAyLCB1bnNpZ25lZCBsb25nIGlkKTsKLSAgICAgICAgICAgIGJvb2wgcG9wX2VudHJ5KHVuc2lnbmVkIGxvbmcgKnAxLHVuc2lnbmVkIGxvbmcgKnAyLCB1bnNpZ25lZCBsb25nICppZCk7Ci0gICAgICAgICAgICAvLyBnZXQgbXNndHlwZSBvZiB0aGUgZmlyc3QgZWxlIGZyb20gdGhlIHF1ZXVlCi0gICAgICAgICAgICB1bnNpZ25lZCBnZXRfcV9tc2dfdHlwZSgpOwotCi0gICAgICAgIH07Ci0gICAgICAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgY2FwOwotI2lmZGVmIF9BTkRST0lEXwotICAgICAgICBzdHJ1Y3QgdHNfZW50cnkgewotICAgICAgICAgICAgT01YX1RJQ0tTIHRpbWVzdGFtcDsKLSAgICAgICAgICAgIGJvb2wgdmFsaWQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RydWN0IHRzX2Fycl9saXN0IHsKLSAgICAgICAgICAgIHRzX2VudHJ5IG1fdHNfYXJyX2xpc3RbTUFYX05VTV9JTlBVVF9PVVRQVVRfQlVGRkVSU107Ci0KLSAgICAgICAgICAgIHRzX2Fycl9saXN0KCk7Ci0gICAgICAgICAgICB+dHNfYXJyX2xpc3QoKTsKLQotICAgICAgICAgICAgYm9vbCBpbnNlcnRfdHMoT01YX1RJQ0tTIHRzKTsKLSAgICAgICAgICAgIGJvb2wgcG9wX21pbl90cyhPTVhfVElDS1MgJnRzKTsKLSAgICAgICAgICAgIGJvb2wgcmVzZXRfdHNfbGlzdCgpOwotICAgICAgICB9OwotI2VuZGlmCi0KLSAgICAgICAgc3RydWN0IGRlc2NfYnVmZmVyX2hkciB7Ci0gICAgICAgICAgICBPTVhfVTggKmJ1Zl9hZGRyOwotICAgICAgICAgICAgT01YX1UzMiBkZXNjX2RhdGFfc2l6ZTsKLSAgICAgICAgfTsKLSAgICAgICAgYm9vbCBhbGxvY2F0ZV9kb25lKHZvaWQpOwotICAgICAgICBib29sIGFsbG9jYXRlX2lucHV0X2RvbmUodm9pZCk7Ci0gICAgICAgIGJvb2wgYWxsb2NhdGVfb3V0cHV0X2RvbmUodm9pZCk7Ci0gICAgICAgIGJvb2wgYWxsb2NhdGVfb3V0cHV0X2V4dHJhZGF0YV9kb25lKHZvaWQpOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgZnJlZV9pbnB1dF9idWZmZXIoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlckhkcik7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgZnJlZV9pbnB1dF9idWZmZXIodW5zaWduZWQgaW50IGJ1ZmZlcmluZGV4LAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwbWVtX2J1ZmZlckhkcik7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgZnJlZV9vdXRwdXRfYnVmZmVyKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXJIZHIpOwotICAgICAgICB2b2lkIGZyZWVfb3V0cHV0X2J1ZmZlcl9oZWFkZXIoKTsKLSAgICAgICAgdm9pZCBmcmVlX2lucHV0X2J1ZmZlcl9oZWFkZXIoKTsKLSAgICAgICAgdm9pZCBmcmVlX291dHB1dF9leHRyYWRhdGFfYnVmZmVyX2hlYWRlcigpOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgYWxsb2NhdGVfaW5wdXRfaGVhcF9idWZmZXIoT01YX0hBTkRMRVRZUEUgICAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZHIsCi0gICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgIGJ5dGVzKTsKLQotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgYWxsb2NhdGVfaW5wdXRfYnVmZmVyKE9NWF9IQU5ETEVUWVBFICAgICAgIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVySGRyLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICBieXRlcyk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBhbGxvY2F0ZV9vdXRwdXRfYnVmZmVyKE9NWF9IQU5ETEVUWVBFICAgICAgIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVySGRyLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgcG9ydCxPTVhfUFRSIGFwcERhdGEsCi0gICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgYnl0ZXMpOwotICAgICAgICBPTVhfRVJST1JUWVBFIHVzZV9vdXRwdXRfYnVmZmVyKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAgKipidWZmZXJIZHIsCi0gICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGJ5dGVzLAotICAgICAgICAgICAgICAgIE9NWF9VOCAgICAgICAgICAgICAgICAgKmJ1ZmZlcik7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgdXNlX2NsaWVudF9vdXRwdXRfZXh0cmFkYXRhX2J1ZmZlcihPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgICoqYnVmZmVySGRyLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICBieXRlcywKLSAgICAgICAgICAgICAgICBPTVhfVTggICAgICAgICAgICAgICAgICpidWZmZXIpOwotICAgICAgICBPTVhfRVJST1JUWVBFIGdldF9zdXBwb3J0ZWRfcHJvZmlsZV9sZXZlbChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcHJvZmlsZUxldmVsVHlwZSk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBhbGxvY2F0ZV9kZXNjX2J1ZmZlcihPTVhfVTMyIGluZGV4KTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBhbGxvY2F0ZV9vdXRwdXRfaGVhZGVycygpOwotICAgICAgICBPTVhfRVJST1JUWVBFIGFsbG9jYXRlX2NsaWVudF9vdXRwdXRfZXh0cmFkYXRhX2hlYWRlcnMoKTsKLSAgICAgICAgYm9vbCBleGVjdXRlX29teF9mbHVzaChPTVhfVTMyKTsKLSAgICAgICAgYm9vbCBleGVjdXRlX291dHB1dF9mbHVzaCgpOwotICAgICAgICBib29sIGV4ZWN1dGVfaW5wdXRfZmx1c2goKTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBlbXB0eV9idWZmZXJfZG9uZShPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqIGJ1ZmZlcik7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBmaWxsX2J1ZmZlcl9kb25lKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICogYnVmZmVyKTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBlbXB0eV90aGlzX2J1ZmZlcl9wcm94eShPTVhfSEFORExFVFlQRSAgICAgICBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKTsKLQotICAgICAgICBPTVhfRVJST1JUWVBFIGZpbGxfdGhpc19idWZmZXJfcHJveHkoT01YX0hBTkRMRVRZUEUgICAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcik7Ci0gICAgICAgIGJvb2wgcmVsZWFzZV9kb25lKCk7Ci0KLSAgICAgICAgYm9vbCByZWxlYXNlX291dHB1dF9kb25lKCk7Ci0gICAgICAgIGJvb2wgcmVsZWFzZV9pbnB1dF9kb25lKCk7Ci0gICAgICAgIGJvb2wgcmVsZWFzZV9vdXRwdXRfZXh0cmFkYXRhX2RvbmUoKTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBnZXRfYnVmZmVyX3JlcSh2ZGVjX2FsbG9jYXRvcnByb3BlcnR5ICpidWZmZXJfcHJvcCk7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgc2V0X2J1ZmZlcl9yZXEodmRlY19hbGxvY2F0b3Jwcm9wZXJ0eSAqYnVmZmVyX3Byb3ApOwotICAgICAgICBPTVhfRVJST1JUWVBFIHN0YXJ0X3BvcnRfcmVjb25maWcoKTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSB1cGRhdGVfcGljdHVyZV9yZXNvbHV0aW9uKCk7Ci0gICAgICAgIGludCBzdHJlYW1fb2ZmKE9NWF9VMzIgcG9ydCk7Ci0gICAgICAgIHZvaWQgYWRqdXN0X3RpbWVzdGFtcChPTVhfUzY0ICZhY3RfdGltZXN0YW1wKTsKLSAgICAgICAgdm9pZCBzZXRfZnJhbWVfcmF0ZShPTVhfUzY0IGFjdF90aW1lc3RhbXApOwotICAgICAgICB2b2lkIGhhbmRsZV9leHRyYWRhdGFfc2VjdXJlKE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1Zl9oZHIpOwotICAgICAgICB2b2lkIGhhbmRsZV9leHRyYWRhdGEoT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmX2hkcik7Ci0gICAgICAgIHZvaWQgY29udmVydF9jb2xvcl9zcGFjZV9pbmZvKE9NWF9VMzIgcHJpbWFyaWVzLCBPTVhfVTMyIHJhbmdlLAotICAgICAgICAgICAgT01YX1UzMiB0cmFuc2ZlciwgT01YX1UzMiBtYXRyaXgsIENvbG9yU3BhY2VfdCAqY29sb3Jfc3BhY2UsCi0gICAgICAgICAgICBDb2xvckFzcGVjdHMgKmFzcGVjdHMpOwotICAgICAgICBib29sIGhhbmRsZV9jb2xvcl9zcGFjZV9pbmZvKHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZV90ICpjb2xvcl9zcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvck1ldGFEYXRhKiBjb2xvcl9tZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBzZXRfY29sb3JfYXNwZWN0c19vbmx5KTsKLSAgICAgICAgdm9pZCBzZXRfY29sb3JzcGFjZV9pbl9oYW5kbGUoQ29sb3JTcGFjZV90IGNvbG9yLCB1bnNpZ25lZCBpbnQgYnVmX2luZGV4KTsKLSAgICAgICAgdm9pZCBwcmludF9kZWJ1Z19jb2xvcl9hc3BlY3RzKENvbG9yQXNwZWN0cyAqYXNwZWN0cywgY29uc3QgY2hhciAqcHJlZml4KTsKLSAgICAgICAgdm9pZCBwcmludF9kZWJ1Z19oZHJfY29sb3JfaW5mbyhIRFJTdGF0aWNJbmZvICpoZHJfaW5mbywgY29uc3QgY2hhciAqcHJlZml4KTsKLSAgICAgICAgdm9pZCBwcmludF9kZWJ1Z19oZHJfY29sb3JfaW5mb19tZGF0YShDb2xvck1ldGFEYXRhKiBjb2xvcl9tZGF0YSk7Ci0gICAgICAgIGJvb2wgaGFuZGxlX2NvbnRlbnRfbGlnaHRfbGV2ZWxfaW5mbyh2b2lkKiBkYXRhLCBDb250ZW50TGlnaHRMZXZlbCogbGlnaHRfbGV2ZWxfbWRhdGEpOwotICAgICAgICBib29sIGhhbmRsZV9tYXN0ZXJpbmdfZGlzcGxheV9jb2xvcl9pbmZvKHZvaWQqIGRhdGEsIE1hc3RlcmluZ0Rpc3BsYXkqIG1hc3RlcmluZ19kaXNwbGF5X21kYXRhKTsKLSAgICAgICAgdm9pZCBwcmludF9kZWJ1Z19leHRyYWRhdGEoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKmV4dHJhKTsKLSAgICAgICAgdm9pZCBzZXRfY29sb3JtZXRhZGF0YV9pbl9oYW5kbGUoQ29sb3JNZXRhRGF0YSAqY29sb3JfbWRhdGEsIHVuc2lnbmVkIGludCBidWZfaW5kZXgpOwotICAgICAgICB2b2lkIHByZXBhcmVfY29sb3JfYXNwZWN0c19tZXRhZGF0YShPTVhfVTMyIHByaW1hcmllcywgT01YX1UzMiByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiB0cmFuc2ZlciwgT01YX1UzMiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yTWV0YURhdGEgKmNvbG9yX21kYXRhKTsKLSAgICAgICAgdm9pZCBhcHBlbmRfaW50ZXJsYWNlX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEsCi0gICAgICAgICAgICAgICAgT01YX1UzMiBpbnRlcmxhY2VkX2Zvcm1hdF90eXBlKTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBlbmFibGVfZXh0cmFkYXRhKE9NWF9VNjQgcmVxdWVzdGVkX2V4dHJhZGF0YSwgYm9vbCBpc19pbnRlcm5hbCwKLSAgICAgICAgICAgICAgICBib29sIGVuYWJsZSA9IHRydWUpOwotICAgICAgICB2b2lkIGFwcGVuZF9mcmFtZV9pbmZvX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEsCi0gICAgICAgICAgICAgICAgT01YX1UzMiBudW1fY29uY2VhbF9tYiwKLSAgICAgICAgICAgICAgICBPTVhfVTMyIHJlY292ZXJ5X3NlaV9mbGFnLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgcGljdHVyZV90eXBlLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgZnJhbWVfcmF0ZSwKLSAgICAgICAgICAgICAgICBPTVhfVElDS1MgdGltZV9zdGFtcCwKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgbXNtX3ZpZGNfcGFuc2Nhbl93aW5kb3dfcGF5bG9hZCAqcGFuc2Nhbl9wYXlsb2FkLAotICAgICAgICAgICAgICAgIHN0cnVjdCB2ZGVjX2FzcGVjdHJhdGlvaW5mbyAqYXNwZWN0X3JhdGlvX2luZm8pOwotICAgICAgICB2b2lkIGFwcGVuZF9mcmFtZV9pbmZvX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEsCi0gICAgICAgICAgICAgICAgT01YX1UzMiBudW1fY29uY2VhbF9tYiwKLSAgICAgICAgICAgICAgICBPTVhfVTMyIHJlY292ZXJ5X3NlaV9mbGFnLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgcGljdHVyZV90eXBlLAotICAgICAgICAgICAgICAgIE9NWF9TNjQgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgZnJhbWVfcmF0ZSwKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdmRlY19hc3BlY3RyYXRpb2luZm8gKmFzcGVjdF9yYXRpb19pbmZvKTsKLSAgICAgICAgdm9pZCBmaWxsX2FzcGVjdF9yYXRpb19pbmZvKHN0cnVjdCB2ZGVjX2FzcGVjdHJhdGlvaW5mbyAqYXNwZWN0X3JhdGlvX2luZm8sCi0gICAgICAgICAgICAgICAgT01YX1FDT01fRVhUUkFEQVRBX0ZSQU1FSU5GTyAqZnJhbWVfaW5mbyk7Ci0gICAgICAgIHZvaWQgYXBwZW5kX3Rlcm1pbmF0b3JfZXh0cmFkYXRhKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpleHRyYSk7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgdXBkYXRlX3BvcnRkZWYoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcG9ydERlZm4pOwotICAgICAgICB2b2lkIGFwcGVuZF9wb3J0ZGVmX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEpOwotICAgICAgICB2b2lkIGFwcGVuZF9mcmFtZV9kaW1lbnNpb25fZXh0cmFkYXRhKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpleHRyYSk7Ci0gICAgICAgIHZvaWQgYXBwZW5kX2V4dG5fZXh0cmFkYXRhKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpleHRyYSwgT01YX09USEVSX0VYVFJBREFUQVRZUEUgKnBfZXh0bik7Ci0gICAgICAgIHZvaWQgYXBwZW5kX3VzZXJfZXh0cmFkYXRhKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpleHRyYSwgT01YX09USEVSX0VYVFJBREFUQVRZUEUgKnBfdXNlcik7Ci0gICAgICAgIHZvaWQgYXBwZW5kX2NvbmNlYWxtYl9leHRyYWRhdGEoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKmV4dHJhLAotICAgICAgICAgICAgICAgIE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpwX2NvbmNlYWxtYiwgT01YX1U4ICpjb25jZWFsX21iX2RhdGEpOwotICAgICAgICB2b2lkIGFwcGVuZF9vdXRwdXRjcm9wX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEsCi0gICAgICAgICAgICAgICAgc3RydWN0IG1zbV92aWRjX291dHB1dF9jcm9wX3BheWxvYWQgKm91dHB1dF9jcm9wX3BheWxvYWQpOwotICAgICAgICB2b2lkIGFwcGVuZF9mcmFtZXBhY2tfZXh0cmFkYXRhKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpleHRyYSwKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgbXNtX3ZpZGNfczNkX2ZyYW1lX3BhY2tpbmdfcGF5bG9hZCAqczNkX2ZyYW1lX3BhY2tpbmdfcGF5bG9hZCk7Ci0gICAgICAgIHZvaWQgYXBwZW5kX3FwX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEsCi0gICAgICAgICAgICAgICAgc3RydWN0IG1zbV92aWRjX2ZyYW1lX3FwX3BheWxvYWQgKnFwX3BheWxvYWQpOwotICAgICAgICB2b2lkIGFwcGVuZF9iaXRzaW5mb19leHRyYWRhdGEoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKmV4dHJhLAotICAgICAgICAgICAgICAgIHN0cnVjdCBtc21fdmlkY19mcmFtZV9iaXRzX2luZm9fcGF5bG9hZCAqYml0c19wYXlsb2FkKTsKLSAgICAgICAgdm9pZCBhcHBlbmRfdnF6aXBfZXh0cmFkYXRhKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpleHRyYSwKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgbXNtX3ZpZGNfdnF6aXBfc2VpX3BheWxvYWQgKnZxemlwX3BheWxvYWQpOwotICAgICAgICB2b2lkIGluc2VydF9kZW11eF9hZGRyX29mZnNldChPTVhfVTMyIGFkZHJlc3Nfb2Zmc2V0KTsKLSAgICAgICAgdm9pZCBleHRyYWN0X2RlbXV4X2FkZHJfb2Zmc2V0cyhPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmX2hkcik7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgaGFuZGxlX2RlbXV4X2RhdGEoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1Zl9oZHIpOwotICAgICAgICBPTVhfVTMyIGNvdW50X01CX2luX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEpOwotCi0gICAgICAgIGJvb2wgYWxpZ25fcG1lbV9idWZmZXJzKGludCBwbWVtX2ZkLCBPTVhfVTMyIGJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgYWxpZ25tZW50KTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgIGludCBhbGxvY19tYXBfaW9uX21lbW9yeShPTVhfVTMyIGJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgYWxpZ25tZW50LCBzdHJ1Y3QgaW9uX2FsbG9jYXRpb25fZGF0YSAqYWxsb2NfZGF0YSwKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgaW9uX2ZkX2RhdGEgKmZkX2RhdGEsaW50IGZsYWcpOwotICAgICAgICB2b2lkIGZyZWVfaW9uX21lbW9yeShzdHJ1Y3QgdmRlY19pb24gKmJ1Zl9pb25faW5mbyk7Ci0jZW5kaWYKLQotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgc2VuZF9jb21tYW5kX3Byb3h5KE9NWF9IQU5ETEVUWVBFICBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICBwYXJhbTEsCi0gICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgIGNtZERhdGEpOwotICAgICAgICBib29sIHBvc3RfZXZlbnQoIHVuc2lnbmVkIGxvbmcgcDEsCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBwMiwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGlkCi0gICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgaW5saW5lIGludCBjbGlwMihpbnQgeCkgewotICAgICAgICAgICAgeCA9IHggLTE7Ci0gICAgICAgICAgICB4ID0geCB8IHggPj4gMTsKLSAgICAgICAgICAgIHggPSB4IHwgeCA+PiAyOwotICAgICAgICAgICAgeCA9IHggfCB4ID4+IDQ7Ci0gICAgICAgICAgICB4ID0geCB8IHggPj4gMTY7Ci0gICAgICAgICAgICB4ID0geCArIDE7Ci0gICAgICAgICAgICByZXR1cm4geDsKLSAgICAgICAgfQotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgdmRlY19hbGxvY19oMjY0X212KCk7Ci0gICAgICAgIHZvaWQgdmRlY19kZWFsbG9jX2gyNjRfbXYoKTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSB2ZGVjX2FsbG9jX21ldGFfYnVmZmVycygpOwotICAgICAgICB2b2lkIHZkZWNfZGVhbGxvY19tZXRhX2J1ZmZlcnMoKTsKLQotICAgICAgICBpbmxpbmUgdm9pZCBvbXhfcmVwb3J0X2Vycm9yICgpIHsKLSAgICAgICAgICAgIGlmIChtX2NiLkV2ZW50SGFuZGxlciAmJiAhbV9lcnJvcl9wcm9wb2dhdGVkICYmIG1fc3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZW5kaW5nIE9NWF9FcnJvckhhcmR3YXJlIHRvIENsaWVudCIpOwotICAgICAgICAgICAgICAgIG1fZXJyb3JfcHJvcG9nYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbV9jYi5FdmVudEhhbmRsZXIoJm1fY21wLG1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JIYXJkd2FyZSwwLE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIHZvaWQgb214X3JlcG9ydF91bnN1cHBvcnRlZF9zZXR0aW5nICgpIHsKLSAgICAgICAgICAgIGlmIChtX2NiLkV2ZW50SGFuZGxlciAmJiAhbV9lcnJvcl9wcm9wb2dhdGVkICYmIG1fc3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRVJST1I6IFNlbmRpbmcgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nIHRvIENsaWVudCIpOwotICAgICAgICAgICAgICAgIG1fZXJyb3JfcHJvcG9nYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbV9jYi5FdmVudEhhbmRsZXIoJm1fY21wLCBtX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgMCwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5saW5lIHZvaWQgb214X3JlcG9ydF9od19vdmVybG9hZCAoKSB7Ci0gICAgICAgICAgICBpZiAobV9jYi5FdmVudEhhbmRsZXIgJiYgIW1fZXJyb3JfcHJvcG9nYXRlZCAmJiBtX3N0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKAotICAgICAgICAgICAgICAgICAgICAgICAgIkVSUk9SOiBTZW5kaW5nIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcyB0byBDbGllbnQiKTsKLSAgICAgICAgICAgICAgICBtX2Vycm9yX3Byb3BvZ2F0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1fY2IuRXZlbnRIYW5kbGVyKCZtX2NtcCwgbV9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXMsIDAsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSNpZiBkZWZpbmVkIChfQU5EUk9JRF9IT05FWUNPTUJfKSB8fCBkZWZpbmVkIChfQU5EUk9JRF9JQ1NfKQotICAgICAgICBPTVhfRVJST1JUWVBFIHVzZV9hbmRyb2lkX25hdGl2ZV9idWZmZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wLCBPTVhfUFRSIGRhdGEpOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoX0FORFJPSURfSUNTXykKLSAgICAgICAgc3RydWN0IG5hdGl2ZWJ1ZmZlciB7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKm5hdGl2ZWhhbmRsZTsKLSAgICAgICAgICAgIHByaXZhdGVfaGFuZGxlX3QgKnByaXZhdGVoYW5kbGU7Ci0gICAgICAgICAgICBpbnQgaW51c2U7Ci0gICAgICAgIH07Ci0gICAgICAgIG5hdGl2ZWJ1ZmZlciBuYXRpdmVfYnVmZmVyW01BWF9OVU1fSU5QVVRfT1VUUFVUX0JVRkZFUlNdOwotI2VuZGlmCi0KLSAgICAgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIC8vKioqKioqKioqKioqKioqKioqKk1FTUJFUiBWQVJJQUJMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgcHRocmVhZF9tdXRleF90ICAgICAgIG1fbG9jazsKLSAgICAgICAgcHRocmVhZF9tdXRleF90ICAgICAgIGNfbG9jazsKLSAgICAgICAgcHRocmVhZF9tdXRleF90ICAgICAgIGJ1Zl9sb2NrOwotICAgICAgICAvL3NlbSB0byBoYW5kbGUgdGhlIG1pbmltdW0gcHJvY2VzaW5nIG9mIGNvbW1hbmRzCi0gICAgICAgIHNlbV90ICAgICAgICAgICAgICAgICBtX2NtZF9sb2NrOwotICAgICAgICBzZW1fdCAgICAgICAgICAgICAgICAgbV9zYWZlX2ZsdXNoOwotICAgICAgICBib29sICAgICAgICAgICAgICBtX2Vycm9yX3Byb3BvZ2F0ZWQ7Ci0gICAgICAgIC8vIGNvbXByZXNzaW9uIGZvcm1hdAotICAgICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7Ci0gICAgICAgIC8vIE9NWCBTdGF0ZQotICAgICAgICBPTVhfU1RBVEVUWVBFIG1fc3RhdGU7Ci0gICAgICAgIC8vIEFwcGxpY2F0aW9uIGRhdGEKLSAgICAgICAgT01YX1BUUiBtX2FwcF9kYXRhOwotICAgICAgICAvLyBBcHBsaWNhdGlvbiBjYWxsYmFja3MKLSAgICAgICAgT01YX0NBTExCQUNLVFlQRSBtX2NiOwotICAgICAgICBPTVhfUFJJT1JJVFlNR01UVFlQRSBtX3ByaW9yaXR5X21nbSA7Ci0gICAgICAgIE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgbV9idWZmZXJfc3VwcGxpZXI7Ci0gICAgICAgIC8vIGZpbGwgdGhpcyBidWZmZXIgcXVldWUKLSAgICAgICAgb214X2NtZF9xdWV1ZSAgICAgICAgIG1fZnRiX3E7Ci0gICAgICAgIC8vIENvbW1hbmQgUSBmb3IgcmVzdCBvZiB0aGUgZXZlbnRzCi0gICAgICAgIG9teF9jbWRfcXVldWUgICAgICAgICBtX2NtZF9xOwotICAgICAgICBvbXhfY21kX3F1ZXVlICAgICAgICAgbV9ldGJfcTsKLSAgICAgICAgLy8gSW5wdXQgbWVtb3J5IHBvaW50ZXIKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICptX2lucF9tZW1fcHRyOwotICAgICAgICAvLyBPdXRwdXQgbWVtb3J5IHBvaW50ZXIKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICptX291dF9tZW1fcHRyOwotICAgICAgICAvLyBDbGllbnQgZXh0cmFkYXRhIG1lbW9yeSBwb2ludGVyCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqbV9jbGllbnRfb3V0cHV0X2V4dHJhZGF0YV9tZW1fcHRyOwotICAgICAgICAvLyBudW1iZXIgb2YgaW5wdXQgYml0c3RyZWFtIGVycm9yIGZyYW1lIGNvdW50Ci0gICAgICAgIHVuc2lnbmVkIGludCBtX2lucF9lcnJfY291bnQ7Ci0jaWZkZWYgX0FORFJPSURfCi0gICAgICAgIC8vIFRpbWVzdGFtcCBsaXN0Ci0gICAgICAgIHRzX2Fycl9saXN0ICAgICAgICAgICBtX3RpbWVzdGFtcF9saXN0OwotI2VuZGlmCi0KLSAgICAgICAgYm9vbCBpbnB1dF9mbHVzaF9wcm9ncmVzczsKLSAgICAgICAgYm9vbCBvdXRwdXRfZmx1c2hfcHJvZ3Jlc3M7Ci0gICAgICAgIGJvb2wgaW5wdXRfdXNlX2J1ZmZlcjsKLSAgICAgICAgYm9vbCBvdXRwdXRfdXNlX2J1ZmZlcjsKLSAgICAgICAgYm9vbCBvdXB1dF9lZ2xfYnVmZmVyczsKLSAgICAgICAgT01YX0JPT0wgbV91c2Vfb3V0cHV0X3BtZW07Ci0gICAgICAgIE9NWF9CT09MIG1fb3V0X21lbV9yZWdpb25fc21pOwotICAgICAgICBPTVhfQk9PTCBtX291dF9wdnRfZW50cnlfcG1lbTsKLQotICAgICAgICBpbnQgcGVuZGluZ19pbnB1dF9idWZmZXJzOwotICAgICAgICBpbnQgcGVuZGluZ19vdXRwdXRfYnVmZmVyczsKLSAgICAgICAgLy8gYml0bWFzayBhcnJheSBzaXplIGZvciBvdXRwdXQgc2lkZQotICAgICAgICB1aW50NjRfdCBtX291dF9ibV9jb3VudDsKLSAgICAgICAgLy8gYml0bWFzayBhcnJheSBzaXplIGZvciBpbnB1dCBzaWRlCi0gICAgICAgIHVpbnQ2NF90IG1faW5wX2JtX2NvdW50OwotICAgICAgICAvLyBiaXRtYXNrIGFycmF5IHNpemUgZm9yIGV4dHJhZGF0YQotICAgICAgICB1aW50NjRfdCBtX291dF9leHRyYWRhdGFfYm1fY291bnQ7Ci0gICAgICAgIC8vSW5wdXQgcG9ydCBQb3B1bGF0ZWQKLSAgICAgICAgT01YX0JPT0wgbV9pbnBfYlBvcHVsYXRlZDsKLSAgICAgICAgLy9PdXRwdXQgcG9ydCBQb3B1bGF0ZWQKLSAgICAgICAgT01YX0JPT0wgbV9vdXRfYlBvcHVsYXRlZDsKLSAgICAgICAgLy8gZW5jYXBzdWxhdGUgdGhlIHdhaXRpbmcgc3RhdGVzLgotICAgICAgICB1aW50NjRfdCBtX2ZsYWdzOwotCi0gICAgICAgIC8vIHN0b3JlIEkvUCBQT1JUIHN0YXRlCi0gICAgICAgIE9NWF9CT09MIG1faW5wX2JFbmFibGVkOwotICAgICAgICAvLyBzdG9yZSBPL1AgUE9SVCBzdGF0ZQotICAgICAgICBPTVhfQk9PTCBtX291dF9iRW5hYmxlZDsKLSAgICAgICAgT01YX1UzMiBtX2luX2FsbG9jX2NudDsKLSAgICAgICAgT01YX1U4ICAgICAgICAgICAgICAgIG1fY1JvbGVbT01YX01BWF9TVFJJTkdOQU1FX1NJWkVdOwotICAgICAgICAvLyBQbGF0Zm9ybSBzcGVjaWZpYyBkZXRhaWxzCi0gICAgICAgIE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfTElTVCAgICAgICptX3BsYXRmb3JtX2xpc3Q7Ci0gICAgICAgIE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfRU5UUlkgICAgICptX3BsYXRmb3JtX2VudHJ5OwotICAgICAgICBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU1fSU5GTyAqbV9wbWVtX2luZm87Ci0gICAgICAgIC8vIFNQUytQUFMgc2VudCBhcyBwYXJ0IG9mIHNldF9jb25maWcKLSAgICAgICAgT01YX1ZFTkRPUl9FWFRSQURBVEFUWVBFICAgICAgICAgICAgbV92ZW5kb3JfY29uZmlnOwotCi0gICAgICAgIC8qVmFyaWFibGVzIGZvciBhcmJpdHJhcnkgQnl0ZSBwYXJzaW5nIHN1cHBvcnQqLwotCi0gICAgICAgIG9teF9jbWRfcXVldWUgbV9pbnB1dF9wZW5kaW5nX3E7Ci0gICAgICAgIG9teF9jbWRfcXVldWUgbV9pbnB1dF9mcmVlX3E7Ci0gICAgICAgIGJvb2wgYXJiaXRyYXJ5X2J5dGVzOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgaDI2NF9zY3JhdGNoOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKnBzb3VyY2VfZnJhbWU7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqcGRlc3RfZnJhbWU7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqbV9pbnBfaGVhcF9wdHI7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqKm1fcGhkcl9wbWVtX3B0cjsKLSAgICAgICAgdW5zaWduZWQgaW50IG1faGVhcF9pbnBfYm1fY291bnQ7Ci0gICAgICAgIGJvb2wgZmlyc3RfZnJhbWVfbWV0YTsKLSAgICAgICAgdW5zaWduZWQgZnJhbWVfY291bnQ7Ci0gICAgICAgIHVuc2lnbmVkIG5hbF9jb3VudDsKLSAgICAgICAgdW5zaWduZWQgbmFsX2xlbmd0aDsKLSAgICAgICAgYm9vbCBsb29rX2FoZWFkX25hbDsKLSAgICAgICAgaW50IGZpcnN0X2ZyYW1lOwotICAgICAgICB1bnNpZ25lZCBjaGFyICpmaXJzdF9idWZmZXI7Ci0gICAgICAgIGludCBmaXJzdF9mcmFtZV9zaXplOwotICAgICAgICB1bnNpZ25lZCBjaGFyIG1faHdkZXZpY2VfbmFtZVs4MF07Ci0gICAgICAgIEZJTEUgKm1fZGV2aWNlX2ZpbGVfcHRyOwotICAgICAgICBlbnVtIHZjMV9wcm9maWxlX3R5cGUgbV92YzFfcHJvZmlsZTsKLSAgICAgICAgT01YX1M2NCBoMjY0X2xhc3RfYXVfdHM7Ci0gICAgICAgIE9NWF9VMzIgaDI2NF9sYXN0X2F1X2ZsYWdzOwotICAgICAgICBPTVhfVTMyIG1fZGVtdXhfb2Zmc2V0c1s4MTkyXTsKLSAgICAgICAgT01YX1UzMiBtX2RlbXV4X2VudHJpZXM7Ci0gICAgICAgIE9NWF9VMzIgbV9kaXNwX2hvcl9zaXplOwotICAgICAgICBPTVhfVTMyIG1fZGlzcF92ZXJ0X3NpemU7Ci0gICAgICAgIE9NWF9TNjQgcHJldl90czsKLSAgICAgICAgT01YX1M2NCBwcmV2X3RzX2FjdHVhbDsKLSAgICAgICAgYm9vbCByc3RfcHJldl90czsKLSAgICAgICAgT01YX1UzMiBmcm1faW50OwotICAgICAgICBPTVhfVTMyIG1fZnBzX3JlY2VpdmVkOwotICAgICAgICBmbG9hdCAgIG1fZnBzX3ByZXY7Ci0gICAgICAgIGJvb2wgbV9kcmNfZW5hYmxlOwotCi0gICAgICAgIHN0cnVjdCB2ZGVjX2FsbG9jYXRvcnByb3BlcnR5IG9wX2J1Zl9yY25mZzsKLSAgICAgICAgYm9vbCBpbl9yZWNvbmZpZzsKLSAgICAgICAgT01YX05BVElWRV9XSU5ET1dUWVBFIG1fZGlzcGxheV9pZDsKLSAgICAgICAgT01YX1UzMiBjbGllbnRfZXh0cmFkYXRhOwotI2lmZGVmIF9BTkRST0lEXwotICAgICAgICBib29sIG1fZGVidWdfdGltZXN0YW1wOwotICAgICAgICBib29sIHBlcmZfZmxhZzsKLSAgICAgICAgT01YX1UzMiBwcm9jX2ZybXMsIGxhdGVuY3k7Ci0gICAgICAgIHBlcmZfbWV0cmljcyBmcHNfbWV0cmljczsKLSAgICAgICAgcGVyZl9tZXRyaWNzIGRlY190aW1lOwotICAgICAgICBib29sIG1fcmVqZWN0X2F2Y18xMDgwcF9tcDsKLSAgICAgICAgYm9vbCBtX2VuYWJsZV9hbmRyb2lkX25hdGl2ZV9idWZmZXJzOwotICAgICAgICBib29sIG1fdXNlX2FuZHJvaWRfbmF0aXZlX2J1ZmZlcnM7Ci0gICAgICAgIGJvb2wgbV9kZWJ1Z19leHRyYWRhdGE7Ci0gICAgICAgIGJvb2wgbV9kZWJ1Z19jb25jZWFsZWRtYjsKLSAgICAgICAgYm9vbCBtX2Rpc2FibGVfZHluYW1pY19idWZfbW9kZTsKLSAgICAgICAgT01YX1UzMiBtX2NvbmNlYWxfY29sb3I7Ci0jZW5kaWYKLQotCi0gICAgICAgIHN0cnVjdCBoMjY0X212X2J1ZmZlciB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXI7Ci0gICAgICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgICAgIGludCBjb3VudDsKLSAgICAgICAgICAgIGludCBwbWVtX2ZkOwotICAgICAgICAgICAgaW50IG9mZnNldDsKLSAgICAgICAgfTsKLSAgICAgICAgaDI2NF9tdl9idWZmZXIgaDI2NF9tdl9idWZmOwotCi0gICAgICAgIHN0cnVjdCBtZXRhX2J1ZmZlciB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXI7Ci0gICAgICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgICAgIGludCBjb3VudDsKLSAgICAgICAgICAgIGludCBwbWVtX2ZkOwotICAgICAgICAgICAgaW50IHBtZW1fZmRfaW9tbXU7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0OwotICAgICAgICB9OwotICAgICAgICBtZXRhX2J1ZmZlciBtZXRhX2J1ZmY7Ci0gICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgbV9wb3J0X2RlZjsKLSAgICAgICAgT01YX1FDT01fRlJBTUVfUEFDS19BUlJBTkdFTUVOVCBtX2ZyYW1lX3BhY2tfYXJyYW5nZW1lbnQ7Ci0gICAgICAgIG9teF90aW1lX3N0YW1wX3Jlb3JkZXIgdGltZV9zdGFtcF9kdHM7Ci0gICAgICAgIGRlc2NfYnVmZmVyX2hkciAqbV9kZXNjX2J1ZmZlcl9wdHI7Ci0gICAgICAgIGJvb2wgc2VjdXJlX21vZGU7Ci0gICAgICAgIGJvb2wgYWxsb2NhdGVfbmF0aXZlX2hhbmRsZTsKLSAgICAgICAgYm9vbCBleHRlcm5hbF9tZXRhX2J1ZmZlcjsKLSAgICAgICAgYm9vbCBleHRlcm5hbF9tZXRhX2J1ZmZlcl9pb21tdTsKLSAgICAgICAgT01YX1FDT01fRVhUUkFEQVRBX0ZSQU1FSU5GTyAqbV9leHRyYWRhdGE7Ci0gICAgICAgIE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICptX290aGVyX2V4dHJhZGF0YTsKLSAgICAgICAgYm9vbCBjb2RlY19jb25maWdfZmxhZzsKLSAgICAgICAgaW50IGNhcHR1cmVfY2FwYWJpbGl0eTsKLSAgICAgICAgaW50IG91dHB1dF9jYXBhYmlsaXR5OwotICAgICAgICBib29sIHN0cmVhbWluZ1tNQVhfUE9SVF07Ci0gICAgICAgIE9NWF9GUkFNRVNJWkVUWVBFIGZyYW1lc2l6ZTsKLSAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSByZWN0YW5nbGU7Ci0gICAgICAgIE9NWF9VMzIgcHJldl9uX2ZpbGxlZF9sZW47Ci0gICAgICAgIGJvb2wgaXNfZG93bl9zY2FsYXJfZW5hYmxlZDsKLSAgICAgICAgYm9vbCBtX2ZvcmNlX2Rvd25fc2NhbGFyOwotICAgICAgICBzdHJ1Y3QgY3VzdG9tX2J1ZmZlcnNpemUgewotICAgICAgICAgICAgT01YX1UzMiBpbnB1dF9idWZmZXJzaXplOwotICAgICAgICB9IG1fY3VzdG9tX2J1ZmZlcnNpemU7Ci0gICAgICAgIGJvb2wgbV9wb3dlcl9oaW50ZWQ7Ci0gICAgICAgIGJvb2wgaXNfcTZfcGxhdGZvcm07Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgcG93ZXJfbW9kdWxlX3JlZ2lzdGVyKCk7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgcG93ZXJfbW9kdWxlX2RlcmVnaXN0ZXIoKTsKLSAgICAgICAgYm9vbCBtc2dfdGhyZWFkX2NyZWF0ZWQ7Ci0gICAgICAgIGJvb2wgYXN5bmNfdGhyZWFkX2NyZWF0ZWQ7Ci0KLSAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgbV9wcm9maWxlX2x2bDsKLSAgICAgICAgT01YX1UzMiBtX3Byb2ZpbGU7Ci0KLSAgICAgICAgLy92YXJpYWJsZXMgdG8gaGFuZGxlIGR5bmFtaWMgYnVmZmVyIG1vZGUKLSAgICAgICAgYm9vbCBkeW5hbWljX2J1Zl9tb2RlOwotICAgICAgICBzdHJ1Y3QgZHluYW1pY19idWZfbGlzdCAqb3V0X2R5bmFtaWNfbGlzdDsKLSAgICAgICAgT01YX1UzMiBtX3JlY29uZmlnX3dpZHRoOwotICAgICAgICBPTVhfVTMyIG1fcmVjb25maWdfaGVpZ2h0OwotICAgICAgICBib29sIG1fc21vb3Roc3RyZWFtaW5nX21vZGU7Ci0gICAgICAgIGJvb2wgbV9kZWNvZGVfb3JkZXJfbW9kZTsKLQotICAgICAgICBib29sIG1faW5wdXRfcGFzc19idWZmZXJfZmQ7Ci0gICAgICAgIERlc2NyaWJlQ29sb3JBc3BlY3RzUGFyYW1zIG1fY2xpZW50X2NvbG9yX3NwYWNlOwotICAgICAgICBEZXNjcmliZUNvbG9yQXNwZWN0c1BhcmFtcyBtX2ludGVybmFsX2NvbG9yX3NwYWNlOwotCi0gICAgICAgIC8vIEhEUlN0YXRpY0luZm8gZGVmaW5lZCBpbiBIYXJkd2FyZUFQSS5oCi0gICAgICAgIERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyBtX2NsaWVudF9oZHJfaW5mbzsKLSAgICAgICAgRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zIG1faW50ZXJuYWxfaGRyX2luZm87Ci0gICAgICAgIGJvb2wgbV9jaGFuZ2VfY2xpZW50X2hkcl9pbmZvOwotICAgICAgICBwdGhyZWFkX211dGV4X3QgbV9oZHJfaW5mb19jbGllbnRfbG9jazsKLSAgICAgICAgQ29sb3JNZXRhRGF0YSBtX2NvbG9yX21kYXRhOwotCi0gICAgICAgIE9NWF9VMzIgb3BlcmF0aW5nX2ZyYW1lX3JhdGU7Ci0KLSAgICAgICAgT01YX1UzMiBtX3Ntb290aHN0cmVhbWluZ193aWR0aDsKLSAgICAgICAgT01YX1UzMiBtX3Ntb290aHN0cmVhbWluZ19oZWlnaHQ7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgZW5hYmxlX3Ntb290aHN0cmVhbWluZygpOwotICAgICAgICBPTVhfRVJST1JUWVBFIGVuYWJsZV9hZGFwdGl2ZV9wbGF5YmFjayh1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCk7Ci0gICAgICAgIGJvb2wgaXNfdGh1bGl1bV92MTsKLSAgICAgICAgYm9vbCBtX2Rpc2FibGVfdWJ3Y19tb2RlOwotICAgICAgICBib29sIG1fZGlzYWJsZV9zcGxpdF9tb2RlOwotICAgICAgICBib29sIG1fZW5hYmxlX2Rvd25zY2FsYXI7Ci0gICAgICAgIE9NWF9VMzIgbV9kb3duc2NhbGFyX3dpZHRoOwotICAgICAgICBPTVhfVTMyIG1fZG93bnNjYWxhcl9oZWlnaHQ7Ci0gICAgICAgIGludCBkZWNpZGVfZG93bnNjYWxhcigpOwotICAgICAgICBpbnQgZW5hYmxlX2Rvd25zY2FsYXIoKTsKLSAgICAgICAgaW50IGRpc2FibGVfZG93bnNjYWxhcigpOwotCi0gICAgICAgIHVuc2lnbmVkIGludCBtX2ZpbGxfb3V0cHV0X21zZzsKLSAgICAgICAgYm9vbCBjbGllbnRfc2V0X2ZwczsKLSAgICAgICAgdW5zaWduZWQgaW50IHN0ZXJlb19vdXRwdXRfbW9kZTsKLSAgICAgICAgY2xhc3MgYWxsb2NhdGVfY29sb3JfY29udmVydF9idWYKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgIGFsbG9jYXRlX2NvbG9yX2NvbnZlcnRfYnVmKCk7Ci0gICAgICAgICAgICAgICAgfmFsbG9jYXRlX2NvbG9yX2NvbnZlcnRfYnVmKCkge307Ci0gICAgICAgICAgICAgICAgdm9pZCBzZXRfdmRlY19jbGllbnQodm9pZCAqKTsKLSAgICAgICAgICAgICAgICB2b2lkIHVwZGF0ZV9jbGllbnQoKTsKLSAgICAgICAgICAgICAgICBib29sIHNldF9jb2xvcl9mb3JtYXQoT01YX0NPTE9SX0ZPUk1BVFRZUEUgZGVzdF9jb2xvcl9mb3JtYXQpOwotICAgICAgICAgICAgICAgIGJvb2wgZ2V0X2NvbG9yX2Zvcm1hdChPTVhfQ09MT1JfRk9STUFUVFlQRSAmZGVzdF9jb2xvcl9mb3JtYXQpOwotICAgICAgICAgICAgICAgIGJvb2wgdXBkYXRlX2J1ZmZlcl9yZXEoKTsKLSAgICAgICAgICAgICAgICBib29sIGdldF9idWZmZXJfcmVxKHVuc2lnbmVkIGludCAmYnVmZmVyX3NpemUpOwotICAgICAgICAgICAgICAgIE9NWF9FUlJPUlRZUEUgc2V0X2J1ZmZlcl9yZXEoT01YX1UzMiBidWZmZXJfc2l6ZSwgT01YX1UzMiBhY3R1YWxfY291bnQpOwotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBnZXRfaWxfYnVmX2hkcigpOwotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBnZXRfaWxfYnVmX2hkcihPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5wdXRfaGRyKTsKLSAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogZ2V0X2RyX2J1Zl9oZHIoT01YX0JVRkZFUkhFQURFUlRZUEUgKmlucHV0X2hkcik7Ci0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIGNvbnZlcnQoT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcik7Ci0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIHF1ZXVlX2J1ZmZlcihPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyKTsKLSAgICAgICAgICAgICAgICBPTVhfRVJST1JUWVBFIGFsbG9jYXRlX2J1ZmZlcnNfY29sb3JfY29udmVydChPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVySGRyLE9NWF9VMzIgcG9ydCxPTVhfUFRSIGFwcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyIGJ5dGVzKTsKLSAgICAgICAgICAgICAgICBPTVhfRVJST1JUWVBFIGZyZWVfb3V0cHV0X2J1ZmZlcihPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVySGRyKTsKLSAgICAgICAgICAgICAgICBib29sIGlzX2NvbG9yX2NvbnZlcnNpb25fZW5hYmxlZCgpIHtyZXR1cm4gZW5hYmxlZDt9Ci0gICAgICAgICAgICBwcml2YXRlOgotI2RlZmluZSBNQVhfQ09VTlQgTUFYX05VTV9JTlBVVF9PVVRQVVRfQlVGRkVSUwotICAgICAgICAgICAgICAgIG9teF92ZGVjICpvbXg7Ci0gICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkOwotICAgICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIENvbG9yRm9ybWF0OwotICAgICAgICAgICAgICAgIHZvaWQgaW5pdF9tZW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgYm9vbCBjb2xvcl9jb252ZXJ0X21vZGU7Ci0gICAgICAgICAgICAgICAgQ29sb3JDb252ZXJ0Rm9ybWF0IGRlc3RfZm9ybWF0OwotICAgICAgICAgICAgICAgIENvbG9yQ29udmVydEZvcm1hdCBzcmNfZm9ybWF0OwotICAgICAgICAgICAgICAgIEMyRENvbG9yQ29udmVydGVyIGMyZGNjOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhbGxvY2F0ZWRfY291bnQ7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplX3JlcTsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX2FsaWdubWVudF9yZXE7Ci0gICAgICAgICAgICAgICAgT01YX1UzMiBtX2MyZF93aWR0aDsKLSAgICAgICAgICAgICAgICBPTVhfVTMyIG1fYzJkX2hlaWdodDsKLSAgICAgICAgICAgICAgICBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0xJU1QgICAgICBtX3BsYXRmb3JtX2xpc3RfY2xpZW50W01BWF9DT1VOVF07Ci0gICAgICAgICAgICAgICAgT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9FTlRSWSAgICAgbV9wbGF0Zm9ybV9lbnRyeV9jbGllbnRbTUFYX0NPVU5UXTsKLSAgICAgICAgICAgICAgICBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU1fSU5GTyBtX3BtZW1faW5mb19jbGllbnRbTUFYX0NPVU5UXTsKLSAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgbV9vdXRfbWVtX3B0cl9jbGllbnRbTUFYX0NPVU5UXTsKLSAgICAgICAgICAgICAgICBEZWNDb2xvck1hcHBpbmcgbU1hcE91dHB1dDJEcml2ZXJDb2xvckZvcm1hdDsKLSAgICAgICAgICAgICAgICBDb2xvclN1Yk1hcHBpbmcgbU1hcE91dHB1dDJDb252ZXJ0OwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdmRlY19pb24gb3BfYnVmX2lvbl9pbmZvW01BWF9DT1VOVF07Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwbWVtX2Jhc2VhZGRyZXNzW01BWF9DT1VOVF07Ci0gICAgICAgICAgICAgICAgaW50IHBtZW1fZmRbTUFYX0NPVU5UXTsKLSAgICAgICAgICAgICAgICBPTVhfRVJST1JUWVBFIGNhY2hlX29wcyh1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBjbWQpOwotICAgICAgICAgICAgICAgIGlubGluZSBPTVhfRVJST1JUWVBFIGNhY2hlX2NsZWFuX2J1ZmZlcih1bnNpZ25lZCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX29wcyhpbmRleCwgSU9OX0lPQ19DTEVBTl9DQUNIRVMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBPTVhfRVJST1JUWVBFIGNhY2hlX2NsZWFuX2ludmFsaWRhdGVfYnVmZmVyKHVuc2lnbmVkIGludCBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVfb3BzKGluZGV4LCBJT05fSU9DX0NMRUFOX0lOVl9DQUNIRVMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgYWxsb2NhdGVfY29sb3JfY29udmVydF9idWYgY2xpZW50X2J1ZmZlcnM7Ci0gICAgICAgIHN0cnVjdCB2aWRlb19kZWNvZGVyX2NhcGFiaWxpdHkgbV9kZWNvZGVyX2NhcGFiaWxpdHk7Ci0gICAgICAgIHN0cnVjdCBkZWJ1Z19jYXAgbV9kZWJ1ZzsKLSAgICAgICAgaW50IGxvZ19pbnB1dF9idWZmZXJzKGNvbnN0IGNoYXIgKiwgaW50KTsKLSAgICAgICAgaW50IGxvZ19vdXRwdXRfYnVmZmVycyhPTVhfQlVGRkVSSEVBREVSVFlQRSAqKTsKLSAgICAgICAgdm9pZCBzZW5kX2NvZGVjX2NvbmZpZygpOwotICAgICAgICBPTVhfVElDS1MgbV9sYXN0X3JlbmRlcmVkX1RTOwotICAgICAgICB2b2xhdGlsZSBpbnQzMl90IG1fcXVldWVkX2NvZGVjX2NvbmZpZ19jb3VudDsKLSAgICAgICAgT01YX1UzMiBjdXJyZW50X3BlcmZfbGV2ZWw7Ci0gICAgICAgIGJvb2wgc2VjdXJlX3NjYWxpbmdfdG9fbm9uX3NlY3VyZV9vcGI7Ci0JYm9vbCBtX2ZvcmNlX2NvbXByZXNzZWRfZm9yX2RwYjsKLSAgICAgICAgYm9vbCBtX2lzX2Rpc3BsYXlfc2Vzc2lvbjsKLQotICAgICAgICBzdGF0aWMgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZ2V0UHJlZmVycmVkQ29sb3JGb3JtYXROb25TdXJmYWNlTW9kZShPTVhfVTMyIGluZGV4KSB7Ci0gICAgICAgICAgICAvL09uIEFuZHJvaWQsIHdlIGRlZmF1bHQgdG8gc3RhbmRhcmQgWVVWIGZvcm1hdHMgZm9yIG5vbi1zdXJmYWNlIHVzZS1jYXNlcwotICAgICAgICAgICAgLy93aGVyZSBhcHBzIHByZWZlciBrbm93biBjb2xvciBmb3JtYXRzLgotICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZm9ybWF0c05vblN1cmZhY2VNb2RlW10gPSB7Ci0gICAgICAgICAgICAgICAgWzBdID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIsCi0gICAgICAgICAgICAgICAgWzFdID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwKLSAgICAgICAgICAgICAgICBbMl0gPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtLAotICAgICAgICAgICAgICAgIFszXSA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSlRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm1NdWx0aVZpZXcsCi0gICAgICAgICAgICAgICAgWzRdID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKVFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybUNvbXByZXNzZWQsCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgcmV0dXJuIChpbmRleCA8IHNpemVvZihmb3JtYXRzTm9uU3VyZmFjZU1vZGUpIC8gc2l6ZW9mKE9NWF9DT0xPUl9GT1JNQVRUWVBFKSkgPwotICAgICAgICAgICAgICAgIGZvcm1hdHNOb25TdXJmYWNlTW9kZVtpbmRleF0gOiBPTVhfQ09MT1JfRm9ybWF0TWF4OwotICAgICAgICB9Ci0KLSAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZ2V0UHJlZmVycmVkQ29sb3JGb3JtYXREZWZhdWx0TW9kZShPTVhfVTMyIGluZGV4KSB7Ci0gICAgICAgICAgICAvL2ZvciBzdXJmYWNlIG1vZGUgKG5vcm1hbCBwbGF5YmFjayksIGFkdmVydGlzZSBuYXRpdmUvYWNjZWxlcmF0ZWQgZm9ybWF0cyBmaXJzdAotICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKVFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybTsKLQotICAgICAgICAgICAgaWYgKCFtX2Rpc2FibGVfdWJ3Y19tb2RlKSB7Ci0gICAgICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZm9ybWF0c0RlZmF1bHRbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgWzBdID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKVFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybUNvbXByZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgIFsxXSA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSlRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm0sCi0gICAgICAgICAgICAgICAgICAgIFsyXSA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLAotICAgICAgICAgICAgICAgICAgICBbM10gPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLAotICAgICAgICAgICAgICAgICAgICBbNF0gPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtTXVsdGlWaWV3LAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgZm9ybWF0ID0gKGluZGV4IDwgc2l6ZW9mKGZvcm1hdHNEZWZhdWx0KSAvIHNpemVvZihPTVhfQ09MT1JfRk9STUFUVFlQRSkpID8KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0c0RlZmF1bHRbaW5kZXhdIDogT01YX0NPTE9SX0Zvcm1hdE1heDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZm9ybWF0c0RlZmF1bHRbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgWzBdID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKVFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybSwKLSAgICAgICAgICAgICAgICAgICAgWzFdID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIsCi0gICAgICAgICAgICAgICAgICAgIFsyXSA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsCi0gICAgICAgICAgICAgICAgICAgIFszXSA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSlRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm1NdWx0aVZpZXcsCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBmb3JtYXQgPSAoaW5kZXggPCBzaXplb2YoZm9ybWF0c0RlZmF1bHQpIC8gc2l6ZW9mKE9NWF9DT0xPUl9GT1JNQVRUWVBFKSkgPwotICAgICAgICAgICAgICAgICAgICBmb3JtYXRzRGVmYXVsdFtpbmRleF0gOiBPTVhfQ09MT1JfRm9ybWF0TWF4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBPTVhfRVJST1JUWVBFIGRlc2NyaWJlQ29sb3JGb3JtYXQoT01YX1BUUiBwYXJhbXMpOwotICAgICAgICB2b2lkIHByZWZldGNoTmV3QnVmZmVycygpOwotCi0gICAgICAgIGNsYXNzIGNsaWVudF9leHRyYWRhdGFfaW5mbyB7Ci0gICAgICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgICAgIE9NWF9VMzIgc2l6ZTsgLy8gc2l6ZSBvZiBleHRyYWRhdGEgb2YgZWFjaCBmcmFtZQotICAgICAgICAgICAgICAgIE9NWF9VMzIgYnVmZmVyX2NvdW50OwotICAgICAgICAgICAgICAgIE9NWF9CT09MIGVuYWJsZTsKLQotICAgICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgIGNsaWVudF9leHRyYWRhdGFfaW5mbygpIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFZFTlVTX0VYVFJBREFUQV9TSVpFKDQwOTYsIDIxNjApOzsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2NvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlID0gT01YX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH5jbGllbnRfZXh0cmFkYXRhX2luZm8oKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYm9vbCBzZXRfZXh0cmFkYXRhX2luZm8oT01YX1UzMiBzaXplLCBPTVhfVTMyIGJ1ZmZlcl9jb3VudCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLT5zaXplID0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy0+YnVmZmVyX2NvdW50ID0gYnVmZmVyX2NvdW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdm9pZCBlbmFibGVfY2xpZW50X2V4dHJhZGF0YShPTVhfQk9PTCBlbmFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy0+ZW5hYmxlID0gZW5hYmxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sIGlzX2NsaWVudF9leHRyYWRhdGFfZW5hYmxlZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuYWJsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT01YX1UzMiBnZXRTaXplKCkgY29uc3QgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT01YX1UzMiBnZXRCdWZmZXJDb3VudCgpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcl9jb3VudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGNsaWVudF9leHRyYWRhdGFfaW5mbyBtX2NsaWVudF9vdXRfZXh0cmFkYXRhX2luZm87Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBnZXRfdmVuZG9yX2V4dGVuc2lvbl9jb25maWcoCi0gICAgICAgICAgICAgICAgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICpleHQpOwotICAgICAgICBPTVhfRVJST1JUWVBFIHNldF92ZW5kb3JfZXh0ZW5zaW9uX2NvbmZpZygKLSAgICAgICAgICAgICAgICBPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX0VYVEVOU0lPTlRZUEUgKmV4dCk7Ci0KLSAgICAgICAgdm9pZCBpbml0X3ZlbmRvcl9leHRlbnNpb25zIChWZW5kb3JFeHRlbnNpb25TdG9yZSYpOwotCi0gICAgICAgIC8vIGxpc3Qgb2YgZXh0ZW5zaW9ucyBpcyBub3QgbXV0YWJsZSBhZnRlciBpbml0aWFsaXphdGlvbgotICAgICAgICBjb25zdCBWZW5kb3JFeHRlbnNpb25TdG9yZSBtVmVuZG9yRXh0ZW5zaW9uU3RvcmU7Ci19OwotCi1lbnVtIGluc3RhbmNlX3N0YXRlIHsKLSAgICBNU01fVklEQ19DT1JFX1VOSU5JVF9ET05FID0gMHgwMDAxLAotICAgIE1TTV9WSURDX0NPUkVfSU5JVCwKLSAgICBNU01fVklEQ19DT1JFX0lOSVRfRE9ORSwKLSAgICBNU01fVklEQ19PUEVOLAotICAgIE1TTV9WSURDX09QRU5fRE9ORSwKLSAgICBNU01fVklEQ19MT0FEX1JFU09VUkNFUywKLSAgICBNU01fVklEQ19MT0FEX1JFU09VUkNFU19ET05FLAotICAgIE1TTV9WSURDX1NUQVJULAotICAgIE1TTV9WSURDX1NUQVJUX0RPTkUsCi0gICAgTVNNX1ZJRENfU1RPUCwKLSAgICBNU01fVklEQ19TVE9QX0RPTkUsCi0gICAgTVNNX1ZJRENfUkVMRUFTRV9SRVNPVVJDRVMsCi0gICAgTVNNX1ZJRENfUkVMRUFTRV9SRVNPVVJDRVNfRE9ORSwKLSAgICBNU01fVklEQ19DTE9TRSwKLSAgICBNU01fVklEQ19DTE9TRV9ET05FLAotICAgIE1TTV9WSURDX0NPUkVfVU5JTklULAotfTsKLQotZW51bSB2aWRjX3Jlc3Bvc2VzX2lkIHsKLSAgICBNU01fVklEQ19ERUNPREVSX0ZMVVNIX0RPTkUgPSAweDExLAotICAgIE1TTV9WSURDX0RFQ09ERVJfRVZFTlRfQ0hBTkdFLAotfTsKLQotI2VuZGlmIC8vIF9fT01YX1ZERUNfSF9fCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL3Bvd2VyX21vZHVsZS5oIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy9wb3dlcl9tb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0N2MyZi4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL3Bvd2VyX21vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTItMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICBhcmUgbWV0OgotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLVdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi1BUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi1CRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi1CVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi1PUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi1JRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGhhcmR3YXJlL3Bvd2VyLmg+Ci0KLWNsYXNzIFBvd2VyTW9kdWxlCi17Ci0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgUG93ZXJNb2R1bGUgKmdldEluc3RhbmNlKCk7Ci0gICAgICAgIHBvd2VyX21vZHVsZV90ICpnZXRQb3dlck1vZHVsZUhhbmRsZSgpOwotICAgIHByaXZhdGU6Ci0gICAgICAgIHN0YXRpYyBQb3dlck1vZHVsZSAqbVBvd2VyTW9kdWxlSW5zdGFuY2U7Ci0gICAgICAgIHBvd2VyX21vZHVsZV90ICptUG93ZXJNb2R1bGVIYW5kbGU7Ci0gICAgICAgIFBvd2VyTW9kdWxlKCkge30KLX07CmRpZmYgLS1naXQgYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL3F0eXBlcy5oIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy9xdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmNmUyZC4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL3F0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDEwIC0gMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vcgotICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgICAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLU9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBRVFlQRVNfSAotI2RlZmluZSBRVFlQRVNfSAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgRGVjbGFyYXRpb25zCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKiBDb25zdGFudHMKLSoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWZkZWYgVFJVRQotI3VuZGVmIFRSVUUKLSNlbmRpZgotCi0jaWZkZWYgRkFMU0UKLSN1bmRlZiBGQUxTRQotI2VuZGlmCi0KLSNkZWZpbmUgVFJVRSAgIDEgICAvKiBCb29sZWFuIHRydWUgdmFsdWUuICovCi0jZGVmaW5lIEZBTFNFICAwICAgLyogQm9vbGVhbiBmYWxzZSB2YWx1ZS4gKi8KLQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKiBTdGFuZGFyZCBUeXBlcwotKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIHRoZSBzYW1lIGFjY3Jvc3MgcGxhdGZvcm1zLiAgVGhpcyBmaXJzdAotICAgICAqKiBncm91cCBhcmUgdGhlIHNhbmN0aW9uZWQgdHlwZXMuCi0gICAgICovCi0KLSAgICB0eXBlZGVmICB1bnNpZ25lZCBjaGFyICAgICAgYm9vbGVhbjsgICAgIC8qIEJvb2xlYW4gdmFsdWUgdHlwZS4gKi8KLQotICAgIHR5cGVkZWYgIHVuc2lnbmVkIGludCAgdWludDMyOyAgICAgIC8qIFVuc2lnbmVkIDMyIGJpdCB2YWx1ZSAqLwotICAgIHR5cGVkZWYgIHVuc2lnbmVkIHNob3J0ICAgICB1aW50MTY7ICAgICAgLyogVW5zaWduZWQgMTYgYml0IHZhbHVlICovCi0gICAgdHlwZWRlZiAgdW5zaWduZWQgY2hhciAgICAgIHVpbnQ4OyAgICAgICAvKiBVbnNpZ25lZCA4ICBiaXQgdmFsdWUgKi8KLQotICAgIHR5cGVkZWYgIGludCAgICBpbnQzMjsgICAgICAgLyogU2lnbmVkIDMyIGJpdCB2YWx1ZSAqLwotICAgIHR5cGVkZWYgIHNpZ25lZCBzaG9ydCAgICAgICBpbnQxNjsgICAgICAgLyogU2lnbmVkIDE2IGJpdCB2YWx1ZSAqLwotICAgIHR5cGVkZWYgIHNpZ25lZCBjaGFyICAgICAgICBpbnQ4OyAgICAgICAgLyogU2lnbmVkIDggIGJpdCB2YWx1ZSAqLwotCi0gICAgLyogVGhpcyBncm91cCBhcmUgdGhlIGRlcHJlY2F0ZWQgdHlwZXMuICBUaGVpciB1c2Ugc2hvdWxkIGJlCi0gICAgICoqIGRpc2NvbnRpbnVlZCBhbmQgbmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgdHlwZXMgYWJvdmUKLSAgICAgKi8KLSAgICB0eXBlZGVmICB1bnNpZ25lZCBjaGFyICAgICBieXRlOyAgICAgICAgIC8qIFVuc2lnbmVkIDggIGJpdCB2YWx1ZSB0eXBlLiAqLwotICAgIHR5cGVkZWYgIHVuc2lnbmVkIHNob3J0ICAgIHdvcmQ7ICAgICAgICAgLyogVW5zaW5nZWQgMTYgYml0IHZhbHVlIHR5cGUuICovCi0gICAgdHlwZWRlZiAgdW5zaWduZWQgbG9uZyAgICAgZHdvcmQ7ICAgICAgICAvKiBVbnNpZ25lZCAzMiBiaXQgdmFsdWUgdHlwZS4gKi8KLQotICAgIHR5cGVkZWYgbG9uZyBsb25nICAgICAgICAgICBpbnQ2NDsKLSAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgdWludDY0OwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAgLyogUVRZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9pbmMvcXVldWUuaCBiL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9pbmMvcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyZTQzYy4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvaW5jL3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vcgotICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgICAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLU9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBRVUVVRV9ICi0jZGVmaW5lIFFVRVVFX0gKLQotdHlwZWRlZiBzdHJ1Y3QgUXVldWUgUXVldWU7Ci0KLVF1ZXVlICphbGxvY19xdWV1ZSgpOwotdm9pZCBmcmVlX3F1ZXVlKFF1ZXVlICpxKTsKLXZvaWQgZnJlZV9xdWV1ZV9hbmRfcWVsZW1lbnQoUXVldWUgKnEpOwotaW50IHB1c2goUXVldWUgKnEsIHZvaWQgKiBlbGVtZW50KTsKLXZvaWQgKnBvcChRdWV1ZSAqcSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy90c19wYXJzZXIuaCBiL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9pbmMvdHNfcGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNWQxYTQuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL2luYy90c19wYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTAtMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vcgotICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgICAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLU9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBfX0RUU1BBUlNFUl9ICi0jZGVmaW5lIF9fRFRTUEFSU0VSX0gKLQotI2luY2x1ZGUgIk9NWF9Db3JlLmgiCi0jaW5jbHVkZSAiT01YX1FDT01FeHRucy5oIgotI2luY2x1ZGUgInFjX29teF9jb21wb25lbnQuaCIKLQotI2luY2x1ZGU8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpZmRlZiBfQU5EUk9JRF8KLWV4dGVybiAiQyIgewotI2luY2x1ZGU8dXRpbHMvTG9nLmg+Ci19Ci0jZWxzZQotI2RlZmluZSBBTE9HRShmbXQsIGFyZ3MuLi4pIGZwcmludGYoc3RkZXJyLCBmbXQsICMjYXJncykKLSNlbmRpZiAvKiBfQU5EUk9JRF8gKi8KLQotY2xhc3Mgb214X3RpbWVfc3RhbXBfcmVvcmRlcgotewotICAgIGNsYXNzIGF1dG9fbG9jayB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGF1dG9fbG9jayhwdGhyZWFkX211dGV4X3QgKmxvY2spCi0gICAgICAgICAgICAgICAgOiBtTG9jayhsb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTG9jaykKLSAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtTG9jayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfmF1dG9fbG9jaygpIHsKLSAgICAgICAgICAgICAgICBpZiAobUxvY2spCi0gICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCAqbUxvY2s7Ci0gICAgfTsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgb214X3RpbWVfc3RhbXBfcmVvcmRlcigpOwotICAgICAgICB+b214X3RpbWVfc3RhbXBfcmVvcmRlcigpOwotICAgICAgICB2b2lkIHNldF90aW1lc3RhbXBfcmVvcmRlcl9tb2RlKGJvb2wgZmxhZyk7Ci0gICAgICAgIHZvaWQgZW5hYmxlX2RlYnVnX3ByaW50KGJvb2wgZmxhZyk7Ci0gICAgICAgIGJvb2wgaW5zZXJ0X3RpbWVzdGFtcChPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyKTsKLSAgICAgICAgYm9vbCBnZXRfbmV4dF90aW1lc3RhbXAoT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciwgYm9vbCBpc19pbnRlcmxhY2VkKTsKLSAgICAgICAgYm9vbCByZW1vdmVfdGltZV9zdGFtcChPTVhfVElDS1MgdHMsIGJvb2wgaXNfaW50ZXJsYWNlZCk7Ci0gICAgICAgIHZvaWQgZmx1c2hfdGltZXN0YW1wKCk7Ci0KLSAgICBwcml2YXRlOgotI2RlZmluZSBUSU1FX1NaIDY0Ci0gICAgICAgIHR5cGVkZWYgc3RydWN0IHRpbWVzdGFtcCB7Ci0gICAgICAgICAgICBPTVhfVElDS1MgdGltZXN0YW1wczsKLSAgICAgICAgICAgIGJvb2wgaW5fdXNlOwotICAgICAgICB9IHRpbWVzdGFtcDsKLSAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgdGltZV9zdGFtcF9saXN0IHsKLSAgICAgICAgICAgIHRpbWVzdGFtcCBpbnB1dF90aW1lc3RhbXBzW1RJTUVfU1pdOwotICAgICAgICAgICAgdGltZV9zdGFtcF9saXN0ICpuZXh0OwotICAgICAgICAgICAgdGltZV9zdGFtcF9saXN0ICpwcmV2OwotICAgICAgICAgICAgdW5zaWduZWQgaW50IGVudHJpZXNfZmlsbGVkOwotICAgICAgICB9IHRpbWVfc3RhbXBfbGlzdDsKLSAgICAgICAgYm9vbCBlcnJvcjsKLSAgICAgICAgdGltZV9zdGFtcF9saXN0ICpwaGVhZCwqcGN1cnJlbnQ7Ci0gICAgICAgIGJvb2wgZ2V0X2N1cnJlbnRfbGlzdCgpOwotICAgICAgICBib29sIGFkZF9uZXdfbGlzdCgpOwotICAgICAgICBib29sIHVwZGF0ZV9oZWFkKCk7Ci0gICAgICAgIHZvaWQgZGVsZXRlX2xpc3QoKTsKLSAgICAgICAgdm9pZCBoYW5kbGVfZXJyb3IoKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgaGFuZGxlciBjYWxsZWQgZm9yIFRTIFBhcnNlciIpOwotCi0gICAgICAgICAgICBpZiAoZXJyb3IpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgICAgICBkZWxldGVfbGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgcmVvcmRlcl90czsKLSAgICAgICAgYm9vbCBwcmludF9kZWJ1ZzsKLSAgICAgICAgcHRocmVhZF9tdXRleF90IG1fbG9jazsKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9zcmMvbWVzc2FnZV9xdWV1ZS5jIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL3NyYy9tZXNzYWdlX3F1ZXVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDc3M2EuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL3NyYy9tZXNzYWdlX3F1ZXVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDEwLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJtZXNzYWdlX3F1ZXVlLmgiCi0KLWludCBjaGVja19pZl9xdWV1ZV9lbXB0eSAoIHVuc2lnbmVkIGludCBxdWV1ZXRvY2hlY2ssIHZvaWQqIHF1ZXVlY29udGV4dCApCi17Ci0gICAgc3RydWN0IHZpZGVvX3F1ZXVlX2NvbnRleHQgKnB0cl9xID0gTlVMTDsKLQotICAgIC8qCi0gICAgICogcXVldWV0b2NoZWNrIC0gMCBjb21tYW5kIHF1ZXVlCi0gICAgICogcXVldWV0b2NoZWNrIC0gMSBkYXRhIHF1ZXVlCi0gICAgICovCi0gICAgaWYgKCBxdWV1ZWNvbnRleHQgPT0gTlVMTCB8fCAocXVldWV0b2NoZWNrID4gMSApICkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBwdHJfcSA9IChzdHJ1Y3QgdmlkZW9fcXVldWVfY29udGV4dCAqKXF1ZXVlY29udGV4dDsKLQotICAgIGlmIChxdWV1ZXRvY2hlY2sgPT0gMCkgewotICAgICAgICBpZiAocHRyX3EtPnJlYWRfY29tcSA9PSBwdHJfcS0+d3JpdGVfY29tcSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHF1ZXVldG9jaGVjayA9PSAxKSB7Ci0gICAgICAgIGlmIChwdHJfcS0+d3JpdGVfZGF0YXEgPT0gcHRyX3EtPnJlYWRfZGF0YXEpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi1zdHJ1Y3QgdmlkZW9fbXNncSAqIHF1ZXVlX2dldF9jbWQgKHZvaWQqIHF1ZXVlY29udGV4dCApIHsKLSAgICBzdHJ1Y3QgdmlkZW9fcXVldWVfY29udGV4dCAqcHRyX3EgPSBOVUxMOwotICAgIHN0cnVjdCB2aWRlb19tc2dxICpwaXRlbSA9IE5VTEw7Ci0KLSAgICBpZiAoIE5VTEwgPT0gcXVldWVjb250ZXh0ICkgewotICAgICAgICBwcmludGYoInF1ZXVlX2dldF9jbWQ6IEludmFsaWQgSW5wdXQgcGFyYW1ldGVyIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHB0cl9xID0gKHN0cnVjdCB2aWRlb19xdWV1ZV9jb250ZXh0ICopcXVldWVjb250ZXh0OwotCi0gICAgLyogV2FpdCBvbiB0aGUgc2VtYXBob3JlIHRpbGwgaXQgaXMgcmVsZWFzZWQgKi8KLSAgICBzZW1fd2FpdCgmcHRyX3EtPnNlbV9tZXNzYWdlKTsKLQotICAgIC8qIExvY2sgdGhlIG11dGV4IHRvIHByb3RlY3QgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnB0cl9xLT5tdXRleCk7Ci0KLSAgICBpZiAocHRyX3EtPnJlYWRfY29tcSAhPSBwdHJfcS0+d3JpdGVfY29tcSkgewotICAgICAgICBwaXRlbSA9ICZwdHJfcS0+cHRyX2NtZHEgW3B0cl9xLT5yZWFkX2NvbXFdOwotICAgICAgICBwdHJfcS0+cmVhZF9jb21xID0gKHB0cl9xLT5yZWFkX2NvbXEgKyAxKSAlIFwKLSAgICAgICAgICAgICAgICAgICBwdHJfcS0+Y29tbWFuZHFfc2l6ZTsKLSAgICB9IGVsc2UgaWYgKHB0cl9xLT53cml0ZV9kYXRhcSAhPSBwdHJfcS0+cmVhZF9kYXRhcSkgewotICAgICAgICBwaXRlbSA9ICZwdHJfcS0+cHRyX2RhdGFxIFtwdHJfcS0+cmVhZF9kYXRhcV07Ci0gICAgICAgIHB0cl9xLT5yZWFkX2RhdGFxID0gKHB0cl9xLT5yZWFkX2RhdGFxICsgMSkgJSBcCi0gICAgICAgICAgICAgICAgICAgIHB0cl9xLT5kYXRhcV9zaXplOwotICAgIH0KLQotICAgIC8qIFVubG9jayB0aGUgbXV0ZXggdG8gcmVsZWFzZSB0aGUgY3JpdGljYWwgc2VjdGlvbiAqLwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwdHJfcS0+bXV0ZXgpOwotCi0gICAgcmV0dXJuIHBpdGVtOwotfQotCi0KLWludCBxdWV1ZV9wb3N0X2NtZHEgKCB2b2lkKiBxdWV1ZWNvbnRleHQsCi0gICAgICAgIHN0cnVjdCB2aWRlb19tc2dxICpwaXRlbQotICAgICAgICApCi17Ci0gICAgc3RydWN0IHZpZGVvX3F1ZXVlX2NvbnRleHQgKnB0cl9xID0gTlVMTDsKLQotICAgIGlmIChwaXRlbSA9PSBOVUxMIHx8IHF1ZXVlY29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdHJfcSA9IChzdHJ1Y3QgdmlkZW9fcXVldWVfY29udGV4dCAqKXF1ZXVlY29udGV4dDsKLQotICAgIC8qIExvY2sgdGhlIG11dGV4IHRvIHByb3RlY3QgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnB0cl9xLT5tdXRleCk7Ci0KLSAgICBpZiAoKHB0cl9xLT53cml0ZV9jb21xICsgMSkgJSBwdHJfcS0+Y29tbWFuZHFfc2l6ZSA9PSBwdHJfcS0+cmVhZF9jb21xKSB7Ci0gICAgICAgIHByaW50ZigiUVVFVUUgaXMgRlVMTCIpOwotICAgICAgICAvKiBVbmxvY2sgdGhlIG11dGV4IHRvIHJlbGVhc2UgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnB0cl9xLT5tdXRleCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFN0b3JlIHRoZSBjb21tYW5kIGluIHRoZSBNZXNzYWdlIFF1ZXVlICYgaW5jcmVtZW50IHdyaXRlIG9mZnNldCAqLwotICAgICAgICBtZW1jcHkgKCAmcHRyX3EtPnB0cl9jbWRxIFtwdHJfcS0+d3JpdGVfY29tcV0scGl0ZW0sIFwKLSAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCB2aWRlb19tc2dxKSk7Ci0gICAgICAgIHB0cl9xLT53cml0ZV9jb21xID0gKHB0cl9xLT53cml0ZV9jb21xICsgMSkgJSBwdHJfcS0+Y29tbWFuZHFfc2l6ZTsKLSAgICB9Ci0KLSAgICAvKiBVbmxvY2sgdGhlIG11dGV4IHRvIHJlbGVhc2UgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcHRyX3EtPm11dGV4KTsKLQotICAgIC8qIFBvc3QgdGhlIHNlbWFwaG9yZSAqLwotICAgIHNlbV9wb3N0KCZwdHJfcS0+c2VtX21lc3NhZ2UpOwotICAgIHJldHVybiAxOwotfQotCi0KLWludCBxdWV1ZV9wb3N0X2RhdGFxICggdm9pZCAqcXVldWVjb250ZXh0LAotICAgICAgICBzdHJ1Y3QgdmlkZW9fbXNncSAqcGl0ZW0KLSAgICAgICAgKQotewotICAgIHN0cnVjdCB2aWRlb19xdWV1ZV9jb250ZXh0ICpwdHJfcSA9IE5VTEw7Ci0KLSAgICBpZiAocGl0ZW0gPT0gTlVMTCB8fCBxdWV1ZWNvbnRleHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHRyX3EgPSAoc3RydWN0IHZpZGVvX3F1ZXVlX2NvbnRleHQgKilxdWV1ZWNvbnRleHQ7Ci0KLSAgICAvKiBMb2NrIHRoZSBtdXRleCB0byBwcm90ZWN0IHRoZSBjcml0aWNhbCBzZWN0aW9uICovCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZwdHJfcS0+bXV0ZXgpOwotCi0gICAgaWYgKChwdHJfcS0+d3JpdGVfZGF0YXEgKyAxKSAlIHB0cl9xLT5kYXRhcV9zaXplID09IHB0cl9xLT5yZWFkX2RhdGFxKSB7Ci0gICAgICAgIHByaW50ZigiUVVFVUUgaXMgRlVMTCIpOwotICAgICAgICAvKiBVbmxvY2sgdGhlIG11dGV4IHRvIHJlbGVhc2UgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnB0cl9xLT5tdXRleCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFN0b3JlIHRoZSBjb21tYW5kIGluIHRoZSBNZXNzYWdlIFF1ZXVlICYgaW5jcmVtZW50IHdyaXRlIG9mZnNldCAqLwotICAgICAgICBtZW1jcHkgKCAmcHRyX3EtPnB0cl9kYXRhcSBbcHRyX3EtPndyaXRlX2RhdGFxXSxwaXRlbSwgXAotICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHZpZGVvX21zZ3EpKTsKLSAgICAgICAgcHRyX3EtPndyaXRlX2RhdGFxID0gKHB0cl9xLT53cml0ZV9kYXRhcSArIDEpICUgcHRyX3EtPmRhdGFxX3NpemU7Ci0gICAgfQotCi0gICAgLyogVW5sb2NrIHRoZSBtdXRleCB0byByZWxlYXNlIHRoZSBjcml0aWNhbCBzZWN0aW9uICovCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnB0cl9xLT5tdXRleCk7Ci0KLSAgICAvKiBQb3N0IHRoZSBzZW1hcGhvcmUgKi8KLSAgICBzZW1fcG9zdCgmcHRyX3EtPnNlbV9tZXNzYWdlKTsKLSAgICByZXR1cm4gMTsKLQotfQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL3NyYy9vbXhfc3d2ZGVjLmNwcCBiL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9zcmMvb214X3N3dmRlYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMjBmOGYuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL3NyYy9vbXhfc3d2ZGVjLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY0MTkgKzAsMCBAQAotLyoqCi0gKiBAY29weXJpZ2h0Ci0gKgotICogICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiAgICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogICBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELgotICogICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSAqICAgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqICAgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiAgIERBTUFHRS4KLSAqCi0gKiBAZmlsZQotICoKLSAqICAgb214X3N3dmRlYy5jcHAKLSAqCi0gKiBAYnJpZWYKLSAqCi0gKiAgIE9NWCBzb2Z0d2FyZSB2aWRlbyBkZWNvZGVyIGNvbXBvbmVudCBzb3VyY2UuCi0gKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgotI2luY2x1ZGUgPGdyYWxsb2NfcHJpdi5oPgotCi0jaW5jbHVkZSAiT01YX1FDT01FeHRucy5oIgotCi0jaW5jbHVkZSAib214X3N3dmRlYy5oIgotCi0jaW5jbHVkZSAic3d2ZGVjX2FwaS5oIgotCi1zdGF0aWMgdW5zaWduZWQgaW50IHNwbGl0X2J1ZmZlcl9tcGVnNCh1bnNpZ25lZCBpbnQgICAgICAgICAqb2Zmc2V0X2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmZmVyX2hkcik7Ci0KLS8qKgotICogLS0tLS0tLS0tLS0tLS0tLQotICogUFVCTElDIEZVTkNUSU9OUwotICogLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qKgotICogQGJyaWVmIENyZWF0ZSAmIHJldHVybiBjb21wb25lbnQgY2xhc3MgaW5zdGFuY2UuCi0gKgotICogQHJldHZhbCBQb2ludGVyIHRvIG5ldyBjb21wb25lbnQgY2xhc3MgaW5zdGFuY2UuCi0gKi8KLXZvaWQgKmdldF9vbXhfY29tcG9uZW50X2ZhY3RvcnlfZm4odm9pZCkKLXsKLSAgICByZXR1cm4gbmV3IG9teF9zd3ZkZWM7Ci19Ci0KLS8qKgotICogQGJyaWVmIENvbXBvbmVudCBjb25zdHJ1Y3Rvci4KLSAqLwotb214X3N3dmRlYzo6b214X3N3dmRlYygpOgotICAgIG1fc3RhdGUoT01YX1N0YXRlSW52YWxpZCksCi0gICAgbV9zdGF0dXNfZmxhZ3MoMCksCi0gICAgbV9zd3ZkZWNfY29kZWMoU1dWREVDX0NPREVDX0lOVkFMSUQpLAotICAgIG1fc3d2ZGVjX2hhbmRsZShOVUxMKSwKLSAgICBtX3N3dmRlY19jcmVhdGVkKGZhbHNlKSwKLSAgICBtX29teF92aWRlb19jb2Rpbmd0eXBlKE9NWF9WSURFT19Db2RpbmdVbnVzZWQpLAotICAgIG1fb214X2NvbG9yX2Zvcm1hdHR5cGUoT01YX0NPTE9SX0Zvcm1hdFVudXNlZCksCi0gICAgbV9zeW5jX2ZyYW1lX2RlY29kaW5nX21vZGUoZmFsc2UpLAotICAgIG1fYW5kcm9pZF9uYXRpdmVfYnVmZmVycyhmYWxzZSksCi0gICAgbV9tZXRhX2J1ZmZlcl9tb2RlX2Rpc2FibGVkKGZhbHNlKSwKLSAgICBtX21ldGFfYnVmZmVyX21vZGUoZmFsc2UpLAotICAgIG1fYWRhcHRpdmVfcGxheWJhY2tfbW9kZShmYWxzZSksCi0gICAgbV9hcmJpdHJhcnlfYnl0ZXNfbW9kZShmYWxzZSksCi0gICAgbV9wb3J0X3JlY29uZmlnX2lucHJvZ3Jlc3MoZmFsc2UpLAotICAgIG1fZGltZW5zaW9uc191cGRhdGVfaW5wcm9ncmVzcyhmYWxzZSksCi0gICAgbV9idWZmZXJfYXJyYXlfaXAoTlVMTCksCi0gICAgbV9idWZmZXJfYXJyYXlfb3AoTlVMTCksCi0gICAgbV9tZXRhX2J1ZmZlcl9hcnJheShOVUxMKQotewotICAgIC8vIG1lbXNldCBhbGwgbWVtYmVyIHZhcmlhYmxlcyB0aGF0IGFyZSBjb21wb3NpdGUgc3RydWN0dXJlcwotICAgIG1lbXNldCgmbV9jbXAsICAgICAgICAgICAgICAgICAgICAgMCwgc2l6ZW9mKG1fY21wKSk7IC8vIHBhcnQgb2YgYmFzZSBjbGFzcwotICAgIG1lbXNldCgmbV9jbXBfbmFtZVswXSwgICAgICAgICAgICAgMCwgc2l6ZW9mKG1fY21wX25hbWUpKTsKLSAgICBtZW1zZXQoJm1fcm9sZV9uYW1lWzBdLCAgICAgICAgICAgIDAsIHNpemVvZihtX3JvbGVfbmFtZSkpOwotICAgIG1lbXNldCgmbV9mcmFtZV9kaW1lbnNpb25zLCAgICAgICAgMCwgc2l6ZW9mKG1fZnJhbWVfZGltZW5zaW9ucykpOwotICAgIG1lbXNldCgmbV9mcmFtZV9hdHRyaWJ1dGVzLCAgICAgICAgMCwgc2l6ZW9mKG1fZnJhbWVfYXR0cmlidXRlcykpOwotICAgIG1lbXNldCgmbV9mcmFtZV9kaW1lbnNpb25zX21heCwgICAgMCwgc2l6ZW9mKG1fZnJhbWVfZGltZW5zaW9uc19tYXgpKTsKLSAgICBtZW1zZXQoJm1fYXN5bmNfdGhyZWFkLCAgICAgICAgICAgIDAsIHNpemVvZihtX2FzeW5jX3RocmVhZCkpOwotICAgIG1lbXNldCgmbV9wb3J0X2lwLCAgICAgICAgICAgICAgICAgMCwgc2l6ZW9mKG1fcG9ydF9pcCkpOwotICAgIG1lbXNldCgmbV9wb3J0X29wLCAgICAgICAgICAgICAgICAgMCwgc2l6ZW9mKG1fcG9ydF9vcCkpOwotICAgIG1lbXNldCgmbV9jYWxsYmFjaywgICAgICAgICAgICAgICAgMCwgc2l6ZW9mKG1fY2FsbGJhY2spKTsKLSAgICBtZW1zZXQoJm1fYXBwX2RhdGEsICAgICAgICAgICAgICAgIDAsIHNpemVvZihtX2FwcF9kYXRhKSk7Ci0gICAgbWVtc2V0KCZtX3ByaW9fbWdtdCwgICAgICAgICAgICAgICAwLCBzaXplb2YobV9wcmlvX21nbXQpKTsKLSAgICBtZW1zZXQoJm1fc2VtX2NtZCwgICAgICAgICAgICAgICAgIDAsIHNpemVvZihtX3NlbV9jbWQpKTsKLSAgICBtZW1zZXQoJm1fbWV0YV9idWZmZXJfYXJyYXlfbXV0ZXgsIDAsIHNpemVvZihtX21ldGFfYnVmZmVyX2FycmF5X211dGV4KSk7Ci0KLSAgICAvLyBudWxsLXRlcm1pbmF0ZSBjb21wb25lbnQgbmFtZSAmIHJvbGUgbmFtZSBzdHJpbmdzCi0gICAgbV9jbXBfbmFtZVswXSAgPSAnXDAnOwotICAgIG1fcm9sZV9uYW1lWzBdID0gJ1wwJzsKLQotICAgIC8vIHBvcnRzIGFyZSBlbmFibGVkICYgdW5wb3B1bGF0ZWQgYnkgZGVmYXVsdAotICAgIG1fcG9ydF9pcC5lbmFibGVkICAgICA9IE9NWF9UUlVFOwotICAgIG1fcG9ydF9vcC5lbmFibGVkICAgICA9IE9NWF9UUlVFOwotICAgIG1fcG9ydF9pcC51bnBvcHVsYXRlZCA9IE9NWF9UUlVFOwotICAgIG1fcG9ydF9vcC51bnBvcHVsYXRlZCA9IE9NWF9UUlVFOwotfQotCi0vKioKLSAqIEBicmllZiBDb21wb25lbnQgZGVzdHJ1Y3Rvci4KLSAqLwotb214X3N3dmRlYzo6fm9teF9zd3ZkZWMoKQotewotfQotCi0vKioKLSAqIEBicmllZiBJbml0aWFsaXplIGNvbXBvbmVudC4KLSAqCi0gKiBAcGFyYW1baW5dIGNtcF9uYW1lOiBDb21wb25lbnQgbmFtZSBzdHJpbmcuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6Y29tcG9uZW50X2luaXQoT01YX1NUUklORyBjbXBfbmFtZSkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBPTVhfU1dWREVDX0xPR19BUEkoIiclcycsIHZlcnNpb24gZGF0ZTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBjbXBfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgT01YX1NXVkRFQ19WRVJTSU9OX0RBVEUpOwotCi0gICAgb214X3N3dmRlY19sb2dfaW5pdCgpOwotCi0gICAgewotICAgICAgICBjaGFyIHByb3BlcnR5X3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF0gPSB7MH07Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5X2dldCgib214X3N3dmRlYy5tZXRhX2J1ZmZlci5kaXNhYmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKLSAgICAgICAgewotICAgICAgICAgICAgbV9tZXRhX2J1ZmZlcl9tb2RlX2Rpc2FibGVkID0gKGJvb2wpIGF0b2kocHJvcGVydHlfdmFsdWUpOwotCi0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19MT1coIm9teF9zd3ZkZWMubWV0YV9idWZmZXIuZGlzYWJsZTogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWV0YV9idWZmZXJfbW9kZV9kaXNhYmxlZCA/IDEgOiAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtX3N0YXRlICE9IE9NWF9TdGF0ZUludmFsaWQpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiZGlzYWxsb3dlZCBpbiBzdGF0ZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TVEFURVRZUEVfU1RSSU5HKG1fc3RhdGUpKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKLSAgICAgICAgZ290byBjb21wb25lbnRfaW5pdF9leGl0OwotICAgIH0KLQotICAgIGlmICghc3RybmNtcChjbXBfbmFtZSwKLSAgICAgICAgICAgICAgICAgIk9NWC5xdGkudmlkZW8uZGVjb2Rlci5tcGVnNHN3IiwKLSAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfTE9XKCIndmlkZW9fZGVjb2Rlci5tcGVnNCciKTsKLQotICAgICAgICBzdHJsY3B5KG1fY21wX25hbWUsICAgICAgICAgICAgICAgY21wX25hbWUsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgc3RybGNweShtX3JvbGVfbmFtZSwgInZpZGVvX2RlY29kZXIubXBlZzQiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0KLSAgICAgICAgbV9zd3ZkZWNfY29kZWMgICAgICAgICA9IFNXVkRFQ19DT0RFQ19NUEVHNDsKLSAgICAgICAgbV9vbXhfdmlkZW9fY29kaW5ndHlwZSA9IE9NWF9WSURFT19Db2RpbmdNUEVHNDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cm5jbXAoY21wX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIk9NWC5xdGkudmlkZW8uZGVjb2Rlci5oMjYzc3ciLAotICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygidmlkZW9fZGVjb2Rlci5oMjYzIik7Ci0KLSAgICAgICAgc3RybGNweShtX2NtcF9uYW1lLCAgICAgICAgICAgICAgY21wX25hbWUsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgc3RybGNweShtX3JvbGVfbmFtZSwgInZpZGVvX2RlY29kZXIuaDI2MyIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLQotICAgICAgICBtX3N3dmRlY19jb2RlYyAgICAgICAgID0gU1dWREVDX0NPREVDX0gyNjM7Ci0gICAgICAgIG1fb214X3ZpZGVvX2NvZGluZ3R5cGUgPSBPTVhfVklERU9fQ29kaW5nSDI2MzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKCghc3RybmNtcChjbXBfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIuZGl2eHN3IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkpIHx8Ci0gICAgICAgICAgICAgKCghc3RybmNtcChjbXBfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJPTVgucXRpLnZpZGVvLmRlY29kZXIuZGl2eDRzdyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpKSkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygidmlkZW9fZGVjb2Rlci5kaXZ4Iik7Ci0KLSAgICAgICAgc3RybGNweShtX2NtcF9uYW1lLCAgICAgICAgICAgICAgY21wX25hbWUsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgc3RybGNweShtX3JvbGVfbmFtZSwgInZpZGVvX2RlY29kZXIuZGl2eCIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLQotICAgICAgICBtX3N3dmRlY19jb2RlYyAgICAgICAgID0gU1dWREVDX0NPREVDX01QRUc0OwotICAgICAgICBtX29teF92aWRlb19jb2Rpbmd0eXBlID0gKChPTVhfVklERU9fQ09ESU5HVFlQRSkgUU9NWF9WSURFT19Db2RpbmdEaXZ4KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoIiclcyc6IGludmFsaWQgY29tcG9uZW50IG5hbWUiLCBjbXBfbmFtZSk7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWU7Ci0gICAgICAgIGdvdG8gY29tcG9uZW50X2luaXRfZXhpdDsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIFNXVkRFQ19DQUxMQkFDSyBjYWxsYmFjazsKLQotICAgICAgICBTV1ZERUNfU1RBVFVTIHJldHZhbF9zd3ZkZWM7Ci0KLSAgICAgICAgY2FsbGJhY2sucGZuX2VtcHR5X2J1ZmZlcl9kb25lICA9IHN3dmRlY19lbXB0eV9idWZmZXJfZG9uZV9jYWxsYmFjazsKLSAgICAgICAgY2FsbGJhY2sucGZuX2ZpbGxfYnVmZmVyX2RvbmUgICA9IHN3dmRlY19maWxsX2J1ZmZlcl9kb25lX2NhbGxiYWNrOwotICAgICAgICBjYWxsYmFjay5wZm5fZXZlbnRfbm90aWZpY2F0aW9uID0gc3d2ZGVjX2V2ZW50X2hhbmRsZXJfY2FsbGJhY2s7Ci0gICAgICAgIGNhbGxiYWNrLnBfY2xpZW50ICAgICAgICAgICAgICAgPSB0aGlzOwotCi0gICAgICAgIGlmICgocmV0dmFsX3N3dmRlYyA9IHN3dmRlY19pbml0KCZtX3N3dmRlY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3d2ZGVjX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2spKSAhPQotICAgICAgICAgICAgU1dWREVDX1NUQVRVU19TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR2YWwgPSByZXR2YWxfc3d2ZGVjMm9teChyZXR2YWxfc3d2ZGVjKTsKLSAgICAgICAgICAgIGdvdG8gY29tcG9uZW50X2luaXRfZXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIG1fc3d2ZGVjX2NyZWF0ZWQgPSB0cnVlOwotCi0gICAgICAgIGlmICgocmV0dmFsID0gc2V0X2ZyYW1lX2RpbWVuc2lvbnMoREVGQVVMVF9GUkFNRV9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0ZSQU1FX0hFSUdIVCkpICE9Ci0gICAgICAgICAgICBPTVhfRXJyb3JOb25lKQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIGNvbXBvbmVudF9pbml0X2V4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBtX29teF9jb2xvcl9mb3JtYXR0eXBlID0KLSAgICAgICAgICAgICgoT01YX0NPTE9SX0ZPUk1BVFRZUEUpCi0gICAgICAgICAgICAgT01YX1FDT01fQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybSk7Ci0KLSAgICAgICAgaWYgKChyZXR2YWwgPSBzZXRfZnJhbWVfYXR0cmlidXRlcyhtX29teF9jb2xvcl9mb3JtYXR0eXBlKSkgIT0KLSAgICAgICAgICAgIE9NWF9FcnJvck5vbmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdvdG8gY29tcG9uZW50X2luaXRfZXhpdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgocmV0dmFsID0gZ2V0X2J1ZmZlcl9yZXF1aXJlbWVudHNfc3d2ZGVjKE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApKSAhPQotICAgICAgICBPTVhfRXJyb3JOb25lKQotICAgIHsKLSAgICAgICAgZ290byBjb21wb25lbnRfaW5pdF9leGl0OwotICAgIH0KLQotICAgIGlmICgocmV0dmFsID0gZ2V0X2J1ZmZlcl9yZXF1aXJlbWVudHNfc3d2ZGVjKE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApKSAhPQotICAgICAgICBPTVhfRXJyb3JOb25lKQotICAgIHsKLSAgICAgICAgZ290byBjb21wb25lbnRfaW5pdF9leGl0OwotICAgIH0KLQotICAgIGlmICgocmV0dmFsID0gYXN5bmNfdGhyZWFkX2NyZWF0ZSgpKSAhPSBPTVhfRXJyb3JOb25lKQotICAgIHsKLSAgICAgICAgZ290byBjb21wb25lbnRfaW5pdF9leGl0OwotICAgIH0KLQotICAgIGlmIChzZW1faW5pdCgmbV9zZW1fY21kLCAwLCAwKSkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGNvbW1hbmQgcHJvY2Vzc2luZyBzZW1hcGhvcmUiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIGdvdG8gY29tcG9uZW50X2luaXRfZXhpdDsKLSAgICB9Ci0KLSAgICBpZiAocHRocmVhZF9tdXRleF9pbml0KCZtX21ldGFfYnVmZmVyX2FycmF5X211dGV4LCBOVUxMKSkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIG1ldGEgYnVmZmVyIGluZm8gYXJyYXkgbXV0ZXgiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIGdvdG8gY29tcG9uZW50X2luaXRfZXhpdDsKLSAgICB9Ci0KLSAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJPTVhfU3RhdGVJbnZhbGlkIC0+IE9NWF9TdGF0ZUxvYWRlZCIpOwotCi0gICAgbV9zdGF0ZSA9IE9NWF9TdGF0ZUxvYWRlZDsKLQotY29tcG9uZW50X2luaXRfZXhpdDoKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBEZS1pbml0aWFsaXplIGNvbXBvbmVudC4KLSAqCi0gKiBAcGFyYW1baW5dIGNtcF9oYW5kbGU6IENvbXBvbmVudCBoYW5kbGUuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6Y29tcG9uZW50X2RlaW5pdChPTVhfSEFORExFVFlQRSBjbXBfaGFuZGxlKQotewotICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiIik7Ci0KLSAgICBpZiAoY21wX2hhbmRsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImNtcF9oYW5kbGUgPSBOVUxMIik7Ci0gICAgfQotCi0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtX21ldGFfYnVmZmVyX2FycmF5X211dGV4KTsKLQotICAgIHNlbV9kZXN0cm95KCZtX3NlbV9jbWQpOwotCi0gICAgYXN5bmNfdGhyZWFkX2Rlc3Ryb3koKTsKLQotICAgIGlmIChtX3N3dmRlY19jcmVhdGVkKQotICAgIHsKLSAgICAgICAgc3d2ZGVjX2RlaW5pdChtX3N3dmRlY19oYW5kbGUpOwotCi0gICAgICAgIG1fc3d2ZGVjX2hhbmRsZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgT01YX1NXVkRFQ19MT0dfSElHSCgiYWxsIGRvbmUsIGdvb2RieWUhIik7Ci0KLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLX0KLQotLyoqCi0gKiBAYnJpZWYgR2V0IGNvbXBvbmVudCB2ZXJzaW9uLgotICoKLSAqIEBwYXJhbVtpbl0gICAgIGNtcF9oYW5kbGU6ICAgICBDb21wb25lbnQgaGFuZGxlLgotICogQHBhcmFtW2luXSAgICAgY21wX25hbWU6ICAgICAgIENvbXBvbmVudCBuYW1lIHN0cmluZy4KLSAqIEBwYXJhbVtpbixvdXRdIHBfY21wX3ZlcnNpb246ICBQb2ludGVyIHRvIGNvbXBvbmVudCB2ZXJzaW9uIHZhcmlhYmxlLgotICogQHBhcmFtW2luLG91dF0gcF9zcGVjX3ZlcnNpb246IFBvaW50ZXIgdG8gT01YIHNwZWMgdmVyc2lvbiB2YXJpYWJsZS4KLSAqIEBwYXJhbVtpbixvdXRdIHBfY21wX1VVSUQ6ICAgICBQb2ludGVyIHRvIGNvbXBvbmVudCBVVUlEIHZhcmlhYmxlLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmdldF9jb21wb25lbnRfdmVyc2lvbihPTVhfSEFORExFVFlQRSAgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RSSU5HICAgICAgIGNtcF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZFUlNJT05UWVBFICpwX2NtcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZFUlNJT05UWVBFICpwX3NwZWNfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VVUlEVFlQRSAgICAqcF9jbXBfVVVJRCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICAodm9pZCkgcF9jbXBfVVVJRDsKLQotICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiIik7Ci0KLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImluIGludmFsaWQgc3RhdGUiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNtcF9oYW5kbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJjbXBfaGFuZGxlID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAoY21wX25hbWUsIG1fY21wX25hbWUsIHNpemVvZihtX2NtcF9uYW1lKSkpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiJyVzJzogaW52YWxpZCBjb21wb25lbnQgbmFtZSIsIGNtcF9uYW1lKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocF9jbXBfdmVyc2lvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfY21wX3ZlcnNpb24gPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICBlbHNlIGlmIChwX3NwZWNfdmVyc2lvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfc3BlY192ZXJzaW9uID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcF9zcGVjX3ZlcnNpb24tPm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICB9Ci0KLWdldF9jb21wb25lbnRfdmVyc2lvbl9leGl0OgotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIFNlbmQgY29tbWFuZCB0byBjb21wb25lbnQuCi0gKgotICogQHBhcmFtW2luXSBjbXBfaGFuZGxlOiBDb21wb25lbnQgaGFuZGxlLgotICogQHBhcmFtW2luXSBjbWQ6ICAgICAgICBDb21tYW5kLgotICogQHBhcmFtW2luXSBwYXJhbTogICAgICBDb21tYW5kIHBhcmFtZXRlci4KLSAqIEBwYXJhbVtpbl0gcF9jbWRfZGF0YTogUG9pbnRlciB0byBjb21tYW5kIGRhdGEuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6c2VuZF9jb21tYW5kKE9NWF9IQU5ETEVUWVBFICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTU1BTkRUWVBFIGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgICBwX2NtZF9kYXRhKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgICh2b2lkKSBwX2NtZF9kYXRhOyAvLyBwcmV2ZW50IHdhcm5pbmcgZm9yIHVudXNlZCBmdW5jdGlvbiBhcmd1bWVudAotCi0gICAgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJpbiBpbnZhbGlkIHN0YXRlIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICBnb3RvIHNlbmRfY29tbWFuZF9leGl0OwotICAgIH0KLSAgICBlbHNlIGlmIChjbXBfaGFuZGxlID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiY21wX2hhbmRsZSA9IE5VTEwiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50OwotICAgICAgICBnb3RvIHNlbmRfY29tbWFuZF9leGl0OwotICAgIH0KLQotICAgIHN3aXRjaCAoY21kKQotICAgIHsKLQotICAgIGNhc2UgT01YX0NvbW1hbmRTdGF0ZVNldDoKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiJXMsICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01NQU5EVFlQRV9TVFJJTkcoY21kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TVEFURVRZUEVfU1RSSU5HKChPTVhfU1RBVEVUWVBFKSBwYXJhbSkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE9NWF9Db21tYW5kRmx1c2g6Ci0gICAgY2FzZSBPTVhfQ29tbWFuZFBvcnREaXNhYmxlOgotICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RW5hYmxlOgotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCIlcywgcG9ydCBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NTUFORFRZUEVfU1RSSU5HKGNtZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSk7Ci0KLSAgICAgICAgaWYgKChwYXJhbSAhPSBPTVhfQ09SRV9QT1JUX0lOREVYX0lQKSAmJgotICAgICAgICAgICAgKHBhcmFtICE9IE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApICYmCi0gICAgICAgICAgICAocGFyYW0gIT0gT01YX0FMTCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsIHBhcmFtKTsKLQotICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiY21kICVkLCBwYXJhbSAlZCIsIGNtZCwgcGFyYW0pOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJjbWQgJyVkJyBpbnZhbGlkIiwgY21kKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIH0gLy8gc3dpdGNoIChjbWQpCi0KLSAgICBpZiAocmV0dmFsID09IE9NWF9FcnJvck5vbmUpCi0gICAgewotICAgICAgICBpZiAoY21wX2hhbmRsZSA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiY21wX2hhbmRsZSA9IE5VTEwiKTsKLQotICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJpbiBpbnZhbGlkIHN0YXRlIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXR2YWwgIT0gT01YX0Vycm9yTm9uZSkKLSAgICB7Ci0gICAgICAgIGFzeW5jX3Bvc3RfZXZlbnQoT01YX1NXVkRFQ19FVkVOVF9FUlJPUiwgcmV0dmFsLCAwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYXN5bmNfcG9zdF9ldmVudChPTVhfU1dWREVDX0VWRU5UX0NNRCwgY21kLCBwYXJhbSk7Ci0KLSAgICAgICAgc2VtX3dhaXQoJm1fc2VtX2NtZCk7Ci0gICAgfQotCi1zZW5kX2NvbW1hbmRfZXhpdDoKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBHZXQgYSBwYXJhbWV0ZXIgZnJvbSBjb21wb25lbnQuCi0gKgotICogQHBhcmFtW2luXSAgICAgY21wX2hhbmRsZTogICBDb21wb25lbnQgaGFuZGxlLgotICogQHBhcmFtW2luXSAgICAgcGFyYW1faW5kZXg6ICBQYXJhbWV0ZXIgaW5kZXguCi0gKiBAcGFyYW1baW4sb3V0XSBwX3BhcmFtX2RhdGE6IFBvaW50ZXIgdG8gcGFyYW1ldGVyIGRhdGEuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6Z2V0X3BhcmFtZXRlcihPTVhfSEFORExFVFlQRSBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgIHBhcmFtX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgIHBfcGFyYW1fZGF0YSkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImluIGludmFsaWQgc3RhdGUiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNtcF9oYW5kbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJjbXBfaGFuZGxlID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBfcGFyYW1fZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfcGFyYW1fZGF0YSA9IE5VTEwiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgaWYgKHJldHZhbCAhPSBPTVhfRXJyb3JOb25lKQotICAgIHsKLSAgICAgICAgZ290byBnZXRfcGFyYW1ldGVyX2V4aXQ7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwYXJhbV9pbmRleCkKLSAgICB7Ci0KLSAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Jbml0OgotICAgIHsKLSAgICAgICAgT01YX1BPUlRfUEFSQU1fVFlQRSAqcF9wb3J0X3BhcmFtID0KLSAgICAgICAgICAgIChPTVhfUE9SVF9QQVJBTV9UWVBFICopIHBfcGFyYW1fZGF0YTsKLQotICAgICAgICBwX3BvcnRfcGFyYW0tPm5Qb3J0cyAgICAgICAgICAgPSAwOwotICAgICAgICBwX3BvcnRfcGFyYW0tPm5TdGFydFBvcnROdW1iZXIgPSAwOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiT01YX0luZGV4UGFyYW1BdWRpb0luaXQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZCBwb3J0KHMpLCBzdGFydCBwb3J0IGluZGV4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9wYXJhbS0+blBvcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X3BhcmFtLT5uU3RhcnRQb3J0TnVtYmVyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfSW5kZXhQYXJhbUltYWdlSW5pdDoKLSAgICB7Ci0gICAgICAgIE9NWF9QT1JUX1BBUkFNX1RZUEUgKnBfcG9ydF9wYXJhbSA9Ci0gICAgICAgICAgICAoT01YX1BPUlRfUEFSQU1fVFlQRSAqKSBwX3BhcmFtX2RhdGE7Ci0KLSAgICAgICAgcF9wb3J0X3BhcmFtLT5uUG9ydHMgICAgICAgICAgID0gMDsKLSAgICAgICAgcF9wb3J0X3BhcmFtLT5uU3RhcnRQb3J0TnVtYmVyID0gMDsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoIk9NWF9JbmRleFBhcmFtSW1hZ2VJbml0OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgcG9ydChzKSwgc3RhcnQgcG9ydCBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfcGFyYW0tPm5Qb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9wYXJhbS0+blN0YXJ0UG9ydE51bWJlcik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0luaXQ6Ci0gICAgewotICAgICAgICBPTVhfUE9SVF9QQVJBTV9UWVBFICpwX3BvcnRfcGFyYW0gPQotICAgICAgICAgICAgKE9NWF9QT1JUX1BBUkFNX1RZUEUgKikgcF9wYXJhbV9kYXRhOwotCi0gICAgICAgIHBfcG9ydF9wYXJhbS0+blBvcnRzICAgICAgICAgICA9IDI7Ci0gICAgICAgIHBfcG9ydF9wYXJhbS0+blN0YXJ0UG9ydE51bWJlciA9IDA7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJPTVhfSW5kZXhQYXJhbVZpZGVvSW5pdDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIHBvcnQocyksIHN0YXJ0IHBvcnQgaW5kZXggJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X3BhcmFtLT5uUG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfcGFyYW0tPm5TdGFydFBvcnROdW1iZXIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE9NWF9JbmRleFBhcmFtT3RoZXJJbml0OgotICAgIHsKLSAgICAgICAgT01YX1BPUlRfUEFSQU1fVFlQRSAqcF9wb3J0X3BhcmFtID0KLSAgICAgICAgICAgIChPTVhfUE9SVF9QQVJBTV9UWVBFICopIHBfcGFyYW1fZGF0YTsKLQotICAgICAgICBwX3BvcnRfcGFyYW0tPm5Qb3J0cyAgICAgICAgICAgPSAwOwotICAgICAgICBwX3BvcnRfcGFyYW0tPm5TdGFydFBvcnROdW1iZXIgPSAwOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiT01YX0luZGV4UGFyYW1PdGhlckluaXQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZCBwb3J0KHMpLCBzdGFydCBwb3J0IGluZGV4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9wYXJhbS0+blBvcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X3BhcmFtLT5uU3RhcnRQb3J0TnVtYmVyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfSW5kZXhDb25maWdQcmlvcml0eU1nbXQ6Ci0gICAgewotICAgICAgICBPTVhfUFJJT1JJVFlNR01UVFlQRSAqcF9wcmlvX21nbXQgPQotICAgICAgICAgICAgKE9NWF9QUklPUklUWU1HTVRUWVBFICopIHBfcGFyYW1fZGF0YTsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoIk9NWF9JbmRleENvbmZpZ1ByaW9yaXR5TWdtdCIpOwotCi0gICAgICAgIG1lbWNweShwX3ByaW9fbWdtdCwgJm1fcHJpb19tZ210LCBzaXplb2YoT01YX1BSSU9SSVRZTUdNVFRZUEUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKLSAgICB7Ci0gICAgICAgIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcF9jbXBfcm9sZSA9Ci0gICAgICAgICAgICAoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopIHBfcGFyYW1fZGF0YTsKLQotICAgICAgICBzdHJsY3B5KChjaGFyICopIHBfY21wX3JvbGUtPmNSb2xlLAotICAgICAgICAgICAgICAgIG1fcm9sZV9uYW1lLAotICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoIk9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NtcF9yb2xlLT5jUm9sZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKLSAgICB7Ci0gICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBfcG9ydF9kZWYgPQotICAgICAgICAgICAgKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKikgcF9wYXJhbV9kYXRhOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgcG9ydCBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5uUG9ydEluZGV4KTsKLQotICAgICAgICByZXR2YWwgPSBnZXRfcG9ydF9kZWZpbml0aW9uKHBfcG9ydF9kZWYpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyOgotICAgIHsKLSAgICAgICAgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqcF9idWZmZXJfc3VwcGxpZXIgPQotICAgICAgICAgICAgKE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgKikgcF9wYXJhbV9kYXRhOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiT01YX0luZGV4UGFyYW1Db21wQnVmZmVyU3VwcGxpZXIsIHBvcnQgaW5kZXggJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfc3VwcGxpZXItPm5Qb3J0SW5kZXgpOwotCi0gICAgICAgIGlmICgocF9idWZmZXJfc3VwcGxpZXItPm5Qb3J0SW5kZXggPT0gT01YX0NPUkVfUE9SVF9JTkRFWF9JUCkgfHwKLSAgICAgICAgICAgIChwX2J1ZmZlcl9zdXBwbGllci0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX09QKSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9idWZmZXJfc3VwcGxpZXItPmVCdWZmZXJTdXBwbGllciA9IE9NWF9CdWZmZXJTdXBwbHlVbnNwZWNpZmllZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9zdXBwbGllci0+blBvcnRJbmRleCk7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6Ci0gICAgewotICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKnBfcG9ydF9mb3JtYXQgPQotICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKSBwX3BhcmFtX2RhdGE7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgaW5kZXggJWQsIGluZGV4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9mb3JtYXQtPm5Qb3J0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZm9ybWF0LT5uSW5kZXgpOwotCi0gICAgICAgIHJldHZhbCA9IGdldF92aWRlb19wb3J0X2Zvcm1hdChwX3BvcnRfZm9ybWF0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzI6Ci0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiT01YX0luZGV4UGFyYW1WaWRlb01wZWcyOiB1bnN1cHBvcnRlZCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb01wZWc0OgotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzQ6IHVuc3VwcG9ydGVkIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjOgotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJPTVhfSW5kZXhQYXJhbVZpZGVvQXZjOiB1bnN1cHBvcnRlZCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0gyNjM6Ci0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoIk9NWF9JbmRleFBhcmFtVmlkZW9IMjYzOiB1bnN1cHBvcnRlZCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkOgotICAgIHsKLSAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBfcHJvZmlsZWxldmVsID0KLSAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqKSBwX3BhcmFtX2RhdGE7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IGluZGV4ICVkLCBwcm9maWxlIGluZGV4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJvZmlsZWxldmVsLT5uUG9ydEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcm9maWxlbGV2ZWwtPm5Qcm9maWxlSW5kZXgpOwotCi0gICAgICAgIHJldHZhbCA9IGdldF9zdXBwb3J0ZWRfcHJvZmlsZWxldmVsKHBfcHJvZmlsZWxldmVsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBWZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9uIGluZGljZXMgY2hlY2tlZCBoZXJlIHNpbmNlIHRoZXkgYXJlIG5vdAotICAgICAgICAgKiBwYXJ0IG9mIHRoZSBPTVhfSU5ERVhUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLSAgICAgICAgICovCi0KLSAgICAgICAgc3dpdGNoICgoT01YX1FDT01fRVhUTl9JTkRFWFRZUEUpIHBhcmFtX2luZGV4KQotICAgICAgICB7Ci0KLSAgICAgICAgY2FzZSBPTVhfR29vZ2xlQW5kcm9pZEluZGV4R2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlclVzYWdlOgotICAgICAgICB7Ci0gICAgICAgICAgICBHZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2VQYXJhbXMgKnBfYnVmZmVyX3VzYWdlID0KLSAgICAgICAgICAgICAgICAoR2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlclVzYWdlUGFyYW1zICopIHBfcGFyYW1fZGF0YTsKLQotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKAotICAgICAgICAgICAgICAgICJPTVhfR29vZ2xlQW5kcm9pZEluZGV4R2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlclVzYWdlLCAiCi0gICAgICAgICAgICAgICAgInBvcnQgaW5kZXggJWQiLCBwX2J1ZmZlcl91c2FnZS0+blBvcnRJbmRleCk7Ci0KLSAgICAgICAgICAgIGlmIChwX2J1ZmZlcl91c2FnZS0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX09QKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBfYnVmZmVyX3VzYWdlLT5uVXNhZ2UgPSAoR1JBTExPQ19VU0FHRV9QUklWQVRFX0lPTU1VX0hFQVAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfdXNhZ2UtPm5Qb3J0SW5kZXgpOwotCi0gICAgICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhGbGV4aWJsZVlVVkRlc2NyaXB0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoIk9NWF9RY29tSW5kZXhGbGV4aWJsZVlVVkRlc2NyaXB0aW9uIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IGRlc2NyaWJlX2NvbG9yX2Zvcm1hdCgoRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcGFyYW1fZGF0YSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwYXJhbSBpbmRleCAnMHglMDh4JyBpbnZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUUNPTV9FWFROX0lOREVYVFlQRSkgcGFyYW1faW5kZXgpOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIH0gLy8gc3dpdGNoICgoT01YX1FDT01fRVhUTl9JTkRFWFRZUEUpIHBhcmFtX2luZGV4KQotCi0gICAgfSAvLyBkZWZhdWx0IGNhc2UKLQotICAgIH0gLy8gc3dpdGNoIChwYXJhbV9pbmRleCkKLQotZ2V0X3BhcmFtZXRlcl9leGl0OgotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIFNldCBhIHBhcmFtZXRlciB0byBjb21wb25lbnQuCi0gKgotICogQHBhcmFtW2luXSBjbXBfaGFuZGxlOiAgIENvbXBvbmVudCBoYW5kbGUuCi0gKiBAcGFyYW1baW5dIHBhcmFtX2luZGV4OiAgUGFyYW1ldGVyIGluZGV4LgotICogQHBhcmFtW2luXSBwX3BhcmFtX2RhdGE6IFBvaW50ZXIgdG8gcGFyYW1ldGVyIGRhdGEuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6c2V0X3BhcmFtZXRlcihPTVhfSEFORExFVFlQRSBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgIHBhcmFtX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgIHBfcGFyYW1fZGF0YSkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImluIGludmFsaWQgc3RhdGUiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNtcF9oYW5kbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJjbXBfaGFuZGxlID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBfcGFyYW1fZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfcGFyYW1fZGF0YSA9IE5VTEwiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotICAgIGVsc2UgaWYgKChtX3N0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYKLSAgICAgICAgICAgICAobV9wb3J0X3JlY29uZmlnX2lucHJvZ3Jlc3MgPT0gZmFsc2UpKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImRpc2FsbG93ZWQgaW4gc3RhdGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RBVEVUWVBFX1NUUklORyhtX3N0YXRlKSk7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247Ci0gICAgfQotCi0gICAgaWYgKHJldHZhbCAhPSBPTVhfRXJyb3JOb25lKQotICAgIHsKLSAgICAgICAgZ290byBzZXRfcGFyYW1ldGVyX2V4aXQ7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwYXJhbV9pbmRleCkKLSAgICB7Ci0KLSAgICBjYXNlIE9NWF9JbmRleFBhcmFtUHJpb3JpdHlNZ210OgotICAgIHsKLSAgICAgICAgT01YX1BSSU9SSVRZTUdNVFRZUEUgKnBfcHJpb19tZ210ID0KLSAgICAgICAgICAgIChPTVhfUFJJT1JJVFlNR01UVFlQRSAqKSBwX3BhcmFtX2RhdGE7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJPTVhfSW5kZXhDb25maWdQcmlvcml0eU1nbXQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cCBJRCAlZCwgZ3JvdXAgcHJpb3JpdHkgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmlvX21nbXQtPm5Hcm91cElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmlvX21nbXQtPm5Hcm91cFByaW9yaXR5KTsKLQotICAgICAgICBpZiAobV9zdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCInJWQnIHN0YXRlIGludmFsaWQ7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgYmUgaW4gbG9hZGVkIHN0YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUpOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgmbV9wcmlvX21nbXQsIHBfcHJpb19tZ210LCBzaXplb2YoT01YX1BSSU9SSVRZTUdNVFRZUEUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6Ci0gICAgewotICAgICAgICBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnBfY21wX3JvbGUgPQotICAgICAgICAgICAgKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKSBwX3BhcmFtX2RhdGE7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZSAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY21wX3JvbGUtPmNSb2xlKTsKLQotICAgICAgICBpZiAobV9zdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCInJWQnIHN0YXRlIGludmFsaWQ7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgYmUgaW4gbG9hZGVkIHN0YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUpOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJuY21wKChjaGFyICopIHBfY21wX3JvbGUtPmNSb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9yb2xlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoIiclcyc6IGludmFsaWQgY29tcG9uZW50IHJvbGUgbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jbXBfcm9sZS0+Y1JvbGUpOwotCi0gICAgICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOgotICAgIHsKLSAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcF9wb3J0X2RlZiA9Ci0gICAgICAgICAgICAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKSBwX3BhcmFtX2RhdGE7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCBwb3J0IGluZGV4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPm5Qb3J0SW5kZXgpOwotCi0gICAgICAgIGlmICgobV9zdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmCi0gICAgICAgICAgICAoKChwX3BvcnRfZGVmLT5uUG9ydEluZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApICYmCi0gICAgICAgICAgICAgIChtX3BvcnRfaXAuZW5hYmxlZCAgICAgID09IE9NWF9UUlVFKSAmJgotICAgICAgICAgICAgICAobV9wb3J0X2lwLnBvcHVsYXRlZCAgICA9PSBPTVhfVFJVRSkpIHx8Ci0gICAgICAgICAgICAgKChwX3BvcnRfZGVmLT5uUG9ydEluZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApICYmCi0gICAgICAgICAgICAgIChtX3BvcnRfb3AuZW5hYmxlZCAgICAgID09IE9NWF9UUlVFKSAmJgotICAgICAgICAgICAgICAobV9wb3J0X29wLnBvcHVsYXRlZCAgICA9PSBPTVhfVFJVRSkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoIk9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93ZWQgaW4gc3RhdGUgJXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoaWxlIHBvcnQgaW5kZXggJWQgaXMgZW5hYmxlZCAmIHBvcHVsYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RBVEVUWVBFX1NUUklORyhtX3N0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPm5Qb3J0SW5kZXgpOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHZhbCA9IHNldF9wb3J0X2RlZmluaXRpb24ocF9wb3J0X2RlZik7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyOgotICAgIHsKLSAgICAgICAgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqcF9idWZmZXJfc3VwcGxpZXIgPQotICAgICAgICAgICAgKE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgKikgcF9wYXJhbV9kYXRhOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiT01YX0luZGV4UGFyYW1Db21wQnVmZmVyU3VwcGxpZXI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IGluZGV4ICVkLCBidWZmZXIgc3VwcGxpZXIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfc3VwcGxpZXItPm5Qb3J0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBwX2J1ZmZlcl9zdXBwbGllci0+ZUJ1ZmZlclN1cHBsaWVyKTsKLQotICAgICAgICBpZiAoKHBfYnVmZmVyX3N1cHBsaWVyLT5uUG9ydEluZGV4ICE9IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApICYmCi0gICAgICAgICAgICAocF9idWZmZXJfc3VwcGxpZXItPm5Qb3J0SW5kZXggIT0gT01YX0NPUkVfUE9SVF9JTkRFWF9PUCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9zdXBwbGllci0+blBvcnRJbmRleCk7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6Ci0gICAgewotICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKnBfcG9ydF9mb3JtYXQgPQotICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKSBwX3BhcmFtX2RhdGE7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdCwgcG9ydCBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZm9ybWF0LT5uUG9ydEluZGV4KTsKLQotICAgICAgICBpZiAoKG1fc3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSAmJgotICAgICAgICAgICAgKCgocF9wb3J0X2Zvcm1hdC0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX0lQKSAmJgotICAgICAgICAgICAgICAobV9wb3J0X2lwLmVuYWJsZWQgICAgICAgICA9PSBPTVhfVFJVRSkgJiYKLSAgICAgICAgICAgICAgKG1fcG9ydF9pcC5wb3B1bGF0ZWQgICAgICAgPT0gT01YX1RSVUUpKSB8fAotICAgICAgICAgICAgICgocF9wb3J0X2Zvcm1hdC0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX09QKSAmJgotICAgICAgICAgICAgICAobV9wb3J0X29wLmVuYWJsZWQgICAgICAgICA9PSBPTVhfVFJVRSkgJiYKLSAgICAgICAgICAgICAgKG1fcG9ydF9vcC5wb3B1bGF0ZWQgICAgICAgPT0gT01YX1RSVUUpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzYWxsb3dlZCBpbiBzdGF0ZSAlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpbGUgcG9ydCBpbmRleCAlZCBpcyBlbmFibGVkICYgcG9wdWxhdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TVEFURVRZUEVfU1RSSU5HKG1fc3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X2Zvcm1hdC0+blBvcnRJbmRleCk7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dmFsID0gc2V0X3ZpZGVvX3BvcnRfZm9ybWF0KHBfcG9ydF9mb3JtYXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzI6Ci0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiT01YX0luZGV4UGFyYW1WaWRlb01wZWcyIHVuc3VwcG9ydGVkIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzQ6Ci0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoIk9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNCB1bnN1cHBvcnRlZCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0F2YzoKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiT01YX0luZGV4UGFyYW1WaWRlb0F2YyB1bnN1cHBvcnRlZCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0gyNjM6Ci0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoIk9NWF9JbmRleFBhcmFtVmlkZW9IMjYzIHVuc3VwcG9ydGVkIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBWZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9uIGluZGljZXMgY2hlY2tlZCBoZXJlIHNpbmNlIHRoZXkgYXJlIG5vdAotICAgICAgICAgKiBwYXJ0IG9mIHRoZSBPTVhfSU5ERVhUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLSAgICAgICAgICovCi0KLSAgICAgICAgc3dpdGNoICgoT01YX1FDT01fRVhUTl9JTkRFWFRZUEUpIHBhcmFtX2luZGV4KQotICAgICAgICB7Ci0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UG9ydERlZm46Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9RQ09NX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcF9wb3J0X2RlZiA9Ci0gICAgICAgICAgICAgICAgKE9NWF9RQ09NX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKSBwX3BhcmFtX2RhdGE7Ci0KLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiT01YX1Fjb21JbmRleFBvcnREZWZuLCBwb3J0IGluZGV4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5uUG9ydEluZGV4KTsKLQotICAgICAgICAgICAgaWYgKChtX3N0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYKLSAgICAgICAgICAgICAgICAoKChwX3BvcnRfZGVmLT5uUG9ydEluZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApICYmCi0gICAgICAgICAgICAgICAgICAobV9wb3J0X2lwLmVuYWJsZWQgICAgICA9PSBPTVhfVFJVRSkgJiYKLSAgICAgICAgICAgICAgICAgIChtX3BvcnRfaXAucG9wdWxhdGVkICAgID09IE9NWF9UUlVFKSkgfHwKLSAgICAgICAgICAgICAgICAgKChwX3BvcnRfZGVmLT5uUG9ydEluZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApICYmCi0gICAgICAgICAgICAgICAgICAobV9wb3J0X29wLmVuYWJsZWQgICAgICA9PSBPTVhfVFJVRSkgJiYKLSAgICAgICAgICAgICAgICAgIChtX3BvcnRfb3AucG9wdWxhdGVkICAgID09IE9NWF9UUlVFKSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJPTVhfUWNvbUluZGV4UG9ydERlZm4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd2VkIGluIHN0YXRlICVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpbGUgcG9ydCBpbmRleCAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIGVuYWJsZWQgJiBwb3B1bGF0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TVEFURVRZUEVfU1RSSU5HKG1fc3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPm5Qb3J0SW5kZXgpOwotCi0gICAgICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gc2V0X3BvcnRfZGVmaW5pdGlvbl9xY29tKHBfcG9ydF9kZWYpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9EaXZ4OgotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoIk9NWF9RY29tSW5kZXhQYXJhbVZpZGVvRGl2eCIpOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9TeW5jRnJhbWVEZWNvZGluZ01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiT01YX1Fjb21JbmRleFBhcmFtVmlkZW9TeW5jRnJhbWVEZWNvZGluZ01vZGUiKTsKLQotICAgICAgICAgICAgbV9zeW5jX2ZyYW1lX2RlY29kaW5nX21vZGUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvRGVjb2RlclBpY3R1cmVPcmRlcjoKLSAgICAgICAgewotICAgICAgICAgICAgUU9NWF9WSURFT19ERUNPREVSX1BJQ1RVUkVfT1JERVIgKnBfcGljdHVyZV9vcmRlciA9Ci0gICAgICAgICAgICAgICAgKFFPTVhfVklERU9fREVDT0RFUl9QSUNUVVJFX09SREVSICopIHBfcGFyYW1fZGF0YTsKLQotICAgICAgICAgICAgc3dpdGNoIChwX3BpY3R1cmVfb3JkZXItPmVPdXRwdXRQaWN0dXJlT3JkZXIpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgIGNhc2UgUU9NWF9WSURFT19ESVNQTEFZX09SREVSOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgKLSAgICAgICAgICAgICAgICAgICAgIk9NWF9RY29tSW5kZXhQYXJhbVZpZGVvRGVjb2RlclBpY3R1cmVPcmRlciwgIgotICAgICAgICAgICAgICAgICAgICAiUU9NWF9WSURFT19ESVNQTEFZX09SREVSIik7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBRT01YX1ZJREVPX0RFQ09ERV9PUkRFUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoCi0gICAgICAgICAgICAgICAgICAgICJPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0RlY29kZXJQaWN0dXJlT3JkZXIsICIKLSAgICAgICAgICAgICAgICAgICAgIlFPTVhfVklERU9fREVDT0RFX09SREVSIik7Ci0KLSAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigKLSAgICAgICAgICAgICAgICAgICAgIk9NWF9RY29tSW5kZXhQYXJhbVZpZGVvRGVjb2RlclBpY3R1cmVPcmRlciwgIgotICAgICAgICAgICAgICAgICAgICAiUU9NWF9WSURFT19ERUNPREVfT1JERVI7IHVuc3VwcG9ydGVkIik7Ci0KLSAgICAgICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoCi0gICAgICAgICAgICAgICAgICAgICJPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0RlY29kZXJQaWN0dXJlT3JkZXIsICVkOyBpbnZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgcF9waWN0dXJlX29yZGVyLT5lT3V0cHV0UGljdHVyZU9yZGVyKTsKLQotICAgICAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0dvb2dsZUFuZHJvaWRJbmRleEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzOgotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoCi0gICAgICAgICAgICAgICAgIk9NWF9Hb29nbGVBbmRyb2lkSW5kZXhFbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVycywgJXMiLAotICAgICAgICAgICAgICAgICgoKEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zICopIHBfcGFyYW1fZGF0YSktPmVuYWJsZSA/Ci0gICAgICAgICAgICAgICAgICJlbmFibGUiIDoKLSAgICAgICAgICAgICAgICAgImRpc2FibGUiKSk7Ci0KLSAgICAgICAgICAgIG1fYW5kcm9pZF9uYXRpdmVfYnVmZmVycyA9Ci0gICAgICAgICAgICAgICAgKGJvb2wpICgoKEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9wYXJhbV9kYXRhKS0+ZW5hYmxlKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9Hb29nbGVBbmRyb2lkSW5kZXhVc2VBbmRyb2lkTmF0aXZlQnVmZmVyOgotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiT01YX0dvb2dsZUFuZHJvaWRJbmRleFVzZUFuZHJvaWROYXRpdmVCdWZmZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtRW5hYmxlVGltZVN0YW1wUmVvcmRlcjoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKAotICAgICAgICAgICAgICAgICJPTVhfUWNvbUluZGV4UGFyYW1FbmFibGVUaW1lU3RhbXBSZW9yZGVyLCAlcyIsCi0gICAgICAgICAgICAgICAgKCgoUU9NWF9JTkRFWFRJTUVTVEFNUFJFT1JERVIgKikgcF9wYXJhbV9kYXRhKS0+YkVuYWJsZSA/Ci0gICAgICAgICAgICAgICAgICJlbmFibGUiIDoKLSAgICAgICAgICAgICAgICAgImRpc2FibGUiKSk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb01ldGFCdWZmZXJNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzUGFyYW1zICpwX21ldGFfZGF0YSA9Ci0gICAgICAgICAgICAgICAgKFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMgKikgcF9wYXJhbV9kYXRhOwotCi0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoIk9NWF9RY29tSW5kZXhQYXJhbVZpZGVvTWV0YUJ1ZmZlck1vZGUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCBpbmRleCAlZCwgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWV0YV9kYXRhLT5uUG9ydEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwX21ldGFfZGF0YS0+YlN0b3JlTWV0YURhdGEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNhYmxlIikpOwotCi0gICAgICAgICAgICBpZiAocF9tZXRhX2RhdGEtPm5Qb3J0SW5kZXggPT0gT01YX0NPUkVfUE9SVF9JTkRFWF9PUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocF9tZXRhX2RhdGEtPmJTdG9yZU1ldGFEYXRhICYmIG1fbWV0YV9idWZmZXJfbW9kZV9kaXNhYmxlZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJtZXRhIGJ1ZmZlciBtb2RlIGRpc2FibGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpYSBBREIgc2V0cHJvcDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ29teF9zd3ZkZWMubWV0YV9idWZmZXIuZGlzYWJsZSciKTsKLQotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fbWV0YV9idWZmZXJfbW9kZSA9IChib29sKSBwX21ldGFfZGF0YS0+YlN0b3JlTWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tZXRhX2RhdGEtPm5Qb3J0SW5kZXgpOwotCi0gICAgICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9BZGFwdGl2ZVBsYXliYWNrTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tQYXJhbXMgKnBfYWRhcHRpdmVfcGxheWJhY2tfcGFyYW1zID0KLSAgICAgICAgICAgICAgICAoUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tQYXJhbXMgKikgcF9wYXJhbV9kYXRhOwotCi0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoIk9NWF9RY29tSW5kZXhQYXJhbVZpZGVvQWRhcHRpdmVQbGF5YmFja01vZGUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCBpbmRleCAlZCwgJXMsIG1heCBkaW1lbnNpb25zOiAlZCB4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FkYXB0aXZlX3BsYXliYWNrX3BhcmFtcy0+blBvcnRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9hZGFwdGl2ZV9wbGF5YmFja19wYXJhbXMtPmJFbmFibGUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNhYmxlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hZGFwdGl2ZV9wbGF5YmFja19wYXJhbXMtPm5NYXhGcmFtZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYWRhcHRpdmVfcGxheWJhY2tfcGFyYW1zLT5uTWF4RnJhbWVIZWlnaHQpOwotCi0gICAgICAgICAgICBpZiAocF9hZGFwdGl2ZV9wbGF5YmFja19wYXJhbXMtPm5Qb3J0SW5kZXggPT0KLSAgICAgICAgICAgICAgICBPTVhfQ09SRV9QT1JUX0lOREVYX09QKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwX2FkYXB0aXZlX3BsYXliYWNrX3BhcmFtcy0+YkVuYWJsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fYWRhcHRpdmVfcGxheWJhY2tfbW9kZSA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9hZGFwdGl2ZV9wbGF5YmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FkYXB0aXZlX3BsYXliYWNrX3BhcmFtcy0+bk1heEZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hZGFwdGl2ZV9wbGF5YmFja19wYXJhbXMtPm5NYXhGcmFtZUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hZGFwdGl2ZV9wbGF5YmFja19wYXJhbXMtPm5Qb3J0SW5kZXgpOwotCi0gICAgICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwYXJhbSBpbmRleCAnMHglMDh4JyBpbnZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUUNPTV9FWFROX0lOREVYVFlQRSkgcGFyYW1faW5kZXgpOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIH0gLy8gc3dpdGNoICgoT01YX1FDT01fRVhUTl9JTkRFWFRZUEUpIHBhcmFtX2luZGV4KQotCi0gICAgICAgIGJyZWFrOwotICAgIH0gLy8gZGVmYXVsdCBjYXNlCi0KLSAgICB9IC8vIHN3aXRjaCAocGFyYW1faW5kZXgpCi0KLXNldF9wYXJhbWV0ZXJfZXhpdDoKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBHZXQgYSBjb25maWd1cmF0aW9uIGZyb20gY29tcG9uZW50LgotICoKLSAqIEBwYXJhbVtpbl0gY21wX2hhbmRsZTogICAgQ29tcG9uZW50IGhhbmRsZS4KLSAqIEBwYXJhbVtpbl0gY29uZmlnX2luZGV4OiAgQ29uZmlndXJhdGlvbiBpbmRleC4KLSAqIEBwYXJhbVtpbl0gcF9jb25maWdfZGF0YTogUG9pbnRlciB0byBjb25maWd1cmF0aW9uIGRhdGEuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6Z2V0X2NvbmZpZyhPTVhfSEFORExFVFlQRSBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgIGNvbmZpZ19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICBwX2NvbmZpZ19kYXRhKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaW4gaW52YWxpZCBzdGF0ZSIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY21wX2hhbmRsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImNtcF9oYW5kbGUgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKLSAgICB9Ci0gICAgZWxzZSBpZiAocF9jb25maWdfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfY29uZmlnX2RhdGEgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGlmIChyZXR2YWwgIT0gT01YX0Vycm9yTm9uZSkKLSAgICB7Ci0gICAgICAgIGdvdG8gZ2V0X2NvbmZpZ19leGl0OwotICAgIH0KLQotICAgIHN3aXRjaCAoY29uZmlnX2luZGV4KQotICAgIHsKLQotICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcDoKLSAgICB7Ci0gICAgICAgIE9NWF9DT05GSUdfUkVDVFRZUEUgKnBfcmVjdHR5cGUgPSAoT01YX0NPTkZJR19SRUNUVFlQRSAqKSBwX2NvbmZpZ19kYXRhOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwgcG9ydCBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3JlY3R0eXBlLT5uUG9ydEluZGV4KTsKLQotICAgICAgICBpZiAocF9yZWN0dHlwZS0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX09QKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobV9kaW1lbnNpb25zX3VwZGF0ZV9pbnByb2dyZXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IGdldF9mcmFtZV9kaW1lbnNpb25zX3N3dmRlYygpOwotCi0gICAgICAgICAgICAgICAgbV9kaW1lbnNpb25zX3VwZGF0ZV9pbnByb2dyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gT01YX0Vycm9yTm9uZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwX3JlY3R0eXBlLT5uTGVmdCAgID0gMDsKLSAgICAgICAgICAgICAgICBwX3JlY3R0eXBlLT5uVG9wICAgID0gMDsKLSAgICAgICAgICAgICAgICBwX3JlY3R0eXBlLT5uV2lkdGggID0gbV9mcmFtZV9kaW1lbnNpb25zLndpZHRoOwotICAgICAgICAgICAgICAgIHBfcmVjdHR5cGUtPm5IZWlnaHQgPSBtX2ZyYW1lX2RpbWVuc2lvbnMuaGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBvcnQgaW5kZXggJyVkJyBpbnZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVjdHR5cGUtPm5Qb3J0SW5kZXgpOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgIHsKLSAgICAgICAgc3dpdGNoICgoT01YX1FDT01fRVhUTl9JTkRFWFRZUEUpIGNvbmZpZ19pbmRleCkKLSAgICAgICAgewotCi0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleENvbmZpZ0ludGVybGFjZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9RQ09NX0NPTkZJR19JTlRFUkxBQ0VUWVBFICpwX2NvbmZpZ19pbnRlcmxhY2V0eXBlID0KLSAgICAgICAgICAgICAgICAoT01YX1FDT01fQ09ORklHX0lOVEVSTEFDRVRZUEUgKikgcF9jb25maWdfZGF0YTsKLQotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJPTVhfUWNvbUluZGV4Q29uZmlnSW50ZXJsYWNlZCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IGluZGV4ICVkLCBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jb25maWdfaW50ZXJsYWNldHlwZS0+blBvcnRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NvbmZpZ19pbnRlcmxhY2V0eXBlLT5uSW5kZXgpOwotCi0gICAgICAgICAgICBpZiAocF9jb25maWdfaW50ZXJsYWNldHlwZS0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX09QKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwX2NvbmZpZ19pbnRlcmxhY2V0eXBlLT5uSW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBfY29uZmlnX2ludGVybGFjZXR5cGUtPmVJbnRlcmxhY2VUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9RQ09NX0ludGVybGFjZUZyYW1lUHJvZ3Jlc3NpdmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBfY29uZmlnX2ludGVybGFjZXR5cGUtPm5JbmRleCA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcF9jb25maWdfaW50ZXJsYWNldHlwZS0+ZUludGVybGFjZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1FDT01fSW50ZXJsYWNlSW50ZXJsZWF2ZUZyYW1lVG9wRmllbGRGaXJzdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocF9jb25maWdfaW50ZXJsYWNldHlwZS0+bkluZGV4ID09IDIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwX2NvbmZpZ19pbnRlcmxhY2V0eXBlLT5lSW50ZXJsYWNlVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUUNPTV9JbnRlcmxhY2VJbnRlcmxlYXZlRnJhbWVCb3R0b21GaWVsZEZpcnN0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaW5kZXggJyVkJyB1bnN1cHBvcnRlZDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gbW9yZSBpbnRlcmxhY2VkIHR5cGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jb25maWdfaW50ZXJsYWNldHlwZS0+bkluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jb25maWdfaW50ZXJsYWNldHlwZS0+blBvcnRJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UXVlcnlOdW1iZXJPZlZpZGVvRGVjSW5zdGFuY2U6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFFPTVhfVklERU9fUVVFUllfREVDT0RFUl9JTlNUQU5DRVMgKnBfZGVjb2Rlcl9pbnN0YW5jZXMgPQotICAgICAgICAgICAgICAgIChRT01YX1ZJREVPX1FVRVJZX0RFQ09ERVJfSU5TVEFOQ0VTICopIHBfY29uZmlnX2RhdGE7Ci0KLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiT01YX1Fjb21JbmRleFF1ZXJ5TnVtYmVyT2ZWaWRlb0RlY0luc3RhbmNlIik7Ci0KLSAgICAgICAgICAgIHBfZGVjb2Rlcl9pbnN0YW5jZXMtPm5OdW1PZkluc3RhbmNlcyA9IE9NWF9TV1ZERUNfTlVNX0lOU1RBTkNFUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4Q29uZmlnVmlkZW9GcmFtZVBhY2tpbmdBcnJhbmdlbWVudDoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKAotICAgICAgICAgICAgICAgICJPTVhfUWNvbUluZGV4Q29uZmlnVmlkZW9GcmFtZVBhY2tpbmdBcnJhbmdlbWVudCIpOwotCi0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigKLSAgICAgICAgICAgICAgICAiT01YX1Fjb21JbmRleENvbmZpZ1ZpZGVvRnJhbWVQYWNraW5nQXJyYW5nZW1lbnQgdW5zdXBwb3J0ZWQiKTsKLQotICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImNvbmZpZyBpbmRleCAnMHglMDh4JyBpbnZhbGlkIiwgY29uZmlnX2luZGV4KTsKLQotICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICB9IC8vIHN3aXRjaCAoKE9NWF9RQ09NX0VYVE5fSU5ERVhUWVBFKSBjb25maWdfaW5kZXgpCi0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgfSAvLyBzd2l0Y2ggKGNvbmZpZ19pbmRleCkKLQotZ2V0X2NvbmZpZ19leGl0OgotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIFNldCBhIGNvbmZpZ3VyYXRpb24gdG8gY29tcG9uZW50LgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OnNldF9jb25maWcoT01YX0hBTkRMRVRZUEUgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFICBjb25maWdfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgcF9jb25maWdfZGF0YSkKLXsKLSAgICAodm9pZCkgY21wX2hhbmRsZTsKLSAgICAodm9pZCkgcF9jb25maWdfZGF0YTsKLQotICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiY29uZmlnIGluZGV4IDB4JTA4eCIsIGNvbmZpZ19pbmRleCk7Ci0KLSAgICBPTVhfU1dWREVDX0xPR19FUlJPUigibm90IGltcGxlbWVudGVkIik7Ci0KLSAgICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci19Ci0KLS8qKgotICogQGJyaWVmIFRyYW5zbGF0ZSBhIHZlbmRvci1zcGVjaWZpYyBleHRlbnNpb24gc3RyaW5nIHRvIGEgc3RhbmRhcmQgaW5kZXggdHlwZS4KLSAqCi0gKiBAcGFyYW1baW5dICAgICBjbXBfaGFuZGxlOiAgIENvbXBvbmVudCBoYW5kbGUuCi0gKiBAcGFyYW1baW5dICAgICBwYXJhbV9uYW1lOiAgIFBhcmFtZXRlciBuYW1lIChleHRlbnNpb24gc3RyaW5nKS4KLSAqIEBwYXJhbVtpbixvdXRdIHBfaW5kZXhfdHlwZTogUG9pbnRlciB0byBleHRlbnNpb24gc3RyaW5nJ3MgaW5kZXggdHlwZS4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpnZXRfZXh0ZW5zaW9uX2luZGV4KE9NWF9IQU5ETEVUWVBFIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1NUUklORyAgICAgcGFyYW1fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFICpwX2luZGV4X3R5cGUpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJpbiBpbnZhbGlkIHN0YXRlIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgIH0KLSAgICBlbHNlIGlmIChjbXBfaGFuZGxlID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiY21wX2hhbmRsZSA9IE5VTEwiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50OwotICAgIH0KLSAgICBlbHNlIGlmIChwX2luZGV4X3R5cGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwX2luZGV4X3R5cGUgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGlmIChyZXR2YWwgIT0gT01YX0Vycm9yTm9uZSkKLSAgICB7Ci0gICAgICAgIGdvdG8gZ2V0X2V4dGVuc2lvbl9pbmRleF9leGl0OwotICAgIH0KLQotICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiJyVzJyIsIHBhcmFtX25hbWUpOwotCi0gICAgaWYgKCFzdHJuY21wKHBhcmFtX25hbWUsCi0gICAgICAgICAgICAgICAgICJPTVguUUNPTS5pbmRleC5wYXJhbS52aWRlby5TeW5jRnJhbWVEZWNvZGluZ01vZGUiLAotICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpCi0gICAgewotICAgICAgICAqcF9pbmRleF90eXBlID0KLSAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKSBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb1N5bmNGcmFtZURlY29kaW5nTW9kZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cm5jbXAocGFyYW1fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAiT01YLlFDT00uaW5kZXgucGFyYW0uSW5kZXhFeHRyYURhdGEiLAotICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkKLSAgICB7Ci0gICAgICAgICpwX2luZGV4X3R5cGUgPSAoT01YX0lOREVYVFlQRSkgT01YX1Fjb21JbmRleFBhcmFtSW5kZXhFeHRyYURhdGFUeXBlOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RybmNtcChwYXJhbV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMiLAotICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkKLSAgICB7Ci0gICAgICAgICpwX2luZGV4X3R5cGUgPQotICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpIE9NWF9Hb29nbGVBbmRyb2lkSW5kZXhFbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVyczsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cm5jbXAocGFyYW1fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnVzZUFuZHJvaWROYXRpdmVCdWZmZXIyIiwKLSAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpCi0gICAgewotICAgICAgICAqcF9pbmRleF90eXBlID0KLSAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKSBPTVhfR29vZ2xlQW5kcm9pZEluZGV4VXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcjI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJuY21wKHBhcmFtX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC51c2VBbmRyb2lkTmF0aXZlQnVmZmVyIiwKLSAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpCi0gICAgewotICAgICAgICAqcF9pbmRleF90eXBlID0KLSAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKSBPTVhfR29vZ2xlQW5kcm9pZEluZGV4VXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cm5jbXAocGFyYW1fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmdldEFuZHJvaWROYXRpdmVCdWZmZXJVc2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKQotICAgIHsKLSAgICAgICAgKnBfaW5kZXhfdHlwZSA9Ci0gICAgICAgICAgICAoT01YX0lOREVYVFlQRSkgT01YX0dvb2dsZUFuZHJvaWRJbmRleEdldEFuZHJvaWROYXRpdmVCdWZmZXJVc2FnZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cm5jbXAocGFyYW1fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiLAotICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkKLSAgICB7Ci0gICAgICAgICpwX2luZGV4X3R5cGUgPSAoT01YX0lOREVYVFlQRSkgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9NZXRhQnVmZmVyTW9kZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cm5jbXAocGFyYW1fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlQ29sb3JGb3JtYXQiLAotICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkKLSAgICB7Ci0gICAgICAgICpwX2luZGV4X3R5cGUgPSAoT01YX0lOREVYVFlQRSkgT01YX1Fjb21JbmRleEZsZXhpYmxlWVVWRGVzY3JpcHRpb247Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJuY21wKHBhcmFtX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjayIsCi0gICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKQotICAgIHsKLSAgICAgICAgKnBfaW5kZXhfdHlwZSA9Ci0gICAgICAgICAgICAoT01YX0lOREVYVFlQRSkgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9BZGFwdGl2ZVBsYXliYWNrTW9kZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoIiclcyc6IG5vdCBpbXBsZW1lbnRlZCIsIHBhcmFtX25hbWUpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvck5vdEltcGxlbWVudGVkOwotICAgIH0KLQotZ2V0X2V4dGVuc2lvbl9pbmRleF9leGl0OgotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIEdldCBjb21wb25lbnQgc3RhdGUuCi0gKgotICogQHBhcmFtW2luXSAgICAgY21wX2hhbmRsZTogQ29tcG9uZW50IGhhbmRsZS4KLSAqIEBwYXJhbVtpbixvdXRdIHBfc3RhdGU6ICAgIFBvaW50ZXIgdG8gc3RhdGUgdmFyaWFibGUuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6Z2V0X3N0YXRlKE9NWF9IQU5ETEVUWVBFIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RBVEVUWVBFICpwX3N0YXRlKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIGlmIChjbXBfaGFuZGxlID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiY21wX2hhbmRsZSA9IE5VTEwiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoIiVzIiwgT01YX1NUQVRFVFlQRV9TVFJJTkcobV9zdGF0ZSkpOwotCi0gICAgICAgICpwX3N0YXRlID0gbV9zdGF0ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBDb21wb25lbnQgdHVubmVsIHJlcXVlc3QuCi0gKgotICogQHJldHZhbCBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZAotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmNvbXBvbmVudF90dW5uZWxfcmVxdWVzdCgKLSAgICBPTVhfSEFORExFVFlQRSAgICAgICBjbXBfaGFuZGxlLAotICAgIE9NWF9VMzIgICAgICAgICAgICAgIHBvcnQsCi0gICAgT01YX0hBTkRMRVRZUEUgICAgICAgcGVlcl9jb21wb25lbnQsCi0gICAgT01YX1UzMiAgICAgICAgICAgICAgcGVlcl9wb3J0LAotICAgIE9NWF9UVU5ORUxTRVRVUFRZUEUgKnBfdHVubmVsX3NldHVwKQotewotICAgICh2b2lkKSBjbXBfaGFuZGxlOwotICAgICh2b2lkKSBwb3J0OwotICAgICh2b2lkKSBwZWVyX2NvbXBvbmVudDsKLSAgICAodm9pZCkgcGVlcl9wb3J0OwotICAgICh2b2lkKSBwX3R1bm5lbF9zZXR1cDsKLQotICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiIik7Ci0KLSAgICBPTVhfU1dWREVDX0xPR19FUlJPUigibm90IGltcGxlbWVudGVkIik7Ci0KLSAgICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci19Ci0KLS8qKgotICogQGJyaWVmIFVzZSBidWZmZXIuCi0gKgotICogQHBhcmFtW2luXSAgICAgY21wX2hhbmRsZTogICAgQ29tcG9uZW50IGhhbmRsZS4KLSAqIEBwYXJhbVtpbixvdXRdIHBwX2J1ZmZlcl9oZHI6IFBvaW50ZXIgdG8gcG9pbnRlciB0byBidWZmZXIgaGVhZGVyIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZS4KLSAqIEBwYXJhbVtpbl0gICAgIHBvcnQ6ICAgICAgICAgIFBvcnQgaW5kZXguCi0gKiBAcGFyYW1baW5dICAgICBwX2FwcF9kYXRhOiAgICBQb2ludGVyIHRvIElMIGNsaWVudCBhcHAgZGF0YS4KLSAqIEBwYXJhbVtpbl0gICAgIGJ5dGVzOiAgICAgICAgIFNpemUgb2YgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlcy4KLSAqIEBwYXJhbVtpbl0gICAgIHBfYnVmZmVyOiAgICAgIFBvaW50ZXIgdG8gYnVmZmVyIHRvIGJlIHVzZWQuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6dXNlX2J1ZmZlcihPTVhfSEFORExFVFlQRSAgICAgICAgIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcF9idWZmZXJfaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICAgIHBfYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTggICAgICAgICAgICAgICAgKnBfYnVmZmVyKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaW4gaW52YWxpZCBzdGF0ZSIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY21wX2hhbmRsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImNtcF9oYW5kbGUgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHBfYnVmZmVyX2hkciA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBwX2J1ZmZlcl9oZHIgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19BUEkoInBvcnQgaW5kZXggJWQsICVwIiwgcG9ydCwgcF9idWZmZXIpOwotCi0gICAgICAgIGlmIChwb3J0ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHZhbCA9IGJ1ZmZlcl91c2Vfb3AocHBfYnVmZmVyX2hkciwgcF9hcHBfZGF0YSwgYnl0ZXMsIHBfYnVmZmVyKTsKLQotICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBPTVhfRXJyb3JOb25lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNXVkRFQ19TVEFUVVMgcmV0dmFsX3N3dmRlYzsKLQotICAgICAgICAgICAgICAgIGlmICgobV9zdGF0dXNfZmxhZ3MgJiAoMSA8PCBQRU5ESU5HX1NUQVRFX0xPQURFRF9UT19JRExFKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1fcG9ydF9pcC5wb3B1bGF0ZWQgPT0gT01YX1RSVUUpICYmCi0gICAgICAgICAgICAgICAgICAgIChtX3BvcnRfb3AucG9wdWxhdGVkID09IE9NWF9UUlVFKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocmV0dmFsX3N3dmRlYyA9IHN3dmRlY19zdGFydChtX3N3dmRlY19oYW5kbGUpKSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgU1dWREVDX1NUQVRVU19TVUNDRVNTKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiZmFpbGVkIHRvIHN0YXJ0IFN3VmRlYyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByZXR2YWxfc3d2ZGVjMm9teChyZXR2YWxfc3d2ZGVjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdXNlX2J1ZmZlcl9leGl0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXNfZmxhZ3MgJj0gfigxIDw8IFBFTkRJTkdfU1RBVEVfTE9BREVEX1RPX0lETEUpOwotCi0gICAgICAgICAgICAgICAgICAgIGFzeW5jX3Bvc3RfZXZlbnQoT01YX1NXVkRFQ19FVkVOVF9DTURfQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9Db21tYW5kU3RhdGVTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0YXRlSWRsZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKChtX3N0YXR1c19mbGFncyAmICgxIDw8IFBFTkRJTkdfUE9SVF9FTkFCTEVfT1ApKSAmJgotICAgICAgICAgICAgICAgICAgICAobV9wb3J0X29wLnBvcHVsYXRlZCA9PSBPTVhfVFJVRSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobV9wb3J0X3JlY29uZmlnX2lucHJvZ3Jlc3MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0dmFsX3N3dmRlYyA9IHN3dmRlY19zdGFydChtX3N3dmRlY19oYW5kbGUpKSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVkRFQ19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiZmFpbGVkIHRvIHN0YXJ0IFN3VmRlYyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcmV0dmFsX3N3dmRlYzJvbXgocmV0dmFsX3N3dmRlYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtX3N0YXR1c19mbGFncyAmPSB+KDEgPDwgUEVORElOR19QT1JUX0VOQUJMRV9PUCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXN5bmNfcG9zdF9ldmVudChPTVhfU1dWREVDX0VWRU5UX0NNRF9BQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NvbW1hbmRQb3J0RW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsIHBvcnQpOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXVzZV9idWZmZXJfZXhpdDoKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBBbGxvY2F0ZSBuZXcgYnVmZmVyICYgYXNzb2NpYXRlZCBoZWFkZXIuCi0gKgotICogQHBhcmFtW2luXSAgICAgY21wX2hhbmRsZTogICAgQ29tcG9uZW50IGhhbmRsZS4KLSAqIEBwYXJhbVtpbixvdXRdIHBwX2J1ZmZlcl9oZHI6IFBvaW50ZXIgdG8gcG9pbnRlciB0byBidWZmZXIgaGVhZGVyIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZS4KLSAqIEBwYXJhbVtpbl0gICAgIHBvcnQ6ICAgICAgICAgIFBvcnQgaW5kZXguCi0gKiBAcGFyYW1baW5dICAgICBwX2FwcF9kYXRhOiAgICBQb2ludGVyIHRvIElMIGNsaWVudCBhcHAgZGF0YS4KLSAqIEBwYXJhbVtpbl0gICAgIGJ5dGVzOiAgICAgICAgIFNpemUgb2YgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlcy4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjphbGxvY2F0ZV9idWZmZXIoT01YX0hBTkRMRVRZUEUgICAgICAgICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcF9idWZmZXJfaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgICAgICAgICBwX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICBieXRlcykKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImluIGludmFsaWQgc3RhdGUiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNtcF9oYW5kbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJjbXBfaGFuZGxlID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBwX2J1ZmZlcl9oZHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwcF9idWZmZXJfaGRyID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJwb3J0IGluZGV4ICVkLCAlZCBieXRlcyIsIHBvcnQsIGJ5dGVzKTsKLQotICAgICAgICBpZiAocG9ydCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX0lQKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR2YWwgPSBidWZmZXJfYWxsb2NhdGVfaXAocHBfYnVmZmVyX2hkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwb3J0ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtX21ldGFfYnVmZmVyX21vZGUgPT0gdHJ1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiJ21ldGEgYnVmZmVyIG1vZGUnIGVuYWJsZWQiKTsKLQotICAgICAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG1fYW5kcm9pZF9uYXRpdmVfYnVmZmVycyA9PSB0cnVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCInYW5kcm9pZCBuYXRpdmUgYnVmZmVycycgZW5hYmxlZCIpOwotCi0gICAgICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IGJ1ZmZlcl9hbGxvY2F0ZV9vcChwcF9idWZmZXJfaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicG9ydCBpbmRleCAlZCBpbnZhbGlkIiwgcG9ydCk7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXR2YWwgPT0gT01YX0Vycm9yTm9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgU1dWREVDX1NUQVRVUyByZXR2YWxfc3d2ZGVjOwotCi0gICAgICAgICAgICBpZiAoKG1fc3RhdHVzX2ZsYWdzICYgKDEgPDwgUEVORElOR19TVEFURV9MT0FERURfVE9fSURMRSkpICYmCi0gICAgICAgICAgICAgICAgKG1fcG9ydF9pcC5wb3B1bGF0ZWQgPT0gT01YX1RSVUUpICYmCi0gICAgICAgICAgICAgICAgKG1fcG9ydF9vcC5wb3B1bGF0ZWQgPT0gT01YX1RSVUUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgocmV0dmFsX3N3dmRlYyA9IHN3dmRlY19zdGFydChtX3N3dmRlY19oYW5kbGUpKSAhPQotICAgICAgICAgICAgICAgICAgICBTV1ZERUNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiZmFpbGVkIHRvIHN0YXJ0IFN3VmRlYyIpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHJldHZhbF9zd3ZkZWMyb214KHJldHZhbF9zd3ZkZWMpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGFsbG9jYXRlX2J1ZmZlcl9leGl0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1fc3RhdHVzX2ZsYWdzICY9IH4oMSA8PCBQRU5ESU5HX1NUQVRFX0xPQURFRF9UT19JRExFKTsKLQotICAgICAgICAgICAgICAgIGFzeW5jX3Bvc3RfZXZlbnQoT01YX1NXVkRFQ19FVkVOVF9DTURfQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NvbW1hbmRTdGF0ZVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZUlkbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKG1fc3RhdHVzX2ZsYWdzICYgKDEgPDwgUEVORElOR19QT1JUX0VOQUJMRV9JUCkpICYmCi0gICAgICAgICAgICAgICAgKG1fcG9ydF9pcC5wb3B1bGF0ZWQgPT0gT01YX1RSVUUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fc3RhdHVzX2ZsYWdzICY9IH4oMSA8PCBQRU5ESU5HX1BPUlRfRU5BQkxFX0lQKTsKLQotICAgICAgICAgICAgICAgIGFzeW5jX3Bvc3RfZXZlbnQoT01YX1NXVkRFQ19FVkVOVF9DTURfQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NvbW1hbmRQb3J0RW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPUkVfUE9SVF9JTkRFWF9JUCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgobV9zdGF0dXNfZmxhZ3MgJiAoMSA8PCBQRU5ESU5HX1BPUlRfRU5BQkxFX09QKSkgJiYKLSAgICAgICAgICAgICAgICAobV9wb3J0X29wLnBvcHVsYXRlZCA9PSBPTVhfVFJVRSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcG9ydF9yZWNvbmZpZ19pbnByb2dyZXNzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChyZXR2YWxfc3d2ZGVjID0gc3d2ZGVjX3N0YXJ0KG1fc3d2ZGVjX2hhbmRsZSkpICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTV1ZERUNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJmYWlsZWQgdG8gc3RhcnQgU3dWZGVjIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHJldHZhbF9zd3ZkZWMyb214KHJldHZhbF9zd3ZkZWMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbV9zdGF0dXNfZmxhZ3MgJj0gfigxIDw8IFBFTkRJTkdfUE9SVF9FTkFCTEVfT1ApOwotCi0gICAgICAgICAgICAgICAgYXN5bmNfcG9zdF9ldmVudChPTVhfU1dWREVDX0VWRU5UX0NNRF9BQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ29tbWFuZFBvcnRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09SRV9QT1JUX0lOREVYX09QKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotYWxsb2NhdGVfYnVmZmVyX2V4aXQ6Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgUmVsZWFzZSBidWZmZXIgJiBhc3NvY2lhdGVkIGhlYWRlci4KLSAqCi0gKiBAcGFyYW1baW5dIGNtcF9oYW5kbGU6ICAgQ29tcG9uZW50IGhhbmRsZS4KLSAqIEBwYXJhbVtpbl0gcG9ydDogICAgICAgICBQb3J0IGluZGV4LgotICogQHBhcmFtW2luXSBwX2J1ZmZlcl9oZHI6IFBvaW50ZXIgdG8gYnVmZmVyJ3MgYnVmZmVyIGhlYWRlci4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpmcmVlX2J1ZmZlcihPTVhfSEFORExFVFlQRSAgICAgICAgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1ZmZlcl9oZHIpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgaWYgKGNtcF9oYW5kbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJjbXBfaGFuZGxlID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBfYnVmZmVyX2hkciA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfYnVmZmVyX2hkciA9IE5VTEwiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotICAgIGVsc2UgaWYgKChwb3J0ICE9IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApICYmCi0gICAgICAgICAgICAgKHBvcnQgIT0gT01YX0NPUkVfUE9SVF9JTkRFWF9PUCkpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicG9ydCBpbmRleCAnJWQnIGludmFsaWQiLCBwb3J0KTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1fc3RhdGUgIT0gT01YX1N0YXRlSWRsZSkKLSAgICB7Ci0gICAgICAgIGlmIChtX3N0YXRlICE9IE9NWF9TdGF0ZUV4ZWN1dGluZykKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImRpc2FsbG93ZWQgaW4gc3RhdGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1NUQVRFVFlQRV9TVFJJTkcobV9zdGF0ZSkpOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKHBvcnQgPT0gT01YX0NPUkVfUE9SVF9JTkRFWF9JUCkgJiYgbV9wb3J0X2lwLmVuYWJsZWQpIHx8Ci0gICAgICAgICAgICAgICAgKChwb3J0ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApICYmIG1fcG9ydF9vcC5lbmFibGVkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicG9ydCBpbmRleCAlZCBub3QgZGlzYWJsZWQiLCBwb3J0KTsKLQotICAgICAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXR2YWwgPT0gT01YX0Vycm9yTm9uZSkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgicG9ydCBpbmRleCAlZCwgJXAiLCBwb3J0LCBwX2J1ZmZlcl9oZHIpOwotCi0gICAgICAgIGlmIChwb3J0ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHZhbCA9IGJ1ZmZlcl9kZWFsbG9jYXRlX2lwKHBfYnVmZmVyX2hkcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR2YWwgPSBidWZmZXJfZGVhbGxvY2F0ZV9vcChwX2J1ZmZlcl9oZHIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKChyZXR2YWwgPT0gT01YX0Vycm9yTm9uZSkgJiYKLSAgICAgICAgKG1fc3RhdHVzX2ZsYWdzICYgKDEgPDwgUEVORElOR19TVEFURV9JRExFX1RPX0xPQURFRCkpKQotICAgIHsKLSAgICAgICAgaWYgKChtX3BvcnRfaXAudW5wb3B1bGF0ZWQgPT0gT01YX1RSVUUpICYmCi0gICAgICAgICAgICAobV9wb3J0X29wLnVucG9wdWxhdGVkID09IE9NWF9UUlVFKSkKLSAgICAgICAgewotICAgICAgICAgICAgU1dWREVDX1NUQVRVUyByZXR2YWxfc3d2ZGVjOwotCi0gICAgICAgICAgICBpZiAoKHJldHZhbF9zd3ZkZWMgPSBzd3ZkZWNfc3RvcChtX3N3dmRlY19oYW5kbGUpKSA9PQotICAgICAgICAgICAgICAgIFNXVkRFQ19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3N0YXR1c19mbGFncyAmPSB+KDEgPDwgUEVORElOR19TVEFURV9JRExFX1RPX0xPQURFRCk7Ci0KLSAgICAgICAgICAgICAgICBhc3luY19wb3N0X2V2ZW50KE9NWF9TV1ZERUNfRVZFTlRfQ01EX0FDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9Db21tYW5kU3RhdGVTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RhdGVMb2FkZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJmYWlsZWQgdG8gc3RvcCBTd1ZkZWMiKTsKLQotICAgICAgICAgICAgICAgIHJldHZhbCA9IHJldHZhbF9zd3ZkZWMyb214KHJldHZhbF9zd3ZkZWMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKChyZXR2YWwgPT0gT01YX0Vycm9yTm9uZSkgJiYKLSAgICAgICAgKG1fc3RhdHVzX2ZsYWdzICYgKDEgPDwgUEVORElOR19QT1JUX0RJU0FCTEVfSVApKSAmJgotICAgICAgICBtX3BvcnRfaXAudW5wb3B1bGF0ZWQpCi0gICAgewotICAgICAgICBtX3N0YXR1c19mbGFncyAmPSB+KDEgPDwgUEVORElOR19QT1JUX0RJU0FCTEVfSVApOwotCi0gICAgICAgIGFzeW5jX3Bvc3RfZXZlbnQoT01YX1NXVkRFQ19FVkVOVF9DTURfQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9Db21tYW5kUG9ydERpc2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPUkVfUE9SVF9JTkRFWF9JUCk7Ci0gICAgfQotCi0gICAgaWYgKChyZXR2YWwgPT0gT01YX0Vycm9yTm9uZSkgJiYKLSAgICAgICAgKG1fc3RhdHVzX2ZsYWdzICYgKDEgPDwgUEVORElOR19QT1JUX0RJU0FCTEVfT1ApKSAmJgotICAgICAgICBtX3BvcnRfb3AudW5wb3B1bGF0ZWQpCi0gICAgewotICAgICAgICBpZiAobV9wb3J0X3JlY29uZmlnX2lucHJvZ3Jlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNXVkRFQ19TVEFUVVMgcmV0dmFsX3N3dmRlYzsKLQotICAgICAgICAgICAgaWYgKChyZXR2YWxfc3d2ZGVjID0gc3d2ZGVjX3N0b3AobV9zd3ZkZWNfaGFuZGxlKSkgIT0KLSAgICAgICAgICAgICAgICBTV1ZERUNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImZhaWxlZCB0byBzdG9wIFN3VmRlYyIpOwotCi0gICAgICAgICAgICAgICAgcmV0dmFsID0gcmV0dmFsX3N3dmRlYzJvbXgocmV0dmFsX3N3dmRlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtX3N0YXR1c19mbGFncyAmPSB+KDEgPDwgUEVORElOR19QT1JUX0RJU0FCTEVfT1ApOwotCi0gICAgICAgIGFzeW5jX3Bvc3RfZXZlbnQoT01YX1NXVkRFQ19FVkVOVF9DTURfQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9Db21tYW5kUG9ydERpc2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPUkVfUE9SVF9JTkRFWF9PUCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgU2VuZCBhIGJ1ZmZlciB0byBjb21wb25lbnQncyBpbnB1dCBwb3J0IHRvIGJlIGVtcHRpZWQuCi0gKgotICogQHBhcmFtW2luXSBjbXBfaGFuZGxlOiAgIENvbXBvbmVudCBoYW5kbGUuCi0gKiBAcGFyYW1baW5dIHBfYnVmZmVyX2hkcjogUG9pbnRlciB0byBidWZmZXIncyBidWZmZXIgaGVhZGVyLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmVtcHR5X3RoaXNfYnVmZmVyKE9NWF9IQU5ETEVUWVBFICAgICAgICBjbXBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9idWZmZXJfaGRyKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIHVuc2lnbmVkIGludCBpaTsKLQotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaW4gaW52YWxpZCBzdGF0ZSIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY21wX2hhbmRsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImNtcF9oYW5kbGUgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKLSAgICB9Ci0gICAgZWxzZSBpZiAocF9idWZmZXJfaGRyID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicF9idWZmZXJfaGRyID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocF9idWZmZXJfaGRyLT5wQnVmZmVyID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicF9idWZmZXJfaGRyLT5wQnVmZmVyID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocF9idWZmZXJfaGRyLT5wSW5wdXRQb3J0UHJpdmF0ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfYnVmZmVyX2hkci0+cElucHV0UG9ydFByaXZhdGUgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICBlbHNlIGlmIChtX3BvcnRfaXAuZW5hYmxlZCA9PSBPTVhfRkFMU0UpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaXAgcG9ydCBkaXNhYmxlZCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOwotICAgIH0KLSAgICBlbHNlIGlmIChwX2J1ZmZlcl9oZHItPm5JbnB1dFBvcnRJbmRleCAhPSBPTVhfQ09SRV9QT1JUX0lOREVYX0lQKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBvcnQgaW5kZXggJyVkJyBpbnZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5uSW5wdXRQb3J0SW5kZXgpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICB9Ci0KLSAgICBpZiAocmV0dmFsICE9IE9NWF9FcnJvck5vbmUpCi0gICAgewotICAgICAgICBnb3RvIGVtcHR5X3RoaXNfYnVmZmVyX2V4aXQ7Ci0gICAgfQotCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgbV9wb3J0X2lwLmRlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGlpKyspCi0gICAgewotICAgICAgICBpZiAocF9idWZmZXJfaGRyID09ICYobV9idWZmZXJfYXJyYXlfaXBbaWldLmJ1ZmZlcl9oZWFkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19MT1coImlwIGJ1ZmZlciAlcCBoYXMgaW5kZXggJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX2hkci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpaSA9PSBtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJpcCBidWZmZXIgJXAgbm90IGZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5wQnVmZmVyKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIGdvdG8gZW1wdHlfdGhpc19idWZmZXJfZXhpdDsKLSAgICB9Ci0KLSAgICBPTVhfU1dWREVDX0xPR19BUEkoIiVwOiBidWZmZXIgJXAsIGZsYWdzIDB4JTA4eCwgZmlsbGVkIGxlbmd0aCAlZCwgIgotICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9oZHIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX2hkci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5uRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX2hkci0+bkZpbGxlZExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5uVGltZVN0YW1wKTsKLQotICAgIGFzeW5jX3Bvc3RfZXZlbnQoT01YX1NXVkRFQ19FVkVOVF9FVEIsCi0gICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgcF9idWZmZXJfaGRyLAotICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGlpKTsKLQotZW1wdHlfdGhpc19idWZmZXJfZXhpdDoKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBTZW5kIGEgYnVmZmVyIHRvIGNvbXBvbmVudCdzIG91dHB1dCBwb3J0IHRvIGJlIGZpbGxlZC4KLSAqCi0gKiBAcGFyYW1baW5dIGNtcF9oYW5kbGU6ICAgQ29tcG9uZW50IGhhbmRsZS4KLSAqIEBwYXJhbVtpbl0gcF9idWZmZXJfaGRyOiBQb2ludGVyIHRvIGJ1ZmZlcidzIGJ1ZmZlciBoZWFkZXIuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6ZmlsbF90aGlzX2J1ZmZlcihPTVhfSEFORExFVFlQRSAgICAgICAgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9idWZmZXJfaGRyKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIHVuc2lnbmVkIGludCBpaTsKLQotICAgIFNXVkRFQ19CVUZGRVIgKnBfYnVmZmVyX3N3dmRlYzsKLQotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaW4gaW52YWxpZCBzdGF0ZSIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY21wX2hhbmRsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImNtcF9oYW5kbGUgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKLSAgICB9Ci0gICAgZWxzZSBpZiAocF9idWZmZXJfaGRyID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicF9idWZmZXJfaGRyID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocF9idWZmZXJfaGRyLT5wQnVmZmVyID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicF9idWZmZXJfaGRyLT5wQnVmZmVyID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocF9idWZmZXJfaGRyLT5wT3V0cHV0UG9ydFByaXZhdGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwX2J1ZmZlcl9oZHItPnBPdXRwdXRQb3J0UHJpdmF0ZSA9IE5VTEwiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1fcG9ydF9vcC5lbmFibGVkID09IE9NWF9GQUxTRSkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJvcCBwb3J0IGRpc2FibGVkIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247Ci0gICAgfQotICAgIGVsc2UgaWYgKHBfYnVmZmVyX2hkci0+bk91dHB1dFBvcnRJbmRleCAhPSBPTVhfQ09SRV9QT1JUX0lOREVYX09QKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBvcnQgaW5kZXggJyVkJyBpbnZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5uT3V0cHV0UG9ydEluZGV4KTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgfQotCi0gICAgaWYgKHJldHZhbCAhPSBPTVhfRXJyb3JOb25lKQotICAgIHsKLSAgICAgICAgZ290byBmaWxsX3RoaXNfYnVmZmVyX2V4aXQ7Ci0gICAgfQotCi0gICAgT01YX1NXVkRFQ19MT0dfQVBJKCIlcCIsIHBfYnVmZmVyX2hkcik7Ci0KLSAgICBmb3IgKGlpID0gMDsgaWkgPCBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbDsgaWkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwX2J1ZmZlcl9oZHIgPT0gJihtX2J1ZmZlcl9hcnJheV9vcFtpaV0uYnVmZmVyX2hlYWRlcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygib3AgYnVmZmVyICVwIGhhcyBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGlpID09IG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoIm9wIGJ1ZmZlciAlcCBub3QgZm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9oZHItPnBCdWZmZXIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgZ290byBmaWxsX3RoaXNfYnVmZmVyX2V4aXQ7Ci0gICAgfQotCi0gICAgcF9idWZmZXJfc3d2ZGVjID0gJm1fYnVmZmVyX2FycmF5X29wW2lpXS5idWZmZXJfc3d2ZGVjOwotCi0gICAgaWYgKG1fbWV0YV9idWZmZXJfbW9kZSkKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBWaWRlb0RlY29kZXJPdXRwdXRNZXRhRGF0YSAqcF9tZXRhX2RhdGE7Ci0KLSAgICAgICAgcHJpdmF0ZV9oYW5kbGVfdCAqcF9wcml2YXRlX2hhbmRsZTsKLQotICAgICAgICBzdHJ1Y3QgdmRlY19idWZmZXJwYXlsb2FkICpwX2J1ZmZlcl9wYXlsb2FkOwotCi0gICAgICAgIHBfbWV0YV9kYXRhID0KLSAgICAgICAgICAgIChzdHJ1Y3QgVmlkZW9EZWNvZGVyT3V0cHV0TWV0YURhdGEgKikgcF9idWZmZXJfaGRyLT5wQnVmZmVyOwotCi0gICAgICAgIHBfcHJpdmF0ZV9oYW5kbGUgPSAocHJpdmF0ZV9oYW5kbGVfdCAqKSAocF9tZXRhX2RhdGEtPnBIYW5kbGUpOwotCi0gICAgICAgIHBfYnVmZmVyX3BheWxvYWQgPSAmbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wYXlsb2FkOwotCi0gICAgICAgIGlmIChwX3ByaXZhdGVfaGFuZGxlID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKAotICAgICAgICAgICAgICAgICJwX2J1ZmZlcl9oZHItPnBCdWZmZXItPnBIYW5kbGUgPSBOVUxMIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIGdvdG8gZmlsbF90aGlzX2J1ZmZlcl9leGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX21ldGFfYnVmZmVyX2FycmF5X211dGV4KTsKLQotICAgICAgICBpZiAobV9tZXRhX2J1ZmZlcl9hcnJheVtpaV0ucmVmX2NvdW50ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcmFkZHI7Ci0KLSAgICAgICAgICAgIGJ1ZmZlcmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBtbWFwKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3ByaXZhdGVfaGFuZGxlLT5mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCi0gICAgICAgICAgICBpZiAoYnVmZmVyYWRkciA9PSBNQVBfRkFJTEVEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJtbWFwKCkgZmFpbGVkIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkICVkIG9mIHNpemUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJpdmF0ZV9oYW5kbGUtPmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcG9ydF9vcC5kZWYubkJ1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbWV0YV9idWZmZXJfYXJyYXlfbXV0ZXgpOwotCi0gICAgICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgICAgIGdvdG8gZmlsbF90aGlzX2J1ZmZlcl9leGl0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwX2J1ZmZlcl9wYXlsb2FkLT5idWZmZXJhZGRyICA9IGJ1ZmZlcmFkZHI7Ci0gICAgICAgICAgICBwX2J1ZmZlcl9wYXlsb2FkLT5wbWVtX2ZkICAgICA9IHBfcHJpdmF0ZV9oYW5kbGUtPmZkOwotICAgICAgICAgICAgcF9idWZmZXJfcGF5bG9hZC0+YnVmZmVyX2xlbiAgPSBtX3BvcnRfb3AuZGVmLm5CdWZmZXJTaXplOwotICAgICAgICAgICAgcF9idWZmZXJfcGF5bG9hZC0+bW1hcGVkX3NpemUgPSBtX3BvcnRfb3AuZGVmLm5CdWZmZXJTaXplOwotCi0gICAgICAgICAgICBwX2J1ZmZlcl9zd3ZkZWMtPnBfYnVmZmVyICAgICAgPSBidWZmZXJhZGRyOwotICAgICAgICAgICAgcF9idWZmZXJfc3d2ZGVjLT5zaXplICAgICAgICAgID0gbV9wb3J0X29wLmRlZi5uQnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+cF9jbGllbnRfZGF0YSA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZykgaWkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWV0YV9idWZmZXJfcmVmX2FkZChpaSwgcF9idWZmZXJfcGF5bG9hZC0+cG1lbV9mZCk7Ci0KLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbWV0YV9idWZmZXJfYXJyYXlfbXV0ZXgpOwotICAgIH0KLQotICAgIE9NWF9TV1ZERUNfTE9HX0xPVygiJXA6IGJ1ZmZlciAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX2hkciwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfc3d2ZGVjLT5wX2J1ZmZlcik7Ci0KLSAgICBhc3luY19wb3N0X2V2ZW50KE9NWF9TV1ZERUNfRVZFTlRfRlRCLAotICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHBfYnVmZmVyX2hkciwKLSAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpaSk7Ci0KLWZpbGxfdGhpc19idWZmZXJfZXhpdDoKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBTZXQgY29tcG9uZW50J3MgY2FsbGJhY2sgc3RydWN0dXJlLgotICoKLSAqIEBwYXJhbVtpbl0gY21wX2hhbmRsZTogIENvbXBvbmVudCBoYW5kbGUuCi0gKiBAcGFyYW1baW5dIHBfY2FsbGJhY2tzOiBQb2ludGVyIHRvIGNhbGxiYWNrIHN0cnVjdHVyZS4KLSAqIEBwYXJhbVtpbl0gcF9hcHBfZGF0YTogIFBvaW50ZXIgdG8gSUwgY2xpZW50IGFwcCBkYXRhLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OnNldF9jYWxsYmFja3MoT01YX0hBTkRMRVRZUEUgICAgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ0FMTEJBQ0tUWVBFICpwX2NhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICBwX2FwcF9kYXRhKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIE9NWF9TV1ZERUNfTE9HX0FQSSgiIik7Ci0KLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImluIGludmFsaWQgc3RhdGUiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNtcF9oYW5kbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJjbXBfaGFuZGxlID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBfY2FsbGJhY2tzLT5FdmVudEhhbmRsZXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwX2NhbGxiYWNrcy0+RXZlbnRIYW5kbGVyID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocF9jYWxsYmFja3MtPkVtcHR5QnVmZmVyRG9uZSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfY2FsbGJhY2tzLT5FbXB0eUJ1ZmZlckRvbmUgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICBlbHNlIGlmIChwX2NhbGxiYWNrcy0+RmlsbEJ1ZmZlckRvbmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwX2NhbGxiYWNrcy0+RmlsbEJ1ZmZlckRvbmUgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtX2NhbGxiYWNrID0gKnBfY2FsbGJhY2tzOwotICAgICAgICBtX2FwcF9kYXRhID0gcF9hcHBfZGF0YTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBVc2UgRUdMIGltYWdlLgotICoKLSAqIEByZXR2YWwgT01YX0Vycm9yTm90SW1wbGVtZW50ZWQKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjp1c2VfRUdMX2ltYWdlKE9NWF9IQU5ETEVUWVBFICAgICAgICAgY21wX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwX2J1ZmZlcl9oZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgcF9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKmVnbF9pbWFnZSkKLXsKLSAgICAodm9pZCkgY21wX2hhbmRsZTsKLSAgICAodm9pZCkgcHBfYnVmZmVyX2hkcjsKLSAgICAodm9pZCkgcG9ydDsKLSAgICAodm9pZCkgcF9hcHBfZGF0YTsKLSAgICAodm9pZCkgZWdsX2ltYWdlOwotCi0gICAgT01YX1NXVkRFQ19MT0dfQVBJKCIiKTsKLQotICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJub3QgaW1wbGVtZW50ZWQiKTsKLQotICAgIHJldHVybiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgRW51bWVyYXRlIGNvbXBvbmVudCByb2xlLgotICoKLSAqIEBwYXJhbVtpbl0gICAgIGNtcF9oYW5kbGU6IENvbXBvbmVudCBoYW5kbGUuCi0gKiBAcGFyYW1baW4sb3V0XSBwX3JvbGU6ICAgICBQb2ludGVyIHRvIGNvbXBvbmVudCByb2xlIHN0cmluZy4KLSAqIEBwYXJhbVtpbl0gICAgIGluZGV4OiAgICAgIFJvbGUgaW5kZXggYmVpbmcgcXVlcmllZC4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpjb21wb25lbnRfcm9sZV9lbnVtKE9NWF9IQU5ETEVUWVBFIGNtcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1U4ICAgICAgICAqcF9yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgIGluZGV4KQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaW4gaW52YWxpZCBzdGF0ZSIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY21wX2hhbmRsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImNtcF9oYW5kbGUgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5kZXggPiAwKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiaW5kZXggJyVkJyB1bnN1cHBvcnRlZDsgbm8gbW9yZSByb2xlcyIsIGluZGV4KTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1lbWNweShwX3JvbGUsIG1fcm9sZV9uYW1lLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQVBJKCJpbmRleCAnJWQnOiAnJXMnIiwgaW5kZXgsIHBfcm9sZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBTd1ZkZWMgY2FsbGJhY2sgZnVuY3Rpb25zCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotLyoqCi0gKiBAYnJpZWYgU3dWZGVjIGVtcHR5IGJ1ZmZlciBkb25lIGNhbGxiYWNrLgotICoKLSAqIEBwYXJhbVtpbl0gc3d2ZGVjX2hhbmRsZTogICBTd1ZkZWMgaGFuZGxlLgotICogQHBhcmFtW2luXSBwX2J1ZmZlcl9pcDogICAgIFBvaW50ZXIgdG8gaW5wdXQgYnVmZmVyIHN0cnVjdHVyZS4KLSAqIEBwYXJhbVtpbl0gcF9jbGllbnRfaGFuZGxlOiBQb2ludGVyIHRvIFN3VmRlYydzIGNsaWVudCBoYW5kbGUuCi0gKgotICogQHJldHZhbCBTV1ZERUNfU1RBVFVTX1NVQ0NFU1MKLSAqIEByZXR2YWwgU1dWREVDX1NUQVRVU19OVUxMX1BPSU5URVIKLSAqIEByZXR2YWwgU1dWREVDX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlMKLSAqLwotU1dWREVDX1NUQVRVUyBvbXhfc3d2ZGVjOjpzd3ZkZWNfZW1wdHlfYnVmZmVyX2RvbmVfY2FsbGJhY2soCi0gICAgU1dWREVDX0hBTkRMRSAgc3d2ZGVjX2hhbmRsZSwKLSAgICBTV1ZERUNfQlVGRkVSICpwX2J1ZmZlcl9pcCwKLSAgICB2b2lkICAgICAgICAgICpwX2NsaWVudF9oYW5kbGUpCi17Ci0gICAgU1dWREVDX1NUQVRVUyByZXR2YWwgPSBTV1ZERUNfU1RBVFVTX1NVQ0NFU1M7Ci0KLSAgICBpZiAocF9idWZmZXJfaXAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwX2J1ZmZlcl9pcCA9IE5VTEwiKTsKLQotICAgICAgICByZXR2YWwgPSBTV1ZERUNfU1RBVFVTX05VTExfUE9JTlRFUjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocF9jbGllbnRfaGFuZGxlID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicF9jbGllbnRfaGFuZGxlID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IFNXVkRFQ19TVEFUVVNfTlVMTF9QT0lOVEVSOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvbXhfc3d2ZGVjICpwX29teF9zd3ZkZWMgPSAob214X3N3dmRlYyAqKSBwX2NsaWVudF9oYW5kbGU7Ci0KLSAgICAgICAgaWYgKHN3dmRlY19oYW5kbGUgIT0gcF9vbXhfc3d2ZGVjLT5tX3N3dmRlY19oYW5kbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJpbnZhbGlkIFN3VmRlYyBoYW5kbGUiKTsKLQotICAgICAgICAgICAgcmV0dmFsID0gU1dWREVDX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwX29teF9zd3ZkZWMtPnN3dmRlY19lbXB0eV9idWZmZXJfZG9uZShwX2J1ZmZlcl9pcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBTd1ZkZWMgZmlsbCBidWZmZXIgZG9uZSBjYWxsYmFjay4KLSAqCi0gKiBAcGFyYW1baW5dIHN3dmRlY19oYW5kbGU6ICAgU3dWZGVjIGhhbmRsZS4KLSAqIEBwYXJhbVtpbl0gcF9idWZmZXJfb3A6ICAgICBQb2ludGVyIHRvIG91dHB1dCBidWZmZXIgc3RydWN0dXJlLgotICogQHBhcmFtW2luXSBwX2NsaWVudF9oYW5kbGU6IFBvaW50ZXIgdG8gU3dWZGVjJ3MgY2xpZW50IGhhbmRsZS4KLSAqCi0gKiBAcmV0dmFsIFNXVkRFQ19TVEFUVVNfU1VDQ0VTUwotICogQHJldHZhbCBTV1ZERUNfU1RBVFVTX05VTExfUE9JTlRFUgotICogQHJldHZhbCBTV1ZERUNfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSUwotICovCi1TV1ZERUNfU1RBVFVTIG9teF9zd3ZkZWM6OnN3dmRlY19maWxsX2J1ZmZlcl9kb25lX2NhbGxiYWNrKAotICAgIFNXVkRFQ19IQU5ETEUgIHN3dmRlY19oYW5kbGUsCi0gICAgU1dWREVDX0JVRkZFUiAqcF9idWZmZXJfb3AsCi0gICAgdm9pZCAgICAgICAgICAqcF9jbGllbnRfaGFuZGxlKQotewotICAgIFNXVkRFQ19TVEFUVVMgcmV0dmFsID0gU1dWREVDX1NUQVRVU19TVUNDRVNTOwotCi0gICAgaWYgKHBfYnVmZmVyX29wID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicF9idWZmZXJfb3AgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gU1dWREVDX1NUQVRVU19OVUxMX1BPSU5URVI7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBfY2xpZW50X2hhbmRsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfY2xpZW50X2hhbmRsZSA9IE5VTEwiKTsKLQotICAgICAgICByZXR2YWwgPSBTV1ZERUNfU1RBVFVTX05VTExfUE9JTlRFUjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb214X3N3dmRlYyAqcF9vbXhfc3d2ZGVjID0gKG9teF9zd3ZkZWMgKikgcF9jbGllbnRfaGFuZGxlOwotCi0gICAgICAgIGlmIChzd3ZkZWNfaGFuZGxlICE9IHBfb214X3N3dmRlYy0+bV9zd3ZkZWNfaGFuZGxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaW52YWxpZCBTd1ZkZWMgaGFuZGxlIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IFNXVkRFQ19TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJTOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcF9vbXhfc3d2ZGVjLT5zd3ZkZWNfZmlsbF9idWZmZXJfZG9uZShwX2J1ZmZlcl9vcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBTd1ZkZWMgZXZlbnQgaGFuZGxlciBjYWxsYmFjay4KLSAqCi0gKiBAcGFyYW1baW5dIHN3dmRlY19oYW5kbGU6ICAgU3dWZGVjIGhhbmRsZS4KLSAqIEBwYXJhbVtpbl0gZXZlbnQ6ICAgICAgICAgICBFdmVudC4KLSAqIEBwYXJhbVtpbl0gcF9kYXRhOiAgICAgICAgICBQb2ludGVyIHRvIGV2ZW50LXNwZWNpZmljIGRhdGEuCi0gKiBAcGFyYW1baW5dIHBfY2xpZW50X2hhbmRsZTogUG9pbnRlciB0byBTd1ZkZWMncyBjbGllbnQgaGFuZGxlLgotICoKLSAqIEByZXR2YWwgU1dWREVDX1NUQVRVU19TVUNDRVNTCi0gKiBAcmV0dmFsIFNXVkRFQ19TVEFUVVNfTlVMTF9QT0lOVEVSCi0gKiBAcmV0dmFsIFNXVkRFQ19TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJTCi0gKi8KLVNXVkRFQ19TVEFUVVMgb214X3N3dmRlYzo6c3d2ZGVjX2V2ZW50X2hhbmRsZXJfY2FsbGJhY2soCi0gICAgU1dWREVDX0hBTkRMRSBzd3ZkZWNfaGFuZGxlLAotICAgIFNXVkRFQ19FVkVOVCAgZXZlbnQsCi0gICAgdm9pZCAgICAgICAgICpwX2RhdGEsCi0gICAgdm9pZCAgICAgICAgICpwX2NsaWVudF9oYW5kbGUpCi17Ci0gICAgU1dWREVDX1NUQVRVUyByZXR2YWwgPSBTV1ZERUNfU1RBVFVTX1NVQ0NFU1M7Ci0KLSAgICBpZiAoKGV2ZW50ID09IFNXVkRFQ19FVkVOVF9SRUxFQVNFX1JFRkVSRU5DRSkgJiYgKHBfZGF0YSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwX2RhdGEgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gU1dWREVDX1NUQVRVU19OVUxMX1BPSU5URVI7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBfY2xpZW50X2hhbmRsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfY2xpZW50X2hhbmRsZSA9IE5VTEwiKTsKLQotICAgICAgICByZXR2YWwgPSBTV1ZERUNfU1RBVFVTX05VTExfUE9JTlRFUjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb214X3N3dmRlYyAqcF9vbXhfc3d2ZGVjID0gKG9teF9zd3ZkZWMgKikgcF9jbGllbnRfaGFuZGxlOwotCi0gICAgICAgIGlmIChzd3ZkZWNfaGFuZGxlICE9IHBfb214X3N3dmRlYy0+bV9zd3ZkZWNfaGFuZGxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaW52YWxpZCBTd1ZkZWMgaGFuZGxlIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IFNXVkRFQ19TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJTOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcF9vbXhfc3d2ZGVjLT5zd3ZkZWNfZXZlbnRfaGFuZGxlcihldmVudCwgcF9kYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFBSSVZBVEUgRlVOQ1RJT05TCi0gKiAtLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qKgotICogQGJyaWVmIFNldCBmcmFtZSBkaW1lbnNpb25zIGZvciBPTVggY29tcG9uZW50ICYgU3dWZGVjIGNvcmUuCi0gKgotICogQHBhcmFtW2luXSB3aWR0aDogIEZyYW1lIHdpZHRoLgotICogQHBhcmFtW2luXSBoZWlnaHQ6IEZyYW1lIGhlaWdodC4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpzZXRfZnJhbWVfZGltZW5zaW9ucyh1bnNpZ25lZCBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBoZWlnaHQpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWw7Ci0KLSAgICBtX2ZyYW1lX2RpbWVuc2lvbnMud2lkdGggID0gd2lkdGg7Ci0gICAgbV9mcmFtZV9kaW1lbnNpb25zLmhlaWdodCA9IGhlaWdodDsKLQotICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goIiVkIHggJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9mcmFtZV9kaW1lbnNpb25zLndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9mcmFtZV9kaW1lbnNpb25zLmhlaWdodCk7Ci0KLSAgICByZXR2YWwgPSBzZXRfZnJhbWVfZGltZW5zaW9uc19zd3ZkZWMoKTsKLQotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIFNldCBmcmFtZSBhdHRyaWJ1dGVzIGZvciBPTVggY29tcG9uZW50ICYgU3dWZGVjIGNvcmUsIGJhc2VkIG9uCi0gKiAgICAgICAgZnJhbWUgZGltZW5zaW9ucyAmIGNvbG9yIGZvcm1hdC4KLSAqCi0gKiBAcGFyYW1baW5dIGNvbG9yX2Zvcm1hdDogQ29sb3IgZm9ybWF0LgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OnNldF9mcmFtZV9hdHRyaWJ1dGVzKAotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yX2Zvcm1hdCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICB1bnNpZ25lZCBpbnQgd2lkdGggID0gbV9mcmFtZV9kaW1lbnNpb25zLndpZHRoOwotICAgIHVuc2lnbmVkIGludCBoZWlnaHQgPSBtX2ZyYW1lX2RpbWVuc2lvbnMuaGVpZ2h0OwotCi0gICAgdW5zaWduZWQgaW50IHNjYW5saW5lc191djsKLQotICAgIHVuc2lnbmVkIGludCBwbGFuZV9zaXplX3k7Ci0gICAgdW5zaWduZWQgaW50IHBsYW5lX3NpemVfdXY7Ci0KLSAgICBzd2l0Y2ggKGNvbG9yX2Zvcm1hdCkKLSAgICB7Ci0KLSAgICBjYXNlIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm06Ci0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogYWxpZ25tZW50IGZhY3RvcnM6Ci0gICAgICAgICAqCi0gICAgICAgICAqIC0gc3RyaWRlOiAgICAgICAgMTI4Ci0gICAgICAgICAqIC0gc2NhbmxpbmVzX3k6ICAgIDMyCi0gICAgICAgICAqIC0gc2NhbmxpbmVzX3V2OiAgIDE2Ci0gICAgICAgICAqIC0gc2l6ZTogICAgICAgICA0MDk2Ci0gICAgICAgICAqLwotCi0gICAgICAgIG1fZnJhbWVfYXR0cmlidXRlcy5zdHJpZGUgICAgPSBBTElHTih3aWR0aCwgMTI4KTsKLSAgICAgICAgbV9mcmFtZV9hdHRyaWJ1dGVzLnNjYW5saW5lcyA9IEFMSUdOKGhlaWdodCwgMzIpOwotCi0gICAgICAgIHNjYW5saW5lc191diA9IEFMSUdOKGhlaWdodCAvIDIsIDE2KTsKLQotICAgICAgICBwbGFuZV9zaXplX3kgID0gKG1fZnJhbWVfYXR0cmlidXRlcy5zdHJpZGUgKgotICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnJhbWVfYXR0cmlidXRlcy5zY2FubGluZXMpOwotCi0gICAgICAgIHBsYW5lX3NpemVfdXYgPSBtX2ZyYW1lX2F0dHJpYnV0ZXMuc3RyaWRlICogc2NhbmxpbmVzX3V2OwotCi0gICAgICAgIG1fZnJhbWVfYXR0cmlidXRlcy5zaXplID0gQUxJR04ocGxhbmVfc2l6ZV95ICsgcGxhbmVfc2l6ZV91diwgNDA5Nik7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiJ09NWF9RQ09NX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm0nOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmlkZSAlZCwgc2NhbmxpbmVzICVkLCBzaXplICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZyYW1lX2F0dHJpYnV0ZXMuc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnJhbWVfYXR0cmlidXRlcy5zY2FubGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mcmFtZV9hdHRyaWJ1dGVzLnNpemUpOwotCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6Ci0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogYWxpZ25tZW50IGZhY3RvcnM6Ci0gICAgICAgICAqCi0gICAgICAgICAqIC0gc3RyaWRlOiAgICAgICAgIDE2Ci0gICAgICAgICAqIC0gc2NhbmxpbmVzX3k6ICAgIDE2Ci0gICAgICAgICAqIC0gc2NhbmxpbmVzX3V2OiAgIDE2Ci0gICAgICAgICAqIC0gc2l6ZTogICAgICAgICA0MDk2Ci0gICAgICAgICAqLwotCi0gICAgICAgIG1fZnJhbWVfYXR0cmlidXRlcy5zdHJpZGUgICAgPSBBTElHTih3aWR0aCwgIDE2KTsKLSAgICAgICAgbV9mcmFtZV9hdHRyaWJ1dGVzLnNjYW5saW5lcyA9IEFMSUdOKGhlaWdodCwgMTYpOwotCi0gICAgICAgIHNjYW5saW5lc191diA9IEFMSUdOKGhlaWdodCAvIDIsIDE2KTsKLQotICAgICAgICBwbGFuZV9zaXplX3kgID0gKG1fZnJhbWVfYXR0cmlidXRlcy5zdHJpZGUgKgotICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnJhbWVfYXR0cmlidXRlcy5zY2FubGluZXMpOwotCi0gICAgICAgIHBsYW5lX3NpemVfdXYgPSBtX2ZyYW1lX2F0dHJpYnV0ZXMuc3RyaWRlICogc2NhbmxpbmVzX3V2OwotCi0gICAgICAgIG1fZnJhbWVfYXR0cmlidXRlcy5zaXplID0gQUxJR04ocGxhbmVfc2l6ZV95ICsgcGxhbmVfc2l6ZV91diwgNDA5Nik7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiJ09NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyJzogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpZGUgJWQsIHNjYW5saW5lcyAlZCwgc2l6ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mcmFtZV9hdHRyaWJ1dGVzLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZyYW1lX2F0dHJpYnV0ZXMuc2NhbmxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnJhbWVfYXR0cmlidXRlcy5zaXplKTsKLQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoIicweCUwOHgnIGNvbG9yIGZvcm1hdCBpbnZhbGlkIG9yIHVuc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfZm9ybWF0KTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIH0gLy8gc3dpdGNoIChjb2xvcl9mb3JtYXQpCi0KLSAgICBpZiAocmV0dmFsID09IE9NWF9FcnJvck5vbmUpCi0gICAgewotICAgICAgICBtX29teF9jb2xvcl9mb3JtYXR0eXBlID0gY29sb3JfZm9ybWF0OwotCi0gICAgICAgIHJldHZhbCA9IHNldF9mcmFtZV9hdHRyaWJ1dGVzX3N3dmRlYygpOwotICAgIH0KLQotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIFNldCBtYXhpbXVtIGFkYXB0aXZlIHBsYXliYWNrIGZyYW1lIGRpbWVuc2lvbnMgZm9yIE9NWCBjb21wb25lbnQgJgotICogICAgICAgIFN3VmRlYyBjb3JlLgotICoKLSAqIEBwYXJhbVtpbl0gd2lkdGg6ICBNYXggYWRhcHRpdmUgcGxheWJhY2sgZnJhbWUgd2lkdGguCi0gKiBAcGFyYW1baW5dIGhlaWdodDogTWF4IGFkYXB0aXZlIHBsYXliYWNrIGZyYW1lIGhlaWdodC4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpzZXRfYWRhcHRpdmVfcGxheWJhY2sodW5zaWduZWQgaW50IG1heF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfaGVpZ2h0KQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsOwotCi0gICAgbV9mcmFtZV9kaW1lbnNpb25zX21heC53aWR0aCAgPSBtYXhfd2lkdGg7Ci0gICAgbV9mcmFtZV9kaW1lbnNpb25zX21heC5oZWlnaHQgPSBtYXhfaGVpZ2h0OwotCi0gICAgT01YX1NXVkRFQ19MT0dfSElHSCgiJWQgeCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2ZyYW1lX2RpbWVuc2lvbnNfbWF4LndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9mcmFtZV9kaW1lbnNpb25zX21heC5oZWlnaHQpOwotCi0gICAgcmV0dmFsID0gc2V0X2FkYXB0aXZlX3BsYXliYWNrX3N3dmRlYygpOwotCi0gICAgaWYgKHJldHZhbCA9PSBPTVhfRXJyb3JOb25lKQotICAgIHsKLSAgICAgICAgcmV0dmFsID0gc2V0X2ZyYW1lX2RpbWVuc2lvbnMobWF4X3dpZHRoLCBtYXhfaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBpZiAocmV0dmFsID09IE9NWF9FcnJvck5vbmUpCi0gICAgewotICAgICAgICByZXR2YWwgPSBzZXRfZnJhbWVfYXR0cmlidXRlcyhtX29teF9jb2xvcl9mb3JtYXR0eXBlKTsKLSAgICB9Ci0KLXNldF9hZGFwdGl2ZV9wbGF5YmFja19leGl0OgotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIEdldCB2aWRlbyBwb3J0IGZvcm1hdCBmb3IgaW5wdXQgb3Igb3V0cHV0IHBvcnQuCi0gKgotICogQHBhcmFtW2luLG91dF0gcF9wb3J0X2Zvcm1hdDogUG9pbnRlciB0byB2aWRlbyBwb3J0IGZvcm1hdCB0eXBlLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmdldF92aWRlb19wb3J0X2Zvcm1hdCgKLSAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKnBfcG9ydF9mb3JtYXQpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgaWYgKHBfcG9ydF9mb3JtYXQtPm5Qb3J0SW5kZXggPT0gT01YX0NPUkVfUE9SVF9JTkRFWF9JUCkKLSAgICB7Ci0gICAgICAgIGlmIChwX3BvcnRfZm9ybWF0LT5uSW5kZXggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcF9wb3J0X2Zvcm1hdC0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKLQotICAgICAgICAgICAgcF9wb3J0X2Zvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gbV9vbXhfdmlkZW9fY29kaW5ndHlwZTsKLQotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiY29sb3IgZm9ybWF0IDB4JTA4eCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3Npb24gZm9ybWF0IDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9mb3JtYXQtPmVDb2xvckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X2Zvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goImluZGV4ICclZCcgdW5zdXBwb3J0ZWQ7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIG1vcmUgY29tcHJlc3Npb24gZm9ybWF0cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9mb3JtYXQtPm5JbmRleCk7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvck5vTW9yZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChwX3BvcnRfZm9ybWF0LT5uUG9ydEluZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApCi0gICAgewotICAgICAgICBpZiAocF9wb3J0X2Zvcm1hdC0+bkluZGV4ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfcG9ydF9mb3JtYXQtPmVDb2xvckZvcm1hdCA9Ci0gICAgICAgICAgICAgICAgT01YX1FDT01fQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybTsKLQotICAgICAgICAgICAgcF9wb3J0X2Zvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKLQotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiY29sb3IgZm9ybWF0IDB4JTA4eCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3Npb24gZm9ybWF0IDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9mb3JtYXQtPmVDb2xvckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X2Zvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwX3BvcnRfZm9ybWF0LT5uSW5kZXggPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9wb3J0X2Zvcm1hdC0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7Ci0KLSAgICAgICAgICAgIHBfcG9ydF9mb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7Ci0KLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goImNvbG9yIGZvcm1hdCAweCUwOHgsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXByZXNzaW9uIGZvcm1hdCAweCUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZm9ybWF0LT5lQ29sb3JGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9mb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJpbmRleCAnJWQnIHVuc3VwcG9ydGVkOyBubyBtb3JlIGNvbG9yIGZvcm1hdHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZm9ybWF0LT5uSW5kZXgpOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBvcnQgaW5kZXggJyVkJyBpbnZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X2Zvcm1hdC0+blBvcnRJbmRleCk7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgIH0KLQotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIFNldCB2aWRlbyBwb3J0IGZvcm1hdCBmb3IgaW5wdXQgb3Igb3V0cHV0IHBvcnQuCi0gKgotICogQHBhcmFtW2luXSBwX3BvcnRfZm9ybWF0OiBQb2ludGVyIHRvIHZpZGVvIHBvcnQgZm9ybWF0IHR5cGUuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6c2V0X3ZpZGVvX3BvcnRfZm9ybWF0KAotICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqcF9wb3J0X2Zvcm1hdCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBpZiAocF9wb3J0X2Zvcm1hdC0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX0lQKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQsIHBvcnQgaW5kZXggMDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb2luZyBub3RoaW5nIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBfcG9ydF9mb3JtYXQtPm5Qb3J0SW5kZXggPT0gT01YX0NPUkVfUE9SVF9JTkRFWF9PUCkKLSAgICB7Ci0gICAgICAgIHJldHZhbCA9IHNldF9mcmFtZV9hdHRyaWJ1dGVzKHBfcG9ydF9mb3JtYXQtPmVDb2xvckZvcm1hdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9mb3JtYXQtPm5Qb3J0SW5kZXgpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICB9Ci0KLXNldF92aWRlb19wb3J0X2Zvcm1hdF9leGl0OgotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIEdldCBwb3J0IGRlZmluaXRpb24gZm9yIGlucHV0IG9yIG91dHB1dCBwb3J0LgotICoKLSAqIEBwYXJhbVtpbixvdXRdIHBfcG9ydF9kZWY6IFBvaW50ZXIgdG8gcG9ydCBkZWZpbml0aW9uIHR5cGUuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6Z2V0X3BvcnRfZGVmaW5pdGlvbigKLSAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwX3BvcnRfZGVmKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIHBfcG9ydF9kZWYtPmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOwotCi0gICAgaWYgKHBfcG9ydF9kZWYtPm5Qb3J0SW5kZXggPT0gT01YX0NPUkVfUE9SVF9JTkRFWF9JUCkKLSAgICB7Ci0gICAgICAgIGlmICgocmV0dmFsID0gZ2V0X2J1ZmZlcl9yZXF1aXJlbWVudHNfc3d2ZGVjKE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApKSAhPQotICAgICAgICAgICAgT01YX0Vycm9yTm9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBnZXRfcG9ydF9kZWZpbml0aW9uX2V4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwX3BvcnRfZGVmLT5lRGlyICAgICAgICAgICAgICAgPSBPTVhfRGlySW5wdXQ7Ci0gICAgICAgIHBfcG9ydF9kZWYtPm5CdWZmZXJDb3VudEFjdHVhbCA9IG1fcG9ydF9pcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsOwotICAgICAgICBwX3BvcnRfZGVmLT5uQnVmZmVyQ291bnRNaW4gICAgPSBtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudE1pbjsKLSAgICAgICAgcF9wb3J0X2RlZi0+bkJ1ZmZlclNpemUgICAgICAgID0gbV9wb3J0X2lwLmRlZi5uQnVmZmVyU2l6ZTsKLSAgICAgICAgcF9wb3J0X2RlZi0+YkVuYWJsZWQgICAgICAgICAgID0gbV9wb3J0X2lwLmVuYWJsZWQ7Ci0gICAgICAgIHBfcG9ydF9kZWYtPmJQb3B1bGF0ZWQgICAgICAgICA9IG1fcG9ydF9pcC5wb3B1bGF0ZWQ7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgicG9ydCBpbmRleCAlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VudCBhY3R1YWwgJWQsIGNvdW50IG1pbiAlZCwgc2l6ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X2RlZi0+blBvcnRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X2RlZi0+bkJ1ZmZlckNvdW50TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPm5CdWZmZXJTaXplKTsKLQotICAgICAgICAvLyBmcmFtZSBkaW1lbnNpb25zICYgYXR0cmlidXRlcyBkb24ndCBhcHBseSB0byBpbnB1dCBwb3J0Ci0KLSAgICAgICAgcF9wb3J0X2RlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCAgICAgICA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7Ci0gICAgICAgIHBfcG9ydF9kZWYtPmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBtX29teF92aWRlb19jb2Rpbmd0eXBlOwotICAgIH0KLSAgICBlbHNlIGlmIChwX3BvcnRfZGVmLT5uUG9ydEluZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApCi0gICAgewotICAgICAgICBpZiAoKHJldHZhbCA9IGdldF9mcmFtZV9kaW1lbnNpb25zX3N3dmRlYygpKSAhPSBPTVhfRXJyb3JOb25lKQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIGdldF9wb3J0X2RlZmluaXRpb25fZXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIHBfcG9ydF9kZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAgPSBtX2ZyYW1lX2RpbWVuc2lvbnMud2lkdGg7Ci0gICAgICAgIHBfcG9ydF9kZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtX2ZyYW1lX2RpbWVuc2lvbnMuaGVpZ2h0OwotCi0gICAgICAgIGlmIChtX3BvcnRfcmVjb25maWdfaW5wcm9ncmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChyZXR2YWwgPSBzZXRfZnJhbWVfYXR0cmlidXRlcyhtX29teF9jb2xvcl9mb3JtYXR0eXBlKSkgIT0KLSAgICAgICAgICAgICAgICBPTVhfRXJyb3JOb25lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdvdG8gZ2V0X3BvcnRfZGVmaW5pdGlvbl9leGl0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChyZXR2YWwgPSBnZXRfZnJhbWVfYXR0cmlidXRlc19zd3ZkZWMoKSkgIT0gT01YX0Vycm9yTm9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBnZXRfcG9ydF9kZWZpbml0aW9uX2V4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwX3BvcnRfZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAgICAgID0gbV9mcmFtZV9hdHRyaWJ1dGVzLnN0cmlkZTsKLSAgICAgICAgcF9wb3J0X2RlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IG1fZnJhbWVfYXR0cmlidXRlcy5zY2FubGluZXM7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgicG9ydCBpbmRleCAlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZCB4ICVkLCBzdHJpZGUgJWQsIHNsaWNlaGVpZ2h0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5uUG9ydEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBRdWVyeSB0byBTd1ZkZWMgY29yZSBmb3IgYnVmZmVyIHJlcXVpcmVtZW50cyBpcyBub3QgYWxsb3dlZCBpbgotICAgICAgICAgKiBleGVjdXRpbmcgc3RhdGUgc2luY2UgaXQgd2lsbCBvdmVyd3JpdGUgdGhlIGNvbXBvbmVudCdzIGJ1ZmZlcgotICAgICAgICAgKiByZXF1aXJlbWVudHMgdXBkYXRlZCB2aWEgdGhlIG1vc3QgcmVjZW50IHNldF9wYXJhbWV0ZXIoKS4KLSAgICAgICAgICoKLSAgICAgICAgICogQnVmZmVyIHJlcXVpcmVtZW50cyBjb21tdW5pY2F0ZWQgdG8gY29tcG9uZW50IHZpYSBzZXRfcGFyYW1ldGVyKCkgYXJlCi0gICAgICAgICAqIG5vdCBwcm9wYWdhdGVkIHRvIFN3VmRlYyBjb3JlLgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgb25seSBleGVjcHRpb24gaXMgaWYgcG9ydCByZWNvbmZpZ3VyYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIGluCi0gICAgICAgICAqIHdoaWNoIGNhc2UgdGhlIHF1ZXJ5IHRvIFN3VmRlYyBjb3JlIGlzIHJlcXVpcmVkIHNpbmNlIGJ1ZmZlcgotICAgICAgICAgKiByZXF1aXJlbWVudHMgY2FuIGNoYW5nZSBiYXNlZCBvbiBuZXcgZGltZW5zaW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIGlmICgobV9zdGF0ZSAhPSBPTVhfU3RhdGVFeGVjdXRpbmcpIHx8IG1fcG9ydF9yZWNvbmZpZ19pbnByb2dyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKHJldHZhbCA9Ci0gICAgICAgICAgICAgICAgIGdldF9idWZmZXJfcmVxdWlyZW1lbnRzX3N3dmRlYyhPTVhfQ09SRV9QT1JUX0lOREVYX09QKSkgIT0KLSAgICAgICAgICAgICAgICBPTVhfRXJyb3JOb25lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdvdG8gZ2V0X3BvcnRfZGVmaW5pdGlvbl9leGl0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcF9wb3J0X2RlZi0+ZURpciAgICAgICAgICAgICAgID0gT01YX0Rpck91dHB1dDsKLSAgICAgICAgcF9wb3J0X2RlZi0+bkJ1ZmZlckNvdW50QWN0dWFsID0gbV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRBY3R1YWw7Ci0gICAgICAgIHBfcG9ydF9kZWYtPm5CdWZmZXJDb3VudE1pbiAgICA9IG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50TWluOwotICAgICAgICBwX3BvcnRfZGVmLT5uQnVmZmVyU2l6ZSAgICAgICAgPSBtX3BvcnRfb3AuZGVmLm5CdWZmZXJTaXplOwotICAgICAgICBwX3BvcnRfZGVmLT5iRW5hYmxlZCAgICAgICAgICAgPSBtX3BvcnRfb3AuZW5hYmxlZDsKLSAgICAgICAgcF9wb3J0X2RlZi0+YlBvcHVsYXRlZCAgICAgICAgID0gbV9wb3J0X29wLnBvcHVsYXRlZDsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJwb3J0IGluZGV4ICVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50IGFjdHVhbCAlZCwgY291bnQgbWluICVkLCBzaXplICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5uUG9ydEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5uQnVmZmVyQ291bnRNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X2RlZi0+bkJ1ZmZlclNpemUpOwotCi0gICAgICAgIHBfcG9ydF9kZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgICAgICAgPSBtX29teF9jb2xvcl9mb3JtYXR0eXBlOwotICAgICAgICBwX3BvcnRfZGVmLT5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKLQotICAgICAgICBpZiAobV9vbXhfY29sb3JfZm9ybWF0dHlwZSA9PQotICAgICAgICAgICAgT01YX1FDT01fQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybSkKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgKLSAgICAgICAgICAgICAgICAicG9ydCBpbmRleCAlZDogY29sb3IgZm9ybWF0ICcweCUwOHgnOiAiCi0gICAgICAgICAgICAgICAgIk9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm0iLAotICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPm5Qb3J0SW5kZXgsCi0gICAgICAgICAgICAgICAgcF9wb3J0X2RlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobV9vbXhfY29sb3JfZm9ybWF0dHlwZSA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgicG9ydCBpbmRleCAlZDogY29sb3IgZm9ybWF0ICcweCUwOHgnOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPm5Qb3J0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0KDApOwotICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsIHBfcG9ydF9kZWYtPm5Qb3J0SW5kZXgpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICB9Ci0KLWdldF9wb3J0X2RlZmluaXRpb25fZXhpdDoKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBTZXQgcG9ydCBkZWZpbml0aW9uIGZvciBpbnB1dCBvciBvdXRwdXQgcG9ydC4KLSAqCi0gKiBAcGFyYW1baW5dIHBfcG9ydF9kZWY6IFBvaW50ZXIgdG8gcG9ydCBkZWZpbml0aW9uIHR5cGUuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6c2V0X3BvcnRfZGVmaW5pdGlvbigKLSAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwX3BvcnRfZGVmKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goInBvcnQgaW5kZXggJWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJjb3VudCBhY3R1YWwgJWQsIGNvdW50IG1pbiAlZCwgc2l6ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5uUG9ydEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X2RlZi0+bkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X2RlZi0+bkJ1ZmZlckNvdW50TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X2RlZi0+bkJ1ZmZlclNpemUpOwotCi0gICAgaWYgKHBfcG9ydF9kZWYtPm5Qb3J0SW5kZXggPT0gT01YX0NPUkVfUE9SVF9JTkRFWF9JUCkKLSAgICB7Ci0gICAgICAgIG1fcG9ydF9pcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gcF9wb3J0X2RlZi0+bkJ1ZmZlckNvdW50QWN0dWFsOwotICAgICAgICBtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudE1pbiAgICA9IHBfcG9ydF9kZWYtPm5CdWZmZXJDb3VudE1pbjsKLSAgICAgICAgbV9wb3J0X2lwLmRlZi5uQnVmZmVyU2l6ZSAgICAgICAgPSBwX3BvcnRfZGVmLT5uQnVmZmVyU2l6ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocF9wb3J0X2RlZi0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX09QKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE9NWCBjb21wb25lbnQncyBvdXRwdXQgcG9ydCBuQnVmZmVyU2l6ZSBpcyBub3QgdXBkYXRlZCBiYXNlZCBvbiB3aGF0Ci0gICAgICAgICAqIElMIGNsaWVudCBzZW5kczsgaW5zdGVhZCBpdCBpcyB1cGRhdGVkIGJhc2VkIG9uIHRoZSBwb3NzaWJseSB1cGRhdGVkCi0gICAgICAgICAqIGZyYW1lIGF0dHJpYnV0ZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgaXMgYmVjYXVzZSBzZXRfcGFyYW1ldGVyKCkgZm9yIG91dHB1dCBwb3J0IGRlZmluaXRpb24gb25seSBoYXMKLSAgICAgICAgICogdXBkYXRlcyB0byBidWZmZXIgY291bnRzIG9yIGZyYW1lIGRpbWVuc2lvbnMuCi0gICAgICAgICAqLwotCi0gICAgICAgIG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gcF9wb3J0X2RlZi0+bkJ1ZmZlckNvdW50QWN0dWFsOwotICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudE1pbiAgICA9IHBfcG9ydF9kZWYtPm5CdWZmZXJDb3VudE1pbjsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJwb3J0IGluZGV4ICVkOiAlZCB4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5uUG9ydEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVXBkYXRlIGZyYW1lIGRpbWVuc2lvbnMgJiBhdHRyaWJ1dGVzIGlmOgotICAgICAgICAgKgotICAgICAgICAgKiAxLiBub3QgaW4gYWRhcHRpdmUgcGxheWJhY2sgbW9kZQotICAgICAgICAgKiAgICBPUgotICAgICAgICAgKiAyLiBuZXcgZnJhbWUgZGltZW5zaW9ucyBncmVhdGVyIHRoYW4gYWRhcHRpdmUgcGxheWJhY2sgbW9kZSdzCi0gICAgICAgICAqICAgIG1heCBmcmFtZSBkaW1lbnNpb25zCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmICgobV9hZGFwdGl2ZV9wbGF5YmFja19tb2RlID09IGZhbHNlKSB8fAotICAgICAgICAgICAgKHBfcG9ydF9kZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA+Ci0gICAgICAgICAgICAgbV9mcmFtZV9kaW1lbnNpb25zX21heC53aWR0aCkgfHwKLSAgICAgICAgICAgIChwX3BvcnRfZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID4KLSAgICAgICAgICAgICBtX2ZyYW1lX2RpbWVuc2lvbnNfbWF4LmhlaWdodCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goInVwZGF0aW5nIGZyYW1lIGRpbWVuc2lvbnMgJiBhdHRyaWJ1dGVzIik7Ci0KLSAgICAgICAgICAgIGlmICgocmV0dmFsID0KLSAgICAgICAgICAgICAgICAgc2V0X2ZyYW1lX2RpbWVuc2lvbnMocF9wb3J0X2RlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0KSkgIT0KLSAgICAgICAgICAgICAgICBPTVhfRXJyb3JOb25lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdvdG8gc2V0X3BvcnRfZGVmaW5pdGlvbl9leGl0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKHJldHZhbCA9IHNldF9mcmFtZV9hdHRyaWJ1dGVzKG1fb214X2NvbG9yX2Zvcm1hdHR5cGUpKSAhPQotICAgICAgICAgICAgICAgIE9NWF9FcnJvck5vbmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ290byBzZXRfcG9ydF9kZWZpbml0aW9uX2V4aXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5CdWZmZXJTaXplIHVwZGF0ZWQgYmFzZWQgb24gKHBvc3NpYmx5IG5ldykgZnJhbWUgYXR0cmlidXRlcwotCi0gICAgICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJTaXplID0gbV9mcmFtZV9hdHRyaWJ1dGVzLnNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJub3QgdXBkYXRpbmcgZnJhbWUgZGltZW5zaW9ucyAmIGF0dHJpYnV0ZXMiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicG9ydCBpbmRleCAnJWQnIGludmFsaWQiLCBwX3BvcnRfZGVmLT5uUG9ydEluZGV4KTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgfQotCi1zZXRfcG9ydF9kZWZpbml0aW9uX2V4aXQ6Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgR2V0IHN1cHBvcnRlZCBwcm9maWxlICYgbGV2ZWwuCi0gKgotICogVGhlIHN1cHBvcnRlZCBwcm9maWxlcyAmIGxldmVscyBhcmUgbm90IHF1ZXJpZWQgZnJvbSBTd1ZkZWMgY29yZSwgYnV0Ci0gKiBoYXJkLWNvZGVkLiBUaGlzIHNob3VsZCBpZGVhbGx5IGJlIHJlcGxhY2VkIHdpdGggYSBxdWVyeSB0byBTd1ZkZWMgY29yZS4KLSAqCi0gKiBAcGFyYW1baW4sb3V0XSBwX3Byb2ZpbGVsZXZlbDogUG9pbnRlciB0byB2aWRlbyBwcm9maWxlICYgbGV2ZWwgdHlwZS4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpnZXRfc3VwcG9ydGVkX3Byb2ZpbGVsZXZlbCgKLSAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcF9wcm9maWxlbGV2ZWwpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgaWYgKHBfcHJvZmlsZWxldmVsID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicF9wcm9maWxlbGV2ZWwgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICBnb3RvIGdldF9zdXBwb3J0ZWRfcHJvZmlsZWxldmVsX2V4aXQ7Ci0gICAgfQotCi0gICAgaWYgKHBfcHJvZmlsZWxldmVsLT5uUG9ydEluZGV4ICE9IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicG9ydCBpbmRleCAnJWQnIGludmFsaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3Byb2ZpbGVsZXZlbC0+blBvcnRJbmRleCk7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICBnb3RvIGdldF9zdXBwb3J0ZWRfcHJvZmlsZWxldmVsX2V4aXQ7Ci0gICAgfQotCi0gICAgaWYgKG1fb214X3ZpZGVvX2NvZGluZ3R5cGUgPT0gT01YX1ZJREVPX0NvZGluZ0gyNjMpCi0gICAgewotICAgICAgICBpZiAocF9wcm9maWxlbGV2ZWwtPm5Qcm9maWxlSW5kZXggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcF9wcm9maWxlbGV2ZWwtPmVQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBwX3Byb2ZpbGVsZXZlbC0+ZUxldmVsICAgPSBPTVhfVklERU9fSDI2M0xldmVsNzA7Ci0KLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goIkguMjYzIGJhc2VsaW5lIHByb2ZpbGUsIGxldmVsIDcwIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJwcm9maWxlIGluZGV4ICclZCcgdW5zdXBwb3J0ZWQ7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIG1vcmUgcHJvZmlsZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3Byb2ZpbGVsZXZlbC0+blByb2ZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvck5vTW9yZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgobV9vbXhfdmlkZW9fY29kaW5ndHlwZSA9PSBPTVhfVklERU9fQ29kaW5nTVBFRzQpIHx8Ci0gICAgICAgICAgICAgKG1fb214X3ZpZGVvX2NvZGluZ3R5cGUgPT0KLSAgICAgICAgICAgICAgKChPTVhfVklERU9fQ09ESU5HVFlQRSkgUU9NWF9WSURFT19Db2RpbmdEaXZ4KSkpCi0gICAgewotICAgICAgICBpZiAocF9wcm9maWxlbGV2ZWwtPm5Qcm9maWxlSW5kZXggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcF9wcm9maWxlbGV2ZWwtPmVQcm9maWxlID0gT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZTsKLSAgICAgICAgICAgIHBfcHJvZmlsZWxldmVsLT5lTGV2ZWwgICA9IE9NWF9WSURFT19NUEVHNExldmVsNTsKLQotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiTVBFRy00IHNpbXBsZSBwcm9maWxlLCBsZXZlbCA1Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocF9wcm9maWxlbGV2ZWwtPm5Qcm9maWxlSW5kZXggPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9wcm9maWxlbGV2ZWwtPmVQcm9maWxlID0gT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlOwotICAgICAgICAgICAgcF9wcm9maWxlbGV2ZWwtPmVMZXZlbCAgID0gT01YX1ZJREVPX01QRUc0TGV2ZWw1OwotCi0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJNUEVHLTQgYWR2YW5jZWQgc2ltcGxlIHByb2ZpbGUsIGxldmVsIDUiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goInByb2ZpbGUgaW5kZXggJyVkJyB1bnN1cHBvcnRlZDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gbW9yZSBwcm9maWxlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJvZmlsZWxldmVsLT5uUHJvZmlsZUluZGV4KTsKLQotICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yTm9Nb3JlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGFzc2VydCgwKTsKLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgIH0KLQotZ2V0X3N1cHBvcnRlZF9wcm9maWxlbGV2ZWxfZXhpdDoKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBEZXNjcmliZSBjb2xvciBmb3JtYXQuCi0gKgotICogQHBhcmFtW2luLG91dF0gcF9wYXJhbXM6IFBvaW50ZXIgdG8gJ0Rlc2NyaWJlQ29sb3JGb3JtYXRQYXJhbXMnIHN0cnVjdHVyZS4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpkZXNjcmliZV9jb2xvcl9mb3JtYXQoCi0gICAgRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyAqcF9wYXJhbXMpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgaWYgKHBfcGFyYW1zID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicF9wYXJhbXMgPSBOVUxMIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNZWRpYUltYWdlICpwX2ltZyA9ICZwX3BhcmFtcy0+c01lZGlhSW1hZ2U7Ci0KLSAgICAgICAgc3dpdGNoIChwX3BhcmFtcy0+ZUNvbG9yRm9ybWF0KQotICAgICAgICB7Ci0KLSAgICAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtOgotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplX3Qgc3RyaWRlLCBzY2FubGluZXM7Ci0KLSAgICAgICAgICAgIHBfaW1nLT5tVHlwZSA9IE1lZGlhSW1hZ2U6Ok1FRElBX0lNQUdFX1RZUEVfWVVWOwotICAgICAgICAgICAgcF9pbWctPm1OdW1QbGFuZXMgPSAzOwotCi0gICAgICAgICAgICBwX2ltZy0+bVdpZHRoICA9IHBfcGFyYW1zLT5uRnJhbWVXaWR0aDsKLSAgICAgICAgICAgIHBfaW1nLT5tSGVpZ2h0ID0gcF9wYXJhbXMtPm5GcmFtZUhlaWdodDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBhbGlnbm1lbnQgZmFjdG9yczoKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAtIHN0cmlkZTogICAgMTI4Ci0gICAgICAgICAgICAgKiAtIHNjYW5saW5lczogIDMyCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHN0cmlkZSAgICA9IEFMSUdOKHBfaW1nLT5tV2lkdGgsICAxMjgpOwotICAgICAgICAgICAgc2NhbmxpbmVzID0gQUxJR04ocF9pbWctPm1IZWlnaHQsICAzMik7Ci0KLSAgICAgICAgICAgIHBfaW1nLT5tQml0RGVwdGggPSA4OwotCi0gICAgICAgICAgICAvLyBwbGFuZSAwIChZKQotICAgICAgICAgICAgcF9pbWctPm1QbGFuZVtNZWRpYUltYWdlOjpZXS5tT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIHBfaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6WV0ubUNvbEluYyA9IDE7Ci0gICAgICAgICAgICBwX2ltZy0+bVBsYW5lW01lZGlhSW1hZ2U6OlldLm1Sb3dJbmMgPSBzdHJpZGU7Ci0gICAgICAgICAgICBwX2ltZy0+bVBsYW5lW01lZGlhSW1hZ2U6OlldLm1Ib3JpelN1YnNhbXBsaW5nID0gMTsKLSAgICAgICAgICAgIHBfaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6WV0ubVZlcnRTdWJzYW1wbGluZyAgPSAxOwotCi0gICAgICAgICAgICAvLyBwbGFuZSAxIChVKQotICAgICAgICAgICAgcF9pbWctPm1QbGFuZVtNZWRpYUltYWdlOjpVXS5tT2Zmc2V0ID0gc3RyaWRlICogc2NhbmxpbmVzOwotICAgICAgICAgICAgcF9pbWctPm1QbGFuZVtNZWRpYUltYWdlOjpVXS5tQ29sSW5jID0gMjsKLSAgICAgICAgICAgIHBfaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6VV0ubVJvd0luYyA9IHN0cmlkZTsKLSAgICAgICAgICAgIHBfaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6VV0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOwotICAgICAgICAgICAgcF9pbWctPm1QbGFuZVtNZWRpYUltYWdlOjpVXS5tVmVydFN1YnNhbXBsaW5nICA9IDI7Ci0KLSAgICAgICAgICAgIC8vIHBsYW5lIDIgKFYpCi0gICAgICAgICAgICBwX2ltZy0+bVBsYW5lW01lZGlhSW1hZ2U6OlZdLm1PZmZzZXQgPSBzdHJpZGUgKiBzY2FubGluZXMgKyAxOwotICAgICAgICAgICAgcF9pbWctPm1QbGFuZVtNZWRpYUltYWdlOjpWXS5tQ29sSW5jID0gMjsKLSAgICAgICAgICAgIHBfaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6Vl0ubVJvd0luYyA9IHN0cmlkZTsKLSAgICAgICAgICAgIHBfaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6Vl0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOwotICAgICAgICAgICAgcF9pbWctPm1QbGFuZVtNZWRpYUltYWdlOjpWXS5tVmVydFN1YnNhbXBsaW5nICA9IDI7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZG8gbm90aGluZzsgc3RhbmRhcmQgT01YIGNvbG9yIGZvcm1hdHMgc2hvdWxkIG5vdCBiZSBkZXNjcmliZWQKLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImNvbG9yIGZvcm1hdCAnMHglMDh4JyBpbnZhbGlkL3Vuc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcGFyYW1zLT5lQ29sb3JGb3JtYXQpOwotCi0gICAgICAgICAgICBwX2ltZy0+bVR5cGUgPSBNZWRpYUltYWdlOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgfSAvLyBzd2l0Y2ggKHBfcGFyYW1zLT5lQ29sb3JGb3JtYXQpCi0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgU2V0IFFUSSB2ZW5kb3Itc3BlY2lmaWMgcG9ydCBkZWZpbml0aW9uIGZvciBpbnB1dCBvciBvdXRwdXQgcG9ydC4KLSAqCi0gKiBAcGFyYW1baW5dIHBfcG9ydF9kZWY6IFBvaW50ZXIgdG8gUVRJIHZlbmRvci1zcGVjaWZpYyBwb3J0IGRlZmluaXRpb24gdHlwZS4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpzZXRfcG9ydF9kZWZpbml0aW9uX3Fjb20oCi0gICAgT01YX1FDT01fUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwX3BvcnRfZGVmKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIGlmIChwX3BvcnRfZGVmLT5uUG9ydEluZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApCi0gICAgewotICAgICAgICBzd2l0Y2ggKHBfcG9ydF9kZWYtPm5GcmFtZVBhY2tpbmdGb3JtYXQpCi0gICAgICAgIHsKLQotICAgICAgICBjYXNlIE9NWF9RQ09NX0ZyYW1lUGFja2luZ19BcmJpdHJhcnk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goIk9NWF9RQ09NX0ZyYW1lUGFja2luZ19BcmJpdHJhcnkiKTsKLQotICAgICAgICAgICAgbV9hcmJpdHJhcnlfYnl0ZXNfbW9kZSA9IHRydWU7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfUUNPTV9GcmFtZVBhY2tpbmdfT25seU9uZUNvbXBsZXRlRnJhbWU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goCi0gICAgICAgICAgICAgICAgIk9NWF9RQ09NX0ZyYW1lUGFja2luZ19Pbmx5T25lQ29tcGxldGVGcmFtZSIpOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKAotICAgICAgICAgICAgICAgICJmcmFtZSBwYWNraW5nIGZvcm1hdCAnJWQnIHVuc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICBwX3BvcnRfZGVmLT5uRnJhbWVQYWNraW5nRm9ybWF0KTsKLQotICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHBfcG9ydF9kZWYtPm5Qb3J0SW5kZXggPT0gT01YX0NPUkVfUE9SVF9JTkRFWF9PUCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goIm5NZW1SZWdpb24gJWQsIG5DYWNoZUF0dHIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPm5NZW1SZWdpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X2RlZi0+bkNhY2hlQXR0cik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9kZWYtPm5Qb3J0SW5kZXgpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBTZXQgU3dWZGVjIGZyYW1lIGRpbWVuc2lvbnMgYmFzZWQgb24gT01YIGNvbXBvbmVudCBmcmFtZSBkaW1lbnNpb25zLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OnNldF9mcmFtZV9kaW1lbnNpb25zX3N3dmRlYygpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgU1dWREVDX1BST1BFUlRZIHByb3BlcnR5OwotCi0gICAgU1dWREVDX1NUQVRVUyByZXR2YWxfc3d2ZGVjOwotCi0gICAgcHJvcGVydHkuaWQgPSBTV1ZERUNfUFJPUEVSVFlfSURfRlJBTUVfRElNRU5TSU9OUzsKLQotICAgIHByb3BlcnR5LmluZm8uZnJhbWVfZGltZW5zaW9ucy53aWR0aCAgPSBtX2ZyYW1lX2RpbWVuc2lvbnMud2lkdGg7Ci0gICAgcHJvcGVydHkuaW5mby5mcmFtZV9kaW1lbnNpb25zLmhlaWdodCA9IG1fZnJhbWVfZGltZW5zaW9ucy5oZWlnaHQ7Ci0KLSAgICBpZiAoKHJldHZhbF9zd3ZkZWMgPSBzd3ZkZWNfc2V0cHJvcGVydHkobV9zd3ZkZWNfaGFuZGxlLCAmcHJvcGVydHkpKSAhPQotICAgICAgICBTV1ZERUNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotICAgICAgICByZXR2YWwgPSByZXR2YWxfc3d2ZGVjMm9teChyZXR2YWxfc3d2ZGVjKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBTZXQgU3dWZGVjIGZyYW1lIGF0dHJpYnV0ZXMgYmFzZWQgb24gT01YIGNvbXBvbmVudCBmcmFtZSBhdHRyaWJ1dGVzLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OnNldF9mcmFtZV9hdHRyaWJ1dGVzX3N3dmRlYygpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgU1dWREVDX0ZSQU1FX0FUVFJJQlVURVMgKnBfZnJhbWVfYXR0cmlidXRlczsKLQotICAgIFNXVkRFQ19QUk9QRVJUWSBwcm9wZXJ0eTsKLQotICAgIFNXVkRFQ19TVEFUVVMgcmV0dmFsX3N3dmRlYzsKLQotICAgIHBfZnJhbWVfYXR0cmlidXRlcyA9ICZwcm9wZXJ0eS5pbmZvLmZyYW1lX2F0dHJpYnV0ZXM7Ci0KLSAgICBwcm9wZXJ0eS5pZCA9IFNXVkRFQ19QUk9QRVJUWV9JRF9GUkFNRV9BVFRSSUJVVEVTOwotCi0gICAgcF9mcmFtZV9hdHRyaWJ1dGVzLT5jb2xvcl9mb3JtYXQgPSBTV1ZERUNfQ09MT1JfRk9STUFUX1NFTUlQTEFOQVJfTlYxMjsKLQotICAgIHBfZnJhbWVfYXR0cmlidXRlcy0+c3RyaWRlICAgID0gbV9mcmFtZV9hdHRyaWJ1dGVzLnN0cmlkZTsKLSAgICBwX2ZyYW1lX2F0dHJpYnV0ZXMtPnNjYW5saW5lcyA9IG1fZnJhbWVfYXR0cmlidXRlcy5zY2FubGluZXM7Ci0gICAgcF9mcmFtZV9hdHRyaWJ1dGVzLT5zaXplICAgICAgPSBtX2ZyYW1lX2F0dHJpYnV0ZXMuc2l6ZTsKLQotICAgIGlmICgocmV0dmFsX3N3dmRlYyA9IHN3dmRlY19zZXRwcm9wZXJ0eShtX3N3dmRlY19oYW5kbGUsICZwcm9wZXJ0eSkpICE9Ci0gICAgICAgIFNXVkRFQ19TVEFUVVNfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgIHJldHZhbCA9IHJldHZhbF9zd3ZkZWMyb214KHJldHZhbF9zd3ZkZWMpOwotICAgIH0KLQotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIFNldCBtYXhpbXVtIGFkYXB0aXZlIHBsYXliYWNrIGZyYW1lIGRpbWVuc2lvbnMgZm9yIFN3VmRlYyBjb3JlLgotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OnNldF9hZGFwdGl2ZV9wbGF5YmFja19zd3ZkZWMoKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIFNXVkRFQ19QUk9QRVJUWSBwcm9wZXJ0eTsKLQotICAgIFNXVkRFQ19TVEFUVVMgcmV0dmFsX3N3dmRlYzsKLQotICAgIHByb3BlcnR5LmlkID0gU1dWREVDX1BST1BFUlRZX0lEX0FEQVBUSVZFX1BMQVlCQUNLOwotCi0gICAgcHJvcGVydHkuaW5mby5mcmFtZV9kaW1lbnNpb25zLndpZHRoICA9IG1fZnJhbWVfZGltZW5zaW9uc19tYXgud2lkdGg7Ci0gICAgcHJvcGVydHkuaW5mby5mcmFtZV9kaW1lbnNpb25zLmhlaWdodCA9IG1fZnJhbWVfZGltZW5zaW9uc19tYXguaGVpZ2h0OwotCi0gICAgaWYgKChyZXR2YWxfc3d2ZGVjID0gc3d2ZGVjX3NldHByb3BlcnR5KG1fc3d2ZGVjX2hhbmRsZSwgJnByb3BlcnR5KSkgIT0KLSAgICAgICAgU1dWREVDX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLSAgICAgICAgcmV0dmFsID0gcmV0dmFsX3N3dmRlYzJvbXgocmV0dmFsX3N3dmRlYyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgR2V0IFN3VmRlYyBmcmFtZSBkaW1lbnNpb25zIGFuZCBzZXQgT01YIGNvbXBvbmVudCBmcmFtZSBkaW1lbnNpb25zLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmdldF9mcmFtZV9kaW1lbnNpb25zX3N3dmRlYygpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgU1dWREVDX1BST1BFUlRZIHByb3BlcnR5OwotCi0gICAgU1dWREVDX1NUQVRVUyByZXR2YWxfc3d2ZGVjOwotCi0gICAgcHJvcGVydHkuaWQgPSBTV1ZERUNfUFJPUEVSVFlfSURfRlJBTUVfRElNRU5TSU9OUzsKLQotICAgIGlmICgocmV0dmFsX3N3dmRlYyA9IHN3dmRlY19nZXRwcm9wZXJ0eShtX3N3dmRlY19oYW5kbGUsICZwcm9wZXJ0eSkpICE9Ci0gICAgICAgIFNXVkRFQ19TVEFUVVNfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgIHJldHZhbCA9IHJldHZhbF9zd3ZkZWMyb214KHJldHZhbF9zd3ZkZWMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtX2ZyYW1lX2RpbWVuc2lvbnMud2lkdGggID0gcHJvcGVydHkuaW5mby5mcmFtZV9kaW1lbnNpb25zLndpZHRoOwotICAgICAgICBtX2ZyYW1lX2RpbWVuc2lvbnMuaGVpZ2h0ID0gcHJvcGVydHkuaW5mby5mcmFtZV9kaW1lbnNpb25zLmhlaWdodDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBHZXQgU3dWZGVjIGZyYW1lIGF0dHJpYnV0ZXMgYW5kIHNldCBPTVggY29tcG9uZW50IGZyYW1lIGF0dHJpYnV0ZXMuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6Z2V0X2ZyYW1lX2F0dHJpYnV0ZXNfc3d2ZGVjKCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBTV1ZERUNfUFJPUEVSVFkgcHJvcGVydHk7Ci0KLSAgICBTV1ZERUNfU1RBVFVTIHJldHZhbF9zd3ZkZWM7Ci0KLSAgICBwcm9wZXJ0eS5pZCA9IFNXVkRFQ19QUk9QRVJUWV9JRF9GUkFNRV9BVFRSSUJVVEVTOwotCi0gICAgaWYgKChyZXR2YWxfc3d2ZGVjID0gc3d2ZGVjX2dldHByb3BlcnR5KG1fc3d2ZGVjX2hhbmRsZSwgJnByb3BlcnR5KSkgIT0KLSAgICAgICAgU1dWREVDX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLSAgICAgICAgcmV0dmFsID0gcmV0dmFsX3N3dmRlYzJvbXgocmV0dmFsX3N3dmRlYyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1fZnJhbWVfYXR0cmlidXRlcy5zdHJpZGUgICAgPSBwcm9wZXJ0eS5pbmZvLmZyYW1lX2F0dHJpYnV0ZXMuc3RyaWRlOwotICAgICAgICBtX2ZyYW1lX2F0dHJpYnV0ZXMuc2NhbmxpbmVzID0gcHJvcGVydHkuaW5mby5mcmFtZV9hdHRyaWJ1dGVzLnNjYW5saW5lczsKLSAgICAgICAgbV9mcmFtZV9hdHRyaWJ1dGVzLnNpemUgICAgICA9IHByb3BlcnR5LmluZm8uZnJhbWVfYXR0cmlidXRlcy5zaXplOwotICAgIH0KLQotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIEdldCBTd1ZkZWMgYnVmZmVyIHJlcXVpcmVtZW50czsgc2V0IGlucHV0IG9yIG91dHB1dCBwb3J0IGRlZmluaXRpb25zLgotICoKLSAqIEBwYXJhbVtpbl0gcG9ydF9pbmRleDogUG9ydCBpbmRleC4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpnZXRfYnVmZmVyX3JlcXVpcmVtZW50c19zd3ZkZWMoCi0gICAgdW5zaWduZWQgaW50IHBvcnRfaW5kZXgpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgU1dWREVDX1BST1BFUlRZIHByb3BlcnR5OwotCi0gICAgU1dWREVDX1NUQVRVUyByZXR2YWxfc3d2ZGVjOwotCi0gICAgU1dWREVDX0JVRkZFUl9SRVEgKnBfYnVmZmVyX3JlcTsKLQotICAgIGlmIChwb3J0X2luZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApCi0gICAgewotICAgICAgICBwcm9wZXJ0eS5pZCA9IFNXVkRFQ19QUk9QRVJUWV9JRF9CVUZGRVJfUkVRX0lQOwotCi0gICAgICAgIHBfYnVmZmVyX3JlcSA9ICZwcm9wZXJ0eS5pbmZvLmJ1ZmZlcl9yZXFfaXA7Ci0KLSAgICAgICAgaWYgKChyZXR2YWxfc3d2ZGVjID0gc3d2ZGVjX2dldHByb3BlcnR5KG1fc3d2ZGVjX2hhbmRsZSwgJnByb3BlcnR5KSkgIT0KLSAgICAgICAgICAgIFNXVkRFQ19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dmFsID0gcmV0dmFsX3N3dmRlYzJvbXgocmV0dmFsX3N3dmRlYyk7Ci0gICAgICAgICAgICBnb3RvIGdldF9idWZmZXJfcmVxdWlyZW1lbnRzX3N3dmRlY19leGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgbV9wb3J0X2lwLmRlZi5uQnVmZmVyU2l6ZSAgICAgICAgPSBwX2J1ZmZlcl9yZXEtPnNpemU7Ci0gICAgICAgIG1fcG9ydF9pcC5kZWYubkJ1ZmZlckNvdW50TWluICAgID0gcF9idWZmZXJfcmVxLT5taW5jb3VudDsKLSAgICAgICAgbV9wb3J0X2lwLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBNQVgocF9idWZmZXJfcmVxLT5taW5jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1NXVkRFQ19JUF9CVUZGRVJfQ09VTlRfTUlOKTsKLSAgICAgICAgbV9wb3J0X2lwLmRlZi5uQnVmZmVyQWxpZ25tZW50ICAgPSBwX2J1ZmZlcl9yZXEtPmFsaWdubWVudDsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJpcCBwb3J0OiAlZCBieXRlcyB4ICVkLCAlZC1ieXRlIGFsaWduZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcG9ydF9pcC5kZWYubkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3J0X2lwLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3J0X2lwLmRlZi5uQnVmZmVyQWxpZ25tZW50KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocG9ydF9pbmRleCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX09QKQotICAgIHsKLSAgICAgICAgcHJvcGVydHkuaWQgPSBTV1ZERUNfUFJPUEVSVFlfSURfQlVGRkVSX1JFUV9PUDsKLQotICAgICAgICBwX2J1ZmZlcl9yZXEgPSAmcHJvcGVydHkuaW5mby5idWZmZXJfcmVxX29wOwotCi0gICAgICAgIGlmICgocmV0dmFsX3N3dmRlYyA9IHN3dmRlY19nZXRwcm9wZXJ0eShtX3N3dmRlY19oYW5kbGUsICZwcm9wZXJ0eSkpICE9Ci0gICAgICAgICAgICBTV1ZERUNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHZhbCA9IHJldHZhbF9zd3ZkZWMyb214KHJldHZhbF9zd3ZkZWMpOwotICAgICAgICAgICAgZ290byBnZXRfYnVmZmVyX3JlcXVpcmVtZW50c19zd3ZkZWNfZXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3N5bmNfZnJhbWVfZGVjb2RpbmdfbW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9idWZmZXJfcmVxLT5taW5jb3VudCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJTaXplICAgICAgICA9IHBfYnVmZmVyX3JlcS0+c2l6ZTsKLSAgICAgICAgbV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRNaW4gICAgPSBwX2J1ZmZlcl9yZXEtPm1pbmNvdW50OwotICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IE1BWChwX2J1ZmZlcl9yZXEtPm1pbmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgIG1fcG9ydF9vcC5kZWYubkJ1ZmZlckFsaWdubWVudCAgID0gcF9idWZmZXJfcmVxLT5hbGlnbm1lbnQ7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgib3AgcG9ydDogJWQgYnl0ZXMgeCAlZCwgJWQtYnl0ZSBhbGlnbmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcG9ydF9vcC5kZWYubkJ1ZmZlckFsaWdubWVudCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsIHBvcnRfaW5kZXgpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICB9Ci0KLWdldF9idWZmZXJfcmVxdWlyZW1lbnRzX3N3dmRlY19leGl0OgotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIEFsbG9jYXRlIGlucHV0IGJ1ZmZlciwgYW5kIGlucHV0IGJ1ZmZlciBpbmZvIGFycmF5IGlmIG5jZXNzYXJ5LgotICoKLSAqIEBwYXJhbVtpbixvdXRdIHBwX2J1ZmZlcl9oZHI6IFBvaW50ZXIgdG8gcG9pbnRlciB0byBidWZmZXIgaGVhZGVyIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZS4KLSAqIEBwYXJhbVtpbl0gICAgIHBfYXBwX2RhdGE6ICAgIFBvaW50ZXIgdG8gSUwgY2xpZW50IGFwcCBkYXRhLgotICogQHBhcmFtW2luXSAgICAgc2l6ZTogICAgICAgICAgU2l6ZSBvZiBidWZmZXIgdG8gYmUgYWxsb2NhdGVkIGluIGJ5dGVzLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmJ1ZmZlcl9hbGxvY2F0ZV9pcCgKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwX2J1ZmZlcl9oZHIsCi0gICAgT01YX1BUUiAgICAgICAgICAgICAgICBwX2FwcF9kYXRhLAotICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgc2l6ZSkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICB1bnNpZ25lZCBpbnQgaWk7Ci0KLSAgICBpZiAoc2l6ZSAhPSBtX3BvcnRfaXAuZGVmLm5CdWZmZXJTaXplKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInJlcXVlc3RlZCBzaXplICglZCBieXRlcykgbm90IGVxdWFsIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZ3VyZWQgc2l6ZSAoJWQgYnl0ZXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3J0X2lwLmRlZi5uQnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICBnb3RvIGJ1ZmZlcl9hbGxvY2F0ZV9pcF9leGl0OwotICAgIH0KLQotICAgIGlmIChtX2J1ZmZlcl9hcnJheV9pcCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiYWxsb2NhdGluZyBidWZmZXIgaW5mbyBhcnJheSwgJWQgZWxlbWVudCVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9wb3J0X2lwLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPiAxKSA/ICJzIiA6ICIiKTsKLQotICAgICAgICBpZiAoKHJldHZhbCA9IGJ1ZmZlcl9hbGxvY2F0ZV9pcF9pbmZvX2FycmF5KCkpICE9IE9NWF9FcnJvck5vbmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdvdG8gYnVmZmVyX2FsbG9jYXRlX2lwX2V4aXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGlpID0gMDsgaWkgPCBtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudEFjdHVhbDsgaWkrKykKLSAgICB7Ci0gICAgICAgIGlmIChtX2J1ZmZlcl9hcnJheV9pcFtpaV0uYnVmZmVyX3BvcHVsYXRlZCA9PSBmYWxzZSkKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfTE9XKCJidWZmZXIgJWQgbm90IHBvcHVsYXRlZCIsIGlpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGlpIDwgbV9wb3J0X2lwLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwpCi0gICAgewotICAgICAgICBpbnQgcG1lbV9mZCA9IC0xOwotCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcmFkZHI7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiaXAgYnVmZmVyICVkOiAlZCBieXRlcyBiZWluZyBhbGxvY2F0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCi0gICAgICAgIG1fYnVmZmVyX2FycmF5X2lwW2lpXS5pb25faW5mby5pb25fZmRfZGV2aWNlID0KLSAgICAgICAgICAgIGlvbl9tZW1vcnlfYWxsb2NfbWFwKCZtX2J1ZmZlcl9hcnJheV9pcFtpaV0uaW9uX2luZm8uaW9uX2FsbG9jX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9idWZmZXJfYXJyYXlfaXBbaWldLmlvbl9pbmZvLmlvbl9mZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcG9ydF9pcC5kZWYubkJ1ZmZlckFsaWdubWVudCk7Ci0KLSAgICAgICAgaWYgKG1fYnVmZmVyX2FycmF5X2lwW2lpXS5pb25faW5mby5pb25fZmRfZGV2aWNlIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgZ290byBidWZmZXJfYWxsb2NhdGVfaXBfZXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIHBtZW1fZmQgPSBtX2J1ZmZlcl9hcnJheV9pcFtpaV0uaW9uX2luZm8uaW9uX2ZkX2RhdGEuZmQ7Ci0KLSAgICAgICAgYnVmZmVyYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIG1tYXAoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lbV9mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlcmFkZHIgPT0gTUFQX0ZBSUxFRCkKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoIm1tYXAoKSBmYWlsZWQgZm9yIGZkICVkIG9mIHNpemUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lbV9mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCi0gICAgICAgICAgICBjbG9zZShwbWVtX2ZkKTsKLSAgICAgICAgICAgIGlvbl9tZW1vcnlfZnJlZSgmbV9idWZmZXJfYXJyYXlfaXBbaWldLmlvbl9pbmZvKTsKLQotICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgZ290byBidWZmZXJfYWxsb2NhdGVfaXBfZXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgICpwcF9idWZmZXJfaGRyID0gJm1fYnVmZmVyX2FycmF5X2lwW2lpXS5idWZmZXJfaGVhZGVyOwotCi0gICAgICAgIG1fYnVmZmVyX2FycmF5X2lwW2lpXS5idWZmZXJfcGF5bG9hZC5idWZmZXJhZGRyICA9IGJ1ZmZlcmFkZHI7Ci0gICAgICAgIG1fYnVmZmVyX2FycmF5X2lwW2lpXS5idWZmZXJfcGF5bG9hZC5wbWVtX2ZkICAgICA9IHBtZW1fZmQ7Ci0gICAgICAgIG1fYnVmZmVyX2FycmF5X2lwW2lpXS5idWZmZXJfcGF5bG9hZC5idWZmZXJfbGVuICA9IHNpemU7Ci0gICAgICAgIG1fYnVmZmVyX2FycmF5X2lwW2lpXS5idWZmZXJfcGF5bG9hZC5tbWFwZWRfc2l6ZSA9IHNpemU7Ci0gICAgICAgIG1fYnVmZmVyX2FycmF5X2lwW2lpXS5idWZmZXJfcGF5bG9hZC5vZmZzZXQgICAgICA9IDA7Ci0KLSAgICAgICAgbV9idWZmZXJfYXJyYXlfaXBbaWldLmJ1ZmZlcl9zd3ZkZWMucF9idWZmZXIgICAgICA9IGJ1ZmZlcmFkZHI7Ci0gICAgICAgIG1fYnVmZmVyX2FycmF5X2lwW2lpXS5idWZmZXJfc3d2ZGVjLnNpemUgICAgICAgICAgPSBzaXplOwotICAgICAgICBtX2J1ZmZlcl9hcnJheV9pcFtpaV0uYnVmZmVyX3N3dmRlYy5wX2NsaWVudF9kYXRhID0KLSAgICAgICAgICAgICh2b2lkICopICgodW5zaWduZWQgbG9uZykgaWkpOwotCi0gICAgICAgIG1fYnVmZmVyX2FycmF5X2lwW2lpXS5idWZmZXJfcG9wdWxhdGVkID0gdHJ1ZTsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJpcCBidWZmZXIgJWQ6ICVwLCAlZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQotICAgICAgICAoKnBwX2J1ZmZlcl9oZHIpLT5wQnVmZmVyICAgICAgICAgICA9IChPTVhfVTggKikgYnVmZmVyYWRkcjsKLSAgICAgICAgKCpwcF9idWZmZXJfaGRyKS0+blNpemUgICAgICAgICAgICAgPSBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpOwotICAgICAgICAoKnBwX2J1ZmZlcl9oZHIpLT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgICAgICgqcHBfYnVmZmVyX2hkciktPm5BbGxvY0xlbiAgICAgICAgID0gc2l6ZTsKLSAgICAgICAgKCpwcF9idWZmZXJfaGRyKS0+cEFwcFByaXZhdGUgICAgICAgPSBwX2FwcF9kYXRhOwotICAgICAgICAoKnBwX2J1ZmZlcl9oZHIpLT5uSW5wdXRQb3J0SW5kZXggICA9IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVA7Ci0gICAgICAgICgqcHBfYnVmZmVyX2hkciktPnBJbnB1dFBvcnRQcml2YXRlID0KLSAgICAgICAgICAgICh2b2lkICopICYobV9idWZmZXJfYXJyYXlfaXBbaWldLmJ1ZmZlcl9wYXlsb2FkKTsKLQotICAgICAgICBtX3BvcnRfaXAucG9wdWxhdGVkICAgPSBwb3J0X2lwX3BvcHVsYXRlZCgpOwotICAgICAgICBtX3BvcnRfaXAudW5wb3B1bGF0ZWQgPSBPTVhfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJhbGwgJWQgaXAgYnVmZmVycyBhbGxvY2F0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgIH0KLQotYnVmZmVyX2FsbG9jYXRlX2lwX2V4aXQ6Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgQWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciwgYW5kIG91dHB1dCBidWZmZXIgaW5mbyBhcnJheSBpZiBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtW2luLG91dF0gcHBfYnVmZmVyX2hkcjogUG9pbnRlciB0byBwb2ludGVyIHRvIGJ1ZmZlciBoZWFkZXIgdHlwZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlLgotICogQHBhcmFtW2luXSAgICAgcF9hcHBfZGF0YTogICAgUG9pbnRlciB0byBJTCBjbGllbnQgYXBwIGRhdGEuCi0gKiBAcGFyYW1baW5dICAgICBzaXplOiAgICAgICAgICBTaXplIG9mIGJ1ZmZlciB0byBiZSBhbGxvY2F0ZWQgaW4gYnl0ZXMuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6YnVmZmVyX2FsbG9jYXRlX29wKAotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqcHBfYnVmZmVyX2hkciwKLSAgICBPTVhfUFRSICAgICAgICAgICAgICAgIHBfYXBwX2RhdGEsCi0gICAgT01YX1UzMiAgICAgICAgICAgICAgICBzaXplKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIHVuc2lnbmVkIGludCBpaTsKLQotICAgIGlmIChzaXplICE9IG1fcG9ydF9vcC5kZWYubkJ1ZmZlclNpemUpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicmVxdWVzdGVkIHNpemUgKCVkIGJ5dGVzKSBub3QgZXF1YWwgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlndXJlZCBzaXplICglZCBieXRlcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJTaXplKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIGdvdG8gYnVmZmVyX2FsbG9jYXRlX29wX2V4aXQ7Ci0gICAgfQotCi0gICAgaWYgKG1fYnVmZmVyX2FycmF5X29wID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJhbGxvY2F0aW5nIGJ1ZmZlciBpbmZvIGFycmF5LCAlZCBlbGVtZW50JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA+IDEpID8gInMiIDogIiIpOwotCi0gICAgICAgIGlmICgocmV0dmFsID0gYnVmZmVyX2FsbG9jYXRlX29wX2luZm9fYXJyYXkoKSkgIT0gT01YX0Vycm9yTm9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBidWZmZXJfYWxsb2NhdGVfb3BfZXhpdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaWkgPSAwOyBpaSA8IG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsOyBpaSsrKQotICAgIHsKLSAgICAgICAgaWYgKG1fYnVmZmVyX2FycmF5X29wW2lpXS5idWZmZXJfcG9wdWxhdGVkID09IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19MT1coImJ1ZmZlciAlZCBub3QgcG9wdWxhdGVkIiwgaWkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaWkgPCBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCkKLSAgICB7Ci0gICAgICAgIGludCBwbWVtX2ZkID0gLTE7Ci0KLSAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyYWRkcjsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJvcCBidWZmZXIgJWQ6ICVkIGJ5dGVzIGJlaW5nIGFsbG9jYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0KLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmlvbl9pbmZvLmlvbl9mZF9kZXZpY2UgPQotICAgICAgICAgICAgaW9uX21lbW9yeV9hbGxvY19tYXAoJm1fYnVmZmVyX2FycmF5X29wW2lpXS5pb25faW5mby5pb25fYWxsb2NfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX2J1ZmZlcl9hcnJheV9vcFtpaV0uaW9uX2luZm8uaW9uX2ZkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3J0X29wLmRlZi5uQnVmZmVyQWxpZ25tZW50KTsKLQotICAgICAgICBpZiAobV9idWZmZXJfYXJyYXlfb3BbaWldLmlvbl9pbmZvLmlvbl9mZF9kZXZpY2UgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICBnb3RvIGJ1ZmZlcl9hbGxvY2F0ZV9vcF9leGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgcG1lbV9mZCA9IG1fYnVmZmVyX2FycmF5X29wW2lpXS5pb25faW5mby5pb25fZmRfZGF0YS5mZDsKLQotICAgICAgICBidWZmZXJhZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgbW1hcChOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWVtX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQotICAgICAgICBpZiAoYnVmZmVyYWRkciA9PSBNQVBfRkFJTEVEKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigibW1hcCgpIGZhaWxlZCBmb3IgZmQgJWQgb2Ygc2l6ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWVtX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0KLSAgICAgICAgICAgIGNsb3NlKHBtZW1fZmQpOwotICAgICAgICAgICAgaW9uX21lbW9yeV9mcmVlKCZtX2J1ZmZlcl9hcnJheV9vcFtpaV0uaW9uX2luZm8pOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICBnb3RvIGJ1ZmZlcl9hbGxvY2F0ZV9vcF9leGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgKnBwX2J1ZmZlcl9oZHIgPSAmbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9oZWFkZXI7Ci0KLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wYXlsb2FkLmJ1ZmZlcmFkZHIgID0gYnVmZmVyYWRkcjsKLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wYXlsb2FkLnBtZW1fZmQgICAgID0gcG1lbV9mZDsKLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wYXlsb2FkLmJ1ZmZlcl9sZW4gID0gc2l6ZTsKLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wYXlsb2FkLm1tYXBlZF9zaXplID0gc2l6ZTsKLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wYXlsb2FkLm9mZnNldCAgICAgID0gMDsKLQotICAgICAgICBtX2J1ZmZlcl9hcnJheV9vcFtpaV0uYnVmZmVyX3N3dmRlYy5wX2J1ZmZlciAgICAgID0gYnVmZmVyYWRkcjsKLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9zd3ZkZWMuc2l6ZSAgICAgICAgICA9IHNpemU7Ci0gICAgICAgIG1fYnVmZmVyX2FycmF5X29wW2lpXS5idWZmZXJfc3d2ZGVjLnBfY2xpZW50X2RhdGEgPQotICAgICAgICAgICAgKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBpaSk7Ci0KLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wb3B1bGF0ZWQgPSB0cnVlOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goIm9wIGJ1ZmZlciAlZDogJXAsICVkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCi0gICAgICAgICgqcHBfYnVmZmVyX2hkciktPnBCdWZmZXIgICAgICAgICAgICA9IChPTVhfVTggKikgYnVmZmVyYWRkcjsKLSAgICAgICAgKCpwcF9idWZmZXJfaGRyKS0+blNpemUgICAgICAgICAgICAgID0gc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKTsKLSAgICAgICAgKCpwcF9idWZmZXJfaGRyKS0+blZlcnNpb24ublZlcnNpb24gID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICAgICAgKCpwcF9idWZmZXJfaGRyKS0+bkFsbG9jTGVuICAgICAgICAgID0gc2l6ZTsKLSAgICAgICAgKCpwcF9idWZmZXJfaGRyKS0+cEFwcFByaXZhdGUgICAgICAgID0gcF9hcHBfZGF0YTsKLSAgICAgICAgKCpwcF9idWZmZXJfaGRyKS0+bk91dHB1dFBvcnRJbmRleCAgID0gT01YX0NPUkVfUE9SVF9JTkRFWF9PUDsKLSAgICAgICAgKCpwcF9idWZmZXJfaGRyKS0+cE91dHB1dFBvcnRQcml2YXRlID0KLSAgICAgICAgICAgICh2b2lkICopICYobV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wYXlsb2FkKTsKLQotICAgICAgICBtX3BvcnRfb3AucG9wdWxhdGVkICAgPSBwb3J0X29wX3BvcHVsYXRlZCgpOwotICAgICAgICBtX3BvcnRfb3AudW5wb3B1bGF0ZWQgPSBPTVhfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJhbGwgJWQgb3AgYnVmZmVycyBhbGxvY2F0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgIH0KLQotYnVmZmVyX2FsbG9jYXRlX29wX2V4aXQ6Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgQWxsb2NhdGUgaW5wdXQgYnVmZmVyIGluZm8gYXJyYXkuCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6YnVmZmVyX2FsbG9jYXRlX2lwX2luZm9fYXJyYXkoKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIHVuc2lnbmVkIGludCBpaTsKLQotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1ZmZlcl9oZHI7Ci0KLSAgICBpZiAobV9idWZmZXJfYXJyYXlfaXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJidWZmZXIgaW5mbyBhcnJheSBhbHJlYWR5IGFsbG9jYXRlZCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgZ290byBidWZmZXJfYWxsb2NhdGVfaXBfaW5mb19hcnJheV9leGl0OwotICAgIH0KLQotICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goImFsbG9jYXRpbmcgYnVmZmVyIGluZm8gYXJyYXksICVkIGVsZW1lbnQlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA+IDEpID8gInMiIDogIiIpOwotCi0gICAgbV9idWZmZXJfYXJyYXlfaXAgPQotICAgICAgICAoT01YX1NXVkRFQ19CVUZGRVJfSU5GTyAqKSBjYWxsb2Moc2l6ZW9mKE9NWF9TV1ZERUNfQlVGRkVSX0lORk8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3J0X2lwLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotCi0gICAgaWYgKG1fYnVmZmVyX2FycmF5X2lwID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBpbmZvIGFycmF5OyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZCBlbGVtZW50JXMsICV6dSBieXRlcyByZXF1ZXN0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcG9ydF9pcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsID4gMSkgPyAicyIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE9NWF9TV1ZERUNfQlVGRkVSX0lORk8pICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3J0X2lwLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgZ290byBidWZmZXJfYWxsb2NhdGVfaXBfaW5mb19hcnJheV9leGl0OwotICAgIH0KLQotICAgIGZvciAoaWkgPSAwOyBpaSA8IG1fcG9ydF9pcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsOyBpaSsrKQotICAgIHsKLSAgICAgICAgcF9idWZmZXJfaGRyID0gJm1fYnVmZmVyX2FycmF5X2lwW2lpXS5idWZmZXJfaGVhZGVyOwotCi0gICAgICAgIC8vIHJlc2V0IGZpbGUgZGVzY3JpcHRvcnMKLQotICAgICAgICBtX2J1ZmZlcl9hcnJheV9pcFtpaV0uYnVmZmVyX3BheWxvYWQucG1lbV9mZCA9IC0xOwotICAgICAgICBtX2J1ZmZlcl9hcnJheV9pcFtpaV0uaW9uX2luZm8uaW9uX2ZkX2RldmljZSA9IC0xOwotCi0gICAgICAgIG1fYnVmZmVyX2FycmF5X2lwW2lpXS5idWZmZXJfc3d2ZGVjLnBfY2xpZW50X2RhdGEgPQotICAgICAgICAgICAgKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBpaSk7Ci0KLSAgICAgICAgcF9idWZmZXJfaGRyLT5uU2l6ZSAgICAgICAgICAgICA9IHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSk7Ci0gICAgICAgIHBfYnVmZmVyX2hkci0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICBwX2J1ZmZlcl9oZHItPm5JbnB1dFBvcnRJbmRleCAgID0gT01YX0NPUkVfUE9SVF9JTkRFWF9JUDsKLSAgICAgICAgcF9idWZmZXJfaGRyLT5wSW5wdXRQb3J0UHJpdmF0ZSA9Ci0gICAgICAgICAgICAodm9pZCAqKSAmKG1fYnVmZmVyX2FycmF5X2lwW2lpXS5idWZmZXJfcGF5bG9hZCk7Ci0gICAgfQotCi1idWZmZXJfYWxsb2NhdGVfaXBfaW5mb19hcnJheV9leGl0OgotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgaW5mbyBhcnJheS4KLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpidWZmZXJfYWxsb2NhdGVfb3BfaW5mb19hcnJheSgpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgdW5zaWduZWQgaW50IGlpOwotCi0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmZmVyX2hkcjsKLQotICAgIGlmIChtX2J1ZmZlcl9hcnJheV9vcCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImJ1ZmZlciBpbmZvIGFycmF5IGFscmVhZHkgYWxsb2NhdGVkIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICBnb3RvIGJ1ZmZlcl9hbGxvY2F0ZV9vcF9pbmZvX2FycmF5X2V4aXQ7Ci0gICAgfQotCi0gICAgT01YX1NXVkRFQ19MT0dfSElHSCgiYWxsb2NhdGluZyBidWZmZXIgaW5mbyBhcnJheSwgJWQgZWxlbWVudCVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgKG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsID4gMSkgPyAicyIgOiAiIik7Ci0KLSAgICBtX2J1ZmZlcl9hcnJheV9vcCA9Ci0gICAgICAgIChPTVhfU1dWREVDX0JVRkZFUl9JTkZPICopIGNhbGxvYyhzaXplb2YoT01YX1NXVkRFQ19CVUZGRVJfSU5GTyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0KLSAgICBpZiAobV9idWZmZXJfYXJyYXlfb3AgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGluZm8gYXJyYXk7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIGVsZW1lbnQlcywgJXp1IGJ5dGVzIHJlcXVlc3RlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPiAxKSA/ICJzIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoT01YX1NXVkRFQ19CVUZGRVJfSU5GTykgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICBnb3RvIGJ1ZmZlcl9hbGxvY2F0ZV9vcF9pbmZvX2FycmF5X2V4aXQ7Ci0gICAgfQotCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgbV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGlpKyspCi0gICAgewotICAgICAgICBwX2J1ZmZlcl9oZHIgPSAmbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9oZWFkZXI7Ci0KLSAgICAgICAgLy8gcmVzZXQgZmlsZSBkZXNjcmlwdG9ycwotCi0gICAgICAgIG1fYnVmZmVyX2FycmF5X29wW2lpXS5idWZmZXJfcGF5bG9hZC5wbWVtX2ZkID0gLTE7Ci0gICAgICAgIG1fYnVmZmVyX2FycmF5X29wW2lpXS5pb25faW5mby5pb25fZmRfZGV2aWNlID0gLTE7Ci0KLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9zd3ZkZWMucF9jbGllbnRfZGF0YSA9Ci0gICAgICAgICAgICAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpIGlpKTsKLQotICAgICAgICBwX2J1ZmZlcl9oZHItPm5TaXplICAgICAgICAgICAgICA9IHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSk7Ci0gICAgICAgIHBfYnVmZmVyX2hkci0+blZlcnNpb24ublZlcnNpb24gID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICAgICAgcF9idWZmZXJfaGRyLT5uT3V0cHV0UG9ydEluZGV4ICAgPSBPTVhfQ09SRV9QT1JUX0lOREVYX09QOwotICAgICAgICBwX2J1ZmZlcl9oZHItPnBPdXRwdXRQb3J0UHJpdmF0ZSA9Ci0gICAgICAgICAgICAodm9pZCAqKSAmKG1fYnVmZmVyX2FycmF5X29wW2lpXS5idWZmZXJfcGF5bG9hZCk7Ci0gICAgfQotCi1idWZmZXJfYWxsb2NhdGVfb3BfaW5mb19hcnJheV9leGl0OgotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIFVzZSBidWZmZXIgYWxsb2NhdGVkIGJ5IElMIGNsaWVudDsgYWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciBpbmZvIGFycmF5Ci0gKiAgICAgICAgaWYgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbVtpbixvdXRdIHBwX2J1ZmZlcl9oZHI6IFBvaW50ZXIgdG8gcG9pbnRlciB0byBidWZmZXIgaGVhZGVyIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZS4KLSAqIEBwYXJhbVtpbl0gICAgIHBfYXBwX2RhdGE6ICAgIFBvaW50ZXIgdG8gSUwgY2xpZW50IGFwcCBkYXRhLgotICogQHBhcmFtW2luXSAgICAgc2l6ZTogICAgICAgICAgU2l6ZSBvZiBidWZmZXIgdG8gYmUgYWxsb2NhdGVkIGluIGJ5dGVzLgotICogQHBhcmFtW2luXSAgICAgcF9idWZmZXI6ICAgICAgUG9pbnRlciB0byBidWZmZXIgdG8gYmUgdXNlZC4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpidWZmZXJfdXNlX29wKAotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqcHBfYnVmZmVyX2hkciwKLSAgICBPTVhfUFRSICAgICAgICAgICAgICAgIHBfYXBwX2RhdGEsCi0gICAgT01YX1UzMiAgICAgICAgICAgICAgICBzaXplLAotICAgIE9NWF9VOCAgICAgICAgICAgICAgICAqcF9idWZmZXIpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgdW5zaWduZWQgaW50IGlpOwotCi0gICAgKHZvaWQpIHNpemU7Ci0KLSAgICBpZiAobV9idWZmZXJfYXJyYXlfb3AgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goImFsbG9jYXRpbmcgYnVmZmVyIGluZm8gYXJyYXksICVkIGVsZW1lbnQlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsID4gMSkgPyAicyIgOiAiIik7Ci0KLSAgICAgICAgaWYgKChyZXR2YWwgPSBidWZmZXJfYWxsb2NhdGVfb3BfaW5mb19hcnJheSgpKSAhPSBPTVhfRXJyb3JOb25lKQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIGJ1ZmZlcl91c2Vfb3BfZXhpdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtX21ldGFfYnVmZmVyX21vZGUgJiYgKG1fbWV0YV9idWZmZXJfYXJyYXkgPT0gTlVMTCkpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJhbGxvY2F0aW5nIG1ldGEgYnVmZmVyIGluZm8gYXJyYXksICVkIGVsZW1lbnQlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsID4gMSkgPyAicyIgOiAiIik7Ci0KLSAgICAgICAgaWYgKChyZXR2YWwgPSBtZXRhX2J1ZmZlcl9hcnJheV9hbGxvY2F0ZSgpKSAhPSBPTVhfRXJyb3JOb25lKQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIGJ1ZmZlcl91c2Vfb3BfZXhpdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaWkgPSAwOyBpaSA8IG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsOyBpaSsrKQotICAgIHsKLSAgICAgICAgaWYgKG1fYnVmZmVyX2FycmF5X29wW2lpXS5idWZmZXJfcG9wdWxhdGVkID09IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19MT1coImJ1ZmZlciAlZCBub3QgcG9wdWxhdGVkIiwgaWkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaWkgPCBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCkKLSAgICB7Ci0gICAgICAgIHN0cnVjdCB2ZGVjX2J1ZmZlcnBheWxvYWQgKnBfYnVmZmVyX3BheWxvYWQ7Ci0KLSAgICAgICAgU1dWREVDX0JVRkZFUiAqcF9idWZmZXJfc3d2ZGVjOwotCi0gICAgICAgICpwcF9idWZmZXJfaGRyICAgPSAmbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9oZWFkZXI7Ci0gICAgICAgIHBfYnVmZmVyX3BheWxvYWQgPSAmbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wYXlsb2FkOwotICAgICAgICBwX2J1ZmZlcl9zd3ZkZWMgID0gJm1fYnVmZmVyX2FycmF5X29wW2lpXS5idWZmZXJfc3d2ZGVjOwotCi0gICAgICAgIGlmIChtX21ldGFfYnVmZmVyX21vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+c2l6ZSAgICAgICAgICA9IG1fcG9ydF9vcC5kZWYubkJ1ZmZlclNpemU7Ci0gICAgICAgICAgICBwX2J1ZmZlcl9zd3ZkZWMtPnBfY2xpZW50X2RhdGEgPSAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpIGlpKTsKLQotICAgICAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wb3B1bGF0ZWQgPSB0cnVlOwotCi0gICAgICAgICAgICAoKnBwX2J1ZmZlcl9oZHIpLT5wQnVmZmVyICAgICA9IHBfYnVmZmVyOwotICAgICAgICAgICAgKCpwcF9idWZmZXJfaGRyKS0+cEFwcFByaXZhdGUgPSBwX2FwcF9kYXRhOwotICAgICAgICAgICAgKCpwcF9idWZmZXJfaGRyKS0+bkFsbG9jTGVuICAgPQotICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgVmlkZW9EZWNvZGVyT3V0cHV0TWV0YURhdGEpOwotCi0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJvcCBidWZmZXIgJWQ6ICVwIChtZXRhIGJ1ZmZlcikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwX2J1ZmZlcl9oZHIpOwotCi0gICAgICAgICAgICBtX3BvcnRfb3AucG9wdWxhdGVkICAgPSBwb3J0X29wX3BvcHVsYXRlZCgpOwotICAgICAgICAgICAgbV9wb3J0X29wLnVucG9wdWxhdGVkID0gT01YX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1fYW5kcm9pZF9uYXRpdmVfYnVmZmVycykKLSAgICAgICAgewotICAgICAgICAgICAgcHJpdmF0ZV9oYW5kbGVfdCAqcF9oYW5kbGU7Ci0KLSAgICAgICAgICAgIE9NWF9VOCAqcF9idWZmZXJfbWFwcGVkOwotCi0gICAgICAgICAgICBwX2hhbmRsZSA9IChwcml2YXRlX2hhbmRsZV90ICopIHBfYnVmZmVyOwotCi0gICAgICAgICAgICBpZiAoKChPTVhfVTMyKSBwX2hhbmRsZS0+c2l6ZSkgPCBtX3BvcnRfb3AuZGVmLm5CdWZmZXJTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJyZXF1ZXN0ZWQgc2l6ZSAoJWQgYnl0ZXMpIG5vdCBlcXVhbCB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZ3VyZWQgc2l6ZSAoJWQgYnl0ZXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2hhbmRsZS0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICBnb3RvIGJ1ZmZlcl91c2Vfb3BfZXhpdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbV9wb3J0X29wLmRlZi5uQnVmZmVyU2l6ZSA9IHBfaGFuZGxlLT5zaXplOwotCi0gICAgICAgICAgICBwX2J1ZmZlcl9tYXBwZWQgPSAoT01YX1U4ICopIG1tYXAoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2hhbmRsZS0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9oYW5kbGUtPmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCi0gICAgICAgICAgICBpZiAocF9idWZmZXJfbWFwcGVkID09IE1BUF9GQUlMRUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoIm1tYXAoKSBmYWlsZWQgZm9yIGZkICVkIG9mIHNpemUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfaGFuZGxlLT5mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2hhbmRsZS0+c2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICAgICAgZ290byBidWZmZXJfdXNlX29wX2V4aXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBfYnVmZmVyX3BheWxvYWQtPmJ1ZmZlcmFkZHIgID0gcF9idWZmZXJfbWFwcGVkOwotICAgICAgICAgICAgcF9idWZmZXJfcGF5bG9hZC0+cG1lbV9mZCAgICAgPSBwX2hhbmRsZS0+ZmQ7Ci0gICAgICAgICAgICBwX2J1ZmZlcl9wYXlsb2FkLT5idWZmZXJfbGVuICA9IHBfaGFuZGxlLT5zaXplOwotICAgICAgICAgICAgcF9idWZmZXJfcGF5bG9hZC0+bW1hcGVkX3NpemUgPSBwX2hhbmRsZS0+c2l6ZTsKLSAgICAgICAgICAgIHBfYnVmZmVyX3BheWxvYWQtPm9mZnNldCAgICAgID0gMDsKLQotICAgICAgICAgICAgcF9idWZmZXJfc3d2ZGVjLT5wX2J1ZmZlciAgICAgID0gcF9idWZmZXJfbWFwcGVkOwotICAgICAgICAgICAgcF9idWZmZXJfc3d2ZGVjLT5zaXplICAgICAgICAgID0gbV9wb3J0X29wLmRlZi5uQnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+cF9jbGllbnRfZGF0YSA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZykgaWkpOwotCi0gICAgICAgICAgICBtX2J1ZmZlcl9hcnJheV9vcFtpaV0uYnVmZmVyX3BvcHVsYXRlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICgqcHBfYnVmZmVyX2hkciktPnBCdWZmZXIgICAgID0gKG1fYW5kcm9pZF9uYXRpdmVfYnVmZmVycyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9NWF9VOCAqKSBwX2hhbmRsZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfbWFwcGVkKTsKLSAgICAgICAgICAgICgqcHBfYnVmZmVyX2hkciktPnBBcHBQcml2YXRlID0gcF9hcHBfZGF0YTsKLSAgICAgICAgICAgICgqcHBfYnVmZmVyX2hkciktPm5BbGxvY0xlbiAgID0gbV9wb3J0X29wLmRlZi5uQnVmZmVyU2l6ZTsKLQotICAgICAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmlvbl9pbmZvLmlvbl9mZF9kYXRhLmZkID0gcF9oYW5kbGUtPmZkOwotCi0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJvcCBidWZmZXIgJWQ6ICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcF9idWZmZXJfaGRyKTsKLQotICAgICAgICAgICAgbV9wb3J0X29wLnBvcHVsYXRlZCAgID0gcG9ydF9vcF9wb3B1bGF0ZWQoKTsKLSAgICAgICAgICAgIG1fcG9ydF9vcC51bnBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJuZWl0aGVyICdtZXRhIGJ1ZmZlciBtb2RlJyBub3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidhbmRyb2lkIG5hdGl2ZSBidWZmZXJzJyBlbmFibGVkIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiYWxsICVkIG9wIGJ1ZmZlcnMgcG9wdWxhdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICB9Ci0KLWJ1ZmZlcl91c2Vfb3BfZXhpdDoKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBEZS1hbGxvY2F0ZSBpbnB1dCBidWZmZXIuCi0gKgotICogQHBhcmFtW2luXSBwX2J1ZmZlcl9oZHI6IFBvaW50ZXIgdG8gYnVmZmVyIGhlYWRlciBzdHJ1Y3R1cmUuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6YnVmZmVyX2RlYWxsb2NhdGVfaXAoCi0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmZmVyX2hkcikKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICB1bnNpZ25lZCBpbnQgaWk7Ci0KLSAgICBpZiAocF9idWZmZXJfaGRyID09IE5VTEwpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicF9idWZmZXJfaGRyID0gTlVMTCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgZ290byBidWZmZXJfZGVhbGxvY2F0ZV9pcF9leGl0OwotICAgIH0KLSAgICBlbHNlIGlmIChtX2J1ZmZlcl9hcnJheV9pcCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImlwIGJ1ZmZlciBhcnJheSBub3QgYWxsb2NhdGVkIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICBnb3RvIGJ1ZmZlcl9kZWFsbG9jYXRlX2lwX2V4aXQ7Ci0gICAgfQotCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgbV9wb3J0X2lwLmRlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGlpKyspCi0gICAgewotICAgICAgICBpZiAocF9idWZmZXJfaGRyID09ICYobV9idWZmZXJfYXJyYXlfaXBbaWldLmJ1ZmZlcl9oZWFkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19MT1coIiVwIGhhcyBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGlpIDwgbV9wb3J0X2lwLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwpCi0gICAgewotICAgICAgICBpZiAobV9idWZmZXJfYXJyYXlfaXBbaWldLmJ1ZmZlcl9wYXlsb2FkLnBtZW1fZmQgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2J1ZmZlcl9hcnJheV9pcFtpaV0uYnVmZmVyX3BvcHVsYXRlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBtX3BvcnRfaXAucG9wdWxhdGVkID0gT01YX0ZBTFNFOwotCi0gICAgICAgICAgICBtdW5tYXAobV9idWZmZXJfYXJyYXlfaXBbaWldLmJ1ZmZlcl9wYXlsb2FkLmJ1ZmZlcmFkZHIsCi0gICAgICAgICAgICAgICAgICAgbV9idWZmZXJfYXJyYXlfaXBbaWldLmJ1ZmZlcl9wYXlsb2FkLm1tYXBlZF9zaXplKTsKLQotICAgICAgICAgICAgY2xvc2UobV9idWZmZXJfYXJyYXlfaXBbaWldLmJ1ZmZlcl9wYXlsb2FkLnBtZW1fZmQpOwotICAgICAgICAgICAgbV9idWZmZXJfYXJyYXlfaXBbaWldLmJ1ZmZlcl9wYXlsb2FkLnBtZW1fZmQgPSAtMTsKLQotICAgICAgICAgICAgaW9uX21lbW9yeV9mcmVlKCZtX2J1ZmZlcl9hcnJheV9pcFtpaV0uaW9uX2luZm8pOwotCi0gICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudEFjdHVhbDsgaWkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobV9idWZmZXJfYXJyYXlfaXBbaWldLmJ1ZmZlcl9wb3B1bGF0ZWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpaSA9PSBtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWZmZXJfZGVhbGxvY2F0ZV9pcF9pbmZvX2FycmF5KCk7Ci0KLSAgICAgICAgICAgICAgICBtX3BvcnRfaXAudW5wb3B1bGF0ZWQgPSBPTVhfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCIlcDogcG1lbV9mZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9oZHItPnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlcl9hcnJheV9pcFtpaV0uYnVmZmVyX3BheWxvYWQucG1lbV9mZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoIiVwIG5vdCBmb3VuZCIsIHBfYnVmZmVyX2hkci0+cEJ1ZmZlcik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotYnVmZmVyX2RlYWxsb2NhdGVfaXBfZXhpdDoKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBEZS1hbGxvY2F0ZSBvdXRwdXQgYnVmZmVyLgotICoKLSAqIEBwYXJhbVtpbl0gcF9idWZmZXJfaGRyOiBQb2ludGVyIHRvIGJ1ZmZlciBoZWFkZXIgc3RydWN0dXJlLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmJ1ZmZlcl9kZWFsbG9jYXRlX29wKAotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1ZmZlcl9oZHIpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgdW5zaWduZWQgaW50IGlpOwotCi0gICAgaWYgKHBfYnVmZmVyX2hkciA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfYnVmZmVyX2hkciA9IE5VTEwiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIGdvdG8gYnVmZmVyX2RlYWxsb2NhdGVfb3BfZXhpdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobV9idWZmZXJfYXJyYXlfb3AgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJvcCBidWZmZXIgYXJyYXkgbm90IGFsbG9jYXRlZCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgZ290byBidWZmZXJfZGVhbGxvY2F0ZV9vcF9leGl0OwotICAgIH0KLQotICAgIGZvciAoaWkgPSAwOyBpaSA8IG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsOyBpaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBfYnVmZmVyX2hkciA9PSAmKG1fYnVmZmVyX2FycmF5X29wW2lpXS5idWZmZXJfaGVhZGVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfTE9XKCIlcCBoYXMgaW5kZXggJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX2hkci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpaSA8IG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsKQotICAgIHsKLSAgICAgICAgaWYgKG1fbWV0YV9idWZmZXJfbW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZG8gbm90aGluZzsgbXVubWFwKCkgJiBGRCByZXNldCBkb25lIGluIEZCRCBvciBSUgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1fYW5kcm9pZF9uYXRpdmVfYnVmZmVycykKLSAgICAgICAgewotICAgICAgICAgICAgbXVubWFwKG1fYnVmZmVyX2FycmF5X29wW2lpXS5idWZmZXJfcGF5bG9hZC5idWZmZXJhZGRyLAotICAgICAgICAgICAgICAgICAgIG1fYnVmZmVyX2FycmF5X29wW2lpXS5idWZmZXJfcGF5bG9hZC5tbWFwZWRfc2l6ZSk7Ci0KLSAgICAgICAgICAgIG1fYnVmZmVyX2FycmF5X29wW2lpXS5idWZmZXJfcGF5bG9hZC5wbWVtX2ZkID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtdW5tYXAobV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wYXlsb2FkLmJ1ZmZlcmFkZHIsCi0gICAgICAgICAgICAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wYXlsb2FkLm1tYXBlZF9zaXplKTsKLQotICAgICAgICAgICAgY2xvc2UobV9idWZmZXJfYXJyYXlfb3BbaWldLmJ1ZmZlcl9wYXlsb2FkLnBtZW1fZmQpOwotCi0gICAgICAgICAgICBtX2J1ZmZlcl9hcnJheV9vcFtpaV0uYnVmZmVyX3BheWxvYWQucG1lbV9mZCA9IC0xOwotCi0gICAgICAgICAgICBpb25fbWVtb3J5X2ZyZWUoJm1fYnVmZmVyX2FycmF5X29wW2lpXS5pb25faW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBtX2J1ZmZlcl9hcnJheV9vcFtpaV0uYnVmZmVyX3BvcHVsYXRlZCA9IGZhbHNlOwotCi0gICAgICAgIG1fcG9ydF9vcC5wb3B1bGF0ZWQgPSBPTVhfRkFMU0U7Ci0KLSAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgbV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGlpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtX2J1ZmZlcl9hcnJheV9vcFtpaV0uYnVmZmVyX3BvcHVsYXRlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpaSA9PSBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyX2RlYWxsb2NhdGVfb3BfaW5mb19hcnJheSgpOwotCi0gICAgICAgICAgICBtX3BvcnRfb3AudW5wb3B1bGF0ZWQgPSBPTVhfVFJVRTsKLQotICAgICAgICAgICAgaWYgKG1fbWV0YV9idWZmZXJfbW9kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhX2J1ZmZlcl9hcnJheV9kZWFsbG9jYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoIiVwIG5vdCBmb3VuZCIsIHBfYnVmZmVyX2hkci0+cEJ1ZmZlcik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotYnVmZmVyX2RlYWxsb2NhdGVfb3BfZXhpdDoKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBEZS1hbGxvY2F0ZSBpbnB1dCBidWZmZXIgaW5mbyBhcnJheS4KLSAqLwotdm9pZCBvbXhfc3d2ZGVjOjpidWZmZXJfZGVhbGxvY2F0ZV9pcF9pbmZvX2FycmF5KCkKLXsKLSAgICBhc3NlcnQobV9idWZmZXJfYXJyYXlfaXAgIT0gTlVMTCk7Ci0KLSAgICBmcmVlKG1fYnVmZmVyX2FycmF5X2lwKTsKLQotICAgIG1fYnVmZmVyX2FycmF5X2lwID0gTlVMTDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgRGUtYWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciBpbmZvIGFycmF5LgotICovCi12b2lkIG9teF9zd3ZkZWM6OmJ1ZmZlcl9kZWFsbG9jYXRlX29wX2luZm9fYXJyYXkoKQotewotICAgIGFzc2VydChtX2J1ZmZlcl9hcnJheV9vcCAhPSBOVUxMKTsKLQotICAgIGZyZWUobV9idWZmZXJfYXJyYXlfb3ApOwotCi0gICAgbV9idWZmZXJfYXJyYXlfb3AgPSBOVUxMOwotfQotCi0vKioKLSAqIEBicmllZiBBbGxvY2F0ZSBtZXRhIGJ1ZmZlciBpbmZvIGFycmF5LgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6Om1ldGFfYnVmZmVyX2FycmF5X2FsbG9jYXRlKCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBtX21ldGFfYnVmZmVyX2FycmF5ID0gKChPTVhfU1dWREVDX01FVEFfQlVGRkVSX0lORk8gKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxvYyhzaXplb2YoT01YX1NXVkRFQ19NRVRBX0JVRkZFUl9JTkZPKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCkpOwotCi0gICAgaWYgKG1fbWV0YV9idWZmZXJfYXJyYXkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgbWV0YV9idWZmZXIgaW5mbyBhcnJheTsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgZWxlbWVudCVzLCAlenUgYnl0ZXMgcmVxdWVzdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA+IDEpID8gInMiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihPTVhfU1dWREVDX01FVEFfQlVGRkVSX0lORk8pICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IGlpOwotCi0gICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsOyBpaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX21ldGFfYnVmZmVyX2FycmF5W2lpXS5mZCA9IC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgRGUtYWxsb2NhdGUgbWV0YSBidWZmZXIgaW5mbyBhcnJheS4KLSAqLwotdm9pZCBvbXhfc3d2ZGVjOjptZXRhX2J1ZmZlcl9hcnJheV9kZWFsbG9jYXRlKCkKLXsKLSAgICBhc3NlcnQobV9tZXRhX2J1ZmZlcl9hcnJheSAhPSBOVUxMKTsKLQotICAgIGZyZWUobV9tZXRhX2J1ZmZlcl9hcnJheSk7Ci0KLSAgICBtX21ldGFfYnVmZmVyX2FycmF5ID0gTlVMTDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgQWRkIG1ldGEgYnVmZmVyIHJlZmVyZW5jZS4KLSAqCi0gKiBAcGFyYW1baW5dIGluZGV4OiBCdWZmZXIgaW5kZXguCi0gKiBAcGFyYW1baW5dIGZkOiAgICBGaWxlIGRlc2NyaXB0b3IuCi0gKi8KLXZvaWQgb214X3N3dmRlYzo6bWV0YV9idWZmZXJfcmVmX2FkZCh1bnNpZ25lZCBpbnQgaW5kZXgsIGludCBmZCkKLXsKLSAgICBpZiAobV9tZXRhX2J1ZmZlcl9hcnJheVtpbmRleF0ucmVmX2NvdW50ID09IDApCi0gICAgewotICAgICAgICBtX21ldGFfYnVmZmVyX2FycmF5W2luZGV4XS5mZCA9IGZkOwotICAgIH0KLQotICAgIG1fbWV0YV9idWZmZXJfYXJyYXlbaW5kZXhdLnJlZl9jb3VudCsrOwotfQotCi0vKioKLSAqIEBicmllZiBSZW1vdmUgbWV0YSBidWZmZXIgcmVmZXJlbmNlLgotICoKLSAqIEBwYXJhbVtpbl0gaW5kZXg6IEJ1ZmZlciBpbmRleC4KLSAqLwotdm9pZCBvbXhfc3d2ZGVjOjptZXRhX2J1ZmZlcl9yZWZfcmVtb3ZlKHVuc2lnbmVkIGludCBpbmRleCkKLXsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbWV0YV9idWZmZXJfYXJyYXlfbXV0ZXgpOwotCi0gICAgbV9tZXRhX2J1ZmZlcl9hcnJheVtpbmRleF0ucmVmX2NvdW50LS07Ci0KLSAgICBpZiAobV9tZXRhX2J1ZmZlcl9hcnJheVtpbmRleF0ucmVmX2NvdW50ID09IDApCi0gICAgewotICAgICAgICBtX21ldGFfYnVmZmVyX2FycmF5W2luZGV4XS5mZCA9IC0xOwotCi0gICAgICAgIG11bm1hcChtX2J1ZmZlcl9hcnJheV9vcFtpbmRleF0uYnVmZmVyX3BheWxvYWQuYnVmZmVyYWRkciwKLSAgICAgICAgICAgICAgIG1fYnVmZmVyX2FycmF5X29wW2luZGV4XS5idWZmZXJfcGF5bG9hZC5tbWFwZWRfc2l6ZSk7Ci0KLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaW5kZXhdLmJ1ZmZlcl9wYXlsb2FkLmJ1ZmZlcmFkZHIgID0gTlVMTDsKLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaW5kZXhdLmJ1ZmZlcl9wYXlsb2FkLm9mZnNldCAgICAgID0gMDsKLSAgICAgICAgbV9idWZmZXJfYXJyYXlfb3BbaW5kZXhdLmJ1ZmZlcl9wYXlsb2FkLm1tYXBlZF9zaXplID0gMDsKLQotICAgICAgICBtX2J1ZmZlcl9hcnJheV9vcFtpbmRleF0uYnVmZmVyX3N3dmRlYy5wX2J1ZmZlciA9IE5VTEw7Ci0gICAgICAgIG1fYnVmZmVyX2FycmF5X29wW2luZGV4XS5idWZmZXJfc3d2ZGVjLnNpemUgICAgID0gMDsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9tZXRhX2J1ZmZlcl9hcnJheV9tdXRleCk7Ci19Ci0KLS8qKgotICogQGJyaWVmIFNwbGl0IE1QRUctNCBiaXRzdHJlYW0gYnVmZmVyIGludG8gbXVsdGlwbGUgZnJhbWVzIChpZiB0aGV5IGV4aXN0KS4KLSAqCi0gKiBAcGFyYW1baW4sb3V0XSBvZmZzZXRfYXJyYXk6IEFycmF5IG9mIG9mZnNldHMgdG8gZnJhbWUgaGVhZGVycy4KLSAqIEBwYXJhbVtpbl0gICAgIHBfYnVmZmVyX2hkcjogUG9pbnRlciB0byBidWZmZXIgaGVhZGVyLgotICoKLSAqIEByZXR2YWwgTnVtYmVyIG9mIGZyYW1lcyBpbiBidWZmZXIuCi0gKi8KLXVuc2lnbmVkIGludCBzcGxpdF9idWZmZXJfbXBlZzQodW5zaWduZWQgaW50ICAgICAgICAgKm9mZnNldF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmZmVyX2hkcikKLXsKLSAgICB1bnNpZ25lZCBjaGFyICpwX2J1ZmZlciA9IHBfYnVmZmVyX2hkci0+cEJ1ZmZlcjsKLQotICAgIHVuc2lnbmVkIGludCBieXRlX2NvdW50ID0gMDsKLQotICAgIHVuc2lnbmVkIGludCBudW1fZnJhbWVfaGVhZGVycyA9IDA7Ci0KLSAgICB1bnNpZ25lZCBpbnQgbmV4dF80Ynl0ZXM7Ci0KLSAgICB3aGlsZSAoKGJ5dGVfY291bnQgPCBwX2J1ZmZlcl9oZHItPm5GaWxsZWRMZW4pICYmCi0gICAgICAgICAgIChudW1fZnJhbWVfaGVhZGVycyA8IE9NWF9TV1ZERUNfTUFYX0ZSQU1FU19QRVJfRVRCKSkKLSAgICB7Ci0gICAgICAgIG5leHRfNGJ5dGVzID0gKigodW5zaWduZWQgaW50ICopIHBfYnVmZmVyKTsKLQotICAgICAgICBuZXh0XzRieXRlcyA9IF9fYnVpbHRpbl9ic3dhcDMyKG5leHRfNGJ5dGVzKTsKLQotICAgICAgICBpZiAobmV4dF80Ynl0ZXMgPT0gMHgwMDAwMDFCNikKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiJXAsIGJ1ZmZlciAlcDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWUgaGVhZGVyIGF0ICVkIGJ5dGVzIG9mZnNldCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX2hkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX2NvdW50KTsKLQotICAgICAgICAgICAgb2Zmc2V0X2FycmF5W251bV9mcmFtZV9oZWFkZXJzXSA9IGJ5dGVfY291bnQ7Ci0KLSAgICAgICAgICAgIG51bV9mcmFtZV9oZWFkZXJzKys7Ci0KLSAgICAgICAgICAgIHBfYnVmZmVyICAgKz0gNDsKLSAgICAgICAgICAgIGJ5dGVfY291bnQgKz0gNDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfYnVmZmVyKys7Ci0gICAgICAgICAgICBieXRlX2NvdW50Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbnVtX2ZyYW1lX2hlYWRlcnM7Ci19Ci0KLS8qKgotICogQGJyaWVmIENoZWNrIGlmIGlwIHBvcnQgaXMgcG9wdWxhdGVkLCBpLmUuLCBpZiBhbGwgaXAgYnVmZmVycyBhcmUgcG9wdWxhdGVkLgotICoKLSAqIEByZXR2YWwgIHRydWUKLSAqIEByZXR2YWwgZmFsc2UKLSAqLwotT01YX0JPT0wgb214X3N3dmRlYzo6cG9ydF9pcF9wb3B1bGF0ZWQoKQotewotICAgIE9NWF9CT09MIHJldHZhbCA9IE9NWF9GQUxTRTsKLQotICAgIGlmIChtX2J1ZmZlcl9hcnJheV9pcCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IGlpOwotCi0gICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG1fcG9ydF9pcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsOyBpaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobV9idWZmZXJfYXJyYXlfaXBbaWldLmJ1ZmZlcl9wb3B1bGF0ZWQgPT0gZmFsc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaWkgPT0gbV9wb3J0X2lwLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9UUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgQ2hlY2sgaWYgb3AgcG9ydCBpcyBwb3B1bGF0ZWQsIGkuZS4sIGlmIGFsbCBvcCBidWZmZXJzIGFyZSBwb3B1bGF0ZWQuCi0gKgotICogQHJldHZhbCAgdHJ1ZQotICogQHJldHZhbCBmYWxzZQotICovCi1PTVhfQk9PTCBvbXhfc3d2ZGVjOjpwb3J0X29wX3BvcHVsYXRlZCgpCi17Ci0gICAgT01YX0JPT0wgcmV0dmFsID0gT01YX0ZBTFNFOwotCi0gICAgaWYgKG1fYnVmZmVyX2FycmF5X29wICE9IE5VTEwpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBpbnQgaWk7Ci0KLSAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgbV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGlpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtX2J1ZmZlcl9hcnJheV9vcFtpaV0uYnVmZmVyX3BvcHVsYXRlZCA9PSBmYWxzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpaSA9PSBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dmFsID0gT01YX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBGbHVzaCBpbnB1dCwgb3V0cHV0LCBvciBib3RoIGlucHV0ICYgb3V0cHV0IHBvcnRzLgotICoKLSAqIEBwYXJhbVtpbl0gcG9ydF9pbmRleDogSW5kZXggb2YgcG9ydCB0byBmbHVzaC4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjpmbHVzaCh1bnNpZ25lZCBpbnQgcG9ydF9pbmRleCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBpZiAoKChwb3J0X2luZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApICYmCi0gICAgICAgICBtX3BvcnRfaXAuZmx1c2hfaW5wcm9ncmVzcykgfHwKLSAgICAgICAgKChwb3J0X2luZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApICYmCi0gICAgICAgICBtX3BvcnRfb3AuZmx1c2hfaW5wcm9ncmVzcykgfHwKLSAgICAgICAgKChwb3J0X2luZGV4ID09IE9NWF9BTEwpICYmCi0gICAgICAgICBtX3BvcnRfaXAuZmx1c2hfaW5wcm9ncmVzcyAmJgotICAgICAgICAgbV9wb3J0X29wLmZsdXNoX2lucHJvZ3Jlc3MpKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiZmx1c2ggcG9ydCBpbmRleCAlZCBhbHJlYWR5IGluIHByb2dyZXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X2luZGV4KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU1dWREVDX0ZMVVNIX1RZUEUgc3d2ZGVjX2ZsdXNoX3R5cGU7Ci0KLSAgICAgICAgU1dWREVDX1NUQVRVUyByZXR2YWxfc3d2ZGVjOwotCi0gICAgICAgIGlmIChwb3J0X2luZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcG9ydF9pcC5mbHVzaF9pbnByb2dyZXNzID0gT01YX1RSVUU7Ci0KLSAgICAgICAgICAgIC8vIG5vIHNlcGFyYXRlIFN3VmRlYyBmbHVzaCB0eXBlIGZvciBpbnB1dAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBvcnRfaW5kZXggPT0gT01YX0NPUkVfUE9SVF9JTkRFWF9PUCkKLSAgICAgICAgewotICAgICAgICAgICAgbV9wb3J0X29wLmZsdXNoX2lucHJvZ3Jlc3MgPSBPTVhfVFJVRTsKLQotICAgICAgICAgICAgc3d2ZGVjX2ZsdXNoX3R5cGUgPSAobV9wb3J0X2lwLmZsdXNoX2lucHJvZ3Jlc3MgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dWREVDX0ZMVVNIX1RZUEVfQUxMIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVkRFQ19GTFVTSF9UWVBFX09QKTsKLQotICAgICAgICAgICAgaWYgKChyZXR2YWxfc3d2ZGVjID0gc3d2ZGVjX2ZsdXNoKG1fc3d2ZGVjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd3ZkZWNfZmx1c2hfdHlwZSkpICE9Ci0gICAgICAgICAgICAgICAgU1dWREVDX1NUQVRVU19TVUNDRVNTKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHJldHZhbF9zd3ZkZWMyb214KHJldHZhbF9zd3ZkZWMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBvcnRfaW5kZXggPT0gT01YX0FMTCkKLSAgICAgICAgewotICAgICAgICAgICAgbV9wb3J0X2lwLmZsdXNoX2lucHJvZ3Jlc3MgPSBPTVhfVFJVRTsKLSAgICAgICAgICAgIG1fcG9ydF9vcC5mbHVzaF9pbnByb2dyZXNzID0gT01YX1RSVUU7Ci0KLSAgICAgICAgICAgIHN3dmRlY19mbHVzaF90eXBlID0gU1dWREVDX0ZMVVNIX1RZUEVfQUxMOwotCi0gICAgICAgICAgICBpZiAoKHJldHZhbF9zd3ZkZWMgPSBzd3ZkZWNfZmx1c2gobV9zd3ZkZWNfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3dmRlY19mbHVzaF90eXBlKSkgIT0KLSAgICAgICAgICAgICAgICBTV1ZERUNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcmV0dmFsX3N3dmRlYzJvbXgocmV0dmFsX3N3dmRlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBBbGxvY2F0ZSAmIG1hcCBJT04gbWVtb3J5LgotICovCi1pbnQgb214X3N3dmRlYzo6aW9uX21lbW9yeV9hbGxvY19tYXAoc3RydWN0IGlvbl9hbGxvY2F0aW9uX2RhdGEgKnBfYWxsb2NfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW9uX2ZkX2RhdGEgICAgICAgICAqcF9mZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQpCi17Ci0gICAgaW50IGZkID0gLUVJTlZBTDsKLSAgICBpbnQgcmMgPSAtRUlOVkFMOwotCi0gICAgaWYgKChwX2FsbG9jX2RhdGEgPT0gTlVMTCkgfHwgKHBfZmRfZGF0YSA9PSBOVUxMKSB8fCAoc2l6ZSA9PSAwKSkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJpbnZhbGlkIGFyZ3VtZW50cyIpOwotICAgICAgICBnb3RvIGlvbl9tZW1vcnlfYWxsb2NfbWFwX2V4aXQ7Ci0gICAgfQotCi0gICAgaWYgKChmZCA9IG9wZW4oIi9kZXYvaW9uIiwgT19SRE9OTFkpKSA8IDApCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiZmFpbGVkIHRvIG9wZW4gaW9uIGRldmljZTsgZmQgPSAlZCIsIGZkKTsKLSAgICAgICAgZ290byBpb25fbWVtb3J5X2FsbG9jX21hcF9leGl0OwotICAgIH0KLQotICAgIHBfYWxsb2NfZGF0YS0+bGVuICAgICAgICAgID0gc2l6ZTsKLSAgICBwX2FsbG9jX2RhdGEtPmFsaWduICAgICAgICA9IChhbGlnbm1lbnQgPCA0MDk2KSA/IDQwOTYgOiBhbGlnbm1lbnQ7Ci0gICAgcF9hbGxvY19kYXRhLT5oZWFwX2lkX21hc2sgPSBJT05fSEVBUChJT05fSU9NTVVfSEVBUF9JRCk7Ci0gICAgcF9hbGxvY19kYXRhLT5mbGFncyAgICAgICAgPSAwOwotCi0gICAgT01YX1NXVkRFQ19MT0dfTE9XKCJoZWFwX2lkX21hc2sgMHglMDh4LCBsZW4gJXp1LCBhbGlnbiAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICBwX2FsbG9jX2RhdGEtPmhlYXBfaWRfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9hbGxvY19kYXRhLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfYWxsb2NfZGF0YS0+YWxpZ24pOwotCi0gICAgcmMgPSBpb2N0bChmZCwgSU9OX0lPQ19BTExPQywgcF9hbGxvY19kYXRhKTsKLQotICAgIGlmIChyYyB8fCAocF9hbGxvY19kYXRhLT5oYW5kbGUgPT0gMCkpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaW9jdGwoKSBmb3IgYWxsb2NhdGlvbiBmYWlsZWQiKTsKLQotICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgIGZkID0gLUVOT01FTTsKLQotICAgICAgICBnb3RvIGlvbl9tZW1vcnlfYWxsb2NfbWFwX2V4aXQ7Ci0gICAgfQotCi0gICAgcF9mZF9kYXRhLT5oYW5kbGUgPSBwX2FsbG9jX2RhdGEtPmhhbmRsZTsKLQotICAgIGlmIChpb2N0bChmZCwgSU9OX0lPQ19NQVAsIHBfZmRfZGF0YSkpCi0gICAgewotICAgICAgICBzdHJ1Y3QgdmRlY19pb24gaW9uX2J1Zl9pbmZvOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJpb2N0bCgpIGZvciBtYXBwaW5nIGZhaWxlZCIpOwotCi0gICAgICAgIGlvbl9idWZfaW5mby5pb25fYWxsb2NfZGF0YSA9ICpwX2FsbG9jX2RhdGE7Ci0gICAgICAgIGlvbl9idWZfaW5mby5pb25fZmRfZGV2aWNlICA9IGZkOwotICAgICAgICBpb25fYnVmX2luZm8uaW9uX2ZkX2RhdGEgICAgPSAqcF9mZF9kYXRhOwotCi0gICAgICAgIGlvbl9tZW1vcnlfZnJlZSgmaW9uX2J1Zl9pbmZvKTsKLQotICAgICAgICBwX2ZkX2RhdGEtPmZkID0gLTE7Ci0KLSAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICBmZCA9IC1FTk9NRU07Ci0KLSAgICAgICAgZ290byBpb25fbWVtb3J5X2FsbG9jX21hcF9leGl0OwotICAgIH0KLQotaW9uX21lbW9yeV9hbGxvY19tYXBfZXhpdDoKLSAgICByZXR1cm4gZmQ7Ci19Ci0KLS8qKgotICogQGJyaWVmIEZyZWUgSU9OIG1lbW9yeS4KLSAqLwotdm9pZCBvbXhfc3d2ZGVjOjppb25fbWVtb3J5X2ZyZWUoc3RydWN0IHZkZWNfaW9uICpwX2lvbl9idWZfaW5mbykKLXsKLSAgICBpZiAocF9pb25fYnVmX2luZm8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwX2lvbl9idWZfaW5mbyA9IE5VTEwiKTsKLSAgICAgICAgZ290byBpb25fbWVtb3J5X2ZyZWVfZXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoaW9jdGwocF9pb25fYnVmX2luZm8tPmlvbl9mZF9kZXZpY2UsCi0gICAgICAgICAgICAgIElPTl9JT0NfRlJFRSwKLSAgICAgICAgICAgICAgJnBfaW9uX2J1Zl9pbmZvLT5pb25fYWxsb2NfZGF0YS5oYW5kbGUpKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImlvY3RsKCkgZm9yIGZyZWVpbmcgZmFpbGVkIik7Ci0gICAgfQotCi0gICAgY2xvc2UocF9pb25fYnVmX2luZm8tPmlvbl9mZF9kZXZpY2UpOwotCi0gICAgcF9pb25fYnVmX2luZm8tPmlvbl9mZF9kZXZpY2UgICAgICAgICA9IC0xOwotICAgIHBfaW9uX2J1Zl9pbmZvLT5pb25fYWxsb2NfZGF0YS5oYW5kbGUgPSAgMDsKLSAgICBwX2lvbl9idWZfaW5mby0+aW9uX2ZkX2RhdGEuZmQgICAgICAgID0gLTE7Ci0KLWlvbl9tZW1vcnlfZnJlZV9leGl0OgotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKiBAYnJpZWYgRmx1c2ggY2FjaGVkIElPTiBvdXRwdXQgYnVmZmVyLgotICoKLSAqIEBwYXJhbVtpbl0gaW5kZXg6IEluZGV4IG9mIGJ1ZmZlciBpbiBvdXRwdXQgYnVmZmVyIGluZm8gYXJyYXkuCi0gKi8KLXZvaWQgb214X3N3dmRlYzo6aW9uX2ZsdXNoX29wKHVuc2lnbmVkIGludCBpbmRleCkKLXsKLSAgICBpZiAoaW5kZXggPCBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCkKLSAgICB7Ci0gICAgICAgIHN0cnVjdCB2ZGVjX2J1ZmZlcnBheWxvYWQgKnBfYnVmZmVyX3BheWxvYWQgPQotICAgICAgICAgICAgJm1fYnVmZmVyX2FycmF5X29wW2luZGV4XS5idWZmZXJfcGF5bG9hZDsKLQotICAgICAgICBpZihwX2J1ZmZlcl9wYXlsb2FkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwX2J1ZmZlcl9wYXlsb2FkLT5idWZmZXJhZGRyICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX19fY2xlYXJfY2FjaGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oKHNpemVfdCopcF9idWZmZXJfcGF5bG9hZC0+YnVmZmVyYWRkciksCi0gICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KChzaXplX3QqKXBfYnVmZmVyX3BheWxvYWQtPmJ1ZmZlcmFkZHIgK3BfYnVmZmVyX3BheWxvYWQtPmJ1ZmZlcl9sZW4pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiYnVmZmVyIGluZGV4ICclZCcgaW52YWxpZCIsIGluZGV4KTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogY29tcG9uZW50IGNhbGxiYWNrIGZ1bmN0aW9ucwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qKgotICogQGJyaWVmIEVtcHR5IGJ1ZmZlciBkb25lIGNhbGxiYWNrLgotICoKLSAqIEBwYXJhbVtpbl0gcF9idWZmZXJfaXA6IFBvaW50ZXIgdG8gaW5wdXQgYnVmZmVyIHN0cnVjdHVyZS4KLSAqLwotdm9pZCBvbXhfc3d2ZGVjOjpzd3ZkZWNfZW1wdHlfYnVmZmVyX2RvbmUoU1dWREVDX0JVRkZFUiAqcF9idWZmZXJfaXApCi17Ci0gICAgdW5zaWduZWQgbG9uZyBpbmRleCA9ICh1bnNpZ25lZCBsb25nKSBwX2J1ZmZlcl9pcC0+cF9jbGllbnRfZGF0YTsKLQotICAgIG1fYnVmZmVyX2FycmF5X2lwW2luZGV4XS5idWZmZXJfaGVhZGVyLm5GaWxsZWRMZW4gPQotICAgICAgICBwX2J1ZmZlcl9pcC0+ZmlsbGVkX2xlbmd0aDsKLQotICAgIGFzeW5jX3Bvc3RfZXZlbnQoT01YX1NXVkRFQ19FVkVOVF9FQkQsCi0gICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgJm1fYnVmZmVyX2FycmF5X2lwW2luZGV4XS5idWZmZXJfaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotfQotCi0vKioKLSAqIEBicmllZiBGaWxsIGJ1ZmZlciBkb25lIGNhbGxiYWNrLgotICoKLSAqIEBwYXJhbVtpbl0gcF9idWZmZXJfb3A6IFBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlciBzdHJ1Y3R1cmUuCi0gKi8KLXZvaWQgb214X3N3dmRlYzo6c3d2ZGVjX2ZpbGxfYnVmZmVyX2RvbmUoU1dWREVDX0JVRkZFUiAqcF9idWZmZXJfb3ApCi17Ci0gICAgdW5zaWduZWQgbG9uZyBpbmRleCA9ICh1bnNpZ25lZCBsb25nKSBwX2J1ZmZlcl9vcC0+cF9jbGllbnRfZGF0YTsKLQotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1ZmZlcl9oZHI7Ci0KLSAgICBpZiAoaW5kZXggPCAoKHVuc2lnbmVkIGxvbmcpIG1fcG9ydF9vcC5kZWYubkJ1ZmZlckNvdW50QWN0dWFsKSkKLSAgICB7Ci0gICAgICAgIHBfYnVmZmVyX2hkciA9ICZtX2J1ZmZlcl9hcnJheV9vcFtpbmRleF0uYnVmZmVyX2hlYWRlcjsKLQotICAgICAgICBwX2J1ZmZlcl9oZHItPm5GbGFncyAgICAgPSBwX2J1ZmZlcl9vcC0+ZmxhZ3M7Ci0gICAgICAgIHBfYnVmZmVyX2hkci0+blRpbWVTdGFtcCA9IHBfYnVmZmVyX29wLT50aW1lc3RhbXA7Ci0gICAgICAgIHBfYnVmZmVyX2hkci0+bkZpbGxlZExlbiA9ICgobV9tZXRhX2J1ZmZlcl9tb2RlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfb3AtPmZpbGxlZF9sZW5ndGgpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX2hkci0+bkFsbG9jTGVuIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX29wLT5maWxsZWRfbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBhc3luY19wb3N0X2V2ZW50KE9NWF9TV1ZERUNfRVZFTlRfRkJELAotICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICZtX2J1ZmZlcl9hcnJheV9vcFtpbmRleF0uYnVmZmVyX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLX0KLQotLyoqCi0gKiBAYnJpZWYgRXZlbnQgaGFuZGxlciBjYWxsYmFjay4KLSAqCi0gKiBAcGFyYW1baW5dIGV2ZW50OiAgRXZlbnQuCi0gKiBAcGFyYW1baW5dIHBfZGF0YTogUG9pbnRlciB0byBldmVudC1zcGVjaWZpYyBkYXRhLgotICovCi12b2lkIG9teF9zd3ZkZWM6OnN3dmRlY19ldmVudF9oYW5kbGVyKFNXVkRFQ19FVkVOVCBldmVudCwgdm9pZCAqcF9kYXRhKQotewotICAgIHN3aXRjaCAoZXZlbnQpCi0gICAgewotCi0gICAgY2FzZSBTV1ZERUNfRVZFTlRfRkxVU0hfQUxMX0RPTkU6Ci0gICAgewotICAgICAgICBhc3luY19wb3N0X2V2ZW50KE9NWF9TV1ZERUNfRVZFTlRfRkxVU0hfUE9SVF9JUCwgMCwgMCk7Ci0gICAgICAgIGFzeW5jX3Bvc3RfZXZlbnQoT01YX1NXVkRFQ19FVkVOVF9GTFVTSF9QT1JUX09QLCAwLCAwKTsKLQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIFNXVkRFQ19FVkVOVF9GTFVTSF9PUF9ET05FOgotICAgIHsKLSAgICAgICAgYXN5bmNfcG9zdF9ldmVudChPTVhfU1dWREVDX0VWRU5UX0ZMVVNIX1BPUlRfT1AsIDAsIDApOwotCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgU1dWREVDX0VWRU5UX1JFTEVBU0VfUkVGRVJFTkNFOgotICAgIHsKLSAgICAgICAgU1dWREVDX0JVRkZFUiAqcF9idWZmZXJfb3AgPSAoU1dWREVDX0JVRkZFUiAqKSBwX2RhdGE7Ci0KLSAgICAgICAgdW5zaWduZWQgbG9uZyBpbmRleCA9ICh1bnNpZ25lZCBsb25nKSBwX2J1ZmZlcl9vcC0+cF9jbGllbnRfZGF0YTsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19MT1coInJlbGVhc2UgcmVmZXJlbmNlOiAlcCIsIHBfYnVmZmVyX29wLT5wX2J1ZmZlcik7Ci0KLSAgICAgICAgYXNzZXJ0KGluZGV4IDwgKCh1bnNpZ25lZCBsb25nKSBtX3BvcnRfb3AuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCkpOwotCi0gICAgICAgIGlmIChtX21ldGFfYnVmZmVyX21vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFfYnVmZmVyX3JlZl9yZW1vdmUoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBTV1ZERUNfRVZFTlRfUkVDT05GSUdfUkVRVUlSRUQ6Ci0gICAgewotICAgICAgICBhc3luY19wb3N0X2V2ZW50KE9NWF9TV1ZERUNfRVZFTlRfUE9SVF9SRUNPTkZJRywgMCwgMCk7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBTV1ZERUNfRVZFTlRfRElNRU5TSU9OU19VUERBVEVEOgotICAgIHsKLSAgICAgICAgYXN5bmNfcG9zdF9ldmVudChPTVhfU1dWREVDX0VWRU5UX0RJTUVOU0lPTlNfVVBEQVRFRCwgMCwgMCk7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBTV1ZERUNfRVZFTlRfRkFUQUxfRVJST1I6Ci0gICAgZGVmYXVsdDoKLSAgICB7Ci0gICAgICAgIGFzeW5jX3Bvc3RfZXZlbnQoT01YX1NXVkRFQ19FVkVOVF9FUlJPUiwgT01YX0Vycm9ySGFyZHdhcmUsIDApOwotCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIH0KLX0KLQotLyoqCi0gKiBAYnJpZWYgVHJhbnNsYXRlIFN3VmRlYyBzdGF0dXMgcmV0dXJuIHZhbHVlIHRvIE9NWCBlcnJvciB0eXBlIHJldHVybiB2YWx1ZS4KLSAqCi0gKiBAcGFyYW1baW5dIHJldHZhbF9zd3ZkZWM6IFN3VmRlYyBzdGF0dXMgcmV0dXJuIHZhbHVlLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OnJldHZhbF9zd3ZkZWMyb214KFNXVkRFQ19TVEFUVVMgcmV0dmFsX3N3dmRlYykKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbF9vbXg7Ci0KLSAgICBzd2l0Y2ggKHJldHZhbF9zd3ZkZWMpCi0gICAgewotCi0gICAgU1dWREVDX1NUQVRVU19TVUNDRVNTOgotICAgICAgICByZXR2YWxfb214ID0gT01YX0Vycm9yTm9uZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBTV1ZERUNfU1RBVFVTX0ZBSUxVUkU6Ci0gICAgICAgIHJldHZhbF9vbXggPSBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgU1dWREVDX1NUQVRVU19OVUxMX1BPSU5URVI6Ci0gICAgU1dWREVDX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlM6Ci0gICAgICAgIHJldHZhbF9vbXggPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgU1dWREVDX1NUQVRVU19JTlZBTElEX1NUQVRFOgotICAgICAgICByZXR2YWxfb214ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICBicmVhazsKLQotICAgIFNXVkRFQ19TVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUzoKLSAgICAgICAgcmV0dmFsX29teCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBTV1ZERUNfU1RBVFVTX1VOU1VQUE9SVEVEOgotICAgICAgICByZXR2YWxfb214ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICBicmVhazsKLQotICAgIFNXVkRFQ19TVEFUVVNfTk9UX0lNUExFTUVOVEVEOgotICAgICAgICByZXR2YWxfb214ID0gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dmFsX29teCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsX29teDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgQ3JlYXRlIGFzeW5jaHJvbm91cyB0aHJlYWQuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6YXN5bmNfdGhyZWFkX2NyZWF0ZSgpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHJpYnV0ZXM7Ci0KLSAgICBpZiAoc2VtX2luaXQoJm1fYXN5bmNfdGhyZWFkLnNlbV90aHJlYWRfY3JlYXRlZCwgMCwgMCkpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBhc3luYyB0aHJlYWQgY3JlYXRlZCBzZW1hcGhvcmUiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbV9pbml0KCZtX2FzeW5jX3RocmVhZC5zZW1fZXZlbnQsIDAsIDApKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImZhaWxlZCB0byBjcmVhdGUgYXN5bmMgdGhyZWFkIGV2ZW50IHNlbWFwaG9yZSIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyaWJ1dGVzKSkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIHRocmVhZCBhdHRyaWJ1dGVzIG9iamVjdCIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImZhaWxlZCB0byBzZXQgZGV0YWNoIHN0YXRlIGF0dHJpYnV0ZSIpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLQotICAgICAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmdGhyZWFkX2F0dHJpYnV0ZXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtX2FzeW5jX3RocmVhZC5jcmVhdGVkID0gZmFsc2U7Ci0gICAgICAgIG1fYXN5bmNfdGhyZWFkLmV4aXQgICAgPSBmYWxzZTsKLQotICAgICAgICBpZiAocHRocmVhZF9jcmVhdGUoJm1fYXN5bmNfdGhyZWFkLmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRfYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICooKikodm9pZCAqKSkgYXN5bmNfdGhyZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGFzeW5jIHRocmVhZCIpOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0KLSAgICAgICAgICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZ0aHJlYWRfYXR0cmlidXRlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHRocmVhZF9zZXRuYW1lX25wKG1fYXN5bmNfdGhyZWFkLmhhbmRsZSwgInN3dmRlY19hc3luYyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGRvbid0IHJldHVybiBlcnJvcgotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IGFzeW5jIHRocmVhZCBuYW1lIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbV93YWl0KCZtX2FzeW5jX3RocmVhZC5zZW1fdGhyZWFkX2NyZWF0ZWQpOwotCi0gICAgICAgICAgICBtX2FzeW5jX3RocmVhZC5jcmVhdGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIERlc3Ryb3kgYXN5bmNocm9ub3VzIHRocmVhZC4KLSAqLwotdm9pZCBvbXhfc3d2ZGVjOjphc3luY190aHJlYWRfZGVzdHJveSgpCi17Ci0gICAgaWYgKG1fYXN5bmNfdGhyZWFkLmNyZWF0ZWQpCi0gICAgewotICAgICAgICBtX2FzeW5jX3RocmVhZC5leGl0ID0gdHJ1ZTsKLQotICAgICAgICBzZW1fcG9zdCgmbV9hc3luY190aHJlYWQuc2VtX2V2ZW50KTsKLQotICAgICAgICBwdGhyZWFkX2pvaW4obV9hc3luY190aHJlYWQuaGFuZGxlLCBOVUxMKTsKLQotICAgICAgICBtX2FzeW5jX3RocmVhZC5jcmVhdGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgbV9hc3luY190aHJlYWQuZXhpdCA9IGZhbHNlOwotCi0gICAgc2VtX2Rlc3Ryb3koJm1fYXN5bmNfdGhyZWFkLnNlbV9ldmVudCk7Ci0gICAgc2VtX2Rlc3Ryb3koJm1fYXN5bmNfdGhyZWFkLnNlbV90aHJlYWRfY3JlYXRlZCk7Ci19Ci0KLS8qKgotICogQGJyaWVmIFBvc3QgZXZlbnQgdG8gYXBwcm9wcmlhdGUgcXVldWUuCi0gKgotICogQHBhcmFtW2luXSBldmVudF9pZDogICAgIEV2ZW50IElELgotICogQHBhcmFtW2luXSBldmVudF9wYXJhbTE6IEV2ZW50IHBhcmFtZXRlciAxLgotICogQHBhcmFtW2luXSBldmVudF9wYXJhbTI6IEV2ZW50IHBhcmFtZXRlciAyLgotICovCi12b2lkIG9teF9zd3ZkZWM6OmFzeW5jX3Bvc3RfZXZlbnQodW5zaWduZWQgbG9uZyBldmVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50X3BhcmFtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50X3BhcmFtMikKLXsKLSAgICBPTVhfU1dWREVDX0VWRU5UX0lORk8gZXZlbnRfaW5mbzsKLQotICAgIGV2ZW50X2luZm8uZXZlbnRfaWQgICAgID0gZXZlbnRfaWQ7Ci0gICAgZXZlbnRfaW5mby5ldmVudF9wYXJhbTEgPSBldmVudF9wYXJhbTE7Ci0gICAgZXZlbnRfaW5mby5ldmVudF9wYXJhbTIgPSBldmVudF9wYXJhbTI7Ci0KLSAgICBzd2l0Y2ggKGV2ZW50X2lkKQotICAgIHsKLQotICAgIGNhc2UgT01YX1NXVkRFQ19FVkVOVF9FVEI6Ci0gICAgY2FzZSBPTVhfU1dWREVDX0VWRU5UX0VCRDoKLSAgICB7Ci0gICAgICAgIG1fcXVldWVfcG9ydF9pcC5wdXNoKCZldmVudF9pbmZvKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfU1dWREVDX0VWRU5UX0ZUQjoKLSAgICBjYXNlIE9NWF9TV1ZERUNfRVZFTlRfRkJEOgotICAgIHsKLSAgICAgICAgbV9xdWV1ZV9wb3J0X29wLnB1c2goJmV2ZW50X2luZm8pOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgIHsKLSAgICAgICAgbV9xdWV1ZV9jb21tYW5kLnB1c2goJmV2ZW50X2luZm8pOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB9Ci0KLSAgICBzZW1fcG9zdCgmbV9hc3luY190aHJlYWQuc2VtX2V2ZW50KTsKLX0KLQotLyoqCi0gKiBAYnJpZWYgQXN5bmNocm9ub3VzIHRocmVhZC4KLSAqCi0gKiBAcGFyYW1baW5dIHBfY21wOiBQb2ludGVyIHRvIE9NWCBTd1ZkZWMgY29tcG9uZW50IGNsYXNzLgotICovCi12b2lkIG9teF9zd3ZkZWM6OmFzeW5jX3RocmVhZCh2b2lkICpwX2NtcCkKLXsKLSAgICBpZiAocF9jbXAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwX2NtcCA9IE5VTEwiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb214X3N3dmRlYyAqcF9vbXhfc3d2ZGVjID0gKG9teF9zd3ZkZWMgKikgcF9jbXA7Ci0KLSAgICAgICAgQVNZTkNfVEhSRUFEICpwX2FzeW5jX3RocmVhZCA9ICZwX29teF9zd3ZkZWMtPm1fYXN5bmNfdGhyZWFkOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goImNyZWF0ZWQiKTsKLQotICAgICAgICBzZW1fcG9zdCgmcF9hc3luY190aHJlYWQtPnNlbV90aHJlYWRfY3JlYXRlZCk7Ci0KLSAgICAgICAgd2hpbGUgKHBfYXN5bmNfdGhyZWFkLT5leGl0ID09IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZW1fd2FpdCgmcF9hc3luY190aHJlYWQtPnNlbV9ldmVudCk7Ci0KLSAgICAgICAgICAgIGlmIChwX2FzeW5jX3RocmVhZC0+ZXhpdCA9PSB0cnVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwX29teF9zd3ZkZWMtPmFzeW5jX3Byb2Nlc3NfZXZlbnQocF9jbXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgT01YX1NXVkRFQ19MT0dfSElHSCgiZXhpdGluZyIpOwotfQotCi0vKioKLSAqIEBicmllZiBQcm9jZXNzIGV2ZW50LgotICoKLSAqIEBwYXJhbVtpbl0gcF9jbXA6IFBvaW50ZXIgdG8gT01YIFN3VmRlYyBjb21wb25lbnQgY2xhc3MuCi0gKi8KLXZvaWQgb214X3N3dmRlYzo6YXN5bmNfcHJvY2Vzc19ldmVudCh2b2lkICpwX2NtcCkKLXsKLSAgICBvbXhfc3d2ZGVjICpwX29teF9zd3ZkZWM7Ci0KLSAgICBPTVhfU1dWREVDX0VWRU5UX0lORk8gZXZlbnRfaW5mbzsKLQotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIGlmIChwX2NtcCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInBfY21wID0gTlVMTCIpOwotCi0gICAgICAgIGdvdG8gYXN5bmNfcHJvY2Vzc19ldmVudF9leGl0OwotICAgIH0KLQotICAgIHBfb214X3N3dmRlYyA9IChvbXhfc3d2ZGVjICopIHBfY21wOwotCi0gICAgLy8gTk9URTogcXVldWVzIHBvcHBlZCBpbiBvcmRlciBvZiBwcmlvcml0eTsgZG8gbm90IGNoYW5nZSEKLQotICAgIGlmICgocF9vbXhfc3d2ZGVjLT5tX3F1ZXVlX2NvbW1hbmQucG9wKCZldmVudF9pbmZvKSA9PSBmYWxzZSkgJiYKLSAgICAgICAgKHBfb214X3N3dmRlYy0+bV9xdWV1ZV9wb3J0X29wLnBvcCgmZXZlbnRfaW5mbykgPT0gZmFsc2UpICYmCi0gICAgICAgIChwX29teF9zd3ZkZWMtPm1fcXVldWVfcG9ydF9pcC5wb3AoJmV2ZW50X2luZm8pID09IGZhbHNlKSkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygibm8gZXZlbnQgcG9wcGVkIik7Ci0KLSAgICAgICAgZ290byBhc3luY19wcm9jZXNzX2V2ZW50X2V4aXQ7Ci0gICAgfQotCi0gICAgc3dpdGNoIChldmVudF9pbmZvLmV2ZW50X2lkKQotICAgIHsKLQotICAgIGNhc2UgT01YX1NXVkRFQ19FVkVOVF9DTUQ6Ci0gICAgewotICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kICAgPSAoT01YX0NPTU1BTkRUWVBFKSBldmVudF9pbmZvLmV2ZW50X3BhcmFtMTsKLSAgICAgICAgT01YX1UzMiAgICAgICAgIHBhcmFtID0gKE9NWF9VMzIpICAgICAgICAgZXZlbnRfaW5mby5ldmVudF9wYXJhbTI7Ci0KLSAgICAgICAgcmV0dmFsID0gcF9vbXhfc3d2ZGVjLT5hc3luY19wcm9jZXNzX2V2ZW50X2NtZChjbWQsIHBhcmFtKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfU1dWREVDX0VWRU5UX0NNRF9BQ0s6Ci0gICAgewotICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kICAgPSAoT01YX0NPTU1BTkRUWVBFKSBldmVudF9pbmZvLmV2ZW50X3BhcmFtMTsKLSAgICAgICAgT01YX1UzMiAgICAgICAgIHBhcmFtID0gKE9NWF9VMzIpICAgICAgICAgZXZlbnRfaW5mby5ldmVudF9wYXJhbTI7Ci0KLSAgICAgICAgcmV0dmFsID0gcF9vbXhfc3d2ZGVjLT5hc3luY19wcm9jZXNzX2V2ZW50X2NtZF9hY2soY21kLCBwYXJhbSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX1NXVkRFQ19FVkVOVF9FUlJPUjoKLSAgICB7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyb3JfY29kZSA9IChPTVhfRVJST1JUWVBFKSBldmVudF9pbmZvLmV2ZW50X3BhcmFtMTsKLQotICAgICAgICByZXR2YWwgPSBwX29teF9zd3ZkZWMtPmFzeW5jX3Byb2Nlc3NfZXZlbnRfZXJyb3IoZXJyb3JfY29kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX1NXVkRFQ19FVkVOVF9FVEI6Ci0gICAgewotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9idWZmZXJfaGRyID0KLSAgICAgICAgICAgIChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKSBldmVudF9pbmZvLmV2ZW50X3BhcmFtMTsKLQotICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBldmVudF9pbmZvLmV2ZW50X3BhcmFtMjsKLQotICAgICAgICByZXR2YWwgPSBwX29teF9zd3ZkZWMtPmFzeW5jX3Byb2Nlc3NfZXZlbnRfZXRiKHBfYnVmZmVyX2hkciwgaW5kZXgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE9NWF9TV1ZERUNfRVZFTlRfRlRCOgotICAgIHsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmZmVyX2hkciA9Ci0gICAgICAgICAgICAoT01YX0JVRkZFUkhFQURFUlRZUEUgKikgZXZlbnRfaW5mby5ldmVudF9wYXJhbTE7Ci0KLSAgICAgICAgdW5zaWduZWQgaW50IGluZGV4ID0gZXZlbnRfaW5mby5ldmVudF9wYXJhbTI7Ci0KLSAgICAgICAgcmV0dmFsID0gcF9vbXhfc3d2ZGVjLT5hc3luY19wcm9jZXNzX2V2ZW50X2Z0YihwX2J1ZmZlcl9oZHIsIGluZGV4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfU1dWREVDX0VWRU5UX0VCRDoKLSAgICB7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1ZmZlcl9oZHIgPQotICAgICAgICAgICAgKE9NWF9CVUZGRVJIRUFERVJUWVBFICopIGV2ZW50X2luZm8uZXZlbnRfcGFyYW0xOwotCi0gICAgICAgIHVuc2lnbmVkIGludCBpbmRleCA9IGV2ZW50X2luZm8uZXZlbnRfcGFyYW0yOwotCi0gICAgICAgIHJldHZhbCA9IHBfb214X3N3dmRlYy0+YXN5bmNfcHJvY2Vzc19ldmVudF9lYmQocF9idWZmZXJfaGRyLCBpbmRleCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX1NXVkRFQ19FVkVOVF9GQkQ6Ci0gICAgewotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9idWZmZXJfaGRyID0KLSAgICAgICAgICAgIChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKSBldmVudF9pbmZvLmV2ZW50X3BhcmFtMTsKLQotICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBldmVudF9pbmZvLmV2ZW50X3BhcmFtMjsKLQotICAgICAgICByZXR2YWwgPSBwX29teF9zd3ZkZWMtPmFzeW5jX3Byb2Nlc3NfZXZlbnRfZmJkKHBfYnVmZmVyX2hkciwgaW5kZXgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE9NWF9TV1ZERUNfRVZFTlRfRU9TOgotICAgIHsKLSAgICAgICAgcmV0dmFsID0gcF9vbXhfc3d2ZGVjLT5hc3luY19wcm9jZXNzX2V2ZW50X2VvcygpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE9NWF9TV1ZERUNfRVZFTlRfRkxVU0hfUE9SVF9JUDoKLSAgICB7Ci0gICAgICAgIHJldHZhbCA9IHBfb214X3N3dmRlYy0+YXN5bmNfcHJvY2Vzc19ldmVudF9mbHVzaF9wb3J0X2lwKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX1NXVkRFQ19FVkVOVF9GTFVTSF9QT1JUX09QOgotICAgIHsKLSAgICAgICAgcmV0dmFsID0gcF9vbXhfc3d2ZGVjLT5hc3luY19wcm9jZXNzX2V2ZW50X2ZsdXNoX3BvcnRfb3AoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfU1dWREVDX0VWRU5UX1BPUlRfUkVDT05GSUc6Ci0gICAgewotICAgICAgICByZXR2YWwgPSBwX29teF9zd3ZkZWMtPmFzeW5jX3Byb2Nlc3NfZXZlbnRfcG9ydF9yZWNvbmZpZygpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE9NWF9TV1ZERUNfRVZFTlRfRElNRU5TSU9OU19VUERBVEVEOgotICAgIHsKLSAgICAgICAgcmV0dmFsID0gcF9vbXhfc3d2ZGVjLT5hc3luY19wcm9jZXNzX2V2ZW50X2RpbWVuc2lvbnNfdXBkYXRlZCgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgIHsKLSAgICAgICAgYXNzZXJ0KDApOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgfQotCi0gICAgaWYgKHJldHZhbCAhPSBPTVhfRXJyb3JOb25lKQotICAgIHsKLSAgICAgICAgcF9vbXhfc3d2ZGVjLT5hc3luY19wb3N0X2V2ZW50KE9NWF9TV1ZERUNfRVZFTlRfRVJST1IsIHJldHZhbCwgMCk7Ci0gICAgfQotCi1hc3luY19wcm9jZXNzX2V2ZW50X2V4aXQ6Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqIEBicmllZiBQcm9jZXNzIGNvbW1hbmQgZXZlbnQuCi0gKgotICogQHBhcmFtW2luXSBjbWQ6ICAgQ29tbWFuZC4KLSAqIEBwYXJhbVtpbl0gcGFyYW06IENvbW1hbmQgcGFyYW1ldGVyLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmFzeW5jX3Byb2Nlc3NfZXZlbnRfY21kKE9NWF9DT01NQU5EVFlQRSBjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICBwYXJhbSkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBib29sIGNtZF9hY2sgPSBmYWxzZTsKLQotICAgIFNXVkRFQ19TVEFUVVMgcmV0dmFsX3N3dmRlYzsKLQotICAgIHN3aXRjaCAoY21kKQotICAgIHsKLQotICAgIGNhc2UgT01YX0NvbW1hbmRTdGF0ZVNldDoKLSAgICB7Ci0gICAgICAgIHJldHZhbCA9IGFzeW5jX3Byb2Nlc3NfZXZlbnRfY21kX3N0YXRlX3NldCgmY21kX2FjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfU1RBVEVUWVBFKSBwYXJhbSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgT01YX0NvbW1hbmRGbHVzaDoKLSAgICB7Ci0gICAgICAgIHJldHZhbCA9IGFzeW5jX3Byb2Nlc3NfZXZlbnRfY21kX2ZsdXNoKCh1bnNpZ25lZCBpbnQpIHBhcmFtKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBPTVhfQ29tbWFuZFBvcnREaXNhYmxlOgotICAgIHsKLSAgICAgICAgcmV0dmFsID0gYXN5bmNfcHJvY2Vzc19ldmVudF9jbWRfcG9ydF9kaXNhYmxlKCZjbWRfYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkgcGFyYW0pOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE9NWF9Db21tYW5kUG9ydEVuYWJsZToKLSAgICB7Ci0gICAgICAgIHJldHZhbCA9IGFzeW5jX3Byb2Nlc3NfZXZlbnRfY21kX3BvcnRfZW5hYmxlKCZjbWRfYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSBwYXJhbSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiY21kICclZCcgaW52YWxpZCIsIChpbnQpIGNtZCk7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB9IC8vIHN3aXRjaCAoY21kKQotCi0gICAgaWYgKHJldHZhbCAhPSBPTVhfRXJyb3JOb25lKQotICAgIHsKLSAgICAgICAgYXN5bmNfcG9zdF9ldmVudChPTVhfU1dWREVDX0VWRU5UX0VSUk9SLCByZXR2YWwsIDApOwotICAgIH0KLSAgICBlbHNlIGlmIChjbWRfYWNrKQotICAgIHsKLSAgICAgICAgYXN5bmNfcG9zdF9ldmVudChPTVhfU1dWREVDX0VWRU5UX0NNRF9BQ0ssIGNtZCwgcGFyYW0pOwotICAgIH0KLQotICAgIHNlbV9wb3N0KCZtX3NlbV9jbWQpOwotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgUHJvY2VzcyBjb21tYW5kIGFja25vd2xlZGdlbWVudCBldmVudC4KLSAqCi0gKiBAcGFyYW1baW5dIGNtZDogICBDb21tYW5kLgotICogQHBhcmFtW2luXSBwYXJhbTogQ29tbWFuZCBwYXJhbWV0ZXIuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6YXN5bmNfcHJvY2Vzc19ldmVudF9jbWRfYWNrKE9NWF9DT01NQU5EVFlQRSBjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgcGFyYW0pCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgc3dpdGNoIChjbWQpCi0gICAgewotCi0gICAgY2FzZSBPTVhfQ29tbWFuZFN0YXRlU2V0OgotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiJXMgLT4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TVEFURVRZUEVfU1RSSU5HKG1fc3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TVEFURVRZUEVfU1RSSU5HKChPTVhfU1RBVEVUWVBFKSBwYXJhbSkpOwotCi0gICAgICAgIG1fc3RhdGUgPSAoT01YX1NUQVRFVFlQRSkgcGFyYW07Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQ0FMTEJBQ0soIkV2ZW50SGFuZGxlcigpOiBPTVhfRXZlbnRDbWRDb21wbGV0ZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT01YX0NvbW1hbmRTdGF0ZVNldCwgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RBVEVUWVBFX1NUUklORyhtX3N0YXRlKSk7Ci0KLSAgICAgICAgbV9jYWxsYmFjay5FdmVudEhhbmRsZXIoJm1fY21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NvbW1hbmRTdGF0ZVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9VMzIpIG1fc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE9NWF9Db21tYW5kRmx1c2g6Ci0gICAgY2FzZSBPTVhfQ29tbWFuZFBvcnRFbmFibGU6Ci0gICAgY2FzZSBPTVhfQ29tbWFuZFBvcnREaXNhYmxlOgotICAgIHsKLSAgICAgICAgaWYgKChjbWQgPT0gT01YX0NvbW1hbmRQb3J0RW5hYmxlKSAmJiBtX3BvcnRfcmVjb25maWdfaW5wcm9ncmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgbV9wb3J0X3JlY29uZmlnX2lucHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0NBTExCQUNLKCJFdmVudEhhbmRsZXIoKTogT01YX0V2ZW50Q21kQ29tcGxldGUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLCBwb3J0IGluZGV4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTU1BTkRUWVBFX1NUUklORyhjbWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSk7Ci0KLSAgICAgICAgbV9jYWxsYmFjay5FdmVudEhhbmRsZXIoJm1fY21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiY21kICclZCcgaW52YWxpZCIsIChpbnQpIGNtZCk7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB9IC8vIHN3aXRjaCAoY21kKQotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgUHJvY2VzcyBlcnJvciBldmVudC4KLSAqCi0gKiBAcGFyYW1baW5dIGVycm9yX2NvZGU6IEVycm9yIGNvZGUuCi0gKgotICogQHJldHZhbCBPTVhfRXJyb3JOb25lCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6YXN5bmNfcHJvY2Vzc19ldmVudF9lcnJvcihPTVhfRVJST1JUWVBFIGVycm9yX2NvZGUpCi17Ci0gICAgaWYgKGVycm9yX2NvZGUgPT0gT01YX0Vycm9ySW52YWxpZFN0YXRlKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgiJXMgLT4gT01YX1N0YXRlSW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1NUQVRFVFlQRV9TVFJJTkcobV9zdGF0ZSkpOwotCi0gICAgICAgIG1fc3RhdGUgPSBPTVhfU3RhdGVJbnZhbGlkOwotICAgIH0KLQotICAgIE9NWF9TV1ZERUNfTE9HX0NBTExCQUNLKCJFdmVudEhhbmRsZXIoKTogT01YX0V2ZW50RXJyb3IsIDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSk7Ci0KLSAgICBtX2NhbGxiYWNrLkV2ZW50SGFuZGxlcigmbV9jbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1UzMikgZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotCi0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLS8qKgotICogQGJyaWVmIFByb2Nlc3MgT01YX0NvbW1hbmRTdGF0ZVNldC4KLSAqCi0gKiBAcGFyYW1baW4sb3V0XSBwX2NtZF9hY2s6IFBvaW50ZXIgdG8gJ2NvbW1hbmQgYWNrbm93bGVkZ2UnIGJvb2xlYW4gdmFyaWFibGUuCi0gKiBAcGFyYW1baW5dICAgICBzdGF0ZV9uZXc6IE5ldyBzdGF0ZSB0byB3aGljaCB0cmFuc2l0aW9uIGlzIHJlcXVlc3RlZC4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjphc3luY19wcm9jZXNzX2V2ZW50X2NtZF9zdGF0ZV9zZXQoCi0gICAgYm9vbCAgICAgICAgICpwX2NtZF9hY2ssCi0gICAgT01YX1NUQVRFVFlQRSBzdGF0ZV9uZXcpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgU1dWREVDX1NUQVRVUyByZXR2YWxfc3d2ZGVjOwotCi0gICAgT01YX1NXVkRFQ19MT0dfSElHSCgiJyVzLXRvLSVzJyByZXF1ZXN0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1NUQVRFVFlQRV9TVFJJTkcobV9zdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RBVEVUWVBFX1NUUklORyhzdGF0ZV9uZXcpKTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgdGhlIGZvbGxvd2luZyBzdGF0ZSB0cmFuc2l0aW9ucyBhcmUgYWxsb3dlZCB2aWEgQ29tbWFuZFN0YXRlU2V0OgotICAgICAqCi0gICAgICogTE9BREVEIC0+IElETEUgLT4gRVhFQ1VUSU5HCi0gICAgICogTE9BREVEIDwtIElETEUgPC0gRVhFQ1VUSU5HCi0gICAgICovCi0KLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImluIHN0YXRlICVzIiwgT01YX1NUQVRFVFlQRV9TVFJJTkcobV9zdGF0ZSkpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RhdGVfbmV3ID09IE9NWF9TdGF0ZUludmFsaWQpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicmVxdWVzdGVkIHRyYW5zaXRpb24gdG8gc3RhdGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RBVEVUWVBFX1NUUklORyhzdGF0ZV9uZXcpKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKChtX3N0YXRlICAgPT0gT01YX1N0YXRlTG9hZGVkKSAmJgotICAgICAgICAgICAgIChzdGF0ZV9uZXcgPT0gT01YX1N0YXRlSWRsZSkpCi0gICAgewotICAgICAgICBpZiAoKG1fcG9ydF9pcC5wb3B1bGF0ZWQgPT0gT01YX1RSVUUpICYmCi0gICAgICAgICAgICAobV9wb3J0X29wLnBvcHVsYXRlZCA9PSBPTVhfVFJVRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgocmV0dmFsX3N3dmRlYyA9IHN3dmRlY19zdGFydChtX3N3dmRlY19oYW5kbGUpKSA9PQotICAgICAgICAgICAgICAgIFNXVkRFQ19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcF9jbWRfYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiZmFpbGVkIHRvIHN0YXJ0IFN3VmRlYyIpOwotCi0gICAgICAgICAgICAgICAgcmV0dmFsID0gcmV0dmFsX3N3dmRlYzJvbXgocmV0dmFsX3N3dmRlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3N0YXR1c19mbGFncyB8PSAoMSA8PCBQRU5ESU5HX1NUQVRFX0xPQURFRF9UT19JRExFKTsKLQotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfTE9XKCInbG9hZGVkLXRvLWlkbGUnIHBlbmRpbmciKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgobV9zdGF0ZSAgID09IE9NWF9TdGF0ZUlkbGUpICYmCi0gICAgICAgICAgICAgKHN0YXRlX25ldyA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpKQotICAgIHsKLSAgICAgICAgKnBfY21kX2FjayA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UgaWYgKChtX3N0YXRlICAgPT0gT01YX1N0YXRlRXhlY3V0aW5nKSAmJgotICAgICAgICAgICAgIChzdGF0ZV9uZXcgPT0gT01YX1N0YXRlSWRsZSkpCi0gICAgewotICAgICAgICBtX3N0YXR1c19mbGFncyB8PSAoMSA8PCBQRU5ESU5HX1NUQVRFX0VYRUNVVElOR19UT19JRExFKTsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19MT1coIidleGVjdXRpbmctdG8taWRsZScgcGVuZGluZyIpOwotCi0gICAgICAgIHJldHZhbCA9IGZsdXNoKE9NWF9BTEwpOwotICAgIH0KLSAgICBlbHNlIGlmICgobV9zdGF0ZSAgID09IE9NWF9TdGF0ZUlkbGUpICYmCi0gICAgICAgICAgICAgKHN0YXRlX25ldyA9PSBPTVhfU3RhdGVMb2FkZWQpKQotICAgIHsKLSAgICAgICAgaWYgKChtX3BvcnRfaXAudW5wb3B1bGF0ZWQgPT0gT01YX1RSVUUpICYmCi0gICAgICAgICAgICAobV9wb3J0X29wLnVucG9wdWxhdGVkID09IE9NWF9UUlVFKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChyZXR2YWxfc3d2ZGVjID0gc3d2ZGVjX3N0b3AobV9zd3ZkZWNfaGFuZGxlKSkgPT0KLSAgICAgICAgICAgICAgICBTV1ZERUNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY21kX2FjayA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImZhaWxlZCB0byBzdG9wIFN3VmRlYyIpOwotCi0gICAgICAgICAgICAgICAgcmV0dmFsID0gcmV0dmFsX3N3dmRlYzJvbXgocmV0dmFsX3N3dmRlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3N0YXR1c19mbGFncyB8PSAoMSA8PCBQRU5ESU5HX1NUQVRFX0lETEVfVE9fTE9BREVEKTsKLQotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfTE9XKCInaWRsZS10by1sb2FkZWQnIHBlbmRpbmciKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigic3RhdGUgdHJhbnNpdGlvbiAnJXMgLT4gJXMnIGlsbGVnYWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU1RBVEVUWVBFX1NUUklORyhtX3N0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1NUQVRFVFlQRV9TVFJJTkcoc3RhdGVfbmV3KSk7Ci0KLSAgICAgICAgcmV0dmFsID0gKChzdGF0ZV9uZXcgPT0gbV9zdGF0ZSkgPwotICAgICAgICAgICAgICAgICAgT01YX0Vycm9yU2FtZVN0YXRlIDoKLSAgICAgICAgICAgICAgICAgIE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgUHJvY2VzcyBPTVhfQ29tbWFuZEZsdXNoLgotICoKLSAqIEBwYXJhbVtpbl0gcG9ydF9pbmRleDogSW5kZXggb2YgcG9ydCB0byBmbHVzaC4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjphc3luY19wcm9jZXNzX2V2ZW50X2NtZF9mbHVzaCh1bnNpZ25lZCBpbnQgcG9ydF9pbmRleCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJmbHVzaCBwb3J0IGluZGV4ICVkIHJlcXVlc3RlZCIsIHBvcnRfaW5kZXgpOwotCi0gICAgaWYgKHBvcnRfaW5kZXggPT0gT01YX0NPUkVfUE9SVF9JTkRFWF9JUCkKLSAgICB7Ci0gICAgICAgIG1fc3RhdHVzX2ZsYWdzIHw9ICgxIDw8IFBFTkRJTkdfUE9SVF9GTFVTSF9JUCk7Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfTE9XKCJpcCBwb3J0IGZsdXNoIHBlbmRpbmciKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocG9ydF9pbmRleCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX09QKQotICAgIHsKLSAgICAgICAgbV9zdGF0dXNfZmxhZ3MgfD0gKDEgPDwgUEVORElOR19QT1JUX0ZMVVNIX09QKTsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19MT1coIm9wIHBvcnQgZmx1c2ggcGVuZGluZyIpOwotICAgIH0KLSAgICBlbHNlIGlmIChwb3J0X2luZGV4ID09IE9NWF9BTEwpCi0gICAgewotICAgICAgICBtX3N0YXR1c19mbGFncyB8PSAoMSA8PCBQRU5ESU5HX1BPUlRfRkxVU0hfSVApOwotICAgICAgICBtX3N0YXR1c19mbGFncyB8PSAoMSA8PCBQRU5ESU5HX1BPUlRfRkxVU0hfT1ApOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygiaXAgJiBvcCBwb3J0cyBmbHVzaCBwZW5kaW5nIik7Ci0gICAgfQotCi0gICAgcmV0dmFsID0gZmx1c2gocG9ydF9pbmRleCk7Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBQcm9jZXNzIE9NWF9Db21tYW5kUG9ydERpc2FibGUuCi0gKgotICogQHBhcmFtW2luLG91dF0gcF9jbWRfYWNrOiAgUG9pbnRlciB0byAnY29tbWFuZCBhY2tub3dsZWRnZScgYm9vbGVhbiB2YXJpYWJsZS4KLSAqIEBwYXJhbVtpbl0gICAgIHBvcnRfaW5kZXg6IEluZGV4IG9mIHBvcnQgdG8gZGlzYWJsZS4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjphc3luY19wcm9jZXNzX2V2ZW50X2NtZF9wb3J0X2Rpc2FibGUoCi0gICAgYm9vbCAgICAgICAgICpwX2NtZF9hY2ssCi0gICAgdW5zaWduZWQgaW50ICBwb3J0X2luZGV4KQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goImRpc2FibGUgcG9ydCBpbmRleCAlZCByZXF1ZXN0ZWQiLCBwb3J0X2luZGV4KTsKLQotICAgIGlmIChwb3J0X2luZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfSVApCi0gICAgewotICAgICAgICBpZiAobV9wb3J0X2lwLmVuYWJsZWQgPT0gT01YX0ZBTFNFKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaXAgcG9ydCBhbHJlYWR5IGRpc2FibGVkIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcG9ydF9pcC5lbmFibGVkID0gT01YX0ZBTFNFOwotCi0gICAgICAgICAgICBpZiAobV9wb3J0X2lwLnVucG9wdWxhdGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NtZF9hY2sgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fc3RhdHVzX2ZsYWdzIHw9ICgxIDw8IFBFTkRJTkdfUE9SVF9ESVNBQkxFX0lQKTsKLQotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygiaXAgcG9ydCBkaXNhYmxlIHBlbmRpbmciKTsKLQotICAgICAgICAgICAgICAgIGlmIChtX3BvcnRfaXAubnVtX3BlbmRpbmdfYnVmZmVycykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGZsdXNoKHBvcnRfaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChwb3J0X2luZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApCi0gICAgewotICAgICAgICBpZiAobV9wb3J0X29wLmVuYWJsZWQgPT0gT01YX0ZBTFNFKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigib3AgcG9ydCBhbHJlYWR5IGRpc2FibGVkIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcG9ydF9vcC5lbmFibGVkID0gT01YX0ZBTFNFOwotCi0gICAgICAgICAgICBpZiAobV9wb3J0X29wLnVucG9wdWxhdGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NtZF9hY2sgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fc3RhdHVzX2ZsYWdzIHw9ICgxIDw8IFBFTkRJTkdfUE9SVF9ESVNBQkxFX09QKTsKLQotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygib3AgcG9ydCBkaXNhYmxlIHBlbmRpbmciKTsKLQotICAgICAgICAgICAgICAgIGlmIChtX3BvcnRfb3AubnVtX3BlbmRpbmdfYnVmZmVycykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGZsdXNoKHBvcnRfaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChwb3J0X2luZGV4ID09IE9NWF9BTEwpCi0gICAgewotICAgICAgICBpZiAobV9wb3J0X2lwLmVuYWJsZWQgPT0gT01YX0ZBTFNFKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaXAgcG9ydCBhbHJlYWR5IGRpc2FibGVkIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtX3BvcnRfb3AuZW5hYmxlZCA9PSBPTVhfRkFMU0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJvcCBwb3J0IGFscmVhZHkgZGlzYWJsZWQiKTsKLQotICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1fcG9ydF9pcC51bnBvcHVsYXRlZCAmJiBtX3BvcnRfb3AudW5wb3B1bGF0ZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY21kX2FjayA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9wb3J0X2lwLmVuYWJsZWQgPSBPTVhfRkFMU0U7Ci0gICAgICAgICAgICAgICAgbV9wb3J0X29wLmVuYWJsZWQgPSBPTVhfRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICBpZiAobV9wb3J0X2lwLnVucG9wdWxhdGVkID09IE9NWF9GQUxTRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzX2ZsYWdzIHw9ICgxIDw8IFBFTkRJTkdfUE9SVF9ESVNBQkxFX0lQKTsKLQotICAgICAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19MT1coImlwIHBvcnQgZGlzYWJsZSBwZW5kaW5nIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fcG9ydF9pcC5udW1fcGVuZGluZ19idWZmZXJzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBmbHVzaChwb3J0X2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICgocmV0dmFsID09IE9NWF9FcnJvck5vbmUpICYmCi0gICAgICAgICAgICAgICAgICAgIChtX3BvcnRfb3AudW5wb3B1bGF0ZWQgPT0gT01YX0ZBTFNFKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzX2ZsYWdzIHw9ICgxIDw8IFBFTkRJTkdfUE9SVF9ESVNBQkxFX09QKTsKLQotICAgICAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19MT1coIm9wIHBvcnQgZGlzYWJsZSBwZW5kaW5nIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fcG9ydF9vcC5udW1fcGVuZGluZ19idWZmZXJzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBmbHVzaChwb3J0X2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigicG9ydCBpbmRleCAnJWQnIGludmFsaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X2luZGV4KTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgUHJvY2VzcyBPTVhfQ29tbWFuZFBvcnRFbmFibGUuCi0gKgotICogQHBhcmFtW2luLG91dF0gcF9jbWRfYWNrOiAgUG9pbnRlciB0byAnY29tbWFuZCBhY2tub3dsZWRnZScgYm9vbGVhbiB2YXJpYWJsZS4KLSAqIEBwYXJhbVtpbl0gICAgIHBvcnRfaW5kZXg6IEluZGV4IG9mIHBvcnQgdG8gZW5hYmxlLgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmFzeW5jX3Byb2Nlc3NfZXZlbnRfY21kX3BvcnRfZW5hYmxlKAotICAgIGJvb2wgICAgICAgICpwX2NtZF9hY2ssCi0gICAgdW5zaWduZWQgaW50IHBvcnRfaW5kZXgpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgT01YX1NXVkRFQ19MT0dfSElHSCgiZW5hYmxlIHBvcnQgaW5kZXggJWQgcmVxdWVzdGVkIiwgcG9ydF9pbmRleCk7Ci0KLSAgICBpZiAocG9ydF9pbmRleCA9PSBPTVhfQ09SRV9QT1JUX0lOREVYX0lQKQotICAgIHsKLSAgICAgICAgaWYgKG1fcG9ydF9pcC5lbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiaXAgcG9ydCBhbHJlYWR5IGVuYWJsZWQiKTsKLQotICAgICAgICAgICAgcmV0dmFsID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbV9wb3J0X2lwLmVuYWJsZWQgPSBPTVhfVFJVRTsKLQotICAgICAgICAgICAgaWYgKG1fcG9ydF9pcC5wb3B1bGF0ZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY21kX2FjayA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9zdGF0dXNfZmxhZ3MgfD0gKDEgPDwgUEVORElOR19QT1JUX0VOQUJMRV9JUCk7Ci0KLSAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19MT1coImlwIHBvcnQgZW5hYmxlIHBlbmRpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChwb3J0X2luZGV4ID09IE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApCi0gICAgewotICAgICAgICBpZiAobV9wb3J0X29wLmVuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJvcCBwb3J0IGFscmVhZHkgZW5hYmxlZCIpOwotCi0gICAgICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3BvcnRfb3AuZW5hYmxlZCA9IE9NWF9UUlVFOwotCi0gICAgICAgICAgICBpZiAobV9wb3J0X29wLnBvcHVsYXRlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcF9jbWRfYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3N0YXR1c19mbGFncyB8PSAoMSA8PCBQRU5ESU5HX1BPUlRfRU5BQkxFX09QKTsKLQotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygib3AgcG9ydCBlbmFibGUgcGVuZGluZyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHBvcnRfaW5kZXggPT0gT01YX0FMTCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BvcnRfaXAuZW5hYmxlZCkKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImlwIHBvcnQgYWxyZWFkeSBlbmFibGVkIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtX3BvcnRfb3AuZW5hYmxlZCkKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoIm9wIHBvcnQgYWxyZWFkeSBlbmFibGVkIik7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcG9ydF9pcC5lbmFibGVkID0gT01YX1RSVUU7Ci0gICAgICAgICAgICBtX3BvcnRfb3AuZW5hYmxlZCA9IE9NWF9UUlVFOwotCi0gICAgICAgICAgICBpZiAobV9wb3J0X2lwLnBvcHVsYXRlZCAmJiBtX3BvcnRfb3AucG9wdWxhdGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NtZF9hY2sgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobV9wb3J0X2lwLnBvcHVsYXRlZCA9PSBmYWxzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3N0YXR1c19mbGFncyB8PSAoMSA8PCBQRU5ESU5HX1BPUlRfRU5BQkxFX0lQKTsKLQotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygiaXAgcG9ydCBlbmFibGUgcGVuZGluZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobV9wb3J0X29wLnBvcHVsYXRlZCA9PSBmYWxzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3N0YXR1c19mbGFncyB8PSAoMSA8PCBQRU5ESU5HX1BPUlRfRU5BQkxFX09QKTsKLQotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygib3AgcG9ydCBlbmFibGUgcGVuZGluZyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IGluZGV4ICclZCcgaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfaW5kZXgpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBQcm9jZXNzIEVUQiBldmVudC4KLSAqCi0gKiBAcGFyYW1baW5dIHBfYnVmZmVyX2hkcjogUG9pbnRlciB0byBidWZmZXIgaGVhZGVyLgotICogQHBhcmFtW2luXSBpbmRleDogICAgICAgIEluZGV4IG9mIGJ1ZmZlciBpbiBpbnB1dCBidWZmZXIgaW5mbyBhcnJheS4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjphc3luY19wcm9jZXNzX2V2ZW50X2V0YigKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9idWZmZXJfaGRyLAotICAgIHVuc2lnbmVkIGludCAgICAgICAgICBpbmRleCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBtX3BvcnRfaXAubnVtX3BlbmRpbmdfYnVmZmVycysrOwotCi0gICAgaWYgKChwX2J1ZmZlcl9oZHItPm5GaWxsZWRMZW4gPT0gMCkgJiYKLSAgICAgICAgKChwX2J1ZmZlcl9oZHItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gMCkpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJyZXR1cm5pbmcgJXAsIGJ1ZmZlciAlcDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ6ZXJvIGxlbmd0aCAmIG5vIEVPUyBmbGFnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9oZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5wQnVmZmVyKTsKLQotICAgICAgICBhc3luY19wb3N0X2V2ZW50KE9NWF9TV1ZERUNfRVZFTlRfRUJELAotICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBwX2J1ZmZlcl9oZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGluZGV4KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobV9wb3J0X2lwLmZsdXNoX2lucHJvZ3Jlc3MpCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJyZXR1cm5pbmcgJXAsIGJ1ZmZlciAlcDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcCBwb3J0IGZsdXNoIGluIHByb2dyZXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9oZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5wQnVmZmVyKTsKLQotICAgICAgICBhc3luY19wb3N0X2V2ZW50KE9NWF9TV1ZERUNfRVZFTlRfRUJELAotICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBwX2J1ZmZlcl9oZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGluZGV4KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU1dWREVDX1NUQVRVUyByZXR2YWxfc3d2ZGVjOwotCi0gICAgICAgIFNXVkRFQ19CVUZGRVIgKnBfYnVmZmVyX3N3dmRlYyA9Ci0gICAgICAgICAgICAmKG1fYnVmZmVyX2FycmF5X2lwW2luZGV4XS5idWZmZXJfc3d2ZGVjKTsKLQotICAgICAgICBpZiAocF9idWZmZXJfaGRyLT5uRmlsbGVkTGVuICYmCi0gICAgICAgICAgICAoKHBfYnVmZmVyX2hkci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3F1ZXVlX3RpbWVzdGFtcC5wdXNoKHBfYnVmZmVyX2hkci0+blRpbWVTdGFtcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQocF9idWZmZXJfc3d2ZGVjLT5wX2J1ZmZlciA9PSBwX2J1ZmZlcl9oZHItPnBCdWZmZXIpOwotCi0gICAgICAgIGlmIChtX2FyYml0cmFyeV9ieXRlc19tb2RlICYmCi0gICAgICAgICAgICBwX2J1ZmZlcl9oZHItPm5GaWxsZWRMZW4gJiYKLSAgICAgICAgICAgICgocF9idWZmZXJfaGRyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXRfYXJyYXlbT01YX1NXVkRFQ19NQVhfRlJBTUVTX1BFUl9FVEJdID0gezB9OwotCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2ZyYW1lX2hlYWRlcnMgPSAxOwotCi0gICAgICAgICAgICBpZiAoKG1fb214X3ZpZGVvX2NvZGluZ3R5cGUgPT0KLSAgICAgICAgICAgICAgICAgKChPTVhfVklERU9fQ09ESU5HVFlQRSkgUU9NWF9WSURFT19Db2RpbmdEaXZ4KSkgfHwKLSAgICAgICAgICAgICAgICAobV9vbXhfdmlkZW9fY29kaW5ndHlwZSA9PSBPTVhfVklERU9fQ29kaW5nTVBFRzQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG51bV9mcmFtZV9oZWFkZXJzID0gc3BsaXRfYnVmZmVyX21wZWc0KG9mZnNldF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9oZHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCgwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYobnVtX2ZyYW1lX2hlYWRlcnMgPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fYnVmZmVyX2FycmF5X2lwW2luZGV4XS5zcGxpdF9jb3VudCA9IG51bV9mcmFtZV9oZWFkZXJzIC0gMTsKLQotICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGlpID0gMDsgaWkgPCBudW1fZnJhbWVfaGVhZGVyczsgaWkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+ZmxhZ3MgICAgID0gcF9idWZmZXJfaGRyLT5uRmxhZ3M7Ci0gICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+dGltZXN0YW1wID0gcF9idWZmZXJfaGRyLT5uVGltZVN0YW1wOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpaSA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9zd3ZkZWMtPm9mZnNldCAgICAgICAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfc3d2ZGVjLT5maWxsZWRfbGVuZ3RoID0gKG9mZnNldF9hcnJheVtpaSArIDFdID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfYXJyYXlbaWkgKyAxXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5uRmlsbGVkTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+b2Zmc2V0ICAgICAgICA9IG9mZnNldF9hcnJheVtpaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9zd3ZkZWMtPmZpbGxlZF9sZW5ndGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX2hkci0+bkZpbGxlZExlbiAtIG9mZnNldF9hcnJheVtpaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtX2RpYWcuZHVtcF9pcChwX2J1ZmZlcl9zd3ZkZWMtPnBfYnVmZmVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfc3d2ZGVjLT5vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+ZmlsbGVkX2xlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsX3N3dmRlYyA9IHN3dmRlY19lbXB0eXRoaXNidWZmZXIobV9zd3ZkZWNfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9zd3ZkZWMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWxfc3d2ZGVjICE9IFNXVkRFQ19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcmV0dmFsX3N3dmRlYzJvbXgocmV0dmFsX3N3dmRlYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfU1dWREVDX0xPR19ISUdIKCJObyBmcmFtZSBkZXRlY3RlZCBmb3IgQnVmZmVyICVwLCB3aXRoIFRTICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5wQnVmZmVyLCBwX2J1ZmZlcl9oZHItPm5UaW1lU3RhbXAgKTsKLQotICAgICAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+ZmxhZ3MgICAgICAgICA9IHBfYnVmZmVyX2hkci0+bkZsYWdzOwotICAgICAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+b2Zmc2V0ICAgICAgICA9IDA7Ci0gICAgICAgICAgICAgICAgcF9idWZmZXJfc3d2ZGVjLT50aW1lc3RhbXAgICAgID0gcF9idWZmZXJfaGRyLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+ZmlsbGVkX2xlbmd0aCA9IHBfYnVmZmVyX2hkci0+bkZpbGxlZExlbjsKLQotICAgICAgICAgICAgICAgIG1fZGlhZy5kdW1wX2lwKHBfYnVmZmVyX3N3dmRlYy0+cF9idWZmZXIgKyBwX2J1ZmZlcl9zd3ZkZWMtPm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmZlcl9zd3ZkZWMtPmZpbGxlZF9sZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgcmV0dmFsX3N3dmRlYyA9IHN3dmRlY19lbXB0eXRoaXNidWZmZXIobV9zd3ZkZWNfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsX3N3dmRlYyAhPSBTV1ZERUNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByZXR2YWxfc3d2ZGVjMm9teChyZXR2YWxfc3d2ZGVjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwX2J1ZmZlcl9zd3ZkZWMtPmZsYWdzICAgICAgICAgPSBwX2J1ZmZlcl9oZHItPm5GbGFnczsKLSAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+b2Zmc2V0ICAgICAgICA9IDA7Ci0gICAgICAgICAgICBwX2J1ZmZlcl9zd3ZkZWMtPnRpbWVzdGFtcCAgICAgPSBwX2J1ZmZlcl9oZHItPm5UaW1lU3RhbXA7Ci0gICAgICAgICAgICBwX2J1ZmZlcl9zd3ZkZWMtPmZpbGxlZF9sZW5ndGggPSBwX2J1ZmZlcl9oZHItPm5GaWxsZWRMZW47Ci0KLSAgICAgICAgICAgIG1fZGlhZy5kdW1wX2lwKHBfYnVmZmVyX3N3dmRlYy0+cF9idWZmZXIgKyBwX2J1ZmZlcl9zd3ZkZWMtPm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYy0+ZmlsbGVkX2xlbmd0aCk7Ci0KLSAgICAgICAgICAgIHJldHZhbF9zd3ZkZWMgPSBzd3ZkZWNfZW1wdHl0aGlzYnVmZmVyKG1fc3d2ZGVjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX3N3dmRlYyk7Ci0KLSAgICAgICAgICAgIGlmIChyZXR2YWxfc3d2ZGVjICE9IFNXVkRFQ19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByZXR2YWxfc3d2ZGVjMm9teChyZXR2YWxfc3d2ZGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBQcm9jZXNzIEZUQiBldmVudC4KLSAqCi0gKiBAcGFyYW1baW5dIHBfYnVmZmVyX2hkcjogUG9pbnRlciB0byBidWZmZXIgaGVhZGVyLgotICogQHBhcmFtW2luXSBpbmRleDogICAgICAgIEluZGV4IG9mIGJ1ZmZlciBpbiBvdXRwdXQgYnVmZmVyIGluZm8gYXJyYXkuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6YXN5bmNfcHJvY2Vzc19ldmVudF9mdGIoCi0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfYnVmZmVyX2hkciwKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgaW5kZXgpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgbV9wb3J0X29wLm51bV9wZW5kaW5nX2J1ZmZlcnMrKzsKLQotICAgIGlmIChtX3BvcnRfb3AuZmx1c2hfaW5wcm9ncmVzcykKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goInJldHVybmluZyAlcCwgYnVmZmVyICVwOyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wIHBvcnQgZmx1c2ggaW4gcHJvZ3Jlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX2hkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlcl9hcnJheV9vcFtpbmRleF0uYnVmZmVyX3N3dmRlYy5wX2J1ZmZlcik7Ci0KLSAgICAgICAgYXN5bmNfcG9zdF9ldmVudChPTVhfU1dWREVDX0VWRU5UX0ZCRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgcF9idWZmZXJfaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbmRleCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFNXVkRFQ19TVEFUVVMgcmV0dmFsX3N3dmRlYzsKLQotICAgICAgICBTV1ZERUNfQlVGRkVSICpwX2J1ZmZlcl9zd3ZkZWMgPQotICAgICAgICAgICAgJihtX2J1ZmZlcl9hcnJheV9vcFtpbmRleF0uYnVmZmVyX3N3dmRlYyk7Ci0KLSAgICAgICAgcmV0dmFsX3N3dmRlYyA9IHN3dmRlY19maWxsdGhpc2J1ZmZlcihtX3N3dmRlY19oYW5kbGUsIHBfYnVmZmVyX3N3dmRlYyk7Ci0KLSAgICAgICAgaWYgKHJldHZhbF9zd3ZkZWMgIT0gU1dWREVDX1NUQVRVU19TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR2YWwgPSByZXR2YWxfc3d2ZGVjMm9teChyZXR2YWxfc3d2ZGVjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIFByb2Nlc3MgRUJEIGV2ZW50LgotICoKLSAqIEBwYXJhbVtpbl0gcF9idWZmZXJfaGRyOiBQb2ludGVyIHRvIGJ1ZmZlciBoZWFkZXIuCi0gKiBAcGFyYW1baW5dIGluZGV4OiAgICAgICAgSW5kZXggb2YgYnVmZmVyIGluIG91dHB1dCBidWZmZXIgaW5mbyBhcnJheS4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjphc3luY19wcm9jZXNzX2V2ZW50X2ViZCgKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9idWZmZXJfaGRyLAotICAgIHVuc2lnbmVkIGludCAgICAgICAgICBpbmRleCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBpZiAoaW5kZXggPCBtX3BvcnRfaXAuZGVmLm5CdWZmZXJDb3VudEFjdHVhbCkKLSAgICB7Ci0gICAgICAgIGlmIChtX2FyYml0cmFyeV9ieXRlc19tb2RlICYmIG1fYnVmZmVyX2FycmF5X2lwW2luZGV4XS5zcGxpdF9jb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgbV9idWZmZXJfYXJyYXlfaXBbaW5kZXhdLnNwbGl0X2NvdW50LS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3BvcnRfaXAubnVtX3BlbmRpbmdfYnVmZmVycy0tOwotCi0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19DQUxMQkFDSygKLSAgICAgICAgICAgICAgICAiRW1wdHlCdWZmZXJEb25lKCk6ICVwLCBidWZmZXIgJXAiLAotICAgICAgICAgICAgICAgIHBfYnVmZmVyX2hkciwKLSAgICAgICAgICAgICAgICBtX2J1ZmZlcl9hcnJheV9pcFtpbmRleF0uYnVmZmVyX3N3dmRlYy5wX2J1ZmZlcik7Ci0KLSAgICAgICAgICAgIG1fY2FsbGJhY2suRW1wdHlCdWZmZXJEb25lKCZtX2NtcCwgbV9hcHBfZGF0YSwgcF9idWZmZXJfaGRyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiYnVmZmVyIGluZGV4ICclZCcgaW52YWxpZCIsIGluZGV4KTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgUHJvY2VzcyBGQkQgZXZlbnQuCi0gKgotICogQHBhcmFtW2luXSBwX2J1ZmZlcl9oZHI6IFBvaW50ZXIgdG8gYnVmZmVyIGhlYWRlci4KLSAqIEBwYXJhbVtpbl0gaW5kZXg6ICAgICAgICBJbmRleCBvZiBidWZmZXIgaW4gb3V0cHV0IGJ1ZmZlciBpbmZvIGFycmF5LgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmFzeW5jX3Byb2Nlc3NfZXZlbnRfZmJkKAotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1ZmZlcl9oZHIsCi0gICAgdW5zaWduZWQgaW50ICAgICAgICAgIGluZGV4KQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIHN0YXRpYyBsb25nIGxvbmcgdGltZXN0YW1wX3ByZXYgPSAwOwotCi0gICAgaWYgKGluZGV4IDwgbV9wb3J0X29wLmRlZi5uQnVmZmVyQ291bnRBY3R1YWwpCi0gICAgewotICAgICAgICBPTVhfVTggKnBfYnVmZmVyOwotCi0gICAgICAgIHBfYnVmZmVyID0gbV9idWZmZXJfYXJyYXlfb3BbaW5kZXhdLmJ1ZmZlcl9zd3ZkZWMucF9idWZmZXI7Ci0KLSAgICAgICAgbV9wb3J0X29wLm51bV9wZW5kaW5nX2J1ZmZlcnMtLTsKLQotICAgICAgICBpZiAobV9wb3J0X29wLmZsdXNoX2lucHJvZ3Jlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfYnVmZmVyX2hkci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICBwX2J1ZmZlcl9oZHItPm5UaW1lU3RhbXAgPSAwOwotICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5uRmxhZ3MgICAgJj0gfk9NWF9CVUZGRVJGTEFHX0RBVEFDT1JSVVBUOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfYnVmZmVyX2hkci0+bkZpbGxlZExlbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1fc3luY19mcmFtZV9kZWNvZGluZ19tb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygic3luYyBmcmFtZSBkZWNvZGluZyBtb2RlOyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXR0aW5nIHRpbWVzdGFtcCB0byB6ZXJvIik7Ci0KLSAgICAgICAgICAgICAgICBwX2J1ZmZlcl9oZHItPm5UaW1lU3RhbXAgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtX3F1ZXVlX3RpbWVzdGFtcC5lbXB0eSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoInRpbWVzdGFtcCBxdWV1ZSBlbXB0eTsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmUtdXNpbmcgcHJldmlvdXMgdGltZXN0YW1wICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBfcHJldik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcF9idWZmZXJfaGRyLT5uVGltZVN0YW1wID0gdGltZXN0YW1wX3ByZXY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBfYnVmZmVyX2hkci0+blRpbWVTdGFtcCA9IG1fcXVldWVfdGltZXN0YW1wLnRvcCgpOwotCi0gICAgICAgICAgICAgICAgICAgIG1fcXVldWVfdGltZXN0YW1wLnBvcCgpOwotCi0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcF9wcmV2ID0gcF9idWZmZXJfaGRyLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW9uX2ZsdXNoX29wKGluZGV4KTsKLQotICAgICAgICAgICAgaWYgKG1fbWV0YV9idWZmZXJfbW9kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbWV0YV9idWZmZXJfYXJyYXlfbXV0ZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtX2RpYWcuZHVtcF9vcChwX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnJhbWVfZGltZW5zaW9ucy53aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnJhbWVfZGltZW5zaW9ucy5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZyYW1lX2F0dHJpYnV0ZXMuc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mcmFtZV9hdHRyaWJ1dGVzLnNjYW5saW5lcyk7Ci0KLSAgICAgICAgICAgIGlmIChtX21ldGFfYnVmZmVyX21vZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbWV0YV9idWZmZXJfYXJyYXlfbXV0ZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfTE9XKCJmaWxsZWQgbGVuZ3RoIHplcm87ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0dGluZyB0aW1lc3RhbXAgdG8gemVybyIpOwotCi0gICAgICAgICAgICBwX2J1ZmZlcl9oZHItPm5UaW1lU3RhbXAgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfYnVmZmVyX2hkci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3luY19wb3N0X2V2ZW50KE9NWF9TV1ZERUNfRVZFTlRfRU9TLCAwLCAwKTsKLQotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfTE9XKCJmbHVzaGluZyAlenUgZWxlbWVudHMgaW4gdGltZXN0YW1wIHF1ZXVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3F1ZXVlX3RpbWVzdGFtcC5zaXplKCkpOwotCi0gICAgICAgICAgICB3aGlsZSAobV9xdWV1ZV90aW1lc3RhbXAuZW1wdHkoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3F1ZXVlX3RpbWVzdGFtcC5wb3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX21ldGFfYnVmZmVyX21vZGUgJiYKLSAgICAgICAgICAgICgocF9idWZmZXJfaGRyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19SRUFET05MWSkpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFfYnVmZmVyX3JlZl9yZW1vdmUoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfQ0FMTEJBQ0soCi0gICAgICAgICAgICAiRmlsbEJ1ZmZlckRvbmUoKTogJXAsIGJ1ZmZlciAlcCwgIgotICAgICAgICAgICAgImZsYWdzIDB4JTA4eCwgZmlsbGVkIGxlbmd0aCAlZCwgdGltZXN0YW1wICVsbGQiLAotICAgICAgICAgICAgcF9idWZmZXJfaGRyLAotICAgICAgICAgICAgcF9idWZmZXIsCi0gICAgICAgICAgICBwX2J1ZmZlcl9oZHItPm5GbGFncywKLSAgICAgICAgICAgIHBfYnVmZmVyX2hkci0+bkZpbGxlZExlbiwKLSAgICAgICAgICAgIHBfYnVmZmVyX2hkci0+blRpbWVTdGFtcCk7Ci0KLSAgICAgICAgbV9jYWxsYmFjay5GaWxsQnVmZmVyRG9uZSgmbV9jbXAsIG1fYXBwX2RhdGEsIHBfYnVmZmVyX2hkcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJidWZmZXIgaW5kZXggJyVkJyBpbnZhbGlkIiwgaW5kZXgpOwotCi0gICAgICAgIHJldHZhbCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLWFzeW5jX3Byb2Nlc3NfZXZlbnRfZmJkX2V4aXQ6Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgUHJvY2VzcyBFT1MgZXZlbnQuCi0gKgotICogQHJldHZhbCBPTVhfRXJyb3JOb25lCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6YXN5bmNfcHJvY2Vzc19ldmVudF9lb3MoKQotewotICAgIE9NWF9TV1ZERUNfTE9HX0NBTExCQUNLKCJFdmVudEhhbmRsZXIoKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPTVhfRXZlbnRCdWZmZXJGbGFnLCBwb3J0IGluZGV4ICVkLCBFT1MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApOwotCi0gICAgbV9jYWxsYmFjay5FdmVudEhhbmRsZXIoJm1fY21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50QnVmZmVyRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09SRV9QT1JUX0lOREVYX09QLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJGTEFHX0VPUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi0vKioKLSAqIEBicmllZiBQcm9jZXNzIGlucHV0IHBvcnQgZmx1c2ggZXZlbnQuCi0gKgotICogQHJldHZhbCBPTVhfRVJST1JUWVBFCi0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3N3dmRlYzo6YXN5bmNfcHJvY2Vzc19ldmVudF9mbHVzaF9wb3J0X2lwKCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBPTVhfU1dWREVDX0VWRU5UX0lORk8gZXZlbnRfaW5mbzsKLQotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1ZmZlcl9oZHI7Ci0KLSAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0KLSAgICB3aGlsZSAobV9xdWV1ZV9wb3J0X2lwLnBvcCgmZXZlbnRfaW5mbykpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGV2ZW50X2luZm8uZXZlbnRfaWQpCi0gICAgICAgIHsKLQotICAgICAgICBjYXNlIE9NWF9TV1ZERUNfRVZFTlRfRVRCOgotICAgICAgICB7Ci0gICAgICAgICAgICBwX2J1ZmZlcl9oZHIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKikgZXZlbnRfaW5mby5ldmVudF9wYXJhbTE7Ci0KLSAgICAgICAgICAgIGluZGV4ID0gZXZlbnRfaW5mby5ldmVudF9wYXJhbTI7Ci0KLSAgICAgICAgICAgIC8vIGNvbXBlbnNhdGUgZGVjcmVtZW50IGluIGFzeW5jX3Byb2Nlc3NfZXZlbnRfZWJkKCkKLSAgICAgICAgICAgIG1fcG9ydF9pcC5udW1fcGVuZGluZ19idWZmZXJzKys7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IGFzeW5jX3Byb2Nlc3NfZXZlbnRfZWJkKHBfYnVmZmVyX2hkciwgaW5kZXgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9TV1ZERUNfRVZFTlRfRUJEOgotICAgICAgICB7Ci0gICAgICAgICAgICBwX2J1ZmZlcl9oZHIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKikgZXZlbnRfaW5mby5ldmVudF9wYXJhbTE7Ci0KLSAgICAgICAgICAgIGluZGV4ID0gZXZlbnRfaW5mby5ldmVudF9wYXJhbTI7Ci0KLSAgICAgICAgICAgIHJldHZhbCA9IGFzeW5jX3Byb2Nlc3NfZXZlbnRfZWJkKHBfYnVmZmVyX2hkciwgaW5kZXgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQoMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhc3NlcnQobV9wb3J0X2lwLm51bV9wZW5kaW5nX2J1ZmZlcnMgPT0gMCk7Ci0KLSAgICBpZiAoKHJldHZhbCA9PSBPTVhfRXJyb3JOb25lKSAmJgotICAgICAgICAobV9zdGF0dXNfZmxhZ3MgJiAoMSA8PCBQRU5ESU5HX1BPUlRfRkxVU0hfSVApKSkKLSAgICB7Ci0gICAgICAgIG1fc3RhdHVzX2ZsYWdzICY9IH4oMSA8PCBQRU5ESU5HX1BPUlRfRkxVU0hfSVApOwotCi0gICAgICAgIGFzeW5jX3Bvc3RfZXZlbnQoT01YX1NXVkRFQ19FVkVOVF9DTURfQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9Db21tYW5kRmx1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPUkVfUE9SVF9JTkRFWF9JUCk7Ci0gICAgfQotCi0gICAgbV9wb3J0X2lwLmZsdXNoX2lucHJvZ3Jlc3MgPSBPTVhfRkFMU0U7Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEBicmllZiBQcm9jZXNzIG91dHB1dCBwb3J0IGZsdXNoIGV2ZW50LgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmFzeW5jX3Byb2Nlc3NfZXZlbnRfZmx1c2hfcG9ydF9vcCgpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXR2YWwgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgT01YX1NXVkRFQ19FVkVOVF9JTkZPIGV2ZW50X2luZm87Ci0KLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9idWZmZXJfaGRyOwotCi0gICAgdW5zaWduZWQgaW50IGluZGV4OwotCi0gICAgd2hpbGUgKG1fcXVldWVfcG9ydF9vcC5wb3AoJmV2ZW50X2luZm8pKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChldmVudF9pbmZvLmV2ZW50X2lkKQotICAgICAgICB7Ci0KLSAgICAgICAgY2FzZSBPTVhfU1dWREVDX0VWRU5UX0ZUQjoKLSAgICAgICAgewotICAgICAgICAgICAgcF9idWZmZXJfaGRyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopIGV2ZW50X2luZm8uZXZlbnRfcGFyYW0xOwotCi0gICAgICAgICAgICBpbmRleCA9IGV2ZW50X2luZm8uZXZlbnRfcGFyYW0yOwotCi0gICAgICAgICAgICAvLyBjb21wZW5zYXRlIGRlY3JlbWVudCBpbiBhc3luY19wcm9jZXNzX2V2ZW50X2ZiZCgpCi0gICAgICAgICAgICBtX3BvcnRfb3AubnVtX3BlbmRpbmdfYnVmZmVycysrOwotCi0gICAgICAgICAgICByZXR2YWwgPSBhc3luY19wcm9jZXNzX2V2ZW50X2ZiZChwX2J1ZmZlcl9oZHIsIGluZGV4KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfU1dWREVDX0VWRU5UX0ZCRDoKLSAgICAgICAgewotICAgICAgICAgICAgcF9idWZmZXJfaGRyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopIGV2ZW50X2luZm8uZXZlbnRfcGFyYW0xOwotCi0gICAgICAgICAgICBpbmRleCA9IGV2ZW50X2luZm8uZXZlbnRfcGFyYW0yOwotCi0gICAgICAgICAgICByZXR2YWwgPSBhc3luY19wcm9jZXNzX2V2ZW50X2ZiZChwX2J1ZmZlcl9oZHIsIGluZGV4KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0KDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXNzZXJ0KG1fcG9ydF9vcC5udW1fcGVuZGluZ19idWZmZXJzID09IDApOwotCi0gICAgaWYgKChyZXR2YWwgPT0gT01YX0Vycm9yTm9uZSkgJiYKLSAgICAgICAgKG1fc3RhdHVzX2ZsYWdzICYgKDEgPDwgUEVORElOR19QT1JUX0ZMVVNIX09QKSkpCi0gICAgewotICAgICAgICBtX3N0YXR1c19mbGFncyAmPSB+KDEgPDwgUEVORElOR19QT1JUX0ZMVVNIX09QKTsKLQotICAgICAgICBhc3luY19wb3N0X2V2ZW50KE9NWF9TV1ZERUNfRVZFTlRfQ01EX0FDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ29tbWFuZEZsdXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT1JFX1BPUlRfSU5ERVhfT1ApOwotICAgIH0KLQotICAgIGlmICgocmV0dmFsID09IE9NWF9FcnJvck5vbmUpICYmCi0gICAgICAgIChtX3N0YXR1c19mbGFncyAmICgxIDw8IFBFTkRJTkdfU1RBVEVfRVhFQ1VUSU5HX1RPX0lETEUpKSkKLSAgICB7Ci0gICAgICAgIG1fc3RhdHVzX2ZsYWdzICY9IH4oMSA8PCBQRU5ESU5HX1NUQVRFX0VYRUNVVElOR19UT19JRExFKTsKLQotICAgICAgICBhc3luY19wb3N0X2V2ZW50KE9NWF9TV1ZERUNfRVZFTlRfQ01EX0FDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ29tbWFuZFN0YXRlU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZUlkbGUpOwotICAgIH0KLQotICAgIGlmIChtX3BvcnRfcmVjb25maWdfaW5wcm9ncmVzcyA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0xPVygiZmx1c2hpbmcgJXp1IGVsZW1lbnRzIGluIHRpbWVzdGFtcCBxdWV1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX3F1ZXVlX3RpbWVzdGFtcC5zaXplKCkpOwotCi0gICAgICAgIHdoaWxlIChtX3F1ZXVlX3RpbWVzdGFtcC5lbXB0eSgpID09IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3F1ZXVlX3RpbWVzdGFtcC5wb3AoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fcG9ydF9vcC5mbHVzaF9pbnByb2dyZXNzID0gT01YX0ZBTFNFOwotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBAYnJpZWYgUHJvY2VzcyBwb3J0IHJlY29uZmlndXJhdGlvbiBldmVudC4KLSAqCi0gKiBAcmV0dmFsIE9NWF9FUlJPUlRZUEUKLSAqLwotT01YX0VSUk9SVFlQRSBvbXhfc3d2ZGVjOjphc3luY19wcm9jZXNzX2V2ZW50X3BvcnRfcmVjb25maWcoKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0dmFsID0gT01YX0Vycm9yTm9uZTsKLQotICAgIGlmIChtX3BvcnRfcmVjb25maWdfaW5wcm9ncmVzcykKLSAgICB7Ci0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJwb3J0IHJlY29uZmlndXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIik7Ci0KLSAgICAgICAgcmV0dmFsID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1fcG9ydF9yZWNvbmZpZ19pbnByb2dyZXNzID0gdHJ1ZTsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19DQUxMQkFDSygiRXZlbnRIYW5kbGVyKCk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIHBvcnQgaW5kZXggJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09SRV9QT1JUX0lOREVYX09QKTsKLQotICAgICAgICBtX2NhbGxiYWNrLkV2ZW50SGFuZGxlcigmbV9jbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT1JFX1BPUlRfSU5ERVhfT1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIFByb2Nlc3MgZGltZW5zaW9ucyB1cGRhdGVkIGV2ZW50LgotICoKLSAqIEByZXR2YWwgT01YX0VSUk9SVFlQRQotICovCi1PTVhfRVJST1JUWVBFIG9teF9zd3ZkZWM6OmFzeW5jX3Byb2Nlc3NfZXZlbnRfZGltZW5zaW9uc191cGRhdGVkKCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldHZhbCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBpZiAobV9kaW1lbnNpb25zX3VwZGF0ZV9pbnByb2dyZXNzKQotICAgIHsKLSAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImRpbWVuc2lvbnMgdXBkYXRlIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKLQotICAgICAgICByZXR2YWwgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbV9kaW1lbnNpb25zX3VwZGF0ZV9pbnByb2dyZXNzID0gdHJ1ZTsKLQotICAgICAgICBPTVhfU1dWREVDX0xPR19DQUxMQkFDSygiRXZlbnRIYW5kbGVyKCk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIHBvcnQgaW5kZXggJWQsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09SRV9QT1JUX0lOREVYX09QKTsKLQotICAgICAgICBtX2NhbGxiYWNrLkV2ZW50SGFuZGxlcigmbV9jbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT1JFX1BPUlRfSU5ERVhfT1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiByZXR2YWw7Ci19CmRpZmYgLS1naXQgYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvc3JjL29teF9zd3ZkZWNfdXRpbHMuY3BwIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL3NyYy9vbXhfc3d2ZGVjX3V0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0NzlkMS4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvc3JjL29teF9zd3ZkZWNfdXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKgotICogQGNvcHlyaWdodAotICoKLSAqICAgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICogICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqICAgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4KLSAqICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqICAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqICAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiAgIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiAgIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotICogICBEQU1BR0UuCi0gKgotICogQGZpbGUKLSAqCi0gKiAgIG9teF9zd3ZkZWNfdXRpbHMuY3BwCi0gKgotICogQGJyaWVmCi0gKgotICogICBPTVggc29mdHdhcmUgdmlkZW8gZGVjb2RlciB1dGlsaXR5IGZ1bmN0aW9ucyBzb3VyY2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlICJvbXhfc3d2ZGVjX3V0aWxzLmgiCi0KLSNkZWZpbmUgT01YX1NXVkRFQ19MT0dMRVZFTF9ERUZBVUxUIDIgLy8vPCBkZWZhdWx0IE9NWCBTd1ZkZWMgbG9nbGV2ZWwKLQotdW5zaWduZWQgaW50IGdfb214X3N3dmRlY19sb2dtYXNrID0gKDEgPDwgT01YX1NXVkRFQ19MT0dMRVZFTF9ERUZBVUxUKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGdsb2JhbCBPTVggU3dWZGVjIGxvZ21hc2sgdmFyaWFibGUgZGVmaW5pdGlvbgotCi0vKioKLSAqIEBicmllZiBJbml0aWFsaXplIE9NWCBTd1ZkZWMgbG9nIGxldmVsICYgbWFzay4KLSAqLwotdm9pZCBvbXhfc3d2ZGVjX2xvZ19pbml0KCkKLXsKLSAgICBpbnQgb214X3N3dmRlY19sb2dsZXZlbCA9IE9NWF9TV1ZERUNfTE9HTEVWRUxfREVGQVVMVDsKLQotICAgIGNoYXIgcHJvcGVydHlfdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLQotICAgIGlmIChwcm9wZXJ0eV9nZXQoIm9teF9zd3ZkZWMubG9nLmxldmVsIiwgcHJvcGVydHlfdmFsdWUsIE5VTEwpKQotICAgIHsKLSAgICAgICAgb214X3N3dmRlY19sb2dsZXZlbCA9IGF0b2kocHJvcGVydHlfdmFsdWUpOwotCi0gICAgICAgIGlmIChvbXhfc3d2ZGVjX2xvZ2xldmVsID4gMykKLSAgICAgICAgewotICAgICAgICAgICAgb214X3N3dmRlY19sb2dsZXZlbCA9IDM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob214X3N3dmRlY19sb2dsZXZlbCA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9teF9zd3ZkZWNfbG9nbGV2ZWwgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgKLSAgICAgICAgICAgICJvbXhfc3d2ZGVjLmxvZy5sZXZlbDogJWQ7ICVzIiwKLSAgICAgICAgICAgIG9teF9zd3ZkZWNfbG9nbGV2ZWwsCi0gICAgICAgICAgICAob214X3N3dmRlY19sb2dsZXZlbCA9PSAzKSA/ICJlcnJvciwgaGlnaCwgJiBsb3cgbG9ncyIgOgotICAgICAgICAgICAgKChvbXhfc3d2ZGVjX2xvZ2xldmVsID09IDIpID8gImVycm9yICYgaGlnaCBsb2dzIiA6Ci0gICAgICAgICAgICAgKChvbXhfc3d2ZGVjX2xvZ2xldmVsID09IDEpID8gImVycm9yIGxvZ3MiIDoKLSAgICAgICAgICAgICAgIm5vIGxvZ3MiKSkpOwotICAgIH0KLQotICAgIGdfb214X3N3dmRlY19sb2dtYXNrID0gKHVuc2lnbmVkIGludCkgKCgxIDw8IG9teF9zd3ZkZWNfbG9nbGV2ZWwpIC0gMSk7Ci19Ci0KLS8qKgotICogQGJyaWVmIE9NWCBTd1ZkZWMgcXVldWUgY29uc3RydWN0b3IuCi0gKi8KLW9teF9zd3ZkZWNfcXVldWU6Om9teF9zd3ZkZWNfcXVldWUoKQotewotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9tdXRleCwgTlVMTCk7Ci19Ci0KLS8qKgotICogQGJyaWVmIE9NWCBTd1ZkZWMgcXVldWUgZGVzdHJ1Y3Rvci4KLSAqLwotb214X3N3dmRlY19xdWV1ZTo6fm9teF9zd3ZkZWNfcXVldWUoKQotewotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbV9tdXRleCk7Ci19Ci0KLS8qKgotICogQGJyaWVmIFB1c2ggZXZlbnQgdG8gcXVldWUuCi0gKgotICogQHBhcmFtW2luXSBwX2V2ZW50X2luZm86IFBvaW50ZXIgdG8gZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlLgotICovCi12b2lkIG9teF9zd3ZkZWNfcXVldWU6OnB1c2goT01YX1NXVkRFQ19FVkVOVF9JTkZPICpwX2V2ZW50X2luZm8pCi17Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX211dGV4KTsKLQotICAgIG1fcXVldWUucHVzaCgqcF9ldmVudF9pbmZvKTsKLQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX211dGV4KTsKLX0KLQotLyoqCi0gKiBAYnJpZWYgUG9wIGV2ZW50IGZyb20gcXVldWUuCi0gKgotICogQHBhcmFtW2luLG91dF0gcF9ldmVudF9pbmZvOiBQb2ludGVyIHRvIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KLSAqCi0gKiBAcmV0dmFsICB0cnVlIGlmIHBvcCBzdWNjZXNzZnVsCi0gKiBAcmV0dmFsIGZhbHNlIGlmIHBvcCB1bnN1Y2Nlc3NmdWwKLSAqLwotYm9vbCBvbXhfc3d2ZGVjX3F1ZXVlOjpwb3AoT01YX1NXVkRFQ19FVkVOVF9JTkZPICpwX2V2ZW50X2luZm8pCi17Ci0gICAgYm9vbCByZXR2YWwgPSB0cnVlOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX211dGV4KTsKLQotICAgIGlmIChtX3F1ZXVlLmVtcHR5KCkpCi0gICAgewotICAgICAgICByZXR2YWwgPSBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnBfZXZlbnRfaW5mbyA9IG1fcXVldWUuZnJvbnQoKTsKLQotICAgICAgICBtX3F1ZXVlLnBvcCgpOwotICAgIH0KLQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX211dGV4KTsKLQotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQGJyaWVmIE9NWCBTd1ZkZWMgZGlhZ25vc3RpY3MgY2xhc3MgY29uc3RydWN0b3IuCi0gKi8KLW9teF9zd3ZkZWNfZGlhZzo6b214X3N3dmRlY19kaWFnKCk6Ci0gICAgbV9kdW1wX2lwKDApLAotICAgIG1fZHVtcF9vcCgwKSwKLSAgICBtX2ZpbGVuYW1lX2lwKE5VTEwpLAotICAgIG1fZmlsZW5hbWVfb3AoTlVMTCksCi0gICAgbV9maWxlX2lwKE5VTEwpLAotICAgIG1fZmlsZV9vcChOVUxMKQotewotICAgIHRpbWVfdCB0aW1lX3JhdzsKLQotICAgIHN0cnVjdCB0bSAqdGltZV9pbmZvOwotCi0gICAgY2hhciB0aW1lX3N0cmluZ1sxNl07Ci0KLSAgICBjaGFyIGZpbGVuYW1lX2lwW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgY2hhciBmaWxlbmFtZV9vcFtQUk9QRVJUWV9WQUxVRV9NQVhdOwotCi0gICAgY2hhciBwcm9wZXJ0eV92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gezB9OwotCi0gICAgdGltZV9yYXcgPSB0aW1lKE5VTEwpOwotCi0gICAgdGltZV9pbmZvID0gbG9jYWx0aW1lKCZ0aW1lX3Jhdyk7Ci0KLSAgICBpZiAodGltZV9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgICAvLyB0aW1lIHN0cmluZzogIllZWVltbWRkVEhITU1TUyIKLSAgICAgICAgc3RyZnRpbWUodGltZV9zdHJpbmcsIHNpemVvZih0aW1lX3N0cmluZyksICIlWSVtJWRUJUglTSVTIiwgdGltZV9pbmZvKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy8gdGltZSBzdHJpbmc6ICIxOTcwMDEwMVQwMDAwMDAiCi0gICAgICAgIHNucHJpbnRmKHRpbWVfc3RyaW5nLCBzaXplb2YodGltZV9zdHJpbmcpLCAiMTk3MDAxMDFUMDAwMDAwIik7Ci0gICAgfQotCi0gICAgLy8gZGVmYXVsdCBpcCBmaWxlbmFtZTogIi9kYXRhL21pc2MvbWVkaWEvb214X3N3dmRlY19ZWVlZbW1kZFRISE1NU1NfaXAuYmluIgotICAgIHNucHJpbnRmKGZpbGVuYW1lX2lwLAotICAgICAgICAgICAgIHNpemVvZihmaWxlbmFtZV9pcCksCi0gICAgICAgICAgICAgIiVzL29teF9zd3ZkZWNfJXNfaXAuYmluIiwKLSAgICAgICAgICAgICBESUFHX0ZJTEVfUEFUSCwKLSAgICAgICAgICAgICB0aW1lX3N0cmluZyk7Ci0KLSAgICAvLyBkZWZhdWx0IG9wIGZpbGVuYW1lOiAiL2RhdGEvbWlzYy9tZWRpYS9vbXhfc3d2ZGVjX1lZWVltbWRkVEhITU1TU19vcC55dXYiCi0gICAgc25wcmludGYoZmlsZW5hbWVfb3AsCi0gICAgICAgICAgICAgc2l6ZW9mKGZpbGVuYW1lX29wKSwKLSAgICAgICAgICAgICAiJXMvb214X3N3dmRlY18lc19vcC55dXYiLAotICAgICAgICAgICAgIERJQUdfRklMRV9QQVRILAotICAgICAgICAgICAgIHRpbWVfc3RyaW5nKTsKLQotICAgIGlmIChwcm9wZXJ0eV9nZXQoIm9teF9zd3ZkZWMuZHVtcC5pcCIsIHByb3BlcnR5X3ZhbHVlLCBOVUxMKSkKLSAgICB7Ci0gICAgICAgIG1fZHVtcF9pcCA9IGF0b2kocHJvcGVydHlfdmFsdWUpOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goIm9teF9zd3ZkZWMuZHVtcC5pcDogJWQiLCBtX2R1bXBfaXApOwotICAgIH0KLQotICAgIGlmIChwcm9wZXJ0eV9nZXQoIm9teF9zd3ZkZWMuZHVtcC5vcCIsIHByb3BlcnR5X3ZhbHVlLCBOVUxMKSkKLSAgICB7Ci0gICAgICAgIG1fZHVtcF9vcCA9IGF0b2kocHJvcGVydHlfdmFsdWUpOwotCi0gICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goIm9teF9zd3ZkZWMuZHVtcC5vcDogJWQiLCBtX2R1bXBfb3ApOwotICAgIH0KLQotICAgIGlmIChtX2R1bXBfaXAgJiYgcHJvcGVydHlfZ2V0KCJvbXhfc3d2ZGVjLmZpbGVuYW1lLmlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9pcCkgJiYgKHN0cmxlbihwcm9wZXJ0eV92YWx1ZSkgPiAwICkgKQotICAgIHsKLSAgICAgICAgc2l6ZV90IG1fZmlsZW5hbWVfaXBfc2l6ZSA9IChzdHJsZW4ocHJvcGVydHlfdmFsdWUpICsgMSkqc2l6ZW9mKGNoYXIpOwotICAgICAgICBtX2ZpbGVuYW1lX2lwID0KLSAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhtX2ZpbGVuYW1lX2lwX3NpemUpOwotICAgICAgICBpZiAobV9maWxlbmFtZV9pcCA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlICV6dSBieXRlcyBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0IGZpbGVuYW1lIHN0cmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZpbGVuYW1lX2lwX3NpemUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3RybGNweShtX2ZpbGVuYW1lX2lwLCBwcm9wZXJ0eV92YWx1ZSxtX2ZpbGVuYW1lX2lwX3NpemUpOwotICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfSElHSCgib214X3N3dmRlYy5maWxlbmFtZS5pcDogJXMiLCBtX2ZpbGVuYW1lX2lwKTsKLSAgICAgICAgICAgIGlmICgobV9maWxlX2lwID0gZm9wZW4obV9maWxlbmFtZV9pcCwgIndiIikpID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX1NXVkRFQ19MT0dfRVJST1IoImNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJyVzJyBsb2dnaW5nIGVycm8gaXMgOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9maWxlbmFtZV9pcCxlcnJubyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobV9kdW1wX29wICYmIHByb3BlcnR5X2dldCgib214X3N3dmRlYy5maWxlbmFtZS5vcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfb3ApICYmIChzdHJsZW4ocHJvcGVydHlfdmFsdWUpID4gMCApKQotICAgIHsKLSAgICAgICAgc2l6ZV90IG1fZmlsZW5hbWVfb3Bfc2l6ZSA9IChzdHJsZW4ocHJvcGVydHlfdmFsdWUpICsgMSkqc2l6ZW9mKGNoYXIpOwotICAgICAgICBtX2ZpbGVuYW1lX29wID0KLSAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhtX2ZpbGVuYW1lX29wX3NpemUpOwotICAgICAgICBpZiAobV9maWxlbmFtZV9vcCA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfU1dWREVDX0xPR19FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlICV6dSBieXRlcyBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBmaWxlbmFtZSBzdHJpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9maWxlbmFtZV9vcF9zaXplKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmxjcHkobV9maWxlbmFtZV9vcCwgcHJvcGVydHlfdmFsdWUsbV9maWxlbmFtZV9vcF9zaXplKTsKLSAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0hJR0goIm9teF9zd3ZkZWMuZmlsZW5hbWUub3A6ICVzIiwgbV9maWxlbmFtZV9vcCk7Ci0gICAgICAgICAgICBpZiAoKG1fZmlsZV9vcCA9IGZvcGVuKG1fZmlsZW5hbWVfb3AsICJ3YiIpKSA9PSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TV1ZERUNfTE9HX0VSUk9SKCJjYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAnJXMnIGxvZ2dpbmcgZXJyb3IgOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9maWxlbmFtZV9vcCxlcnJubyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogQGJyaWVmIE9NWCBTd1ZkZWMgZGlhZ25vc3RpY3MgY2xhc3MgZGVzdHJ1Y3Rvci4KLSAqLwotb214X3N3dmRlY19kaWFnOjp+b214X3N3dmRlY19kaWFnKCkKLXsKLSAgICBpZiAobV9maWxlX29wKQotICAgIHsKLSAgICAgICAgZmNsb3NlKG1fZmlsZV9vcCk7Ci0gICAgICAgIG1fZmlsZV9vcCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1fZmlsZV9pcCkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShtX2ZpbGVfaXApOwotICAgICAgICBtX2ZpbGVfaXAgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtX2ZpbGVuYW1lX29wKQotICAgIHsKLSAgICAgICAgZnJlZShtX2ZpbGVuYW1lX29wKTsKLSAgICAgICAgbV9maWxlbmFtZV9vcCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1fZmlsZW5hbWVfaXApCi0gICAgewotICAgICAgICBmcmVlKG1fZmlsZW5hbWVfaXApOwotICAgICAgICBtX2ZpbGVuYW1lX2lwID0gTlVMTDsKLSAgICB9Ci19Ci0KLS8qKgotICogQGJyaWVmIER1bXAgaW5wdXQgYml0c3RyZWFtIHRvIGZpbGUuCi0gKgotICogQHBhcmFtW2luXSBwX2J1ZmZlcjogICAgICBQb2ludGVyIHRvIGlucHV0IGJpdHN0cmVhbSBidWZmZXIuCi0gKiBAcGFyYW1baW5dIGZpbGxlZF9sZW5ndGg6IEJpdHN0cmVhbSBidWZmZXIncyBmaWxsZWQgbGVuZ3RoLgotICovCi12b2lkIG9teF9zd3ZkZWNfZGlhZzo6ZHVtcF9pcCh1bnNpZ25lZCBjaGFyICpwX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGZpbGxlZF9sZW5ndGgpCi17Ci0gICAgaWYgKG1fZHVtcF9pcCAmJiAobV9maWxlX2lwICE9IE5VTEwpKQotICAgIHsKLSAgICAgICAgZndyaXRlKHBfYnVmZmVyLCBzaXplb2YodW5zaWduZWQgY2hhciksIGZpbGxlZF9sZW5ndGgsIG1fZmlsZV9pcCk7Ci0gICAgfQotfQotCi0vKioKLSAqIEBicmllZiBEdW1wIG91dHB1dCBZVVYgdG8gZmlsZS4KLSAqCi0gKiBAcGFyYW1baW5dIHBfYnVmZmVyOiAgUG9pbnRlciB0byBvdXRwdXQgWVVWIGJ1ZmZlci4KLSAqIEBwYXJhbVtpbl0gd2lkdGg6ICAgICBGcmFtZSB3aWR0aC4KLSAqIEBwYXJhbVtpbl0gaGVpZ2h0OiAgICBGcmFtZSBoZWlnaHQuCi0gKiBAcGFyYW1baW5dIHN0cmlkZTogICAgRnJhbWUgc3RyaWRlLgotICogQHBhcmFtW2luXSBzY2FubGluZXM6IEZyYW1lIHNjYW5saW5lcy4KLSAqLwotdm9pZCBvbXhfc3d2ZGVjX2RpYWc6OmR1bXBfb3AodW5zaWduZWQgY2hhciAqcF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIHNjYW5saW5lcykKLXsKLSAgICBpZiAobV9kdW1wX29wICYmIChtX2ZpbGVfb3AgIT0gTlVMTCkpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyICpwX2J1ZmZlcl95OwotICAgICAgICB1bnNpZ25lZCBjaGFyICpwX2J1ZmZlcl91djsKLQotICAgICAgICB1bnNpZ25lZCBpbnQgaWk7Ci0KLSAgICAgICAgcF9idWZmZXJfeSAgPSBwX2J1ZmZlcjsKLSAgICAgICAgcF9idWZmZXJfdXYgPSBwX2J1ZmZlciArIChzdHJpZGUgKiBzY2FubGluZXMpOwotCi0gICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IGhlaWdodDsgaWkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZndyaXRlKHBfYnVmZmVyX3ksIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgd2lkdGgsIG1fZmlsZV9vcCk7Ci0KLSAgICAgICAgICAgIHBfYnVmZmVyX3kgKz0gc3RyaWRlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgKGhlaWdodCAvIDIpOyBpaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmd3JpdGUocF9idWZmZXJfdXYsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgd2lkdGgsIG1fZmlsZV9vcCk7Ci0KLSAgICAgICAgICAgIHBfYnVmZmVyX3V2ICs9IHN0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9zcmMvb214X3ZkZWNfZXh0ZW5zaW9ucy5ocHAgYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvc3JjL29teF92ZGVjX2V4dGVuc2lvbnMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGVlODkyLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9zcmMvb214X3ZkZWNfZXh0ZW5zaW9ucy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLU9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLUlGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIG9teF92ZGVjOjppbml0X3ZlbmRvcl9leHRlbnNpb25zIChWZW5kb3JFeHRlbnNpb25TdG9yZSAmc3RvcmUpIHsKLQotICAgIC8vVE9ETzogYWRkIGV4dGVuc2lvbnMgYmFzZWQgb24gQ29kZWMsIG1fcGxhdGZvcm0gYW5kL29yIG90aGVyIGNhcGFiaWxpdHkgcXVlcmllcwotCi0gICAgQUREX0VYVEVOU0lPTigicXRpLWV4dC1kZWMtcGljdHVyZS1vcmRlciIsIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvRGVjb2RlclBpY3R1cmVPcmRlciwgT01YX0Rpck91dHB1dCkKLSAgICBBRERfUEFSQU1fRU5EKCJlbmFibGUiLCBPTVhfQW5kcm9pZFZlbmRvclZhbHVlSW50MzIpCi19Ci0KLQotT01YX0VSUk9SVFlQRSBvbXhfdmRlYzo6Z2V0X3ZlbmRvcl9leHRlbnNpb25fY29uZmlnKAotICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0KSB7Ci0gICAgaWYgKGV4dC0+bkluZGV4ID49IG1WZW5kb3JFeHRlbnNpb25TdG9yZS5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKLSAgICB9Ci0KLSAgICBjb25zdCBWZW5kb3JFeHRlbnNpb24mIHZFeHQgPSBtVmVuZG9yRXh0ZW5zaW9uU3RvcmVbZXh0LT5uSW5kZXhdOwotICAgIERFQlVHX1BSSU5UX0xPVygiVmVuZG9yRXh0OiBnZXRDb25maWc6IGluZGV4PSV1ICglcykiLCBleHQtPm5JbmRleCwgdkV4dC5uYW1lKCkpOwotCi0gICAgdkV4dC5jb3B5SW5mb1RvKGV4dCk7Ci0gICAgaWYgKGV4dC0+blBhcmFtU2l6ZVVzZWQgPCB2RXh0LnBhcmFtQ291bnQoKSkgewotICAgICAgICAvLyB0aGlzIGhhcHBlbnMgZHVyaW5nIGluaXRpYWwgZ2V0Q29uZmlnIHRvIHF1ZXJ5IG9ubHkgZXh0ZW5zaW9uLW5hbWUgYW5kIHBhcmFtLWNvdW50Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLQotICAgIC8vIFdlIG5vdyBoYXZlIHN1ZmZpY2llbnQgcGFyYW1zIGFsbG9jYXRlZCBpbiBleHRlbnNpb24gZGF0YSBwYXNzZWQuCi0gICAgLy8gRm9sbG93aW5nIGNvZGUgaXMgdG8gc2V0IHRoZSBleHRlbnNpb24tc3BlY2lmaWMgZGF0YQotCi0gICAgYm9vbCBzZXRTdGF0dXMgPSB0cnVlOwotCi0gICAgc3dpdGNoICgoT01YX1UzMil2RXh0LmV4dGVuc2lvbkluZGV4KCkpIHsKLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0RlY29kZXJQaWN0dXJlT3JkZXI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNldFN0YXR1cyAmPSB2RXh0LnNldFBhcmFtSW50MzIoZXh0LCAiZW5hYmxlIiwgbV9kZWNvZGVfb3JkZXJfbW9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNldFN0YXR1cyA/IE9NWF9FcnJvck5vbmUgOiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgb214X3ZkZWM6OnNldF92ZW5kb3JfZXh0ZW5zaW9uX2NvbmZpZygKLSAgICAgICAgICAgICAgICBPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX0VYVEVOU0lPTlRZUEUgKmV4dCkgewotCi0gICAgQUxPR0koInNldF92ZW5kb3JfZXh0ZW5zaW9uX2NvbmZpZyIpOwotICAgIGlmIChleHQtPm5JbmRleCA+PSBtVmVuZG9yRXh0ZW5zaW9uU3RvcmUuc2l6ZSgpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJ1bnJlY29nbml6ZWQgdmVuZG9yIGV4dGVuc2lvbiBpbmRleCAoJXUpIG1heCgldSkiLAotICAgICAgICAgICAgICAgIGV4dC0+bkluZGV4LCBtVmVuZG9yRXh0ZW5zaW9uU3RvcmUuc2l6ZSgpKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBjb25zdCBWZW5kb3JFeHRlbnNpb24mIHZFeHQgPSBtVmVuZG9yRXh0ZW5zaW9uU3RvcmVbZXh0LT5uSW5kZXhdOwotICAgIERFQlVHX1BSSU5UX0xPVygiVmVuZG9yRXh0OiBzZXRDb25maWc6IGluZGV4PSV1ICglcykiLCBleHQtPm5JbmRleCwgdkV4dC5uYW1lKCkpOwotCi0gICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfRXJyb3JOb25lOwotICAgIGVyciA9IHZFeHQuaXNDb25maWdWYWxpZChleHQpOwotICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8vIG1hcmsgdGhpcyBhcyBzZXQsIHJlZ2FyZGxlc3Mgb2Ygc2V0X2NvbmZpZyBzdWNjZWVkaW5nL2ZhaWxpbmcuCi0gICAgLy8gQXBwIHdpbGwga25vdyBieSBpbmNvbnNpc3RlbnQgdmFsdWVzIGluIG91dHB1dC1mb3JtYXQKLSAgICB2RXh0LnNldCgpOwotCi0gICAgYm9vbCB2YWx1ZVNldCA9IGZhbHNlOwotICAgIHN3aXRjaCAoKE9NWF9VMzIpdkV4dC5leHRlbnNpb25JbmRleCgpKSB7Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9EZWNvZGVyUGljdHVyZU9yZGVyOgotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfUzMyIHBpY19vcmRlcl9lbmFibGUgPSAwOwotICAgICAgICAgICAgdmFsdWVTZXQgfD0gdkV4dC5yZWFkUGFyYW1JbnQzMihleHQsICJlbmFibGUiLCAmcGljX29yZGVyX2VuYWJsZSk7Ci0gICAgICAgICAgICBpZiAoIXZhbHVlU2V0KSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlZFTkRPUi1FWFQ6IHNldF9jb25maWc6IE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvRGVjb2RlclBpY3R1cmVPcmRlciA6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcGljX29yZGVyX2VuYWJsZSk7Ci0KLSAgICAgICAgICAgIFFPTVhfVklERU9fREVDT0RFUl9QSUNUVVJFX09SREVSIGRlY1BhcmFtOwotICAgICAgICAgICAgT01YX0lOSVRfU1RSVUNUKCZkZWNQYXJhbSwgUU9NWF9WSURFT19ERUNPREVSX1BJQ1RVUkVfT1JERVIpOwotICAgICAgICAgICAgZGVjUGFyYW0uZU91dHB1dFBpY3R1cmVPcmRlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBpY19vcmRlcl9lbmFibGUgPyBRT01YX1ZJREVPX0RFQ09ERV9PUkRFUiA6IFFPTVhfVklERU9fRElTUExBWV9PUkRFUjsKLSAgICAgICAgICAgIGRlY1BhcmFtLm5Qb3J0SW5kZXggPSBPTVhfRGlyT3V0cHV0OwotCi0gICAgICAgICAgICBlcnIgPSBzZXRfcGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICBOVUxMLCAoT01YX0lOREVYVFlQRSlPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0RlY29kZXJQaWN0dXJlT3JkZXIsICZkZWNQYXJhbSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigic2V0X2NvbmZpZzogT01YX1Fjb21JbmRleFBhcmFtVmlkZW9EZWNvZGVyUGljdHVyZU9yZGVyIGZhaWxlZCAhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL3NyYy9vbXhfdmRlY192NGwyLmNwcCBiL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmRlYy9zcmMvb214X3ZkZWNfdjRsMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1M2Q5ZmUuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL3NyYy9vbXhfdmRlY192NGwyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOTk0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMCAtIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiBNIEEgWCAgIHcgciBhIHAgcCBlIHIgcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuICBNIEEgWCAgIEMgbyByIGUKLQotICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE9wZW5NQVggY29yZSAmIGNvbXBvbmVudC4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgRmlsZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgIm9teF92ZGVjLmgiCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgotI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLQotI2lmICFkZWZpbmVkKF9BTkRST0lEXykgfHwgZGVmaW5lZChTWVNfSU9DVEwpCi0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNlbmRpZgotCi0jaWZkZWYgX0FORFJPSURfCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSN1bmRlZiBVU0VfRUdMX0lNQUdFX0dQVQotCi0jaWZkZWYgX1FVRVJZX0RJU1BfUkVTXwotI2luY2x1ZGUgImRpc3BsYXlfY29uZmlnLmgiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX1VTRV9HTElCXwotI2luY2x1ZGUgPGdsaWIuaD4KLSNkZWZpbmUgc3RybGNweSBnX3N0cmxjcHkKLSNlbmRpZgotCi0jaW5jbHVkZSA8cWRNZXRhRGF0YS5oPgotI2luY2x1ZGUgPGdyYWxsb2NfcHJpdi5oPgotCi0jaWZkZWYgQU5EUk9JRF9KRUxMWUJFQU5fTVIyCi0jaW5jbHVkZSAiUUNvbU9NWE1ldGFkYXRhLmgiCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9FR0xfSU1BR0VfR1BVCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xRQ09NLmg+Ci0jZGVmaW5lIEVHTF9CVUZGRVJfSEFORExFIDB4NEYwMAotI2RlZmluZSBFR0xfQlVGRkVSX09GRlNFVCAweDRGMDEKLSNlbmRpZgotCi0jZGVmaW5lIEJVRkZFUl9MT0dfTE9DICIvZGF0YS9taXNjL21lZGlhIgotCi0jaWZkZWYgT1VUUFVUX0VYVFJBREFUQV9MT0cKLUZJTEUgKm91dHB1dEV4dHJhZGF0YUZpbGU7Ci1jaGFyIG91dHB1dF9leHRyYWRhdGFfZmlsZW5hbWUgW10gPSAiL2RhdGEvbWlzYy9tZWRpYS9leHRyYWRhdGEiOwotI2VuZGlmCi0KLSNkZWZpbmUgREVGQVVMVF9GUFMgMzAKLSNkZWZpbmUgTUFYX1NVUFBPUlRFRF9GUFMgMjQwCi0jZGVmaW5lIERFRkFVTFRfV0lEVEhfQUxJR05NRU5UIDEyOAotI2RlZmluZSBERUZBVUxUX0hFSUdIVF9BTElHTk1FTlQgMzIKLQotI2RlZmluZSBQT0xMX1RJTUVPVVQgMHg3ZmZmZmZmZgotCi0jZGVmaW5lIE1FTV9ERVZJQ0UgIi9kZXYvaW9uIgotCi0jaWZkZWYgX0FORFJPSURfCi1leHRlcm4gIkMiIHsKLSNpbmNsdWRlPHV0aWxzL0xvZy5oPgotfQotI2VuZGlmLy9fQU5EUk9JRF8KLQotI2RlZmluZSBTWl80SyAweDEwMDAKLSNkZWZpbmUgU1pfMU0gMHgxMDAwMDAKLQotI2RlZmluZSBMb2cyKG51bWJlciwgcG93ZXIpICB7IE9NWF9VMzIgdGVtcCA9IG51bWJlcjsgcG93ZXIgPSAwOyB3aGlsZSggKDAgPT0gKHRlbXAgJiAweDEpKSAmJiAgcG93ZXIgPCAxNikgeyB0ZW1wID4+PTB4MTsgcG93ZXIrKzsgfSB9Ci0jZGVmaW5lIFExNlRvRnJhY3Rpb24ocSxudW0sZGVuKSB7IE9NWF9VMzIgcG93ZXI7IExvZzIocSxwb3dlcik7ICBudW0gPSBxID4+IHBvd2VyOyBkZW4gPSAweDEgPDwgKDE2IC0gcG93ZXIpOyB9Ci0jZGVmaW5lIEVYVFJBREFUQV9JRFgoX19udW1fcGxhbmVzKSAoKF9fbnVtX3BsYW5lcykgPyAoX19udW1fcGxhbmVzKSAtIDEgOiAwKQotI3VuZGVmIEFMSUdOCi0jZGVmaW5lIEFMSUdOKHgsIHRvX2FsaWduKSAoKCgodW5zaWduZWQpIHgpICsgKHRvX2FsaWduIC0gMSkpICYgfih0b19hbGlnbiAtIDEpKQotCi0jZGVmaW5lIERFRkFVTFRfRVhUUkFEQVRBIChPTVhfSU5URVJMQUNFX0VYVFJBREFUQSB8IE9NWF9GUkFNRVBBQ0tfRVhUUkFEQVRBIHwgT01YX09VVFBVVENST1BfRVhUUkFEQVRBIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT01YX0RJU1BMQVlfSU5GT19FWFRSQURBVEEgfCBPTVhfSERSX0NPTE9SX0lORk9fRVhUUkFEQVRBKQotI2RlZmluZSBERUZBVUxUX0NPTkNFQUxfQ09MT1IgIjMyNzg0IiAvLzB4ODAxMCwgYmxhY2sgYnkgZGVmYXVsdAotCi0jaWZuZGVmIElPTl9GTEFHX0NQX0JJVFNUUkVBTQotI2RlZmluZSBJT05fRkxBR19DUF9CSVRTVFJFQU0gMAotI2VuZGlmCi0KLSNpZm5kZWYgSU9OX0ZMQUdfQ1BfUElYRUwKLSNkZWZpbmUgSU9OX0ZMQUdfQ1BfUElYRUwgMAotI2VuZGlmCi0KLSNpZmRlZiBNQVNURVJfU0lERV9DUAotI2RlZmluZSBNRU1fSEVBUF9JRCBJT05fU0VDVVJFX0hFQVBfSUQKLSNkZWZpbmUgU0VDVVJFX0FMSUdOIFNaXzRLCi0jZGVmaW5lIFNFQ1VSRV9GTEFHU19JTlBVVF9CVUZGRVIgKElPTl9TRUNVUkUgfCBJT05fRkxBR19DUF9CSVRTVFJFQU0pCi0jZGVmaW5lIFNFQ1VSRV9GTEFHU19PVVRQVVRfQlVGRkVSIChJT05fU0VDVVJFIHwgSU9OX0ZMQUdfQ1BfUElYRUwpCi0jZWxzZSAvL1NMQVZFX1NJREVfQ1AKLSNkZWZpbmUgTUVNX0hFQVBfSUQgSU9OX0NQX01NX0hFQVBfSUQKLSNkZWZpbmUgU0VDVVJFX0FMSUdOIFNaXzFNCi0jZGVmaW5lIFNFQ1VSRV9GTEFHU19JTlBVVF9CVUZGRVIgSU9OX1NFQ1VSRQotI2RlZmluZSBTRUNVUkVfRkxBR1NfT1VUUFVUX0JVRkZFUiBJT05fU0VDVVJFCi0jZW5kaWYKLQotI2RlZmluZSBMVU1JTkFOQ0VfRElWX0ZBQ1RPUiAxMDAwMC4wCi0KLSNkZWZpbmUgTUlOKHgseSkgKCgoeCkgPCAoeSkpID8gKHgpIDogKHkpKQotI2RlZmluZSBNQVgoeCx5KSAoKCh4KSA+ICh5KSkgPyAoeCkgOiAoeSkpCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1zdGF0aWMgT01YX1UzMiBtYXhTbW9vdGhTdHJlYW1pbmdXaWR0aCA9IDE5MjA7Ci1zdGF0aWMgT01YX1UzMiBtYXhTbW9vdGhTdHJlYW1pbmdIZWlnaHQgPSAxMDg4OwotCi12b2lkKiBhc3luY19tZXNzYWdlX3RocmVhZCAodm9pZCAqaW5wdXQpCi17Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcjsKLSAgICBzdHJ1Y3QgdjRsMl9wbGFuZSBwbGFuZVtWSURFT19NQVhfUExBTkVTXTsKLSAgICBzdHJ1Y3QgcG9sbGZkIHBmZHNbMl07Ci0gICAgc3RydWN0IHY0bDJfYnVmZmVyIHY0bDJfYnVmOwotICAgIG1lbXNldCgodm9pZCAqKSZ2NGwyX2J1ZiwwLHNpemVvZih2NGwyX2J1ZikpOwotICAgIHN0cnVjdCB2NGwyX2V2ZW50IGRxZXZlbnQ7Ci0gICAgb214X3ZkZWMgKm9teCA9IHJlaW50ZXJwcmV0X2Nhc3Q8b214X3ZkZWMqPihpbnB1dCk7Ci0gICAgcGZkc1swXS5ldmVudHMgPSBQT0xMSU4gfCBQT0xMUkROT1JNIHwgUE9MTE9VVCB8IFBPTExXUk5PUk0gfCBQT0xMUkRCQU5EIHwgUE9MTFBSSTsKLSAgICBwZmRzWzFdLmV2ZW50cyA9IFBPTExJTiB8IFBPTExFUlI7Ci0gICAgcGZkc1swXS5mZCA9IG9teC0+ZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQ7Ci0gICAgcGZkc1sxXS5mZCA9IG9teC0+bV9wb2xsX2VmZDsKLSAgICBpbnQgZXJyb3JfY29kZSA9IDAscmM9MCxieXRlc19yZWFkID0gMCxieXRlc193cml0dGVuID0gMDsKLSAgICBERUJVR19QUklOVF9ISUdIKCJvbXhfdmRlYzogQXN5bmMgdGhyZWFkIHN0YXJ0Iik7Ci0gICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJWaWRlb0RlY0NhbGxCYWNrVGhyZWFkIiwgMCwgMCwgMCk7Ci0gICAgd2hpbGUgKCFvbXgtPmFzeW5jX3RocmVhZF9mb3JjZV9zdG9wKSB7Ci0gICAgICAgIHJjID0gcG9sbChwZmRzLCAyLCBQT0xMX1RJTUVPVVQpOwotICAgICAgICBpZiAoIXJjKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiUG9sbCB0aW1lZG91dCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAocmMgPCAwICYmIGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVycm9yIHdoaWxlIHBvbGxpbmc6ICVkLCBlcnJubyA9ICVkIiwgcmMsIGVycm5vKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgocGZkc1sxXS5yZXZlbnRzICYgUE9MTElOKSB8fCAocGZkc1sxXS5yZXZlbnRzICYgUE9MTEVSUikpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goImFzeW5jX21lc3NhZ2VfdGhyZWFkIGludGVycnVwdGVkIHRvIGJlIGV4aXRlZCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChwZmRzWzBdLnJldmVudHMgJiBQT0xMSU4pIHx8IChwZmRzWzBdLnJldmVudHMgJiBQT0xMUkROT1JNKSkgewotICAgICAgICAgICAgc3RydWN0IHZkZWNfbXNnaW5mbyB2ZGVjX21zZzsKLSAgICAgICAgICAgIG1lbXNldCgmdmRlY19tc2csIDAsIHNpemVvZih2ZGVjX21zZykpOwotICAgICAgICAgICAgdjRsMl9idWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgICAgICAgICB2NGwyX2J1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOwotICAgICAgICAgICAgdjRsMl9idWYubGVuZ3RoID0gb214LT5kcnZfY3R4Lm51bV9wbGFuZXM7Ci0gICAgICAgICAgICB2NGwyX2J1Zi5tLnBsYW5lcyA9IHBsYW5lOwotICAgICAgICAgICAgd2hpbGUgKCFpb2N0bChwZmRzWzBdLmZkLCBWSURJT0NfRFFCVUYsICZ2NGwyX2J1ZikpIHsKLSAgICAgICAgICAgICAgICB2ZGVjX21zZy5tc2djb2RlPVZERUNfTVNHX1JFU1BfT1VUUFVUX0JVRkZFUl9ET05FOwotICAgICAgICAgICAgICAgIHZkZWNfbXNnLnN0YXR1c19jb2RlPVZERUNfU19TVUNDRVNTOwotICAgICAgICAgICAgICAgIHZkZWNfbXNnLm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmNsaWVudF9kYXRhPSh2b2lkKikmdjRsMl9idWY7Ci0gICAgICAgICAgICAgICAgdmRlY19tc2cubXNnZGF0YS5vdXRwdXRfZnJhbWUubGVuPXBsYW5lWzBdLmJ5dGVzdXNlZDsKLSAgICAgICAgICAgICAgICB2ZGVjX21zZy5tc2dkYXRhLm91dHB1dF9mcmFtZS5idWZmZXJhZGRyPSh2b2lkKilwbGFuZVswXS5tLnVzZXJwdHI7Ci0gICAgICAgICAgICAgICAgdmRlY19tc2cubXNnZGF0YS5vdXRwdXRfZnJhbWUudGltZV9zdGFtcD0gKCh1aW50NjRfdCl2NGwyX2J1Zi50aW1lc3RhbXAudHZfc2VjICogKHVpbnQ2NF90KTEwMDAwMDApICsKLSAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KXY0bDJfYnVmLnRpbWVzdGFtcC50dl91c2VjOwotCi0gICAgICAgICAgICAgICAgaWYgKG9teC0+YXN5bmNfbWVzc2FnZV9wcm9jZXNzKGlucHV0LCZ2ZGVjX21zZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goImFzeW5jX21lc3NhZ2VfdGhyZWFkIEV4aXRlZCIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChwZmRzWzBdLnJldmVudHMgJiBQT0xMT1VUKSB8fCAocGZkc1swXS5yZXZlbnRzICYgUE9MTFdSTk9STSkpIHsKLSAgICAgICAgICAgIHN0cnVjdCB2ZGVjX21zZ2luZm8gdmRlY19tc2c7Ci0gICAgICAgICAgICB2NGwyX2J1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICAgICAgdjRsMl9idWYubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICAgICAgICAgIHY0bDJfYnVmLmxlbmd0aCA9IDE7Ci0gICAgICAgICAgICB2NGwyX2J1Zi5tLnBsYW5lcyA9IHBsYW5lOwotICAgICAgICAgICAgd2hpbGUgKCFpb2N0bChwZmRzWzBdLmZkLCBWSURJT0NfRFFCVUYsICZ2NGwyX2J1ZikpIHsKLSAgICAgICAgICAgICAgICB2ZGVjX21zZy5tc2djb2RlPVZERUNfTVNHX1JFU1BfSU5QVVRfQlVGRkVSX0RPTkU7Ci0gICAgICAgICAgICAgICAgdmRlY19tc2cuc3RhdHVzX2NvZGU9VkRFQ19TX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgdmRlY19tc2cubXNnZGF0YS5pbnB1dF9mcmFtZV9jbGllbnRkYXRhPSh2b2lkKikmdjRsMl9idWY7Ci0gICAgICAgICAgICAgICAgaWYgKG9teC0+YXN5bmNfbWVzc2FnZV9wcm9jZXNzKGlucHV0LCZ2ZGVjX21zZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goImFzeW5jX21lc3NhZ2VfdGhyZWFkIEV4aXRlZCIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBmZHNbMF0ucmV2ZW50cyAmIFBPTExQUkkpIHsKLSAgICAgICAgICAgIHJjID0gaW9jdGwocGZkc1swXS5mZCwgVklESU9DX0RRRVZFTlQsICZkcWV2ZW50KTsKLSAgICAgICAgICAgIGlmIChkcWV2ZW50LnR5cGUgPT0gVjRMMl9FVkVOVF9NU01fVklEQ19QT1JUX1NFVFRJTkdTX0NIQU5HRURfSU5TVUZGSUNJRU5UICkgewotICAgICAgICAgICAgICAgIHN0cnVjdCB2ZGVjX21zZ2luZm8gdmRlY19tc2c7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwdHIgPSAodW5zaWduZWQgaW50ICopKHZvaWQgKilkcWV2ZW50LnUuZGF0YTsKLQotICAgICAgICAgICAgICAgIHZkZWNfbXNnLm1zZ2NvZGU9VkRFQ19NU0dfRVZUX0NPTkZJR19DSEFOR0VEOwotICAgICAgICAgICAgICAgIHZkZWNfbXNnLnN0YXR1c19jb2RlPVZERUNfU19TVUNDRVNTOwotICAgICAgICAgICAgICAgIHZkZWNfbXNnLm1zZ2RhdGEub3V0cHV0X2ZyYW1lLnBpY3NpemUuZnJhbWVfaGVpZ2h0ID0gcHRyWzBdOwotICAgICAgICAgICAgICAgIHZkZWNfbXNnLm1zZ2RhdGEub3V0cHV0X2ZyYW1lLnBpY3NpemUuZnJhbWVfd2lkdGggPSBwdHJbMV07Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiVklEQyBQb3J0IFJlY29uZmlnIHJlY2VpdmVkIGluc3VmZmljaWVudCIpOwotICAgICAgICAgICAgICAgIG9teC0+ZHBiX2JpdF9kZXB0aCA9IHB0clsyXTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJWSURDIFBvcnQgUmVjb25maWcgQml0ZGVwdGggLSAlZCIsIHB0clszXSk7Ci0gICAgICAgICAgICAgICAgb214LT5tX3Byb2dyZXNzaXZlID0gcHRyWzNdOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlZJREMgUG9ydCBSZWNvbmZpZyBQaWNTdHJ1Y3QgLSAlZCIsIHB0cls0XSk7Ci0gICAgICAgICAgICAgICAgb214LT5tX2NvbG9yX3NwYWNlID0gKHB0cls0XSA9PSBNU01fVklEQ19CVDIwMjAgPyAob214X3ZkZWM6OkJUMjAyMCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbXhfdmRlYzo6IEVYQ0VQVF9CVDIwMjApKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJWSURDIFBvcnQgUmVjb25maWcgQ29sb3JTcGFjZSAtICVkIiwgb214LT5tX2NvbG9yX3NwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAob214LT5hc3luY19tZXNzYWdlX3Byb2Nlc3MoaW5wdXQsJnZkZWNfbXNnKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiYXN5bmNfbWVzc2FnZV90aHJlYWQgRXhpdGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZHFldmVudC50eXBlID09IFY0TDJfRVZFTlRfTVNNX1ZJRENfUE9SVF9TRVRUSU5HU19DSEFOR0VEX1NVRkZJQ0lFTlQpIHsKLQotICAgICAgICAgICAgICAgIGJvb2wgZXZlbnRfZmllbGRzX2NoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBib29sIHNlbmRfbXNnID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgb214X3ZkZWM6OmNvbG9yX3NwYWNlX3R5cGUgdG1wX2NvbG9yX3NwYWNlOwotICAgICAgICAgICAgICAgIHN0cnVjdCB2ZGVjX21zZ2luZm8gdmRlY19tc2c7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiVklEQyBQb3J0IFJlY29uZmlnIHJlY2VpdmVkIHN1ZmZpY2llbnQiKTsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnB0ciA9ICh1bnNpZ25lZCBpbnQgKikodm9pZCAqKWRxZXZlbnQudS5kYXRhOwotICAgICAgICAgICAgICAgIGV2ZW50X2ZpZWxkc19jaGFuZ2VkIHw9IChvbXgtPmRwYl9iaXRfZGVwdGggIT0gKGludClwdHJbMl0pOwotICAgICAgICAgICAgICAgIGV2ZW50X2ZpZWxkc19jaGFuZ2VkIHw9IChvbXgtPm1fcHJvZ3Jlc3NpdmUgIT0gKGludClwdHJbM10pOwotICAgICAgICAgICAgICAgIHRtcF9jb2xvcl9zcGFjZSA9IChwdHJbNF0gPT0gTVNNX1ZJRENfQlQyMDIwID8gKG9teF92ZGVjOjpCVDIwMjApOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob214X3ZkZWM6OiBFWENFUFRfQlQyMDIwKSk7Ci0gICAgICAgICAgICAgICAgZXZlbnRfZmllbGRzX2NoYW5nZWQgfD0gKG9teC0+bV9jb2xvcl9zcGFjZSAhPSB0bXBfY29sb3Jfc3BhY2UpOwotICAgICAgICAgICAgICAgIGV2ZW50X2ZpZWxkc19jaGFuZ2VkIHw9IChvbXgtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQgIT0gcHRyWzBdKTsKLSAgICAgICAgICAgICAgICBldmVudF9maWVsZHNfY2hhbmdlZCB8PSAob214LT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGggIT0gcHRyWzFdKTsKLQotICAgICAgICAgICAgICAgIGlmIChldmVudF9maWVsZHNfY2hhbmdlZCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJWSURDIFBvcnQgUmVjb25maWcgT2xkIFJlc29sdXRpb24oSCxXKSA9ICglZCwlZCkgTmV3IFJlc29sdXRpb24oSCxXKSA9ICglZCwlZCkpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXgtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb214LT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyWzBdLCBwdHJbMV0pOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJWSURDIFBvcnQgUmVjb25maWcgT2xkIGJpdGRlcHRoID0gJWQgTmV3IGJpdGRlcHRoID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teC0+ZHBiX2JpdF9kZXB0aCwgcHRyWzJdKTsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiVklEQyBQb3J0IFJlY29uZmlnIE9sZCBwaWNzdHJ1Y3QgPSAlZCBOZXcgcGljc3RydWN0ID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teC0+bV9wcm9ncmVzc2l2ZSwgcHRyWzNdKTsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiVklEQyBQb3J0IFJlY29uZmlnIE9sZCBjb2xvclNwYWNlID0gJXMgTmV3IGNvbG9yc3BhY2UgPSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9teC0+bV9jb2xvcl9zcGFjZSA9PSBvbXhfdmRlYzo6QlQyMDIwID8gIkJUMjAyMCI6ICJFWENFUFRfQlQyMDIwIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRtcF9jb2xvcl9zcGFjZSA9PSBvbXhfdmRlYzo6QlQyMDIwID8gIkJUMjAyMCI6ICJFWENFUFRfQlQyMDIwIikpOwotICAgICAgICAgICAgICAgICAgICBvbXgtPmRwYl9iaXRfZGVwdGggPSBwdHJbMl07Ci0gICAgICAgICAgICAgICAgICAgIG9teC0+bV9wcm9ncmVzc2l2ZSA9IHB0clszXTsKLSAgICAgICAgICAgICAgICAgICAgb214LT5tX2NvbG9yX3NwYWNlID0gKHB0cls0XSA9PSBNU01fVklEQ19CVDIwMjAgPyAob214X3ZkZWM6OkJUMjAyMCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob214X3ZkZWM6OiBFWENFUFRfQlQyMDIwKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRfbXNnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgdmRlY19tc2cubXNnY29kZT1WREVDX01TR19FVlRfQ09ORklHX0NIQU5HRUQ7Ci0gICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLnN0YXR1c19jb2RlPVZERUNfU19TVUNDRVNTOwotICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy5tc2dkYXRhLm91dHB1dF9mcmFtZS5waWNzaXplLmZyYW1lX2hlaWdodCA9IHB0clswXTsKLSAgICAgICAgICAgICAgICAgICAgdmRlY19tc2cubXNnZGF0YS5vdXRwdXRfZnJhbWUucGljc2l6ZS5mcmFtZV93aWR0aCA9IHB0clsxXTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2RlY29kZXJfY21kIGRlYzsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZkZWMsIDAsIHNpemVvZihkZWMpKTsKLSAgICAgICAgICAgICAgICAgICAgZGVjLmNtZCA9IFY0TDJfUUNPTV9DTURfU0VTU0lPTl9DT05USU5VRTsKLSAgICAgICAgICAgICAgICAgICAgcmMgPSBpb2N0bChwZmRzWzBdLmZkLCBWSURJT0NfREVDT0RFUl9DTUQsICZkZWMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU2Vzc2lvbiBjb250aW51ZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbXNnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLm1zZ2NvZGU9VkRFQ19NU0dfRVZUX0hXX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgdmRlY19tc2cuc3RhdHVzX2NvZGU9VkRFQ19TX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJTZW50IFNlc3Npb24gY29udGludWUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChzZW5kX21zZykgewotICAgICAgICAgICAgICAgICAgICBpZiAob214LT5hc3luY19tZXNzYWdlX3Byb2Nlc3MoaW5wdXQsJnZkZWNfbXNnKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goImFzeW5jX21lc3NhZ2VfdGhyZWFkIEV4aXRlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZHFldmVudC50eXBlID09IFY0TDJfRVZFTlRfTVNNX1ZJRENfRkxVU0hfRE9ORSkgewotICAgICAgICAgICAgICAgIHN0cnVjdCB2ZGVjX21zZ2luZm8gdmRlY19tc2c7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgZmx1c2hfdHlwZSA9ICoodWludDMyX3QgKilkcWV2ZW50LnUuZGF0YTsKLSAgICAgICAgICAgICAgICAvLyBPbGQgZHJpdmVyIGRvZXNuJ3Qgc2VuZCBmbHVzaFR5cGUgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgLy8gVG8gbWFrZSB0aGlzIGJhY2t3YXJkIGNvbXBhdGlibGUgZmFsbGJhY2sgdG8gb2xkIGFwcHJvYWNoCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZsdXNoX3R5cGUgaXMgbm90IHByZXNlbnQuCi0gICAgICAgICAgICAgICAgdmRlY19tc2cuc3RhdHVzX2NvZGU9VkRFQ19TX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgaWYgKCFmbHVzaF90eXBlIHx8IChmbHVzaF90eXBlICYgVjRMMl9RQ09NX0NNRF9GTFVTSF9PVVRQVVQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLm1zZ2NvZGU9VkRFQ19NU0dfUkVTUF9GTFVTSF9JTlBVVF9ET05FOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJWSURDIElucHV0IEZsdXNoIERvbmUgUmVjaWV2ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9teC0+YXN5bmNfbWVzc2FnZV9wcm9jZXNzKGlucHV0LCZ2ZGVjX21zZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJhc3luY19tZXNzYWdlX3RocmVhZCBFeGl0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFmbHVzaF90eXBlIHx8IChmbHVzaF90eXBlICYgVjRMMl9RQ09NX0NNRF9GTFVTSF9DQVBUVVJFKSkgewotICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy5tc2djb2RlPVZERUNfTVNHX1JFU1BfRkxVU0hfT1VUUFVUX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlZJREMgT3V0cHV0IEZsdXNoIERvbmUgUmVjaWV2ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9teC0+YXN5bmNfbWVzc2FnZV9wcm9jZXNzKGlucHV0LCZ2ZGVjX21zZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJhc3luY19tZXNzYWdlX3RocmVhZCBFeGl0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChkcWV2ZW50LnR5cGUgPT0gVjRMMl9FVkVOVF9NU01fVklEQ19IV19PVkVSTE9BRCkgewotICAgICAgICAgICAgICAgIHN0cnVjdCB2ZGVjX21zZ2luZm8gdmRlY19tc2c7Ci0gICAgICAgICAgICAgICAgdmRlY19tc2cubXNnY29kZT1WREVDX01TR19FVlRfSFdfT1ZFUkxPQUQ7Ci0gICAgICAgICAgICAgICAgdmRlY19tc2cuc3RhdHVzX2NvZGU9VkRFQ19TX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkhXIE92ZXJsb2FkIHJlY2VpdmVkIik7Ci0gICAgICAgICAgICAgICAgaWYgKG9teC0+YXN5bmNfbWVzc2FnZV9wcm9jZXNzKGlucHV0LCZ2ZGVjX21zZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goImFzeW5jX21lc3NhZ2VfdGhyZWFkIEV4aXRlZCIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRxZXZlbnQudHlwZSA9PSBWNEwyX0VWRU5UX01TTV9WSURDX0hXX1VOU1VQUE9SVEVEKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHZkZWNfbXNnaW5mbyB2ZGVjX21zZzsKLSAgICAgICAgICAgICAgICB2ZGVjX21zZy5tc2djb2RlPVZERUNfTVNHX0VWVF9IV19VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICB2ZGVjX21zZy5zdGF0dXNfY29kZT1WREVDX1NfU1VDQ0VTUzsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSFcgVW5zdXBwb3J0ZWQgcmVjZWl2ZWQiKTsKLSAgICAgICAgICAgICAgICBpZiAob214LT5hc3luY19tZXNzYWdlX3Byb2Nlc3MoaW5wdXQsJnZkZWNfbXNnKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiYXN5bmNfbWVzc2FnZV90aHJlYWQgRXhpdGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZHFldmVudC50eXBlID09IFY0TDJfRVZFTlRfTVNNX1ZJRENfU1lTX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHZkZWNfbXNnaW5mbyB2ZGVjX21zZzsKLSAgICAgICAgICAgICAgICB2ZGVjX21zZy5tc2djb2RlID0gVkRFQ19NU0dfRVZUX0hXX0VSUk9SOwotICAgICAgICAgICAgICAgIHZkZWNfbXNnLnN0YXR1c19jb2RlID0gVkRFQ19TX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiU1lTIEVycm9yIFJlY2lldmVkIik7Ci0gICAgICAgICAgICAgICAgaWYgKG9teC0+YXN5bmNfbWVzc2FnZV9wcm9jZXNzKGlucHV0LCZ2ZGVjX21zZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goImFzeW5jX21lc3NhZ2VfdGhyZWFkIEV4aXRlZCIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRxZXZlbnQudHlwZSA9PSBWNEwyX0VWRU5UX01TTV9WSURDX1JFTEVBU0VfQlVGRkVSX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcHRyID0gKHVuc2lnbmVkIGludCAqKSh2b2lkICopZHFldmVudC51LmRhdGE7Ci0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlJFRkVSRU5DRSBSRUxFQVNFIEVWRU5UIFJFQ1ZEIGZkID0gJWQgb2Zmc2V0ID0gJWQiLCBwdHJbMF0sIHB0clsxXSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRxZXZlbnQudHlwZSA9PSBWNEwyX0VWRU5UX01TTV9WSURDX1JFTEVBU0VfVU5RVUVVRURfQlVGRkVSKSB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwdHIgPSAodW5zaWduZWQgaW50ICopKHZvaWQgKilkcWV2ZW50LnUuZGF0YTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdmRlY19tc2dpbmZvIHZkZWNfbXNnOwotCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJSZWxlYXNlIHVucXVldWVkIGJ1ZmZlciBldmVudCByZWN2ZCBmZCA9ICVkIG9mZnNldCA9ICVkIiwgcHRyWzBdLCBwdHJbMV0pOwotCi0gICAgICAgICAgICAgICAgdjRsMl9idWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgICAgICAgICAgICAgdjRsMl9idWYubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICAgICAgICAgICAgICB2NGwyX2J1Zi5sZW5ndGggPSBvbXgtPmRydl9jdHgubnVtX3BsYW5lczsKLSAgICAgICAgICAgICAgICB2NGwyX2J1Zi5tLnBsYW5lcyA9IHBsYW5lOwotICAgICAgICAgICAgICAgIHY0bDJfYnVmLmluZGV4ID0gcHRyWzVdOwotICAgICAgICAgICAgICAgIHY0bDJfYnVmLmZsYWdzID0gMDsKLQotICAgICAgICAgICAgICAgIHZkZWNfbXNnLm1zZ2NvZGUgPSBWREVDX01TR19SRVNQX09VVFBVVF9CVUZGRVJfRE9ORTsKLSAgICAgICAgICAgICAgICB2ZGVjX21zZy5zdGF0dXNfY29kZSA9IFZERUNfU19TVUNDRVNTOwotICAgICAgICAgICAgICAgIHZkZWNfbXNnLm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmNsaWVudF9kYXRhID0gKHZvaWQqKSZ2NGwyX2J1ZjsKLSAgICAgICAgICAgICAgICB2ZGVjX21zZy5tc2dkYXRhLm91dHB1dF9mcmFtZS5sZW4gPSAwOwotICAgICAgICAgICAgICAgIHZkZWNfbXNnLm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmJ1ZmZlcmFkZHIgPSAodm9pZCopKGludHB0cl90KXB0clsyXTsKLSAgICAgICAgICAgICAgICB2ZGVjX21zZy5tc2dkYXRhLm91dHB1dF9mcmFtZS50aW1lX3N0YW1wID0gKCh1aW50NjRfdClwdHJbM10gKiAodWludDY0X3QpMTAwMDAwMCkgKwotICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpcHRyWzRdOwotICAgICAgICAgICAgICAgIGlmIChvbXgtPmFzeW5jX21lc3NhZ2VfcHJvY2VzcyhpbnB1dCwmdmRlY19tc2cpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJhc3luY19tZXNzYWdlX3RocmVhZCBFeGl0ZWRuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiVklEQyBTb21lIEV2ZW50IHJlY2lldmVkIik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgREVCVUdfUFJJTlRfSElHSCgib214X3ZkZWM6IEFzeW5jIHRocmVhZCBzdG9wIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQqIG1lc3NhZ2VfdGhyZWFkX2RlYyh2b2lkICppbnB1dCkKLXsKLSAgICBvbXhfdmRlYyogb214ID0gcmVpbnRlcnByZXRfY2FzdDxvbXhfdmRlYyo+KGlucHV0KTsKLSAgICBpbnQgcmVzID0gMDsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goIm9teF92ZGVjOiBtZXNzYWdlIHRocmVhZCBzdGFydCIpOwotICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiVmlkZW9EZWNNc2dUaHJlYWQiLCAwLCAwLCAwKTsKLSAgICB3aGlsZSAoIW9teC0+bWVzc2FnZV90aHJlYWRfc3RvcCkgewotICAgICAgICByZXMgPSBvbXgtPnNpZ25hbC53YWl0KDIgKiAxMDAwMDAwMDAwKTsKLSAgICAgICAgaWYgKHJlcyA9PSBFVElNRURPVVQgfHwgb214LT5tZXNzYWdlX3RocmVhZF9zdG9wKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXMpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJvbXhfdmRlYzogbWVzc2FnZV90aHJlYWRfZGVjIHdhaXQgb24gY29uZGl0aW9uIGZhaWxlZCwgZXhpdGluZyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgb214LT5wcm9jZXNzX2V2ZW50X2NiKG9teCk7Ci0gICAgfQotICAgIERFQlVHX1BSSU5UX0hJR0goIm9teF92ZGVjOiBtZXNzYWdlIHRocmVhZCBzdG9wIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcG9zdF9tZXNzYWdlKG9teF92ZGVjICpvbXgsIHVuc2lnbmVkIGNoYXIgaWQpCi17Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJvbXhfdmRlYzogcG9zdF9tZXNzYWdlICVkIiwgaWQpOwotICAgIG9teC0+c2lnbmFsLnNpZ25hbCgpOwotfQotCi0vLyBvbXhfY21kX3F1ZXVlIGRlc3RydWN0b3IKLW9teF92ZGVjOjpvbXhfY21kX3F1ZXVlOjp+b214X2NtZF9xdWV1ZSgpCi17Ci0gICAgLy8gTm90aGluZyB0byBkbwotfQotCi0vLyBvbXggY21kIHF1ZXVlIGNvbnN0cnVjdG9yCi1vbXhfdmRlYzo6b214X2NtZF9xdWV1ZTo6b214X2NtZF9xdWV1ZSgpOiBtX3JlYWQoMCksbV93cml0ZSgwKSxtX3NpemUoMCkKLXsKLSAgICBtZW1zZXQobV9xLDAsc2l6ZW9mKG9teF9ldmVudCkqT01YX0NPUkVfQ09OVFJPTF9DTURRX1NJWkUpOwotfQotCi0vLyBvbXggY21kIHF1ZXVlIGluc2VydAotYm9vbCBvbXhfdmRlYzo6b214X2NtZF9xdWV1ZTo6aW5zZXJ0X2VudHJ5KHVuc2lnbmVkIGxvbmcgcDEsIHVuc2lnbmVkIGxvbmcgcDIsIHVuc2lnbmVkIGxvbmcgaWQpCi17Ci0gICAgYm9vbCByZXQgPSB0cnVlOwotICAgIGlmIChtX3NpemUgPCBPTVhfQ09SRV9DT05UUk9MX0NNRFFfU0laRSkgewotICAgICAgICBtX3FbbV93cml0ZV0uaWQgICAgICAgPSBpZDsKLSAgICAgICAgbV9xW21fd3JpdGVdLnBhcmFtMSAgID0gcDE7Ci0gICAgICAgIG1fcVttX3dyaXRlXS5wYXJhbTIgICA9IHAyOwotICAgICAgICBtX3dyaXRlKys7Ci0gICAgICAgIG1fc2l6ZSArKzsKLSAgICAgICAgaWYgKG1fd3JpdGUgPj0gT01YX0NPUkVfQ09OVFJPTF9DTURRX1NJWkUpIHsKLSAgICAgICAgICAgIG1fd3JpdGUgPSAwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogJXMoKTo6Q29tbWFuZCBRdWV1ZSBGdWxsIiwgX19mdW5jX18pOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vLyBvbXggY21kIHF1ZXVlIHBvcAotYm9vbCBvbXhfdmRlYzo6b214X2NtZF9xdWV1ZTo6cG9wX2VudHJ5KHVuc2lnbmVkIGxvbmcgKnAxLCB1bnNpZ25lZCBsb25nICpwMiwgdW5zaWduZWQgbG9uZyAqaWQpCi17Ci0gICAgYm9vbCByZXQgPSB0cnVlOwotICAgIGlmIChtX3NpemUgPiAwKSB7Ci0gICAgICAgICppZCA9IG1fcVttX3JlYWRdLmlkOwotICAgICAgICAqcDEgPSBtX3FbbV9yZWFkXS5wYXJhbTE7Ci0gICAgICAgICpwMiA9IG1fcVttX3JlYWRdLnBhcmFtMjsKLSAgICAgICAgLy8gTW92ZSB0aGUgcmVhZCBwb2ludGVyIGFoZWFkCi0gICAgICAgICsrbV9yZWFkOwotICAgICAgICAtLW1fc2l6ZTsKLSAgICAgICAgaWYgKG1fcmVhZCA+PSBPTVhfQ09SRV9DT05UUk9MX0NNRFFfU0laRSkgewotICAgICAgICAgICAgbV9yZWFkID0gMDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vLyBSZXRyaWV2ZSB0aGUgZmlyc3QgbWVzZyB0eXBlIGluIHRoZSBxdWV1ZQotdW5zaWduZWQgb214X3ZkZWM6Om9teF9jbWRfcXVldWU6OmdldF9xX21zZ190eXBlKCkKLXsKLSAgICByZXR1cm4gbV9xW21fcmVhZF0uaWQ7Ci19Ci0KLSNpZmRlZiBfQU5EUk9JRF8KLW9teF92ZGVjOjp0c19hcnJfbGlzdDo6dHNfYXJyX2xpc3QoKQotewotICAgIC8vaW5pdGlhbGl6ZSB0aW1lc3RhbXBzIGFycmF5Ci0gICAgbWVtc2V0KG1fdHNfYXJyX2xpc3QsIDAsICggc2l6ZW9mKHRzX2VudHJ5KSAqIE1BWF9OVU1fSU5QVVRfT1VUUFVUX0JVRkZFUlMpICk7Ci19Ci1vbXhfdmRlYzo6dHNfYXJyX2xpc3Q6On50c19hcnJfbGlzdCgpCi17Ci0gICAgLy9mcmVlIG1fdHNfYXJyX2xpc3Q/Ci19Ci0KLWJvb2wgb214X3ZkZWM6OnRzX2Fycl9saXN0OjppbnNlcnRfdHMoT01YX1RJQ0tTIHRzKQotewotICAgIGJvb2wgcmV0ID0gdHJ1ZTsKLSAgICBib29sIGR1cGxpY2F0ZV90cyA9IGZhbHNlOwotICAgIGludCBpZHggPSAwOwotCi0gICAgLy9pbnNlcnQgYXQgdGhlIGZpcnN0IGF2YWlsYWJsZSBlbXB0eSBsb2NhdGlvbgotICAgIGZvciAoIDsgaWR4IDwgTUFYX05VTV9JTlBVVF9PVVRQVVRfQlVGRkVSUzsgaWR4KyspIHsKLSAgICAgICAgaWYgKCFtX3RzX2Fycl9saXN0W2lkeF0udmFsaWQpIHsKLSAgICAgICAgICAgIC8vZm91bmQgaW52YWxpZCBvciBlbXB0eSBlbnRyeSwgc2F2ZSB0aW1lc3RhbXAKLSAgICAgICAgICAgIG1fdHNfYXJyX2xpc3RbaWR4XS52YWxpZCA9IHRydWU7Ci0gICAgICAgICAgICBtX3RzX2Fycl9saXN0W2lkeF0udGltZXN0YW1wID0gdHM7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkluc2VydF90cygpOiBJbnNlcnRpbmcgVElNRVNUQU1QICglbGxkKSBhdCBpZHggKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHRzLCBpZHgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaWR4ID09IE1BWF9OVU1fSU5QVVRfT1VUUFVUX0JVRkZFUlMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJUaW1lc3RhbXAgYXJyYXkgbGlzdCBpcyBGVUxMLiBVbnN1Y2Nlc3NmdWwgaW5zZXJ0Iik7Ci0gICAgICAgIHJldCA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1ib29sIG9teF92ZGVjOjp0c19hcnJfbGlzdDo6cG9wX21pbl90cyhPTVhfVElDS1MgJnRzKQotewotICAgIGJvb2wgcmV0ID0gdHJ1ZTsKLSAgICBpbnQgbWluX2lkeCA9IC0xOwotICAgIE9NWF9USUNLUyBtaW5fdHMgPSAwOwotICAgIGludCBpZHggPSAwOwotCi0gICAgZm9yICggOyBpZHggPCBNQVhfTlVNX0lOUFVUX09VVFBVVF9CVUZGRVJTOyBpZHgrKykgewotCi0gICAgICAgIGlmIChtX3RzX2Fycl9saXN0W2lkeF0udmFsaWQpIHsKLSAgICAgICAgICAgIC8vZm91bmQgdmFsaWQgZW50cnksIHNhdmUgaW5kZXgKLSAgICAgICAgICAgIGlmIChtaW5faWR4IDwgMCkgewotICAgICAgICAgICAgICAgIC8vZmlyc3QgdmFsaWQgZW50cnkKLSAgICAgICAgICAgICAgICBtaW5fdHMgPSBtX3RzX2Fycl9saXN0W2lkeF0udGltZXN0YW1wOwotICAgICAgICAgICAgICAgIG1pbl9pZHggPSBpZHg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fdHNfYXJyX2xpc3RbaWR4XS50aW1lc3RhbXAgPCBtaW5fdHMpIHsKLSAgICAgICAgICAgICAgICBtaW5fdHMgPSBtX3RzX2Fycl9saXN0W2lkeF0udGltZXN0YW1wOwotICAgICAgICAgICAgICAgIG1pbl9pZHggPSBpZHg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIGlmIChtaW5faWR4IDwgMCkgewotICAgICAgICAvL25vIHZhbGlkIGVudHJpZXMgZm91bmQKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJUaW1lc3RhbXAgYXJyYXkgbGlzdCBpcyBlbXB0eS4gVW5zdWNjZXNzZnVsIHBvcCIpOwotICAgICAgICB0cyA9IDA7Ci0gICAgICAgIHJldCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRzID0gbV90c19hcnJfbGlzdFttaW5faWR4XS50aW1lc3RhbXA7Ci0gICAgICAgIG1fdHNfYXJyX2xpc3RbbWluX2lkeF0udmFsaWQgPSBmYWxzZTsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJQb3BfbWluX3RzOlRpbWVzdGFtcCAoJWxsZCksIGluZGV4KCVkKSIsCi0gICAgICAgICAgICAgICAgdHMsIG1pbl9pZHgpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0KLX0KLQotCi1ib29sIG9teF92ZGVjOjp0c19hcnJfbGlzdDo6cmVzZXRfdHNfbGlzdCgpCi17Ci0gICAgYm9vbCByZXQgPSB0cnVlOwotICAgIGludCBpZHggPSAwOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJyZXNldF90c19saXN0KCk6IFJlc2V0dGluZyB0aW1lc3RhbXAgYXJyYXkgbGlzdCIpOwotICAgIGZvciAoIDsgaWR4IDwgTUFYX05VTV9JTlBVVF9PVVRQVVRfQlVGRkVSUzsgaWR4KyspIHsKLSAgICAgICAgbV90c19hcnJfbGlzdFtpZHhdLnZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotLy8gZmFjdG9yeSBmdW5jdGlvbiBleGVjdXRlZCBieSB0aGUgY29yZSB0byBjcmVhdGUgaW5zdGFuY2VzCi12b2lkICpnZXRfb214X2NvbXBvbmVudF9mYWN0b3J5X2ZuKHZvaWQpCi17Ci0gICAgcmV0dXJuIChuZXcgb214X3ZkZWMpOwotfQotCi1ib29sIGlzX3BsYXRmb3JtX3RwMTBjYXB0dXJlX3N1cHBvcnRlZCgpCi17Ci0gICAgREVCVUdfUFJJTlRfSElHSCgiVFAxMCBvbiBjYXB0dXJlIHBvcnQgaXMgc3VwcG9ydGVkIik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6b214X3ZkZWMKLQotICAgREVTQ1JJUFRJT04KLSAgIENvbnN0cnVjdG9yCi0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUKLQotICAgUkVUVVJOIFZBTFVFCi0gICBOb25lLgotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLW9teF92ZGVjOjpvbXhfdmRlYygpOiBtX2Vycm9yX3Byb3BvZ2F0ZWQoZmFsc2UpLAotICAgIG1fc3RhdGUoT01YX1N0YXRlSW52YWxpZCksCi0gICAgbV9hcHBfZGF0YShOVUxMKSwKLSAgICBtX2lucF9tZW1fcHRyKE5VTEwpLAotICAgIG1fb3V0X21lbV9wdHIoTlVMTCksCi0gICAgbV9jbGllbnRfb3V0cHV0X2V4dHJhZGF0YV9tZW1fcHRyKE5VTEwpLAotICAgIGlucHV0X2ZsdXNoX3Byb2dyZXNzIChmYWxzZSksCi0gICAgb3V0cHV0X2ZsdXNoX3Byb2dyZXNzIChmYWxzZSksCi0gICAgaW5wdXRfdXNlX2J1ZmZlciAoZmFsc2UpLAotICAgIG91dHB1dF91c2VfYnVmZmVyIChmYWxzZSksCi0gICAgb3VwdXRfZWdsX2J1ZmZlcnMoZmFsc2UpLAotICAgIG1fdXNlX291dHB1dF9wbWVtKE9NWF9GQUxTRSksCi0gICAgbV9vdXRfbWVtX3JlZ2lvbl9zbWkoT01YX0ZBTFNFKSwKLSAgICBtX291dF9wdnRfZW50cnlfcG1lbShPTVhfRkFMU0UpLAotICAgIHBlbmRpbmdfaW5wdXRfYnVmZmVycygwKSwKLSAgICBwZW5kaW5nX291dHB1dF9idWZmZXJzKDApLAotICAgIG1fb3V0X2JtX2NvdW50KDApLAotICAgIG1faW5wX2JtX2NvdW50KDApLAotICAgIG1fb3V0X2V4dHJhZGF0YV9ibV9jb3VudCgwKSwKLSAgICBtX2lucF9iUG9wdWxhdGVkKE9NWF9GQUxTRSksCi0gICAgbV9vdXRfYlBvcHVsYXRlZChPTVhfRkFMU0UpLAotICAgIG1fZmxhZ3MoMCksCi0gICAgbV9pbnBfYkVuYWJsZWQoT01YX1RSVUUpLAotICAgIG1fb3V0X2JFbmFibGVkKE9NWF9UUlVFKSwKLSAgICBtX2luX2FsbG9jX2NudCgwKSwKLSAgICBtX3BsYXRmb3JtX2xpc3QoTlVMTCksCi0gICAgbV9wbGF0Zm9ybV9lbnRyeShOVUxMKSwKLSAgICBtX3BtZW1faW5mbyhOVUxMKSwKLSAgICBhcmJpdHJhcnlfYnl0ZXMgKHRydWUpLAotICAgIHBzb3VyY2VfZnJhbWUgKE5VTEwpLAotICAgIHBkZXN0X2ZyYW1lIChOVUxMKSwKLSAgICBtX2lucF9oZWFwX3B0ciAoTlVMTCksCi0gICAgbV9waGRyX3BtZW1fcHRyKE5VTEwpLAotICAgIG1faGVhcF9pbnBfYm1fY291bnQgKDApLAotICAgIGZpcnN0X2ZyYW1lX21ldGEgKHRydWUpLAotICAgIGZyYW1lX2NvdW50ICgwKSwKLSAgICBuYWxfY291bnQgKDApLAotICAgIG5hbF9sZW5ndGgoMCksCi0gICAgbG9va19haGVhZF9uYWwgKGZhbHNlKSwKLSAgICBmaXJzdF9mcmFtZSgwKSwKLSAgICBmaXJzdF9idWZmZXIoTlVMTCksCi0gICAgZmlyc3RfZnJhbWVfc2l6ZSAoMCksCi0gICAgbV9kZXZpY2VfZmlsZV9wdHIoTlVMTCksCi0gICAgaDI2NF9sYXN0X2F1X3RzKExMT05HX01BWCksCi0gICAgaDI2NF9sYXN0X2F1X2ZsYWdzKDApLAotICAgIG1fZGlzcF9ob3Jfc2l6ZSgwKSwKLSAgICBtX2Rpc3BfdmVydF9zaXplKDApLAotICAgIHByZXZfdHMoTExPTkdfTUFYKSwKLSAgICBwcmV2X3RzX2FjdHVhbChMTE9OR19NQVgpLAotICAgIHJzdF9wcmV2X3RzKHRydWUpLAotICAgIGZybV9pbnQoMCksCi0gICAgbV9mcHNfcmVjZWl2ZWQoMCksCi0gICAgbV9mcHNfcHJldigwKSwKLSAgICBtX2RyY19lbmFibGUoMCksCi0gICAgaW5fcmVjb25maWcoZmFsc2UpLAotICAgIG1fZGlzcGxheV9pZChOVUxMKSwKLSAgICBjbGllbnRfZXh0cmFkYXRhKDApLAotI2lmZGVmIF9BTkRST0lEXwotICAgIG1fZW5hYmxlX2FuZHJvaWRfbmF0aXZlX2J1ZmZlcnMoT01YX0ZBTFNFKSwKLSAgICBtX3VzZV9hbmRyb2lkX25hdGl2ZV9idWZmZXJzKE9NWF9GQUxTRSksCi0jZW5kaWYKLSAgICBtX2Rlc2NfYnVmZmVyX3B0cihOVUxMKSwKLSAgICBzZWN1cmVfbW9kZShmYWxzZSksCi0gICAgYWxsb2NhdGVfbmF0aXZlX2hhbmRsZShmYWxzZSksCi0gICAgbV9vdGhlcl9leHRyYWRhdGEoTlVMTCksCi0gICAgbV9wcm9maWxlKDApLAotICAgIGNsaWVudF9zZXRfZnBzKGZhbHNlKSwKLSAgICBzdGVyZW9fb3V0cHV0X21vZGUoSEFMX05PXzNEKSwKLSAgICBtX2xhc3RfcmVuZGVyZWRfVFMoLTEpLAotICAgIG1fcXVldWVkX2NvZGVjX2NvbmZpZ19jb3VudCgwKSwKLSAgICBzZWN1cmVfc2NhbGluZ190b19ub25fc2VjdXJlX29wYihmYWxzZSksCi0gICAgbV9mb3JjZV9jb21wcmVzc2VkX2Zvcl9kcGIodHJ1ZSksCi0gICAgbV9pc19kaXNwbGF5X3Nlc3Npb24oZmFsc2UpCi17Ci0gICAgbV9wb2xsX2VmZCA9IC0xOwotICAgIGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkID0gLTE7Ci0gICAgZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5pb24uZmRfaW9uX2RhdGEuZmQgPSAtMTsKLSAgICAvKiBBc3N1bXB0aW9uIGlzIHRoYXQgLCB0byBiZWdpbiB3aXRoICwgd2UgaGF2ZSBhbGwgdGhlIGZyYW1lcyB3aXRoIGRlY29kZXIgKi8KLSAgICBERUJVR19QUklOVF9ISUdIKCJJbiAldSBiaXQgT01YIHZkZWMgQ29uc3RydWN0b3IiLCAodW5zaWduZWQgaW50KXNpemVvZihsb25nKSAqIDgpOwotICAgIG1lbXNldCgmbV9kZWJ1ZywwLHNpemVvZihtX2RlYnVnKSk7Ci0jaWZkZWYgX0FORFJPSURfCi0gICAgY2hhciBwcm9wZXJ0eV92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gezB9OwotICAgIHByb3BlcnR5X2dldCgidmlkYy5kZWJ1Zy5sZXZlbCIsIHByb3BlcnR5X3ZhbHVlLCAiMSIpOwotICAgIGRlYnVnX2xldmVsID0gc3RydG91bChwcm9wZXJ0eV92YWx1ZSwgTlVMTCwgMTYpOwotICAgIHByb3BlcnR5X3ZhbHVlWzBdID0gJ1wwJzsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goIkluIE9NWCB2ZGVjIENvbnN0cnVjdG9yIik7Ci0KLSAgICBwcm9wZXJ0eV9nZXQoInZpZGMuZGVjLmRlYnVnLnBlcmYiLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBwZXJmX2ZsYWcgPSBhdG9pKHByb3BlcnR5X3ZhbHVlKTsKLSAgICBpZiAocGVyZl9mbGFnKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goInZpZGMuZGVjLmRlYnVnLnBlcmYgaXMgJWQiLCBwZXJmX2ZsYWcpOwotICAgICAgICBkZWNfdGltZS5zdGFydCgpOwotICAgIH0KLSAgICBwcm9jX2ZybXMgPSBsYXRlbmN5ID0gMDsKLSAgICBwcmV2X25fZmlsbGVkX2xlbiA9IDA7Ci0gICAgcHJvcGVydHlfdmFsdWVbMF0gPSAnXDAnOwotICAgIHByb3BlcnR5X2dldCgidmlkYy5kZWMuZGVidWcudHMiLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBtX2RlYnVnX3RpbWVzdGFtcCA9IGF0b2kocHJvcGVydHlfdmFsdWUpOwotICAgIERFQlVHX1BSSU5UX0hJR0goInZpZGMuZGVjLmRlYnVnLnRzIHZhbHVlIGlzICVkIixtX2RlYnVnX3RpbWVzdGFtcCk7Ci0gICAgaWYgKG1fZGVidWdfdGltZXN0YW1wKSB7Ci0gICAgICAgIHRpbWVfc3RhbXBfZHRzLnNldF90aW1lc3RhbXBfcmVvcmRlcl9tb2RlKHRydWUpOwotICAgICAgICB0aW1lX3N0YW1wX2R0cy5lbmFibGVfZGVidWdfcHJpbnQodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJvcGVydHlfdmFsdWVbMF0gPSAnXDAnOwotICAgIHByb3BlcnR5X2dldCgidmlkYy5kZWMuZGVidWcuY29uY2VhbGVkbWIiLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBtX2RlYnVnX2NvbmNlYWxlZG1iID0gYXRvaShwcm9wZXJ0eV92YWx1ZSk7Ci0gICAgREVCVUdfUFJJTlRfSElHSCgidmlkYy5kZWMuZGVidWcuY29uY2VhbGVkbWIgdmFsdWUgaXMgJWQiLG1fZGVidWdfY29uY2VhbGVkbWIpOwotCi0gICAgcHJvcGVydHlfdmFsdWVbMF0gPSAnXDAnOwotICAgIHByb3BlcnR5X2dldCgidmlkYy5kZWMucHJvZmlsZS5jaGVjayIsIHByb3BlcnR5X3ZhbHVlLCAiMCIpOwotICAgIG1fcmVqZWN0X2F2Y18xMDgwcF9tcCA9IGF0b2kocHJvcGVydHlfdmFsdWUpOwotICAgIERFQlVHX1BSSU5UX0hJR0goInZpZGMuZGVjLnByb2ZpbGUuY2hlY2sgdmFsdWUgaXMgJWQiLG1fcmVqZWN0X2F2Y18xMDgwcF9tcCk7Ci0KLSAgICBwcm9wZXJ0eV92YWx1ZVswXSA9ICdcMCc7Ci0gICAgcHJvcGVydHlfZ2V0KCJ2aWRjLmRlYy5sb2cuaW4iLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBtX2RlYnVnLmluX2J1ZmZlcl9sb2cgPSBhdG9pKHByb3BlcnR5X3ZhbHVlKTsKLQotICAgIHByb3BlcnR5X3ZhbHVlWzBdID0gJ1wwJzsKLSAgICBwcm9wZXJ0eV9nZXQoInZpZGMuZGVjLmxvZy5vdXQiLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBtX2RlYnVnLm91dF9idWZmZXJfbG9nID0gYXRvaShwcm9wZXJ0eV92YWx1ZSk7Ci0gICAgc25wcmludGYobV9kZWJ1Zy5sb2dfbG9jLCBQUk9QRVJUWV9WQUxVRV9NQVgsICIlcyIsIEJVRkZFUl9MT0dfTE9DKTsKLQotICAgIHByb3BlcnR5X3ZhbHVlWzBdID0gJ1wwJzsKLSAgICBwcm9wZXJ0eV9nZXQoInZpZGMuZGVjLm1ldGEubG9nLm91dCIsIHByb3BlcnR5X3ZhbHVlLCAiMCIpOwotICAgIG1fZGVidWcub3V0X21ldGFfYnVmZmVyX2xvZyA9IGF0b2kocHJvcGVydHlfdmFsdWUpOwotICAgIHNucHJpbnRmKG1fZGVidWcubG9nX2xvYywgUFJPUEVSVFlfVkFMVUVfTUFYLCAiJXMiLCBCVUZGRVJfTE9HX0xPQyk7Ci0KLSAgICBwcm9wZXJ0eV92YWx1ZVswXSA9ICdcMCc7Ci0gICAgcHJvcGVydHlfZ2V0KCJ2aWRjLmxvZy5sb2MiLCBwcm9wZXJ0eV92YWx1ZSwgIiIpOwotICAgIGlmICgqcHJvcGVydHlfdmFsdWUpCi0gICAgICAgIHN0cmxjcHkobV9kZWJ1Zy5sb2dfbG9jLCBwcm9wZXJ0eV92YWx1ZSwgUFJPUEVSVFlfVkFMVUVfTUFYKTsKLQotICAgIHByb3BlcnR5X3ZhbHVlWzBdID0gJ1wwJzsKLSAgICBwcm9wZXJ0eV9nZXQoInZpZGMuZGVjLjEyMGZwcy5lbmFibGVkIiwgcHJvcGVydHlfdmFsdWUsICIwIik7Ci0KLSAgICAvL2lmIHRoaXMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCB0aGVuIHJlc2V0IHRoaXMgdmFsdWUgLXZlCi0gICAgaWYoYXRvaShwcm9wZXJ0eV92YWx1ZSkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJmZWF0dXJlIDEyMCBGUFMgZGVjb2RlIGVuYWJsZWQiKTsKLSAgICAgICAgbV9sYXN0X3JlbmRlcmVkX1RTID0gMDsKLSAgICB9Ci0KLSAgICBwcm9wZXJ0eV92YWx1ZVswXSA9ICdcMCc7Ci0gICAgcHJvcGVydHlfZ2V0KCJ2aWRjLmRlYy5kZWJ1Zy5keW4uZGlzYWJsZWQiLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBtX2Rpc2FibGVfZHluYW1pY19idWZfbW9kZSA9IGF0b2kocHJvcGVydHlfdmFsdWUpOwotICAgIERFQlVHX1BSSU5UX0hJR0goInZpZGMuZGVjLmRlYnVnLmR5bi5kaXNhYmxlZCB2YWx1ZSBpcyAlZCIsbV9kaXNhYmxlX2R5bmFtaWNfYnVmX21vZGUpOwotCi0gICAgcHJvcGVydHlfdmFsdWVbMF0gPSAnXDAnOwotICAgIHByb3BlcnR5X2dldCgidmlkYy5kZWMuZHJjLmVuYWJsZSIsIHByb3BlcnR5X3ZhbHVlLCAiMCIpOwotICAgIGlmIChhdG9pKHByb3BlcnR5X3ZhbHVlKSkgewotICAgICAgICBtX2RyY19lbmFibGUgPSB0cnVlOwotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJEUkMgZW5hYmxlZCIpOwotICAgIH0KLQotI2lmZGVmIF9VQldDXwotICAgIHByb3BlcnR5X3ZhbHVlWzBdID0gJ1wwJzsKLSAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmdyYWxsb2MuZ2Z4X3Vid2NfZGlzYWJsZSIsIHByb3BlcnR5X3ZhbHVlLCAiMCIpOwotICAgIG1fZGlzYWJsZV91YndjX21vZGUgPSBhdG9pKHByb3BlcnR5X3ZhbHVlKTsKLSAgICBERUJVR19QUklOVF9ISUdIKCJVQldDIG1vZGUgaXMgJXMiLCBtX2Rpc2FibGVfdWJ3Y19tb2RlID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7Ci0jZWxzZQotICAgIG1fZGlzYWJsZV91YndjX21vZGUgPSB0cnVlOwotI2VuZGlmCi0jZW5kaWYKLSAgICBtZW1zZXQoJm1fY21wLDAsc2l6ZW9mKG1fY21wKSk7Ci0gICAgbWVtc2V0KCZtX2NiLDAsc2l6ZW9mKG1fY2IpKTsKLSAgICBtZW1zZXQgKCZkcnZfY3R4LDAsc2l6ZW9mKGRydl9jdHgpKTsKLSAgICBtZW1zZXQgKCZoMjY0X3NjcmF0Y2gsMCxzaXplb2YgKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7Ci0gICAgbWVtc2V0IChtX2h3ZGV2aWNlX25hbWUsMCxzaXplb2YobV9od2RldmljZV9uYW1lKSk7Ci0gICAgbWVtc2V0KG1fZGVtdXhfb2Zmc2V0cywgMCwgKCBzaXplb2YoT01YX1UzMikgKiA4MTkyKSApOwotICAgIG1lbXNldCgmbV9jdXN0b21fYnVmZmVyc2l6ZSwgMCwgc2l6ZW9mKG1fY3VzdG9tX2J1ZmZlcnNpemUpKTsKLSAgICBtZW1zZXQoJm1fY2xpZW50X2NvbG9yX3NwYWNlLCAwLCBzaXplb2YoRGVzY3JpYmVDb2xvckFzcGVjdHNQYXJhbXMpKTsKLSAgICBtZW1zZXQoJm1faW50ZXJuYWxfY29sb3Jfc3BhY2UsIDAsIHNpemVvZihEZXNjcmliZUNvbG9yQXNwZWN0c1BhcmFtcykpOwotICAgIG1lbXNldCgmbV9jbGllbnRfaGRyX2luZm8sIDAsIHNpemVvZihEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMpKTsKLSAgICBtZW1zZXQoJm1faW50ZXJuYWxfaGRyX2luZm8sIDAsIHNpemVvZihEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMpKTsKLSAgICBtZW1zZXQoJm1fY29sb3JfbWRhdGEsIDAsIHNpemVvZihDb2xvck1ldGFEYXRhKSk7Ci0gICAgbV9kZW11eF9lbnRyaWVzID0gMDsKLSAgICBtc2dfdGhyZWFkX2lkID0gMDsKLSAgICBhc3luY190aHJlYWRfaWQgPSAwOwotICAgIG1zZ190aHJlYWRfY3JlYXRlZCA9IGZhbHNlOwotICAgIGFzeW5jX3RocmVhZF9jcmVhdGVkID0gZmFsc2U7Ci0gICAgYXN5bmNfdGhyZWFkX2ZvcmNlX3N0b3AgPSBmYWxzZTsKLSAgICBtZXNzYWdlX3RocmVhZF9zdG9wID0gZmFsc2U7Ci0jaWZkZWYgX0FORFJPSURfSUNTXwotICAgIG1lbXNldCgmbmF0aXZlX2J1ZmZlciwgMCAsKHNpemVvZihzdHJ1Y3QgbmF0aXZlYnVmZmVyKSAqIE1BWF9OVU1fSU5QVVRfT1VUUFVUX0JVRkZFUlMpKTsKLSNlbmRpZgotICAgIG1lbXNldCgmZHJ2X2N0eC5leHRyYWRhdGFfaW5mbywgMCwgc2l6ZW9mKGRydl9jdHguZXh0cmFkYXRhX2luZm8pKTsKLQotICAgIC8qIGludmFsaWRhdGUgbV9mcmFtZV9wYWNrX2FycmFuZ2VtZW50ICovCi0gICAgbWVtc2V0KCZtX2ZyYW1lX3BhY2tfYXJyYW5nZW1lbnQsIDAsIHNpemVvZihPTVhfUUNPTV9GUkFNRV9QQUNLX0FSUkFOR0VNRU5UKSk7Ci0gICAgbV9mcmFtZV9wYWNrX2FycmFuZ2VtZW50LmNhbmNlbF9mbGFnID0gMTsKLQotICAgIGRydl9jdHgudGltZXN0YW1wX2FkanVzdCA9IGZhbHNlOwotICAgIG1fdmVuZG9yX2NvbmZpZy5wRGF0YSA9IE5VTEw7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZtX2xvY2ssIE5VTEwpOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmY19sb2NrLCBOVUxMKTsKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJmJ1Zl9sb2NrLCBOVUxMKTsKLSAgICBzZW1faW5pdCgmbV9jbWRfbG9jaywwLDApOwotICAgIHNlbV9pbml0KCZtX3NhZmVfZmx1c2gsIDAsIDApOwotICAgIHN0cmVhbWluZ1tDQVBUVVJFX1BPUlRdID0KLSAgICAgICAgc3RyZWFtaW5nW09VVFBVVF9QT1JUXSA9IGZhbHNlOwotI2lmZGVmIF9BTkRST0lEXwotICAgIGNoYXIgZXh0cmFkYXRhX3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF0gPSB7MH07Ci0gICAgcHJvcGVydHlfZ2V0KCJ2aWRjLmRlYy5kZWJ1Zy5leHRyYWRhdGEiLCBleHRyYWRhdGFfdmFsdWUsICIwIik7Ci0gICAgbV9kZWJ1Z19leHRyYWRhdGEgPSBhdG9pKGV4dHJhZGF0YV92YWx1ZSk7Ci0gICAgREVCVUdfUFJJTlRfSElHSCgidmlkYy5kZWMuZGVidWcuZXh0cmFkYXRhIHZhbHVlIGlzICVkIixtX2RlYnVnX2V4dHJhZGF0YSk7Ci0jZW5kaWYKLSAgICBtX2ZpbGxfb3V0cHV0X21zZyA9IE9NWF9DT01QT05FTlRfR0VORVJBVEVfRlRCOwotICAgIGNsaWVudF9idWZmZXJzLnNldF92ZGVjX2NsaWVudCh0aGlzKTsKLSAgICBkeW5hbWljX2J1Zl9tb2RlID0gZmFsc2U7Ci0gICAgb3V0X2R5bmFtaWNfbGlzdCA9IE5VTEw7Ci0gICAgaXNfZG93bl9zY2FsYXJfZW5hYmxlZCA9IGZhbHNlOwotICAgIG1fZW5hYmxlX2Rvd25zY2FsYXIgPSAwOwotICAgIG1fZG93bnNjYWxhcl93aWR0aCA9IDA7Ci0gICAgbV9kb3duc2NhbGFyX2hlaWdodCA9IDA7Ci0gICAgbV9mb3JjZV9kb3duX3NjYWxhciA9IDA7Ci0gICAgbV9yZWNvbmZpZ19oZWlnaHQgPSAwOwotICAgIG1fcmVjb25maWdfd2lkdGggPSAwOwotICAgIG1fc21vb3Roc3RyZWFtaW5nX21vZGUgPSBmYWxzZTsKLSAgICBtX3Ntb290aHN0cmVhbWluZ193aWR0aCA9IDA7Ci0gICAgbV9zbW9vdGhzdHJlYW1pbmdfaGVpZ2h0ID0gMDsKLSAgICBtX2RlY29kZV9vcmRlcl9tb2RlID0gZmFsc2U7Ci0gICAgaXNfcTZfcGxhdGZvcm0gPSBmYWxzZTsKLSAgICBtX2lucHV0X3Bhc3NfYnVmZmVyX2ZkID0gZmFsc2U7Ci0gICAgbWVtc2V0KCZtX2V4dHJhZGF0YV9pbmZvLCAwLCBzaXplb2YobV9leHRyYWRhdGFfaW5mbykpOwotICAgIG1fY2xpZW50X2NvbG9yX3NwYWNlLm5Qb3J0SW5kZXggPSAoT01YX1UzMilPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYOwotICAgIG1fY2xpZW50X2NvbG9yX3NwYWNlLnNBc3BlY3RzLm1SYW5nZSA9ICBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQ7Ci0gICAgbV9jbGllbnRfY29sb3Jfc3BhY2Uuc0FzcGVjdHMubVByaW1hcmllcyA9IENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7Ci0gICAgbV9jbGllbnRfY29sb3Jfc3BhY2Uuc0FzcGVjdHMubU1hdHJpeENvZWZmcyA9IENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQ7Ci0gICAgbV9jbGllbnRfY29sb3Jfc3BhY2Uuc0FzcGVjdHMubVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkOwotCi0gICAgbV9pbnRlcm5hbF9jb2xvcl9zcGFjZS5uUG9ydEluZGV4ID0gKE9NWF9VMzIpT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVg7Ci0gICAgbV9pbnRlcm5hbF9jb2xvcl9zcGFjZS5zQXNwZWN0cy5tUmFuZ2UgPSAgQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkOwotICAgIG1faW50ZXJuYWxfY29sb3Jfc3BhY2Uuc0FzcGVjdHMubVByaW1hcmllcyA9IENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7Ci0gICAgbV9pbnRlcm5hbF9jb2xvcl9zcGFjZS5zQXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhVbnNwZWNpZmllZDsKLSAgICBtX2ludGVybmFsX2NvbG9yX3NwYWNlLnNBc3BlY3RzLm1UcmFuc2ZlciA9IENvbG9yQXNwZWN0czo6VHJhbnNmZXJVbnNwZWNpZmllZDsKLSAgICBtX2ludGVybmFsX2NvbG9yX3NwYWNlLm5TaXplID0gc2l6ZW9mKERlc2NyaWJlQ29sb3JBc3BlY3RzUGFyYW1zKTsKLQotICAgIG1fY2xpZW50X2hkcl9pbmZvLm5Qb3J0SW5kZXggPSAoT01YX1UzMilPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYOwotICAgIG1faW50ZXJuYWxfaGRyX2luZm8ublBvcnRJbmRleCA9IChPTVhfVTMyKU9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYOwotICAgIG1fY2hhbmdlX2NsaWVudF9oZHJfaW5mbyA9IGZhbHNlOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9oZHJfaW5mb19jbGllbnRfbG9jaywgTlVMTCk7Ci0KLSAgICBjaGFyIGRpdGhlcl92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gezB9OwotICAgIHByb3BlcnR5X2dldCgidmlkYy5kZWMuZGl0aGVyIiwgZGl0aGVyX3ZhbHVlLCAiMCIpOwotICAgIGlmICgoYXRvaShkaXRoZXJfdmFsdWUpID4gRElUSEVSX0FMTF9DT0xPUlNQQUNFKSB8fAotICAgICAgICAoYXRvaShkaXRoZXJfdmFsdWUpIDwgRElUSEVSX0RJU0FCTEUpKSB7Ci0gICAgICAgIG1fZGl0aGVyX2NvbmZpZyA9IERJVEhFUl9BTExfQ09MT1JTUEFDRTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX2RpdGhlcl9jb25maWcgPSBpc19wbGF0Zm9ybV90cDEwY2FwdHVyZV9zdXBwb3J0ZWQoKSA/IChkaXRoZXJfdHlwZSlhdG9pKGRpdGhlcl92YWx1ZSkgOiBESVRIRVJfQUxMX0NPTE9SU1BBQ0U7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfSElHSCgiRGl0aGVyIGNvbmZpZyBpcyAlZCIsIG1fZGl0aGVyX2NvbmZpZyk7Ci0gICAgbV9jb2xvcl9zcGFjZSA9IEVYQ0VQVF9CVDIwMjA7Ci19Ci0KLXN0YXRpYyBjb25zdCBpbnQgZXZlbnRfdHlwZVtdID0gewotICAgIFY0TDJfRVZFTlRfTVNNX1ZJRENfRkxVU0hfRE9ORSwKLSAgICBWNEwyX0VWRU5UX01TTV9WSURDX1BPUlRfU0VUVElOR1NfQ0hBTkdFRF9TVUZGSUNJRU5ULAotICAgIFY0TDJfRVZFTlRfTVNNX1ZJRENfUE9SVF9TRVRUSU5HU19DSEFOR0VEX0lOU1VGRklDSUVOVCwKLSAgICBWNEwyX0VWRU5UX01TTV9WSURDX1BPUlRfU0VUVElOR1NfQklUREVQVEhfQ0hBTkdFRF9JTlNVRkZJQ0lFTlQsCi0gICAgVjRMMl9FVkVOVF9NU01fVklEQ19SRUxFQVNFX0JVRkZFUl9SRUZFUkVOQ0UsCi0gICAgVjRMMl9FVkVOVF9NU01fVklEQ19SRUxFQVNFX1VOUVVFVUVEX0JVRkZFUiwKLSAgICBWNEwyX0VWRU5UX01TTV9WSURDX1NZU19FUlJPUiwKLSAgICBWNEwyX0VWRU5UX01TTV9WSURDX0hXX09WRVJMT0FELAotICAgIFY0TDJfRVZFTlRfTVNNX1ZJRENfSFdfVU5TVVBQT1JURUQKLX07Ci0KLXN0YXRpYyBPTVhfRVJST1JUWVBFIHN1YnNjcmliZV90b19ldmVudHMoaW50IGZkKQotewotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uIHN1YjsKLSAgICBpbnQgYXJyYXlfc3ogPSBzaXplb2YoZXZlbnRfdHlwZSkvc2l6ZW9mKGludCk7Ci0gICAgaW50IGkscmM7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSW52YWxpZCBpbnB1dDogJWQiLCBmZCk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGFycmF5X3N6OyArK2kpIHsKLSAgICAgICAgbWVtc2V0KCZzdWIsIDAsIHNpemVvZihzdWIpKTsKLSAgICAgICAgc3ViLnR5cGUgPSBldmVudF90eXBlW2ldOwotICAgICAgICByYyA9IGlvY3RsKGZkLCBWSURJT0NfU1VCU0NSSUJFX0VWRU5ULCAmc3ViKTsKLSAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHN1YnNjcmliZSBldmVudDogMHgleCIsIHN1Yi50eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpIDwgYXJyYXlfc3opIHsKLSAgICAgICAgZm9yICgtLWk7IGkgPj0wIDsgaS0tKSB7Ci0gICAgICAgICAgICBtZW1zZXQoJnN1YiwgMCwgc2l6ZW9mKHN1YikpOwotICAgICAgICAgICAgc3ViLnR5cGUgPSBldmVudF90eXBlW2ldOwotICAgICAgICAgICAgcmMgPSBpb2N0bChmZCwgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5ULCAmc3ViKTsKLSAgICAgICAgICAgIGlmIChyYykKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHVuc3Vic2NyaWJlIGV2ZW50OiAweCV4Iiwgc3ViLnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZDsKLSAgICB9Ci0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLQotc3RhdGljIE9NWF9FUlJPUlRZUEUgdW5zdWJzY3JpYmVfdG9fZXZlbnRzKGludCBmZCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiBzdWI7Ci0gICAgaW50IGFycmF5X3N6ID0gc2l6ZW9mKGV2ZW50X3R5cGUpL3NpemVvZihpbnQpOwotICAgIGludCBpLHJjOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgaW5wdXQ6ICVkIiwgZmQpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBhcnJheV9zejsgKytpKSB7Ci0gICAgICAgIG1lbXNldCgmc3ViLCAwLCBzaXplb2Yoc3ViKSk7Ci0gICAgICAgIHN1Yi50eXBlID0gZXZlbnRfdHlwZVtpXTsKLSAgICAgICAgcmMgPSBpb2N0bChmZCwgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5ULCAmc3ViKTsKLSAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHVuc3Vic2NyaWJlIGV2ZW50OiAweCV4Iiwgc3ViLnR5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6fm9teF92ZGVjCi0KLSAgIERFU0NSSVBUSU9OCi0gICBEZXN0cnVjdG9yCi0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUKLQotICAgUkVUVVJOIFZBTFVFCi0gICBOb25lLgotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLW9teF92ZGVjOjp+b214X3ZkZWMoKQotewotICAgIG1fcG1lbV9pbmZvID0gTlVMTDsKLSAgICBERUJVR19QUklOVF9ISUdIKCJJbiBPTVggdmRlYyBEZXN0cnVjdG9yIik7Ci0gICAgaWYgKG1zZ190aHJlYWRfY3JlYXRlZCkgewotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJTaWduYWxsaW5nIGNsb3NlIHRvIE9NWCBNc2cgVGhyZWFkIik7Ci0gICAgICAgIG1lc3NhZ2VfdGhyZWFkX3N0b3AgPSB0cnVlOwotICAgICAgICBwb3N0X21lc3NhZ2UodGhpcywgT01YX0NPTVBPTkVOVF9DTE9TRV9NU0cpOwotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJXYWl0aW5nIG9uIE9NWCBNc2cgVGhyZWFkIGV4aXQiKTsKLSAgICAgICAgcHRocmVhZF9qb2luKG1zZ190aHJlYWRfaWQsTlVMTCk7Ci0gICAgfQotICAgIERFQlVHX1BSSU5UX0hJR0goIldhaXRpbmcgb24gT01YIEFzeW5jIFRocmVhZCBleGl0Iik7Ci0gICAgaWYoZXZlbnRmZF93cml0ZShtX3BvbGxfZWZkLCAxKSkgewotICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImV2ZW50ZmRfd3JpdGUgZmFpbGVkIGZvciBmZDogJWQsIGVycm5vID0gJWQsIGZvcmNlIHN0b3AgYXN5bmNfdGhyZWFkIiwgbV9wb2xsX2VmZCwgZXJybm8pOwotICAgICAgICAgYXN5bmNfdGhyZWFkX2ZvcmNlX3N0b3AgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChhc3luY190aHJlYWRfY3JlYXRlZCkKLSAgICAgICAgcHRocmVhZF9qb2luKGFzeW5jX3RocmVhZF9pZCxOVUxMKTsKLSAgICB1bnN1YnNjcmliZV90b19ldmVudHMoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQpOwotICAgIGNsb3NlKG1fcG9sbF9lZmQpOwotICAgIGNsb3NlKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkKTsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fbG9jayk7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZjX2xvY2spOwotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmYnVmX2xvY2spOwotICAgIHNlbV9kZXN0cm95KCZtX2NtZF9sb2NrKTsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1faGRyX2luZm9fY2xpZW50X2xvY2spOwotICAgIGlmIChwZXJmX2ZsYWcpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiLS0+IFRPVEFMIFBST0NFU1NJTkcgVElNRSIpOwotICAgICAgICBkZWNfdGltZS5lbmQoKTsKLSAgICB9Ci0gICAgREVCVUdfUFJJTlRfSU5GTygiRXhpdCBPTVggdmRlYyBEZXN0cnVjdG9yOiBmZD0lZCIsZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQpOwotfQotCi1pbnQgcmVsZWFzZV9idWZmZXJzKG9teF92ZGVjKiBvYmosIGVudW0gdmRlY19idWZmZXIgYnVmZmVyX3R5cGUpCi17Ci0gICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgYnVmcmVxOwotICAgIGludCByYyA9IDA7Ci0gICAgaWYgKGJ1ZmZlcl90eXBlID09IFZERUNfQlVGRkVSX1RZUEVfT1VUUFVUKSB7Ci0gICAgICAgIGJ1ZnJlcS5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOwotICAgICAgICBidWZyZXEuY291bnQgPSAwOwotICAgICAgICBidWZyZXEudHlwZT1WNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgICAgICByYyA9IGlvY3RsKG9iai0+ZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsVklESU9DX1JFUUJVRlMsICZidWZyZXEpOwotICAgIH0gZWxzZSBpZihidWZmZXJfdHlwZSA9PSBWREVDX0JVRkZFUl9UWVBFX0lOUFVUKSB7Ci0gICAgICAgIGJ1ZnJlcS5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOwotICAgICAgICBidWZyZXEuY291bnQgPSAwOwotICAgICAgICBidWZyZXEudHlwZT1WNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7Ci0gICAgICAgIHJjID0gaW9jdGwob2JqLT5kcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCxWSURJT0NfUkVRQlVGUywgJmJ1ZnJlcSk7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotT01YX0VSUk9SVFlQRSBvbXhfdmRlYzo6c2V0X2RwYihib29sIGlzX3NwbGl0X21vZGUsIGludCBkcGJfY29sb3JfZm9ybWF0KQotewotICAgIGludCByYyA9IDA7Ci0gICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgY3RybFsyXTsKLSAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgY29udHJvbHM7Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJEUEIgbW9kZTogJXMgRFBCIGNvbG9yIGZvcm1hdDogJXMgT1BCIGNvbG9yIGZvcm1hdDogJXMiLAotICAgICAgICAgaXNfc3BsaXRfbW9kZSA/ICJzcGxpdCIgOiAiY29tYmluZWQiLAotICAgICAgICAgZHBiX2NvbG9yX2Zvcm1hdCA9PSBWNEwyX01QRUdfVklEQ19WSURFT19EUEJfQ09MT1JfRk1UX1VCV0MgPyAibnYxMl91YndjIjoKLSAgICAgICAgIGRwYl9jb2xvcl9mb3JtYXQgPT0gVjRMMl9NUEVHX1ZJRENfVklERU9fRFBCX0NPTE9SX0ZNVF9UUDEwX1VCV0MgPyAibnYxMl8xMGJpdF91YndjIjoKLSAgICAgICAgIGRwYl9jb2xvcl9mb3JtYXQgPT0gVjRMMl9NUEVHX1ZJRENfVklERU9fRFBCX0NPTE9SX0ZNVF9OT05FID8gInNhbWUgYXMgb3BiIjoKLSAgICAgICAgICJ1bmtub3duIiwKLSAgICAgICAgIGNhcHR1cmVfY2FwYWJpbGl0eSA9PSBWNEwyX1BJWF9GTVRfTlYxMiA/ICJudjEyIjoKLSAgICAgICAgIGNhcHR1cmVfY2FwYWJpbGl0eSA9PSBWNEwyX1BJWF9GTVRfTlYxMl9VQldDID8gIm52MTJfdWJ3YyI6Ci0gICAgICAgICBjYXB0dXJlX2NhcGFiaWxpdHkgPT0gVjRMMl9QSVhfRk1UX05WMTJfVFAxMF9VQldDID8gIm52MTJfMTBiaXRfdWJ3YyI6Ci0gICAgICAgICAidW5rbm93biIpOwotCi0gICAgY3RybFswXS5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19TVFJFQU1fT1VUUFVUX01PREU7Ci0gICAgaWYgKGlzX3NwbGl0X21vZGUpIHsKLSAgICAgICAgY3RybFswXS52YWx1ZSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19TVFJFQU1fT1VUUFVUX1NFQ09OREFSWTsKLSAgICB9IGVsc2UgewotICAgICAgICBjdHJsWzBdLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1NUUkVBTV9PVVRQVVRfUFJJTUFSWTsKLSAgICB9Ci0KLSAgICBjdHJsWzFdLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0RQQl9DT0xPUl9GT1JNQVQ7Ci0gICAgY3RybFsxXS52YWx1ZSA9IGRwYl9jb2xvcl9mb3JtYXQ7Ci0KLSAgICBjb250cm9scy5jb3VudCA9IDI7Ci0gICAgY29udHJvbHMuY3RybF9jbGFzcyA9IFY0TDJfQ1RSTF9DTEFTU19NUEVHOwotICAgIGNvbnRyb2xzLmNvbnRyb2xzID0gY3RybDsKLQotICAgIHJjID0gaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX0VYVF9DVFJMUywgJmNvbnRyb2xzKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgZXh0IGN0cmxzIGZvciBvcGJfZHBiOiAlZFxuIiwgcmMpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgIH0KLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLX0KLQotCi1PTVhfRVJST1JUWVBFIG9teF92ZGVjOjpkZWNpZGVfZHBiX2J1ZmZlcl9tb2RlKGJvb2wgc3BsaXRfb3BiX2RwYl93aXRoX3NhbWVfY29sb3JfZm10KQotewotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKLSAgICBpbnQgcmMgPSAwOwotICAgIGJvb2wgY3B1X2FjY2VzcyA9IChjYXB0dXJlX2NhcGFiaWxpdHkgIT0gVjRMMl9QSVhfRk1UX05WMTJfVUJXQykgJiYKLSAgICAgICAgY2FwdHVyZV9jYXBhYmlsaXR5ICE9IFY0TDJfUElYX0ZNVF9OVjEyX1RQMTBfVUJXQzsKLSAgICBib29sIHRwMTBfZW5hYmxlID0gIWNwdV9hY2Nlc3MgJiYKLSAgICAgICAgZHBiX2JpdF9kZXB0aCA9PSBNU01fVklEQ19CSVRfREVQVEhfMTA7Ci0gICAgYm9vbCBkaXRoZXJfZW5hYmxlID0gdHJ1ZTsKLQotICAgIHN3aXRjaCAobV9kaXRoZXJfY29uZmlnKSB7Ci0gICAgY2FzZSBESVRIRVJfRElTQUJMRToKLSAgICAgICAgZGl0aGVyX2VuYWJsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERJVEhFUl9DT0xPUlNQQUNFX0VYQ0VQVEJUMjAyMDoKLSAgICAgICAgZGl0aGVyX2VuYWJsZSA9IChtX2NvbG9yX3NwYWNlID09IEVYQ0VQVF9CVDIwMjApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERJVEhFUl9BTExfQ09MT1JTUEFDRToKLSAgICAgICAgZGl0aGVyX2VuYWJsZSA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJVbnN1cHBvcnRlZCBkaXRoZXIgY29uZmlndXJhdGlvbjolZCIsIG1fZGl0aGVyX2NvbmZpZyk7Ci0gICAgfQotCi0gICAgaWYgKHRwMTBfZW5hYmxlICYmICFkaXRoZXJfZW5hYmxlKSB7Ci0gICAgICAgIGRydl9jdHgub3V0cHV0X2Zvcm1hdCA9IFZERUNfWVVWX0ZPUk1BVF9OVjEyX1RQMTBfVUJXQzsKLSAgICAgICAgY2FwdHVyZV9jYXBhYmlsaXR5ID0gVjRMMl9QSVhfRk1UX05WMTJfVFAxMF9VQldDOwotCi0gICAgICAgIG1lbXNldCgmZm10LCAweDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQpKTsKLSAgICAgICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgICAgICByYyA9IGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfR19GTVQsICZmbXQpOwotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlczogRmFpbGVkIGdldCBmb3JtYXQgb24gY2FwdHVyZSBtcGxhbmUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICB9Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gY2FwdHVyZV9jYXBhYmlsaXR5OwotICAgICAgICByYyA9IGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19GTVQsICZmbXQpOwotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlczogRmFpbGVkIHNldCBmb3JtYXQgb24gY2FwdHVyZSBtcGxhbmUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIGlmICghQklUTUFTS19QUkVTRU5UKCZtX2ZsYWdzICxPTVhfQ09NUE9ORU5UX0lETEVfUEVORElORykgJiYKLSAgICAgICAgIUJJVE1BU0tfUFJFU0VOVCgmbV9mbGFncywgT01YX0NPTVBPTkVOVF9PVVRQVVRfRU5BQkxFX1BFTkRJTkcpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiSW52YWxpZCBzdGF0ZSB0byBkZWNpZGUgb24gZHBiLW9wYiBzcGxpdCIpOwotICAgICAgICByZXR1cm4gZVJldDsKLSAgICB9Ci0KLQotICAgIGlmIChjcHVfYWNjZXNzKSB7Ci0gICAgICAgIGlmIChkcGJfYml0X2RlcHRoID09IE1TTV9WSURDX0JJVF9ERVBUSF84KSB7Ci0gICAgICAgICAgICAvKiBEaXNhYmxlZCBzcGxpdCBtb2RlIGZvciBWUDkuIEluIHNwbGl0IG1vZGUgdGhlIERQQiBidWZmZXJzIGFyZSBwYXJ0IG9mIHRoZSBpbnRlcm5hbAotICAgICAgICAgICAgICogc2NyYXRjaCBidWZmZXJzIGFuZCB0aGUgZHJpdmVyIGRvZXMgbm90IGRvZXMgdGhlIHJlZmVyZW5jZSBidWZmZXIgbWFuYWdlbWVudCBmb3IKLSAgICAgICAgICAgICAqIHNjcmF0Y2ggYnVmZmVycy4gSW4gY2FzZSBvZiBWUDkgd2l0aCBzcGF0aWFsIHNjYWxhYmlsaXR5LCB3aGVuIGEgc2VxdWVuY2UgY2hhbmdlZAotICAgICAgICAgICAgICogZXZlbnQgaXMgcmVjZWl2ZWQgd2l0aCB0aGUgbmV3IHJlc29sdXRpb24sIGFuZCB3aGVuIGEgZmx1c2ggaXMgc2VudCBieSB0aGUgZHJpdmVyLCBpdAotICAgICAgICAgICAgICogcmVsZWFzZXMgYWxsIHRoZSByZWZlcmVuY2VzIG9mIGludGVybmFsIHNjcmF0Y2ggYnVmZmVycy4gSG93ZXZlciBhcyBwZXIgdGhlIFZQOQotICAgICAgICAgICAgICogc3BhdGlhbCBzY2FsYWJpbGl0eSwgZXZlbiBhZnRlciB0aGUgZmx1c2gsIHRoZSBidWZmZXJzIHdoaWNoIGhhdmUgbm90IHlldCByZWNlaXZlZAotICAgICAgICAgICAgICogcmVsZWFzZSByZWZlcmVuY2UgZXZlbnQgc2hvdWxkIG5vdCBiZSB1bm1hcHBlZCBhbmQgZnJlZWQuIEN1cnJlbnRseSBpbiBkcml2ZXIsCi0gICAgICAgICAgICAgKiByZWZlcmVuY2UgYnVmZmVyIG1hbmFnZW1lbnQgb2YgdGhlIGludGVybmFsIHNjcmF0Y2ggYnVmZmVyIGlzIG5vdCBpbXBsZW1lbnRlZAotICAgICAgICAgICAgICogYW5kIGhlbmNlIHRoZSBEUEIgYnVmZmVycyBnZXQgdW5tYXBwZWQuIEZvciBvdGhlciBjb2RlY3MgaXQgZG9lcyBub3QgbWF0dGVyCi0gICAgICAgICAgICAgKiBhcyB3aXRoIHRoZSBuZXcgU1BTL1BQUywgdGhlIERQQiBpcyBmbHVzaGVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sIGlzX25vdF92cDkgPSBlQ29tcHJlc3Npb25Gb3JtYXQgIT0gT01YX1ZJREVPX0NvZGluZ1ZQOTsKLSAgICAgICAgICAgIGJvb2wgZWxpZ2libGVfZm9yX3NwbGl0X2RwYl91YndjID0KLSAgICAgICAgICAgICAgIG1fcHJvZ3Jlc3NpdmUgPT0gTVNNX1ZJRENfUElDX1NUUlVDVF9QUk9HUkVTU0lWRSAmJiAgICAgLy9AIER1ZSB0byBWZW51cyBsaW1pdGF0aW9uIGZvciBJbnRlcmxhY2VkLCBTcGxpdCBtb2RlIGVuYWJsZWQgb25seSBmb3IgUHJvZ3Jlc3NpdmUuCi0gICAgICAgICAgICAgICBpc19ub3RfdnA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgICAgIC8vQCBTcGxpdCBtb2RlIGRpc2FibGVkIGZvciBWUDkuCi0gICAgICAgICAgICAgICAhZHJ2X2N0eC5pZHJfb25seV9kZWNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgJiYgICAgIC8vQCBTcGxpdCBtb2RlIGRpc2FibGVkIGZvciBUaHVtYm5haWwgdXNlY2FzZS4KLSAgICAgICAgICAgICAgICFtX2Rpc2FibGVfc3BsaXRfbW9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9AIFNldCBwcm9wIHRvIGRpc2FibGUgc3BsaXQgbW9kZQotCi0gICAgICAgICAgICAvL1NpbmNlIG9wYiBpcyBsaW5lYXIsIGRwYiBzaG91bGQgYWxzbyBiZSBsaW5lYXIuCi0gICAgICAgICAgICBpZiAoc3BsaXRfb3BiX2RwYl93aXRoX3NhbWVfY29sb3JfZm10KSB7Ci0gICAgICAgICAgICAgICAgZWxpZ2libGVfZm9yX3NwbGl0X2RwYl91YndjID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbGlnaWJsZV9mb3Jfc3BsaXRfZHBiX3Vid2MpIHsKLSAgICAgICAgICAgICAgICAvL3NwbGl0IERQQi1PUEIKLSAgICAgICAgICAgICAgICAvL0RQQiAtPiBVQldDICwgT1BCIC0+IExpbmVhcgotICAgICAgICAgICAgICAgIGVSZXQgPSBzZXRfZHBiKHRydWUsIFY0TDJfTVBFR19WSURDX1ZJREVPX0RQQl9DT0xPUl9GTVRfVUJXQyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNwbGl0X29wYl9kcGJfd2l0aF9zYW1lX2NvbG9yX2ZtdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9EUEIgLT4gTGluZWFyLCBPUEIgLT4gTGluZWFyCi0gICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gc2V0X2RwYih0cnVlLCBWNEwyX01QRUdfVklEQ19WSURFT19EUEJfQ09MT1JfRk1UX05PTkUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vRFBCLU9QQiBjb21iaW5lZCBsaW5lYXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBzZXRfZHBiKGZhbHNlLCBWNEwyX01QRUdfVklEQ19WSURFT19EUEJfQ09MT1JfRk1UX05PTkUpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZHBiX2JpdF9kZXB0aCA9PSBNU01fVklEQ19CSVRfREVQVEhfMTApIHsKLSAgICAgICAgICAgIC8vc3BsaXQgRFBCLU9QQgotICAgICAgICAgICAgLy9EUEIgLT4gVUJXQywgT1BCIC0+IExpbmVhcgotICAgICAgICAgICAgZVJldCA9IHNldF9kcGIodHJ1ZSwgVjRMMl9NUEVHX1ZJRENfVklERU9fRFBCX0NPTE9SX0ZNVF9UUDEwX1VCV0MpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsgLy9ubyBjcHUgYWNjZXNzCi0gICAgICAgIGlmIChkcGJfYml0X2RlcHRoID09IE1TTV9WSURDX0JJVF9ERVBUSF84KSB7Ci0gICAgICAgICAgICBpZiAoc3BsaXRfb3BiX2RwYl93aXRoX3NhbWVfY29sb3JfZm10KSB7Ci0gICAgICAgICAgICAgICAgLy9zcGxpdCBEUEItT1BCCi0gICAgICAgICAgICAgICAgLy9EUEIgLT4gVUJXQywgT1BCIC0+IFVCV0MKLSAgICAgICAgICAgICAgICBlUmV0ID0gc2V0X2RwYih0cnVlLCBWNEwyX01QRUdfVklEQ19WSURFT19EUEJfQ09MT1JfRk1UX1VCV0MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL0RQQi1PUEIgY29tYmluZWQgVUJXQwotICAgICAgICAgICAgICAgIGVSZXQgPSBzZXRfZHBiKGZhbHNlLCBWNEwyX01QRUdfVklEQ19WSURFT19EUEJfQ09MT1JfRk1UX05PTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRwYl9iaXRfZGVwdGggPT0gTVNNX1ZJRENfQklUX0RFUFRIXzEwKSB7Ci0gICAgICAgICAgICBpZiAoZGl0aGVyX2VuYWJsZSkgewotICAgICAgICAgICAgICAgIC8vc3BsaXQgRFBCLU9QQgotICAgICAgICAgICAgICAgIC8vRFBCIC0+IFRQMTBVQldDLCBPUEIgLT4gVUJXQwotICAgICAgICAgICAgICAgIGVSZXQgPSBzZXRfZHBiKHRydWUsIFY0TDJfTVBFR19WSURDX1ZJREVPX0RQQl9DT0xPUl9GTVRfVFAxMF9VQldDKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9jb21iaW5lZCBEUEItT1BCCi0gICAgICAgICAgICAgICAgLy9EUEIgLT4gVFAxMFVCV0MsIE9QQiAtPiBUUDEwVUJXQwotICAgICAgICAgICAgICAgIGVSZXQgPSBzZXRfZHBiKGZhbHNlLCBWNEwyX01QRUdfVklEQ19WSURFT19EUEJfQ09MT1JfRk1UX1RQMTBfVUJXQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGVSZXQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIHNldCBEUEIgYnVmZmVyIG1vZGU6ICVkIiwgZVJldCk7Ci0gICAgfQotCi0KLQotICAgIHJldHVybiBlUmV0OwotfQotCi1pbnQgb214X3ZkZWM6OmVuYWJsZV9kb3duc2NhbGFyKCkKLXsKLSAgICBpbnQgcmMgPSAwOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm10OwotCi0gICAgaWYgKGlzX2Rvd25fc2NhbGFyX2VuYWJsZWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCIlczogYWxyZWFkeSBlbmFibGVkIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIm9teF92ZGVjOjplbmFibGVfZG93bnNjYWxhciIpOwotICAgIHJjID0gZGVjaWRlX2RwYl9idWZmZXJfbW9kZSh0cnVlKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiBkZWNpZGVfZHBiX2J1ZmZlcl9tb2RlIEZhaWxlZCAiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0gICAgaXNfZG93bl9zY2FsYXJfZW5hYmxlZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IG9teF92ZGVjOjpkaXNhYmxlX2Rvd25zY2FsYXIoKQotewotICAgIGludCByYyA9IDA7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotCi0gICAgaWYgKCFpc19kb3duX3NjYWxhcl9lbmFibGVkKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygib214X3ZkZWM6OmRpc2FibGVfZG93bnNjYWxhcjogYWxyZWFkeSBkaXNhYmxlZCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByYyA9IGRlY2lkZV9kcGJfYnVmZmVyX21vZGUoZmFsc2UpOwotICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOmRlY2lkZV9kcGJfYnVmZmVyX21vZGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0gICAgaXNfZG93bl9zY2FsYXJfZW5hYmxlZCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIHJjOwotfQotCi1pbnQgb214X3ZkZWM6OmRlY2lkZV9kb3duc2NhbGFyKCkKLXsKLSAgICBpbnQgcmMgPSAwOwotICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7Ci0gICAgZW51bSBjb2xvcl9mbXRzIGNvbG9yX2Zvcm1hdDsKLSAgICBPTVhfVTMyIHdpZHRoLCBoZWlnaHQ7Ci0gICAgT01YX0JPT0wgaXNQb3J0cmFpdFZpZGVvID0gT01YX0ZBTFNFOwotCi0gICAgaWYgKGNhcHR1cmVfY2FwYWJpbGl0eSA9PSBWNEwyX1BJWF9GTVRfTlYxMl9UUDEwX1VCV0MpIHsKLSAgICAgICAgcmMgPSBkaXNhYmxlX2Rvd25zY2FsYXIoKTsKLSAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRGlzYWJsZSBkb3duc2NhbGFyIGZhaWxlZCEiKTsKLSAgICAgICAgICAgIHJldHVybiByYzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAgKCFtX2VuYWJsZV9kb3duc2NhbGFyKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiJXM6IGRvd25zY2FsYXIgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYgX1FVRVJZX0RJU1BfUkVTXwotICAgIG1lbXNldCgmZm10LCAweDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQpKTsKLSAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBjYXB0dXJlX2NhcGFiaWxpdHk7Ci0gICAgcmMgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmZm10KTsKLSAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiBGYWlsZWQgdG8gZ2V0IGZvcm1hdCBvbiBjYXB0dXJlIG1wbGFuZSIsIF9fZnVuY19fKTsKLSAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotICAgIGlzUG9ydHJhaXRWaWRlbyA9IGZtdC5mbXQucGl4X21wLndpZHRoIDwgZm10LmZtdC5waXhfbXAuaGVpZ2h0ID8gT01YX1RSVUUgOiBPTVhfRkFMU0U7Ci0gICAgaWYgKCFtX2Rvd25zY2FsYXJfd2lkdGggfHwgIW1fZG93bnNjYWxhcl9oZWlnaHQpIHsKLSAgICAgICAgcWR1dGlsczo6RGlzcGxheUF0dHJpYnV0ZXMgZHBhID0ge30sIGRzYSA9IHt9LCBkdmEgPSB7fTsKLSAgICAgICAgaW50IHByaW1fY29uZmlnLCBleHRfY29uZmlnLCB2aXJ0X2NvbmZpZzsKLQotICAgICAgICBwcmltX2NvbmZpZyA9IHFkdXRpbHM6OmdldEFjdGl2ZUNvbmZpZyhxZHV0aWxzOjpESVNQTEFZX1BSSU1BUlkpOwotICAgICAgICBkcGEgPSBxZHV0aWxzOjpnZXREaXNwbGF5QXR0cmlidXRlcyhwcmltX2NvbmZpZywgcWR1dGlsczo6RElTUExBWV9QUklNQVJZKTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiJXM6IFByaW1hcnkgZHBhLnhyZXMgPSAlZCAgZHBhLnlyZXM9JWQgICBkcGEueGRwaSA9ICVmICBkcGEueWRwaSA9ICVmICIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgZHBhLnhyZXMsIGRwYS55cmVzLCBkcGEueGRwaSwgZHBhLnlkcGkpOwotCi0gICAgICAgIGV4dF9jb25maWcgPSBxZHV0aWxzOjpnZXRBY3RpdmVDb25maWcocWR1dGlsczo6RElTUExBWV9FWFRFUk5BTCk7Ci0gICAgICAgIGRzYSA9IHFkdXRpbHM6OmdldERpc3BsYXlBdHRyaWJ1dGVzKGV4dF9jb25maWcsIHFkdXRpbHM6OkRJU1BMQVlfRVhURVJOQUwpOwotICAgICAgICBERUJVR19QUklOVF9ISUdIKCIlczogSERNSSBkc2EueHJlcyA9ICVkICBkc2EueXJlcyA9ICVkICAgZHNhLnhkcGkgPSAlZiAgZHNhLnlkcGkgPSAlZiAiLAotICAgICAgICAgICAgX19mdW5jX18sIGRzYS54cmVzLCBkc2EueXJlcywgZHNhLnhkcGksIGRzYS55ZHBpKTsKLQotICAgICAgICB2aXJ0X2NvbmZpZyA9IHFkdXRpbHM6OmdldEFjdGl2ZUNvbmZpZyhxZHV0aWxzOjpESVNQTEFZX1ZJUlRVQUwpOwotICAgICAgICBkdmEgPSBxZHV0aWxzOjpnZXREaXNwbGF5QXR0cmlidXRlcyh2aXJ0X2NvbmZpZywgcWR1dGlsczo6RElTUExBWV9WSVJUVUFMKTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiJXM6IFZpcnR1YWwgZHZhLnhyZXMgPSAlZCAgZHZhLnlyZXMgPSAlZCAgIGR2YS54ZHBpID0gJWYgIGR2YS55ZHBpID0gJWYgIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBkdmEueHJlcywgZHZhLnlyZXMsIGR2YS54ZHBpLCBkdmEueWRwaSk7Ci0KLSAgICAgICAgLyogQmVsb3cgbG9naWMgdGFrZXMgY2FyZSBvZiBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAgICAgICAgICogICAxLiBDaG9vc2UgZGlzcGxheSByZXNvbHV0aW9uIGFzIG1heGltdW0gcmVzb2x1dGlvbiBvZiBhbGwgdGhlIGNvbm5lY3RlZAotICAgICAgICAgKiAgICAgIGRpc3BsYXlzIChzZWNvbmRhcnksIHByaW1hcnksIHZpcnR1YWwpLCBzbyB0aGF0IHdlIGRvIG5vdCBkb3duc2NhbGUKLSAgICAgICAgICogICAgICB1bm5lY2Vzc2FyaWx5IHdoaWNoIG1pZ2h0IGJlIHN1cHBvcnRlZCBvbiBvbmUgb2YgdGhlIGRpc3BsYXkgbG9zaW5nIHF1YWxpdHkuCi0gICAgICAgICAqICAgMi4gRGlzcGxheXMgY29ubmVjdGVkIG1pZ2h0IGJlIGluIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBtb2RlLCBzbyB0aGUgeHJlcyBtaWdodAotICAgICAgICAgKiAgICAgIGJlIHNtYWxsZXIgb3IgZ3JlYXRlciB0aGFuIHRoZSB5cmVzLiBTbyB3ZSBmaXJzdCB0YWtlIHRoZSBtYXggb2YgdGhlIHR3bwotICAgICAgICAgKiAgICAgIGluIHdpZHRoIGFuZCBtaW4gb2YgdHdvIGluIGhlaWdodCBhbmQgdGhlbiByb3RhdGUgaXQgaWYgYmVsb3cgcG9pbnQgaXMgdHJ1ZS4KLSAgICAgICAgICogICAzLiBWaWRlbyBtaWdodCBhbHNvIGJlIGluIHBvcnRyYWl0IG1vZGUsIHNvIGludmVydCB0aGUgZG93bnNjYWxhciB3aWR0aCBhbmQKLSAgICAgICAgICogICAgICBoZWlnaHQgZm9yIHN1Y2ggY2FzZXMuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoZHNhLnhyZXMgKiBkc2EueXJlcyA+IGRwYS54cmVzICogZHBhLnlyZXMpIHsKLSAgICAgICAgICAgIG1fZG93bnNjYWxhcl93aWR0aCA9IE1BWChkc2EueHJlcywgZHNhLnlyZXMpOwotICAgICAgICAgICAgbV9kb3duc2NhbGFyX2hlaWdodCA9IE1JTihkc2EueHJlcywgZHNhLnlyZXMpOwotICAgICAgICB9IGVsc2UgaWYgKGR2YS54cmVzICogZHZhLnlyZXMgPiBkcGEueHJlcyAqIGRwYS55cmVzKSB7Ci0gICAgICAgICAgICBtX2Rvd25zY2FsYXJfd2lkdGggPSBNQVgoZHZhLnhyZXMsIGR2YS55cmVzKTsKLSAgICAgICAgICAgIG1fZG93bnNjYWxhcl9oZWlnaHQgPSBNSU4oZHZhLnhyZXMsIGR2YS55cmVzKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9kb3duc2NhbGFyX3dpZHRoID0gTUFYKGRwYS54cmVzLCBkcGEueXJlcyk7Ci0gICAgICAgICAgICBtX2Rvd25zY2FsYXJfaGVpZ2h0ID0gTUlOKGRwYS54cmVzLCBkcGEueXJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzUG9ydHJhaXRWaWRlbykgewotICAgICAgICAgICAgLy8gU3dhcCB3aWR0aCBhbmQgaGVpZ2h0Ci0gICAgICAgICAgICBtX2Rvd25zY2FsYXJfd2lkdGggPSBtX2Rvd25zY2FsYXJfd2lkdGggXiBtX2Rvd25zY2FsYXJfaGVpZ2h0OwotICAgICAgICAgICAgbV9kb3duc2NhbGFyX2hlaWdodCA9IG1fZG93bnNjYWxhcl93aWR0aCBeIG1fZG93bnNjYWxhcl9oZWlnaHQ7Ci0gICAgICAgICAgICBtX2Rvd25zY2FsYXJfd2lkdGggPSBtX2Rvd25zY2FsYXJfd2lkdGggXiBtX2Rvd25zY2FsYXJfaGVpZ2h0OwotICAgICAgICB9Ci0gICAgfQotICAgIG1fZG93bnNjYWxhcl93aWR0aCA9IEFMSUdOKG1fZG93bnNjYWxhcl93aWR0aCwgMTI4KTsKLSAgICBtX2Rvd25zY2FsYXJfaGVpZ2h0ID0gQUxJR04obV9kb3duc2NhbGFyX2hlaWdodCwgMzIpOwotI2VuZGlmCi0KLSAgICBpZiAoIW1fZG93bnNjYWxhcl93aWR0aCB8fCAhbV9kb3duc2NhbGFyX2hlaWdodCkgewotICAgICAgICBERUJVR19QUklOVF9MT1coIiVzOiBJbnZhbGlkIGRvd25zY2FsYXIgY29uZmlndXJhdGlvbiIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKG1fZm9yY2VfZG93bl9zY2FsYXIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCIlczogbV9mb3JjZV9kb3duX3NjYWxhciAlZCAiLCBfX2Z1bmNfXywgbV9mb3JjZV9kb3duX3NjYWxhcik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIG1lbXNldCgmZm10LCAweDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQpKTsKLSAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBjYXB0dXJlX2NhcGFiaWxpdHk7Ci0gICAgcmMgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmZm10KTsKLSAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiBGYWlsZWQgdG8gZ2V0IGZvcm1hdCBvbiBjYXB0dXJlIG1wbGFuZSIsIF9fZnVuY19fKTsKLSAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgaGVpZ2h0ID0gZm10LmZtdC5waXhfbXAuaGVpZ2h0OwotICAgIHdpZHRoID0gZm10LmZtdC5waXhfbXAud2lkdGg7Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCIlczogZHJpdmVyIHd4aCA9ICVkeCVkLCBkb3duc2NhbGFyIHd4aCA9ICVkeCVkIG1faXNfZGlzcGxheV9zZXNzaW9uID0gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgZm10LmZtdC5waXhfbXAud2lkdGgsIGZtdC5mbXQucGl4X21wLmhlaWdodCwgbV9kb3duc2NhbGFyX3dpZHRoLCBtX2Rvd25zY2FsYXJfaGVpZ2h0LCBtX2lzX2Rpc3BsYXlfc2Vzc2lvbik7Ci0KLSAgICBpZiAoKGZtdC5mbXQucGl4X21wLndpZHRoICogZm10LmZtdC5waXhfbXAuaGVpZ2h0ID4gbV9kb3duc2NhbGFyX3dpZHRoICogbV9kb3duc2NhbGFyX2hlaWdodCkgJiYKLSAgICAgICAgIG1faXNfZGlzcGxheV9zZXNzaW9uKSB7Ci0gICAgICAgIHJjID0gZW5hYmxlX2Rvd25zY2FsYXIoKTsKLSAgICAgICAgaWYgKHJjIDwgMCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiBlbmFibGVfZG93bnNjYWxhciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHJldHVybiByYzsKLSAgICAgICAgfQotCi0gICAgICAgIHdpZHRoID0gbV9kb3duc2NhbGFyX3dpZHRoID4gZm10LmZtdC5waXhfbXAud2lkdGggPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLndpZHRoIDogbV9kb3duc2NhbGFyX3dpZHRoOwotICAgICAgICBoZWlnaHQgPSBtX2Rvd25zY2FsYXJfaGVpZ2h0ID4gZm10LmZtdC5waXhfbXAuaGVpZ2h0ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5oZWlnaHQgOiBtX2Rvd25zY2FsYXJfaGVpZ2h0OwotICAgICAgICBzd2l0Y2ggKGNhcHR1cmVfY2FwYWJpbGl0eSkgewotICAgICAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKLSAgICAgICAgICAgICAgICBjb2xvcl9mb3JtYXQgPSBDT0xPUl9GTVRfTlYxMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTJfVUJXQzoKLSAgICAgICAgICAgICAgICBjb2xvcl9mb3JtYXQgPSBDT0xPUl9GTVRfTlYxMl9VQldDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMl9UUDEwX1VCV0M6Ci0gICAgICAgICAgICAgICAgY29sb3JfZm9ybWF0ID0gQ09MT1JfRk1UX05WMTJfQlBQMTBfVUJXQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkNvbG9yIGZvcm1hdCBub3QgcmVjb2duaXplZFxuIik7Ci0gICAgICAgICAgICAgICAgcmMgPSBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJjOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgICByYyA9IGRpc2FibGVfZG93bnNjYWxhcigpOwotICAgICAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXM6IGRpc2FibGVfZG93bnNjYWxhciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHJldHVybiByYzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1lbXNldCgmZm10LCAweDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQpKTsKLSAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgZm10LmZtdC5waXhfbXAuaGVpZ2h0ID0gaGVpZ2h0OwotICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gd2lkdGg7Ci0gICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBjYXB0dXJlX2NhcGFiaWxpdHk7Ci0gICAgcmMgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfRk1ULCAmZm10KTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiBGYWlsZWQgc2V0IGZvcm1hdCBvbiBjYXB0dXJlIG1wbGFuZSIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIHJjID0gZ2V0X2J1ZmZlcl9yZXEoJmRydl9jdHgub3BfYnVmKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiBGYWlsZWQgdG8gZ2V0IG91dHB1dCBidWZmZXIgcmVxdWlyZW1lbnRzIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJjOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6Ok9NWENudHJsUHJvY2Vzc01zZ0NiCi0KLSAgIERFU0NSSVBUSU9OCi0gICBJTCBDbGllbnQgY2FsbGJhY2tzIGFyZSBnZW5lcmF0ZWQgdGhyb3VnaCB0aGlzIHJvdXRpbmUuIFRoZSBkZWNvZGVyCi0gICBwcm92aWRlcyB0aGUgdGhyZWFkIGNvbnRleHQgZm9yIHRoaXMgcm91dGluZS4KLQotICAgUEFSQU1FVEVSUwotICAgY3R4dCAtLSBDb250ZXh0IGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIHNlbGYuCi0gICBpZCAgIC0tIEV2ZW50IGlkZW50aWZpZXIuIFRoaXMgY291bGQgYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAxLiBDb21tYW5kIGNvbXBsZXRpb24gZXZlbnQKLSAgIDIuIEJ1ZmZlciBkb25lIGNhbGxiYWNrIGV2ZW50Ci0gICAzLiBGcmFtZSBkb25lIGNhbGxiYWNrIGV2ZW50Ci0KLSAgIFJFVFVSTiBWQUxVRQotICAgTm9uZS4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXZvaWQgb214X3ZkZWM6OnByb2Nlc3NfZXZlbnRfY2Iodm9pZCAqY3R4dCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHAxOyAvLyBQYXJhbWV0ZXIgLSAxCi0gICAgdW5zaWduZWQgbG9uZyBwMjsgLy8gUGFyYW1ldGVyIC0gMgotICAgIHVuc2lnbmVkIGxvbmcgaWRlbnQ7Ci0gICAgdW5zaWduZWQgcXNpemU9MDsgLy8gcXNpemUKLSAgICBvbXhfdmRlYyAqcFRoaXMgPSAob214X3ZkZWMgKikgY3R4dDsKLQotICAgIGlmICghcFRoaXMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAlcygpOjpDb250ZXh0IGlzIGluY29ycmVjdCwgYmFpbGluZyBvdXQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFByb3RlY3QgdGhlIHNoYXJlZCBxdWV1ZSBkYXRhIHN0cnVjdHVyZQotICAgIGRvIHsKLSAgICAgICAgLypSZWFkIHRoZSBtZXNzYWdlIGlkJ3MgZnJvbSB0aGUgcXVldWUqLwotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnBUaGlzLT5tX2xvY2spOwotICAgICAgICBxc2l6ZSA9IHBUaGlzLT5tX2NtZF9xLm1fc2l6ZTsKLSAgICAgICAgaWYgKHFzaXplKSB7Ci0gICAgICAgICAgICBwVGhpcy0+bV9jbWRfcS5wb3BfZW50cnkoJnAxLCAmcDIsICZpZGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocXNpemUgPT0gMCAmJiBwVGhpcy0+bV9zdGF0ZSAhPSBPTVhfU3RhdGVQYXVzZSkgewotICAgICAgICAgICAgcXNpemUgPSBwVGhpcy0+bV9mdGJfcS5tX3NpemU7Ci0gICAgICAgICAgICBpZiAocXNpemUpIHsKLSAgICAgICAgICAgICAgICBwVGhpcy0+bV9mdGJfcS5wb3BfZW50cnkoJnAxLCAmcDIsICZpZGVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocXNpemUgPT0gMCAmJiBwVGhpcy0+bV9zdGF0ZSAhPSBPTVhfU3RhdGVQYXVzZSkgewotICAgICAgICAgICAgcXNpemUgPSBwVGhpcy0+bV9ldGJfcS5tX3NpemU7Ci0gICAgICAgICAgICBpZiAocXNpemUpIHsKLSAgICAgICAgICAgICAgICBwVGhpcy0+bV9ldGJfcS5wb3BfZW50cnkoJnAxLCAmcDIsICZpZGVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBUaGlzLT5tX2xvY2spOwotCi0gICAgICAgIC8qcHJvY2VzcyBtZXNzYWdlIGlmIHdlIGhhdmUgb25lKi8KLSAgICAgICAgaWYgKHFzaXplID4gMCkgewotICAgICAgICAgICAgc3dpdGNoIChpZGVudCkgewotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5tX2NiLkV2ZW50SGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT01YX0NvbW1hbmRTdGF0ZVNldDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fc3RhdGUgPSAoT01YX1NUQVRFVFlQRSkgcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIk9NWF9Db21tYW5kU3RhdGVTZXQgY29tcGxldGUsIG1fc3RhdGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9jYi5FdmVudEhhbmRsZXIoJnBUaGlzLT5tX2NtcCwgcFRoaXMtPm1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsIHAxLCBwMiwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPTVhfRXZlbnRFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAyID09IE9NWF9TdGF0ZUludmFsaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJPTVhfRXZlbnRFcnJvcjogcDIgaXMgT01YX1N0YXRlSW52YWxpZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fc3RhdGUgPSAoT01YX1NUQVRFVFlQRSkgcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9jYi5FdmVudEhhbmRsZXIoJnBUaGlzLT5tX2NtcCwgcFRoaXMtPm1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JJbnZhbGlkU3RhdGUsIHAyLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwMiA9PSAodW5zaWduZWQgbG9uZylPTVhfRXJyb3JIYXJkd2FyZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm9teF9yZXBvcnRfZXJyb3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX2NiLkV2ZW50SGFuZGxlcigmcFRoaXMtPm1fY21wLCBwVGhpcy0+bV9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50RXJyb3IsIHAyLCAoT01YX1UzMilOVUxMLCBOVUxMICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9NWF9Db21tYW5kUG9ydERpc2FibGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIk9NWF9Db21tYW5kUG9ydERpc2FibGUgY29tcGxldGUgZm9yIHBvcnQgWyVsdV0iLCBwMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCSVRNQVNLX1BSRVNFTlQoJnBUaGlzLT5tX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX09VVFBVVF9GTFVTSF9JTl9ESVNBQkxFX1BFTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRNQVNLX1NFVCgmcFRoaXMtPm1fZmxhZ3MsIE9NWF9DT01QT05FTlRfRElTQUJMRV9PVVRQVVRfREVGRVJSRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAyID09IE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPnN0cmVhbV9vZmYoT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGVhc2VfYnVmZmVycyhwVGhpcywgVkRFQ19CVUZGRVJfVFlQRV9PVVRQVVQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZhaWxlZCB0byByZWxlYXNlIG91dHB1dCBidWZmZXJzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRVJST1JUWVBFIGVSZXQxID0gcFRoaXMtPmdldF9idWZmZXJfcmVxKCZwVGhpcy0+ZHJ2X2N0eC5vcF9idWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPmluX3JlY29uZmlnID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVJldCAhPSAgT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfYnVmZmVyX3JlcSBmYWlsZWQgZVJldCA9ICVkIixlUmV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9lcnJvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX2NiLkV2ZW50SGFuZGxlcigmcFRoaXMtPm1fY21wLCBwVGhpcy0+bV9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwgcDEsIHAyLCBOVUxMICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RW5hYmxlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJPTVhfQ29tbWFuZFBvcnRFbmFibGUgY29tcGxldGUgZm9yIHBvcnQgWyVsdV0iLCBwMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX2NiLkV2ZW50SGFuZGxlcigmcFRoaXMtPm1fY21wLCBwVGhpcy0+bV9hcHBfZGF0YSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsIHAxLCBwMiwgTlVMTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX2NiLkV2ZW50SGFuZGxlcigmcFRoaXMtPm1fY21wLCBwVGhpcy0+bV9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwgcDEsIHAyLCBOVUxMICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6ICVzKCk6OkV2ZW50SGFuZGxlciBpcyBOVUxMIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVEI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FUlJPUlRZUEUgaXJldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlyZXQgPSBwVGhpcy0+ZW1wdHlfdGhpc19idWZmZXJfcHJveHkoKE9NWF9IQU5ETEVUWVBFKXAxLCAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXJldCA9PSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZW1wdHlfdGhpc19idWZmZXJfcHJveHkgZmFpbHVyZSBkdWUgdG8gSFcgb3ZlcmxvYWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9od19vdmVybG9hZCAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXJldCAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImVtcHR5X3RoaXNfYnVmZmVyX3Byb3h5IGZhaWx1cmUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9lcnJvciAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GVEI6Ci0gICAgICAgICAgICAgICAgICAgIGlmICggcFRoaXMtPmZpbGxfdGhpc19idWZmZXJfcHJveHkoKE9NWF9IQU5ETEVUWVBFKShpbnRwdHJfdClwMSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKShpbnRwdHJfdClwMikgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImZpbGxfdGhpc19idWZmZXJfcHJveHkgZmFpbHVyZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm9teF9yZXBvcnRfZXJyb3IgKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT01QT05FTlRfR0VORVJBVEVfQ09NTUFORDoKLSAgICAgICAgICAgICAgICAgICAgcFRoaXMtPnNlbmRfY29tbWFuZF9wcm94eSgmcFRoaXMtPm1fY21wLChPTVhfQ09NTUFORFRZUEUpcDEsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfVTMyKXAyLChPTVhfUFRSKU5VTEwpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQ6Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHAyICE9IFZERUNfU19TVUNDRVNTICYmIHAyICE9IFZERUNfU19JTlBVVF9CSVRTVFJFQU1fRVJSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQgZmFpbHVyZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm9teF9yZXBvcnRfZXJyb3IgKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocDIgPT0gVkRFQ19TX0lOUFVUX0JJVFNUUkVBTV9FUlIgJiYgcDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+dGltZV9zdGFtcF9kdHMucmVtb3ZlX3RpbWVfc3RhbXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9NWF9CVUZGRVJIRUFERVJUWVBFICopKGludHB0cl90KXAxKS0+blRpbWVTdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwVGhpcy0+ZHJ2X2N0eC5pbnRlcmxhY2UgIT0gVkRFQ19JbnRlcmxhY2VGcmFtZVByb2dyZXNzaXZlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgP3RydWU6ZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBUaGlzLT5lbXB0eV9idWZmZXJfZG9uZSgmcFRoaXMtPm1fY21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9CVUZGRVJIRUFERVJUWVBFICopKGludHB0cl90KXAxKSAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImVtcHR5X2J1ZmZlcl9kb25lIGZhaWx1cmUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9lcnJvciAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT01QT05FTlRfR0VORVJBVEVfSU5GT19GSUVMRF9EUk9QUEVEOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcCA9IChpbnQ2NF90ICopKGludHB0cl90KXAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT50aW1lX3N0YW1wX2R0cy5yZW1vdmVfdGltZV9zdGFtcCgqdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFRoaXMtPmRydl9jdHguaW50ZXJsYWNlICE9IFZERUNfSW50ZXJsYWNlRnJhbWVQcm9ncmVzc2l2ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgP3RydWU6ZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh0aW1lc3RhbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GQkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAyICE9IFZERUNfU19TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZCRCBmYWlsdXJlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHBUaGlzLT5maWxsX2J1ZmZlcl9kb25lKCZwVGhpcy0+bV9jbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9CVUZGRVJIRUFERVJUWVBFICopKGludHB0cl90KXAxKSAhPSBPTVhfRXJyb3JOb25lICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZmlsbF9idWZmZXJfZG9uZSBmYWlsdXJlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVF9JTlBVVF9GTFVTSDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJEcml2ZXIgZmx1c2ggaS9wIFBvcnQgY29tcGxldGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBUaGlzLT5pbnB1dF9mbHVzaF9wcm9ncmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJXQVJOSU5HOiBVbmV4cGVjdGVkIGZsdXNoIGZyb20gZHJpdmVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPmV4ZWN1dGVfaW5wdXRfZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5tX2NiLkV2ZW50SGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAyICE9IFZERUNfU19TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlRfSU5QVVRfRkxVU0ggZmFpbHVyZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHdlIG5lZWQgZ2VuZXJhdGUgZXZlbnQgZm9yIEZsdXNoIGRvbmUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCSVRNQVNLX1BSRVNFTlQoJnBUaGlzLT5tX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfSU5QVVRfRkxVU0hfUEVORElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUiAoJnBUaGlzLT5tX2ZsYWdzLE9NWF9DT01QT05FTlRfSU5QVVRfRkxVU0hfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiSW5wdXQgRmx1c2ggY29tcGxldGVkIC0gTm90aWZ5IENsaWVudCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9jYi5FdmVudEhhbmRsZXIoJnBUaGlzLT5tX2NtcCwgcFRoaXMtPm1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsT01YX0NvbW1hbmRGbHVzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYLE5VTEwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmcFRoaXMtPm1fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGhpcy0+c3RyZWFtX29mZihPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBjYWxsIHN0cmVhbW9mZiBvbiBPVVRQVVQgUG9ydCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm9teF9yZXBvcnRfZXJyb3IgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+c3RyZWFtaW5nW09VVFBVVF9QT1JUXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcFRoaXMtPm91dHB1dF9mbHVzaF9wcm9ncmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJJbnB1dCBmbHVzaCBkb25lIGhlbmNlIGlzc3VlIHN0b3AiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5wb3N0X2V2ZW50ICgodW5zaWduZWQgaW50KU5VTEwsIFZERUNfU19TVUNDRVNTLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9TVE9QX0RPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAlcygpOjpFdmVudEhhbmRsZXIgaXMgTlVMTCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVF9PVVRQVVRfRkxVU0g6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRHJpdmVyIGZsdXNoIG8vcCBQb3J0IGNvbXBsZXRlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwVGhpcy0+b3V0cHV0X2ZsdXNoX3Byb2dyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIldBUk5JTkc6IFVuZXhwZWN0ZWQgZmx1c2ggZnJvbSBkcml2ZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+ZXhlY3V0ZV9vdXRwdXRfZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5tX2NiLkV2ZW50SGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAyICE9IFZERUNfU19TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlRfT1VUUFVUX0ZMVVNIIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHdlIG5lZWQgZ2VuZXJhdGUgZXZlbnQgZm9yIEZsdXNoIGRvbmUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCSVRNQVNLX1BSRVNFTlQoJnBUaGlzLT5tX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfT1VUUFVUX0ZMVVNIX1BFTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiTm90aWZ5IE91dHB1dCBGbHVzaCBkb25lIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIgKCZwVGhpcy0+bV9mbGFncyxPTVhfQ09NUE9ORU5UX09VVFBVVF9GTFVTSF9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fY2IuRXZlbnRIYW5kbGVyKCZwVGhpcy0+bV9jbXAsIHBUaGlzLT5tX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudENtZENvbXBsZXRlLE9NWF9Db21tYW5kRmx1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgsTlVMTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCZwVGhpcy0+bV9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX09VVFBVVF9GTFVTSF9JTl9ESVNBQkxFX1BFTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiSW50ZXJuYWwgZmx1c2ggY29tcGxldGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUiAoJnBUaGlzLT5tX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfT1VUUFVUX0ZMVVNIX0lOX0RJU0FCTEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCSVRNQVNLX1BSRVNFTlQoJnBUaGlzLT5tX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0RJU0FCTEVfT1VUUFVUX0RFRkVSUkVEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPnBvc3RfZXZlbnQoT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUiAoJnBUaGlzLT5tX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0RJU0FCTEVfT1VUUFVUX0RFRkVSUkVEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIgKCZwVGhpcy0+bV9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9PVVRQVVRfRElTQUJMRV9QRU5ESU5HKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmcFRoaXMtPm1fZmxhZ3MgLE9NWF9DT01QT05FTlRfSURMRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFRoaXMtPnN0cmVhbV9vZmYoT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIGNhbGwgc3RyZWFtb2ZmIG9uIENBUFRVUkUgUG9ydCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm9teF9yZXBvcnRfZXJyb3IgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+c3RyZWFtaW5nW0NBUFRVUkVfUE9SVF0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwVGhpcy0+aW5wdXRfZmx1c2hfcHJvZ3Jlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiT3V0cHV0IGZsdXNoIGRvbmUgaGVuY2UgaXNzdWUgc3RvcCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPnBvc3RfZXZlbnQgKCh1bnNpZ25lZCBpbnQpTlVMTCwgVkRFQ19TX1NVQ0NFU1MsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1NUT1BfRE9ORSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6ICVzKCk6OkV2ZW50SGFuZGxlciBpcyBOVUxMIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1NUQVJUX0RPTkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiUnhkIE9NWF9DT01QT05FTlRfR0VORVJBVEVfU1RBUlRfRE9ORSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5tX2NiLkV2ZW50SGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocDIgIT0gVkRFQ19TX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1NUQVJUX0RPTkUgRmFpbHVyZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm9teF9yZXBvcnRfZXJyb3IgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWF9DT01QT05FTlRfR0VORVJBVEVfU1RBUlRfRE9ORSBTdWNjZXNzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCZwVGhpcy0+bV9mbGFncyxPTVhfQ09NUE9ORU5UX0VYRUNVVEVfUEVORElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk1vdmUgdG8gZXhlY3V0aW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgY2FsbGJhY2sgbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUigoJnBUaGlzLT5tX2ZsYWdzKSxPTVhfQ09NUE9ORU5UX0VYRUNVVEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fc3RhdGUgPSBPTVhfU3RhdGVFeGVjdXRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fY2IuRXZlbnRIYW5kbGVyKCZwVGhpcy0+bV9jbXAsIHBUaGlzLT5tX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsT01YX0NvbW1hbmRTdGF0ZVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZUV4ZWN1dGluZywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJJVE1BU0tfUFJFU0VOVCgmcFRoaXMtPm1fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX1BBVVNFX1BFTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC8qaW9jdGwgKHBUaGlzLT5kcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWREVDX0lPQ1RMX0NNRF9QQVVTRSxOVUxMICkgPCAqLzApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlZERUNfSU9DVExfQ01EX1BBVVNFIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9lcnJvciAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkV2ZW50IEhhbmRsZXIgY2FsbGJhY2sgaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9QQVVTRV9ET05FOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlJ4ZCBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1BBVVNFX0RPTkUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFRoaXMtPm1fY2IuRXZlbnRIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwMiAhPSBWREVDX1NfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk9NWF9DT01QT05FTlRfR0VORVJBVEVfUEFVU0VfRE9ORSByZXQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9lcnJvciAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5jb21wbGV0ZV9wZW5kaW5nX2J1ZmZlcl9kb25lX2NicygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmcFRoaXMtPm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9QQVVTRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiT01YX0NPTVBPTkVOVF9HRU5FUkFURV9QQVVTRV9ET05FIG5vZml0eSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2VuZCB0aGUgY2FsbGJhY2sgbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUigoJnBUaGlzLT5tX2ZsYWdzKSxPTVhfQ09NUE9ORU5UX1BBVVNFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX3N0YXRlID0gT01YX1N0YXRlUGF1c2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fY2IuRXZlbnRIYW5kbGVyKCZwVGhpcy0+bV9jbXAsIHBUaGlzLT5tX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsT01YX0NvbW1hbmRTdGF0ZVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZVBhdXNlLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogJXMoKTo6RXZlbnRIYW5kbGVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT01QT05FTlRfR0VORVJBVEVfUkVTVU1FX0RPTkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiUnhkIE9NWF9DT01QT05FTlRfR0VORVJBVEVfUkVTVU1FX0RPTkUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFRoaXMtPm1fY2IuRXZlbnRIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwMiAhPSBWREVDX1NfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk9NWF9DT01QT05FTlRfR0VORVJBVEVfUkVTVU1FX0RPTkUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9lcnJvciAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCSVRNQVNLX1BSRVNFTlQoJnBUaGlzLT5tX2ZsYWdzLE9NWF9DT01QT05FTlRfRVhFQ1VURV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiTW92aW5nIHRoZSBkZWNvZGVyIHRvIGV4ZWN1dGUgc3RhdGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBjYWxsYmFjayBub3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCgmcFRoaXMtPm1fZmxhZ3MpLE9NWF9DT01QT05FTlRfRVhFQ1VURV9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9zdGF0ZSA9IE9NWF9TdGF0ZUV4ZWN1dGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9jYi5FdmVudEhhbmRsZXIoJnBUaGlzLT5tX2NtcCwgcFRoaXMtPm1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSxPTVhfQ29tbWFuZFN0YXRlU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0YXRlRXhlY3V0aW5nLE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAlcygpOjpFdmVudEhhbmRsZXIgaXMgTlVMTCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9TVE9QX0RPTkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiUnhkIE9NWF9DT01QT05FTlRfR0VORVJBVEVfU1RPUF9ET05FIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5tX2NiLkV2ZW50SGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocDIgIT0gVkRFQ19TX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1NUT1BfRE9ORSByZXQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9lcnJvciAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5jb21wbGV0ZV9wZW5kaW5nX2J1ZmZlcl9kb25lX2NicygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmcFRoaXMtPm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1NUT1BfRE9ORSBTdWNjZXNzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgY2FsbGJhY2sgbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUigoJnBUaGlzLT5tX2ZsYWdzKSxPTVhfQ09NUE9ORU5UX0lETEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fc3RhdGUgPSBPTVhfU3RhdGVJZGxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiTW92ZSB0byBJZGxlIFN0YXRlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fY2IuRXZlbnRIYW5kbGVyKCZwVGhpcy0+bV9jbXAscFRoaXMtPm1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSxPTVhfQ29tbWFuZFN0YXRlU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0YXRlSWRsZSxOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogJXMoKTo6RXZlbnRIYW5kbGVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT01QT05FTlRfR0VORVJBVEVfUE9SVF9SRUNPTkZJRzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocDIgPT0gT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJSeGQgUE9SVF9SRUNPTkZJRzogT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+aW5fcmVjb25maWcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIGVsc2UgaWYgKHAyID09IE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiUnhkIFBPUlRfUkVDT05GSUc6IE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiByZXNvbHV0aW9uIGlzIGNoYW5nZWQgaW4gc21vb3RoIHN0cmVhbWluZyBtb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGhpcy0+bV9zbW9vdGhzdHJlYW1pbmdfbW9kZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBUaGlzLT5mcmFtZXNpemUubldpZHRoICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwVGhpcy0+ZnJhbWVzaXplLm5IZWlnaHQgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+ZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiUmVzb2x1dGlvbiBjaGFuZ2VkIGZyb206IHd4aCA9ICVkeCVkIHRvOiB3eGggPSAlZHglZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5mcmFtZXNpemUubldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+ZnJhbWVzaXplLm5IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIG5ldyByZXNvbHV0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+ZnJhbWVzaXplLm5XaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5mcmFtZXNpemUubkhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBDMkQgd2l0aCBuZXcgcmVzb2x1dGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwVGhpcy0+Y2xpZW50X2J1ZmZlcnMudXBkYXRlX2J1ZmZlcl9yZXEoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXR0aW5nIEMyRCBidWZmZXIgcmVxdWlyZW1lbnRzIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIG5ldyBjcm9wIGluZm9ybWF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5yZWN0YW5nbGUubkxlZnQgPSBwVGhpcy0+ZHJ2X2N0eC5mcmFtZV9zaXplLmxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5yZWN0YW5nbGUublRvcCA9IHBUaGlzLT5kcnZfY3R4LmZyYW1lX3NpemUudG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+cmVjdGFuZ2xlLm5XaWR0aCA9IHBUaGlzLT5kcnZfY3R4LmZyYW1lX3NpemUucmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5yZWN0YW5nbGUubkhlaWdodCA9IHBUaGlzLT5kcnZfY3R4LmZyYW1lX3NpemUuYm90dG9tOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbGlkYXRlIHRoZSBuZXcgY3JvcCBpbmZvcm1hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFRoaXMtPnJlY3RhbmdsZS5uTGVmdCArIHBUaGlzLT5yZWN0YW5nbGUubldpZHRoID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGgpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiQ3JvcCBMWyV1XSArIFJbJXVdID4gV1sldV0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+cmVjdGFuZ2xlLm5MZWZ0LCBwVGhpcy0+cmVjdGFuZ2xlLm5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+cmVjdGFuZ2xlLm5MZWZ0ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5yZWN0YW5nbGUubldpZHRoID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+ZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJDcm9wIFJbJXVdID4gV1sldV0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPnJlY3RhbmdsZS5uV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+ZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+cmVjdGFuZ2xlLm5XaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5yZWN0YW5nbGUublRvcCArIHBUaGlzLT5yZWN0YW5nbGUubkhlaWdodCA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+ZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJDcm9wIFRbJXVdICsgQlsldV0gPiBIWyV1XSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPnJlY3RhbmdsZS5uVG9wLCBwVGhpcy0+cmVjdGFuZ2xlLm5IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPnJlY3RhbmdsZS5uVG9wID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5yZWN0YW5nbGUubkhlaWdodCA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkNyb3AgQlsldV0gPiBIWyV1XSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5yZWN0YW5nbGUubkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5yZWN0YW5nbGUubkhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlVwZGF0ZWQgQ3JvcCBJbmZvOiBMOiAldSwgVDogJXUsIFI6ICV1LCBCOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPnJlY3RhbmdsZS5uTGVmdCwgcFRoaXMtPnJlY3RhbmdsZS5uVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5yZWN0YW5nbGUubldpZHRoLCBwVGhpcy0+cmVjdGFuZ2xlLm5IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocDIgPT0gT01YX1FUSUluZGV4Q29uZmlnRGVzY3JpYmVDb2xvckFzcGVjdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiUnhkIFBPUlRfUkVDT05GSUc6IE9NWF9RVElJbmRleENvbmZpZ0Rlc2NyaWJlQ29sb3JBc3BlY3RzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwMiA9PSBPTVhfUVRJSW5kZXhDb25maWdEZXNjcmliZUhEUkNvbG9ySW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJSeGQgUE9SVF9SRUNPTkZJRzogT01YX1FUSUluZGV4Q29uZmlnRGVzY3JpYmVIRFJjb2xvcmluZm8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiUnhkIEludmFsaWQgUE9SVF9SRUNPTkZJRyBldmVudCAoJWx1KSIsIHAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGhpcy0+bV9kZWJ1Zy5vdXRmaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjbG9zZShwVGhpcy0+bV9kZWJ1Zy5vdXRmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fZGVidWcub3V0ZmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGhpcy0+bV9kZWJ1Zy5vdXRfeW1ldGFfZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UocFRoaXMtPm1fZGVidWcub3V0X3ltZXRhX2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9kZWJ1Zy5vdXRfeW1ldGFfZmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGhpcy0+bV9kZWJ1Zy5vdXRfdXZtZXRhX2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKHBUaGlzLT5tX2RlYnVnLm91dF91dm1ldGFfZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX2RlYnVnLm91dF91dm1ldGFfZmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5zZWN1cmVfbW9kZSAmJiBwVGhpcy0+bV9jYi5FdmVudEhhbmRsZXIgJiYgcFRoaXMtPmluX3JlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5wcmVmZXRjaE5ld0J1ZmZlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFRoaXMtPm1fY2IuRXZlbnRIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2RhdGFbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2RhdGFbMF0gPSAocDIgPT0gT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fcmVjb25maWdfaGVpZ2h0IDogcFRoaXMtPnJlY3RhbmdsZS5uSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9kYXRhWzFdID0gKHAyID09IE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24pID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX3JlY29uZmlnX3dpZHRoIDogcFRoaXMtPnJlY3RhbmdsZS5uV2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfZGF0YVsyXSA9IChwMiA9PSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9kYXRhWzBdIDogcFRoaXMtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfZGF0YVszXSA9IChwMiA9PSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9kYXRhWzFdIDogcFRoaXMtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9jYi5FdmVudEhhbmRsZXIoJnBUaGlzLT5tX2NtcCwgcFRoaXMtPm1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgcDEsIHAyLCAodm9pZCopIGZyYW1lX2RhdGEgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6ICVzKCk6OkV2ZW50SGFuZGxlciBpcyBOVUxMIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FT1NfRE9ORToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJSeGQgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FT1NfRE9ORSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGhpcy0+bV9jYi5FdmVudEhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fY2IuRXZlbnRIYW5kbGVyKCZwVGhpcy0+bV9jbXAsIHBUaGlzLT5tX2FwcF9kYXRhLCBPTVhfRXZlbnRCdWZmZXJGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYLCBPTVhfQlVGRkVSRkxBR19FT1MsIE5VTEwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6ICVzKCk6OkV2ZW50SGFuZGxlciBpcyBOVUxMIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+cHJldl90cyA9IExMT05HX01BWDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+cnN0X3ByZXZfdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0hBUkRXQVJFX0VSUk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0hBUkRXQVJFX0VSUk9SIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm9teF9yZXBvcnRfZXJyb3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9VTlNVUFBPUlRFRF9TRVRUSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1VOU1VQUE9SVEVEX1NFVFRJTkciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF91bnN1cHBvcnRlZF9zZXR0aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT01QT05FTlRfR0VORVJBVEVfSEFSRFdBUkVfT1ZFUkxPQUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk9NWF9DT01QT05FTlRfR0VORVJBVEVfSEFSRFdBUkVfT1ZFUkxPQUQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9od19vdmVybG9hZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnBUaGlzLT5tX2xvY2spOwotICAgICAgICBxc2l6ZSA9IHBUaGlzLT5tX2NtZF9xLm1fc2l6ZTsKLSAgICAgICAgaWYgKHBUaGlzLT5tX3N0YXRlICE9IE9NWF9TdGF0ZVBhdXNlKQotICAgICAgICAgICAgcXNpemUgKz0gKHBUaGlzLT5tX2Z0Yl9xLm1fc2l6ZSArIHBUaGlzLT5tX2V0Yl9xLm1fc2l6ZSk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwVGhpcy0+bV9sb2NrKTsKLSAgICB9IHdoaWxlIChxc2l6ZT4wKTsKLQotfQotCi1pbnQgb214X3ZkZWM6OnVwZGF0ZV9yZXNvbHV0aW9uKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgaW50IHNjYW5fbGluZXMpCi17Ci0gICAgaW50IGZvcm1hdF9jaGFuZ2VkID0gMDsKLSAgICBpZiAoKGhlaWdodCAhPSAoaW50KWRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQpIHx8Ci0gICAgICAgICAgICAod2lkdGggIT0gKGludClkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGgpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIk5PVEVfQ0lGOiBXL0ggJWQgKCVkKSwgJWQgKCVkKSIsCi0gICAgICAgICAgICAgICAgd2lkdGgsIGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aCwKLSAgICAgICAgICAgICAgICBoZWlnaHQsZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodCk7Ci0gICAgICAgIGZvcm1hdF9jaGFuZ2VkID0gMTsKLSAgICB9Ci0gICAgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodCA9IGhlaWdodDsKLSAgICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGggPSB3aWR0aDsKLSAgICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uc2Nhbl9saW5lcyA9IHNjYW5fbGluZXM7Ci0gICAgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLnN0cmlkZSA9IHN0cmlkZTsKLQotICAgIGlmICghaXNfZG93bl9zY2FsYXJfZW5hYmxlZCkgewotICAgICAgICByZWN0YW5nbGUubkxlZnQgPSBtX2V4dHJhZGF0YV9pbmZvLm91dHB1dF9jcm9wX3JlY3QubkxlZnQ7Ci0gICAgICAgIHJlY3RhbmdsZS5uVG9wID0gbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5Ub3A7Ci0gICAgICAgIHJlY3RhbmdsZS5uV2lkdGggPSBtX2V4dHJhZGF0YV9pbmZvLm91dHB1dF9jcm9wX3JlY3QubldpZHRoOwotICAgICAgICByZWN0YW5nbGUubkhlaWdodCA9IG1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfcmVjdC5uSGVpZ2h0OwotICAgIH0KLSAgICByZXR1cm4gZm9ybWF0X2NoYW5nZWQ7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgb214X3ZkZWM6OmlzX3ZpZGVvX3Nlc3Npb25fc3VwcG9ydGVkKCkKLXsKLSAgICBpZiAoKGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aCAqCi0gICAgICAgICAgICAgICAgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodCA+Ci0gICAgICAgICAgICAgICAgbV9kZWNvZGVyX2NhcGFiaWxpdHkubWF4X3dpZHRoICoKLSAgICAgICAgICAgICAgICBtX2RlY29kZXJfY2FwYWJpbGl0eS5tYXhfaGVpZ2h0KSB8fAotICAgICAgICAgICAgKGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aCoKLSAgICAgICAgICAgICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0IDwKLSAgICAgICAgICAgICBtX2RlY29kZXJfY2FwYWJpbGl0eS5taW5fd2lkdGggKgotICAgICAgICAgICAgIG1fZGVjb2Rlcl9jYXBhYmlsaXR5Lm1pbl9oZWlnaHQpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKAotICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBXeEggPSAoJXUpeCgldSkgc3VwcG9ydGVkIHJhbmdlIGlzIG1pbigldSl4KCV1KSAtIG1heCgldSl4KCV1KSIsCi0gICAgICAgICAgICAgICAgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoLAotICAgICAgICAgICAgICAgIGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgbV9kZWNvZGVyX2NhcGFiaWxpdHkubWluX3dpZHRoLAotICAgICAgICAgICAgICAgIG1fZGVjb2Rlcl9jYXBhYmlsaXR5Lm1pbl9oZWlnaHQsCi0gICAgICAgICAgICAgICAgbV9kZWNvZGVyX2NhcGFiaWxpdHkubWF4X3dpZHRoLAotICAgICAgICAgICAgICAgIG1fZGVjb2Rlcl9jYXBhYmlsaXR5Lm1heF9oZWlnaHQpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgIH0KLSAgICBERUJVR19QUklOVF9ISUdIKCJ2aWRlbyBzZXNzaW9uIHN1cHBvcnRlZCIpOwotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi1pbnQgb214X3ZkZWM6OmxvZ19pbnB1dF9idWZmZXJzKGNvbnN0IGNoYXIgKmJ1ZmZlcl9hZGRyLCBpbnQgYnVmZmVyX2xlbikKLXsKLSAgICBpZiAobV9kZWJ1Zy5pbl9idWZmZXJfbG9nICYmICFtX2RlYnVnLmluZmlsZSkgewotICAgICAgICBpZighc3RybmNtcChkcnZfY3R4LmtpbmQsIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzIiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgICAgICAgICBzbnByaW50ZihtX2RlYnVnLmluZmlsZV9uYW1lLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSwgIiVzL2lucHV0X2RlY18lZF8lZF8lcC5tcGciLCBtX2RlYnVnLmxvZ19sb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGgsIGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQsIHRoaXMpOwotICAgICAgICB9IGVsc2UgaWYoIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tdmMiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgICAgICAgICBzbnByaW50ZihtX2RlYnVnLmluZmlsZV9uYW1lLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSwgIiVzL2lucHV0X2RlY18lZF8lZF8lcC4yNjQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWJ1Zy5sb2dfbG9jLCBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGgsIGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQsIHRoaXMpOwotICAgICAgICB9IGVsc2UgaWYoIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oZXZjIiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYobV9kZWJ1Zy5pbmZpbGVfbmFtZSwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUsICIlcy9pbnB1dF9kZWNfJWRfJWRfJXAuMjY1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVidWcubG9nX2xvYywgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoLCBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0LCB0aGlzKTsKLSAgICAgICAgfSBlbHNlIGlmKCFzdHJuY21wKGRydl9jdHgua2luZCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA4IiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYobV9kZWJ1Zy5pbmZpbGVfbmFtZSwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUsICIlcy9pbnB1dF9kZWNfJWRfJWRfJXAuaXZmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVidWcubG9nX2xvYywgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoLCBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0LCB0aGlzKTsKLSAgICAgICAgfSBlbHNlIGlmKCFzdHJuY21wKGRydl9jdHgua2luZCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA5IiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYobV9kZWJ1Zy5pbmZpbGVfbmFtZSwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUsICIlcy9pbnB1dF9kZWNfJWRfJWRfJXAuaXZmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVidWcubG9nX2xvYywgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoLCBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0LCB0aGlzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIHNucHJpbnRmKG1fZGVidWcuaW5maWxlX25hbWUsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFLCAiJXMvaW5wdXRfZGVjXyVkXyVkXyVwLmJpbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2RlYnVnLmxvZ19sb2MsIGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aCwgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodCwgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9kZWJ1Zy5pbmZpbGUgPSBmb3BlbiAobV9kZWJ1Zy5pbmZpbGVfbmFtZSwgImFiIik7Ci0gICAgICAgIGlmICghbV9kZWJ1Zy5pbmZpbGUpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZhaWxlZCB0byBvcGVuIGlucHV0IGZpbGU6ICVzIGZvciBsb2dnaW5nIiwgbV9kZWJ1Zy5pbmZpbGVfbmFtZSk7Ci0gICAgICAgICAgICBtX2RlYnVnLmluZmlsZV9uYW1lWzBdID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDgiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkgfHwKLSAgICAgICAgICAgICAgICAhc3RybmNtcChkcnZfY3R4LmtpbmQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOSIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgc3RydWN0IGl2Zl9maWxlX2hlYWRlciB7Ci0gICAgICAgICAgICAgICAgT01YX1U4IHNpZ25hdHVyZVs0XTsgLy89J0RLSUYnOwotICAgICAgICAgICAgICAgIE9NWF9VOCB2ZXJzaW9uICAgICAgICAgOyAvLz0gMDsKLSAgICAgICAgICAgICAgICBPTVhfVTggaGVhZGVyc2l6ZSAgICAgIDsgLy89IDMyOwotICAgICAgICAgICAgICAgIE9NWF9VMzIgRm91ckNDOwotICAgICAgICAgICAgICAgIE9NWF9VOCB3aWR0aDsKLSAgICAgICAgICAgICAgICBPTVhfVTggaGVpZ2h0OwotICAgICAgICAgICAgICAgIE9NWF9VMzIgcmF0ZTsKLSAgICAgICAgICAgICAgICBPTVhfVTMyIHNjYWxlOwotICAgICAgICAgICAgICAgIE9NWF9VMzIgbGVuZ3RoOwotICAgICAgICAgICAgICAgIE9NWF9VOCB1bnVzZWRbNF07Ci0gICAgICAgICAgICB9IGZpbGVfaGVhZGVyOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKikmZmlsZV9oZWFkZXIsMCxzaXplb2YoZmlsZV9oZWFkZXIpKTsKLSAgICAgICAgICAgIGZpbGVfaGVhZGVyLnNpZ25hdHVyZVswXSA9ICdEJzsKLSAgICAgICAgICAgIGZpbGVfaGVhZGVyLnNpZ25hdHVyZVsxXSA9ICdLJzsKLSAgICAgICAgICAgIGZpbGVfaGVhZGVyLnNpZ25hdHVyZVsyXSA9ICdJJzsKLSAgICAgICAgICAgIGZpbGVfaGVhZGVyLnNpZ25hdHVyZVszXSA9ICdGJzsKLSAgICAgICAgICAgIGZpbGVfaGVhZGVyLnZlcnNpb24gPSAwOwotICAgICAgICAgICAgZmlsZV9oZWFkZXIuaGVhZGVyc2l6ZSA9IDMyOwotICAgICAgICAgICAgc3dpdGNoIChkcnZfY3R4LmRlY29kZXJfZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBWREVDX0NPREVDVFlQRV9WUDg6Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVfaGVhZGVyLkZvdXJDQyA9IDB4MzAzODUwNTY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVkRFQ19DT0RFQ1RZUEVfVlA5OgotICAgICAgICAgICAgICAgICAgICBmaWxlX2hlYWRlci5Gb3VyQ0MgPSAweDMwMzk1MDU2OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigidW5zdXBwb3J0ZWQgZm9ybWF0IGZvciBWUDgvVlA5Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZndyaXRlKChjb25zdCBjaGFyICopJmZpbGVfaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmlsZV9oZWFkZXIpLDEsbV9kZWJ1Zy5pbmZpbGUpOwotICAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9kZWJ1Zy5pbmZpbGUgJiYgYnVmZmVyX2FkZHIgJiYgYnVmZmVyX2xlbikgewotICAgICAgICBpZiAoIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDgiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkgfHwKLSAgICAgICAgICAgICAgICAhc3RybmNtcChkcnZfY3R4LmtpbmQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOSIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgc3RydWN0IHZweF9pdmZfZnJhbWVfaGVhZGVyIHsKLSAgICAgICAgICAgICAgICBPTVhfVTMyIGZyYW1lc2l6ZTsKLSAgICAgICAgICAgICAgICBPTVhfVTMyIHRpbWVzdGFtcF9sbzsKLSAgICAgICAgICAgICAgICBPTVhfVTMyIHRpbWVzdGFtcF9oaTsKLSAgICAgICAgICAgIH0gdnB4X2ZyYW1lX2hlYWRlcjsKLSAgICAgICAgICAgIHZweF9mcmFtZV9oZWFkZXIuZnJhbWVzaXplID0gYnVmZmVyX2xlbjsKLSAgICAgICAgICAgIC8qIEN1cnJlbnRseSBGVyBkb2Vzbid0IHVzZSB0aW1lc3RhbXAgdmFsdWVzICovCi0gICAgICAgICAgICB2cHhfZnJhbWVfaGVhZGVyLnRpbWVzdGFtcF9sbyA9IDA7Ci0gICAgICAgICAgICB2cHhfZnJhbWVfaGVhZGVyLnRpbWVzdGFtcF9oaSA9IDA7Ci0gICAgICAgICAgICBmd3JpdGUoKGNvbnN0IGNoYXIgKikmdnB4X2ZyYW1lX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZweF9mcmFtZV9oZWFkZXIpLDEsbV9kZWJ1Zy5pbmZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIGZ3cml0ZShidWZmZXJfYWRkciwgYnVmZmVyX2xlbiwgMSwgbV9kZWJ1Zy5pbmZpbGUpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IG9teF92ZGVjOjpsb2dfb3V0cHV0X2J1ZmZlcnMoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgewotICAgIGludCBidWZfaW5kZXggPSAwOwotICAgIGNoYXIgKnRlbXAgPSBOVUxMOwotCi0gICAgaWYgKCEobV9kZWJ1Zy5vdXRfYnVmZmVyX2xvZyB8fCBtX2RlYnVnLm91dF9tZXRhX2J1ZmZlcl9sb2cpIHx8ICFidWZmZXIgfHwgIWJ1ZmZlci0+bkZpbGxlZExlbikKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAobV9kZWJ1Zy5vdXRfYnVmZmVyX2xvZyAmJiAhbV9kZWJ1Zy5vdXRmaWxlKSB7Ci0gICAgICAgIHNucHJpbnRmKG1fZGVidWcub3V0ZmlsZV9uYW1lLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSwgIiVzL291dHB1dF8lZF8lZF8lcC55dXYiLAotICAgICAgICAgICAgICAgIG1fZGVidWcubG9nX2xvYywgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoLCBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0LCB0aGlzKTsKLSAgICAgICAgbV9kZWJ1Zy5vdXRmaWxlID0gZm9wZW4gKG1fZGVidWcub3V0ZmlsZV9uYW1lLCAiYWIiKTsKLSAgICAgICAgaWYgKCFtX2RlYnVnLm91dGZpbGUpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlOiAlcyBmb3IgbG9nZ2luZyIsIG1fZGVidWcubG9nX2xvYyk7Ci0gICAgICAgICAgICBtX2RlYnVnLm91dGZpbGVfbmFtZVswXSA9ICdcMCc7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobV9kZWJ1Zy5vdXRfbWV0YV9idWZmZXJfbG9nICYmICFtX2RlYnVnLm91dF95bWV0YV9maWxlICYmICFtX2RlYnVnLm91dF91dm1ldGFfZmlsZSkgewotICAgICAgICBzbnByaW50ZihtX2RlYnVnLm91dF95bWV0YWZpbGVfbmFtZSwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUsICIlcy9vdXRwdXRfJWRfJWRfJXAueW1ldGEiLAotICAgICAgICAgICAgICAgIG1fZGVidWcubG9nX2xvYywgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoLCBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0LCB0aGlzKTsKLSAgICAgICAgc25wcmludGYobV9kZWJ1Zy5vdXRfdXZtZXRhZmlsZV9uYW1lLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSwgIiVzL291dHB1dF8lZF8lZF8lcC51dm1ldGEiLAotICAgICAgICAgICAgICAgIG1fZGVidWcubG9nX2xvYywgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoLCBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0LCB0aGlzKTsKLSAgICAgICAgbV9kZWJ1Zy5vdXRfeW1ldGFfZmlsZSA9IGZvcGVuIChtX2RlYnVnLm91dF95bWV0YWZpbGVfbmFtZSwgImFiIik7Ci0gICAgICAgIG1fZGVidWcub3V0X3V2bWV0YV9maWxlID0gZm9wZW4gKG1fZGVidWcub3V0X3V2bWV0YWZpbGVfbmFtZSwgImFiIik7Ci0gICAgICAgIGlmICghbV9kZWJ1Zy5vdXRfeW1ldGFfZmlsZSB8fCAhbV9kZWJ1Zy5vdXRfdXZtZXRhX2ZpbGUpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZhaWxlZCB0byBvcGVuIG91dHB1dCB5L3V2IG1ldGEgZmlsZTogJXMgZm9yIGxvZ2dpbmciLCBtX2RlYnVnLmxvZ19sb2MpOwotICAgICAgICAgICAgbV9kZWJ1Zy5vdXRfeW1ldGFmaWxlX25hbWVbMF0gPSAnXDAnOwotICAgICAgICAgICAgbV9kZWJ1Zy5vdXRfdXZtZXRhZmlsZV9uYW1lWzBdID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJ1Zl9pbmRleCA9IGJ1ZmZlciAtIG1fb3V0X21lbV9wdHI7Ci0gICAgdGVtcCA9IChjaGFyICopZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2J1Zl9pbmRleF0uYnVmZmVyYWRkcjsKLQotICAgIGlmIChkcnZfY3R4Lm91dHB1dF9mb3JtYXQgPT0gVkRFQ19ZVVZfRk9STUFUX05WMTJfVUJXQyB8fAotICAgICAgICAgICAgZHJ2X2N0eC5vdXRwdXRfZm9ybWF0ID09IFZERUNfWVVWX0ZPUk1BVF9OVjEyX1RQMTBfVUJXQykgewotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJMb2dnaW5nIFVCV0MgeXV2IHdpZHRoL2hlaWdodCgldS8ldSkiLAotICAgICAgICAgICAgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoLAotICAgICAgICAgICAgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodCk7Ci0KLSAgICAgICAgaWYgKG1fZGVidWcub3V0ZmlsZSkKLSAgICAgICAgICAgIGZ3cml0ZSh0ZW1wLCBidWZmZXItPm5GaWxsZWRMZW4sIDEsIG1fZGVidWcub3V0ZmlsZSk7Ci0KLSAgICAgICAgaWYgKG1fZGVidWcub3V0X3ltZXRhX2ZpbGUgJiYgbV9kZWJ1Zy5vdXRfdXZtZXRhX2ZpbGUpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgeV9wbGFuZSwgeV9tZXRhX3BsYW5lOwotICAgICAgICAgICAgaW50IHlfc3RyaWRlID0gMCwgeV9zY2xpbmVzID0gMDsKLSAgICAgICAgICAgIGludCB5X21ldGFfc3RyaWRlID0gMCwgeV9tZXRhX3NjYW5saW5lcyA9IDAsIHV2X21ldGFfc3RyaWRlID0gMCwgdXZfbWV0YV9zY2FubGluZXMgPSAwOwotICAgICAgICAgICAgaW50IGNvbG9yX2ZtdCA9IChkcnZfY3R4Lm91dHB1dF9mb3JtYXQ9PSBWREVDX1lVVl9GT1JNQVRfTlYxMl9VQldDKT8gQ09MT1JfRk1UX05WMTJfVUJXQzogQ09MT1JfRk1UX05WMTJfQlBQMTBfVUJXQzsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgaW50IGJ5dGVzX3dyaXR0ZW4gPSAwOwotCi0gICAgICAgICAgICB3aWR0aCA9IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aDsKLSAgICAgICAgICAgIGhlaWdodCA9IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQ7Ci0gICAgICAgICAgICB5X21ldGFfc3RyaWRlID0gVkVOVVNfWV9NRVRBX1NUUklERShjb2xvcl9mbXQsIHdpZHRoKTsKLSAgICAgICAgICAgIHlfbWV0YV9zY2FubGluZXMgPSBWRU5VU19ZX01FVEFfU0NBTkxJTkVTKGNvbG9yX2ZtdCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIHlfc3RyaWRlID0gVkVOVVNfWV9TVFJJREUoY29sb3JfZm10LCB3aWR0aCk7Ci0gICAgICAgICAgICB5X3NjbGluZXMgPSBWRU5VU19ZX1NDQU5MSU5FUyhjb2xvcl9mbXQsIGhlaWdodCk7Ci0gICAgICAgICAgICB1dl9tZXRhX3N0cmlkZSA9IFZFTlVTX1VWX01FVEFfU1RSSURFKGNvbG9yX2ZtdCwgd2lkdGgpOwotICAgICAgICAgICAgdXZfbWV0YV9zY2FubGluZXMgPSBWRU5VU19VVl9NRVRBX1NDQU5MSU5FUyhjb2xvcl9mbXQsIGhlaWdodCk7Ci0KLSAgICAgICAgICAgIHlfbWV0YV9wbGFuZSA9IE1TTV9NRURJQV9BTElHTih5X21ldGFfc3RyaWRlICogeV9tZXRhX3NjYW5saW5lcywgNDA5Nik7Ci0gICAgICAgICAgICB5X3BsYW5lID0gTVNNX01FRElBX0FMSUdOKHlfc3RyaWRlICogeV9zY2xpbmVzLCA0MDk2KTsKLQotICAgICAgICAgICAgdGVtcCA9IChjaGFyICopZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2J1Zl9pbmRleF0uYnVmZmVyYWRkcjsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB5X21ldGFfc2NhbmxpbmVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbiA9IGZ3cml0ZSh0ZW1wLCB5X21ldGFfc3RyaWRlLCAxLCBtX2RlYnVnLm91dF95bWV0YV9maWxlKTsKLSAgICAgICAgICAgICAgICAgdGVtcCArPSB5X21ldGFfc3RyaWRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZW1wID0gKGNoYXIgKilkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbYnVmX2luZGV4XS5idWZmZXJhZGRyICsgeV9tZXRhX3BsYW5lICsgeV9wbGFuZTsKLSAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHV2X21ldGFfc2NhbmxpbmVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBieXRlc193cml0dGVuICs9IGZ3cml0ZSh0ZW1wLCB1dl9tZXRhX3N0cmlkZSwgMSwgbV9kZWJ1Zy5vdXRfdXZtZXRhX2ZpbGUpOwotICAgICAgICAgICAgICAgIHRlbXAgKz0gdXZfbWV0YV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fZGVidWcub3V0ZmlsZSAmJiBkcnZfY3R4Lm91dHB1dF9mb3JtYXQgPT0gVkRFQ19ZVVZfRk9STUFUX05WMTIpIHsKLSAgICAgICAgaW50IHN0cmlkZSA9IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5zdHJpZGU7Ci0gICAgICAgIGludCBzY2FubGluZXMgPSBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uc2Nhbl9saW5lczsKLSAgICAgICAgaWYgKG1fc21vb3Roc3RyZWFtaW5nX21vZGUpIHsKLSAgICAgICAgICAgIHN0cmlkZSA9IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aDsKLSAgICAgICAgICAgIHNjYW5saW5lcyA9IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQ7Ci0gICAgICAgICAgICBzdHJpZGUgPSAoc3RyaWRlICsgREVGQVVMVF9XSURUSF9BTElHTk1FTlQgLSAxKSAmICh+KERFRkFVTFRfV0lEVEhfQUxJR05NRU5UIC0gMSkpOwotICAgICAgICAgICAgc2NhbmxpbmVzID0gKHNjYW5saW5lcyArIERFRkFVTFRfSEVJR0hUX0FMSUdOTUVOVCAtIDEpICYgKH4oREVGQVVMVF9IRUlHSFRfQUxJR05NRU5UIC0gMSkpOwotICAgICAgICB9Ci0gICAgICAgIHVuc2lnbmVkIGk7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkxvZ2dpbmcgd2lkdGgvaGVpZ2h0KCV1LyV1KSBzdHJpZGUvc2NhbmxpbmVzKCV1LyV1KSIsCi0gICAgICAgICAgICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGgsCi0gICAgICAgICAgICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0LCBzdHJpZGUsIHNjYW5saW5lcyk7Ci0gICAgICAgIGludCBieXRlc193cml0dGVuID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPSBmd3JpdGUodGVtcCwgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoLCAxLCBtX2RlYnVnLm91dGZpbGUpOwotICAgICAgICAgICAgIHRlbXAgKz0gc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIHRlbXAgPSAoY2hhciAqKWRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltidWZfaW5kZXhdLmJ1ZmZlcmFkZHIgKyBzdHJpZGUgKiBzY2FubGluZXM7Ci0gICAgICAgIGludCBzdHJpZGVfYyA9IHN0cmlkZTsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodC8yOyBpKyspIHsKLSAgICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gKz0gZndyaXRlKHRlbXAsIGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aCwgMSwgbV9kZWJ1Zy5vdXRmaWxlKTsKLSAgICAgICAgICAgIHRlbXAgKz0gc3RyaWRlX2M7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6Q29tcG9uZW50SW5pdAotCi0gICBERVNDUklQVElPTgotICAgSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50LgotCi0gICBQQVJBTUVURVJTCi0gICBjdHh0IC0tIENvbnRleHQgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgc2VsZi4KLSAgIGlkICAgLS0gRXZlbnQgaWRlbnRpZmllci4gVGhpcyBjb3VsZCBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzoKLSAgIDEuIENvbW1hbmQgY29tcGxldGlvbiBldmVudAotICAgMi4gQnVmZmVyIGRvbmUgY2FsbGJhY2sgZXZlbnQKLSAgIDMuIEZyYW1lIGRvbmUgY2FsbGJhY2sgZXZlbnQKLQotICAgUkVUVVJOIFZBTFVFCi0gICBOb25lLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSBvbXhfdmRlYzo6Y29tcG9uZW50X2luaXQoT01YX1NUUklORyByb2xlKQotewotCi0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjIGZkZXNjOwotICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7Ci0gICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgYnVmcmVxOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICBzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSBmcm1zaXplOwotICAgIHVuc2lnbmVkIGludCAgIGFsaWdubWVudCA9IDAsYnVmZmVyX3NpemUgPSAwOwotICAgIGludCBmZHNbMl07Ci0gICAgaW50IHIscmV0PTA7Ci0gICAgYm9vbCBjb2RlY19hbWJpZ3VvdXMgPSBmYWxzZTsKLSAgICBPTVhfU1RSSU5HIGRldmljZV9uYW1lID0gKE9NWF9TVFJJTkcpIi9kZXYvdmlkZW8zMiI7Ci0gICAgY2hhciBwcm9wZXJ0eV92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gezB9OwotICAgIEZJTEUgKnNvY19maWxlID0gTlVMTDsKLSAgICBjaGFyIGJ1ZmZlclsxMF07Ci0KLSNpZmRlZiBfQU5EUk9JRF8KLSAgICBjaGFyIHBsYXRmb3JtX25hbWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBwcm9wZXJ0eV9nZXQoInJvLmJvYXJkLnBsYXRmb3JtIiwgcGxhdGZvcm1fbmFtZSwgIjAiKTsKLSAgICBpZiAoIXN0cm5jbXAocGxhdGZvcm1fbmFtZSwgIm1zbTg2MTAiLCA3KSkgewotICAgICAgICBkZXZpY2VfbmFtZSA9IChPTVhfU1RSSU5HKSIvZGV2L3ZpZGVvL3E2X2RlYyI7Ci0gICAgICAgIGlzX3E2X3BsYXRmb3JtID0gdHJ1ZTsKLSAgICAgICAgbWF4U21vb3RoU3RyZWFtaW5nV2lkdGggPSAxMjgwOwotICAgICAgICBtYXhTbW9vdGhTdHJlYW1pbmdIZWlnaHQgPSA3MjA7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpc190aHVsaXVtX3YxID0gZmFsc2U7Ci0gICAgc29jX2ZpbGUgPSBmb3BlbigiL3N5cy9kZXZpY2VzL3NvYzAvc29jX2lkIiwgInIiKTsKLSAgICBpZiAoc29jX2ZpbGUpIHsKLSAgICAgICAgZnJlYWQoYnVmZmVyLCAxLCA0LCBzb2NfZmlsZSk7Ci0gICAgICAgIGZjbG9zZShzb2NfZmlsZSk7Ci0gICAgICAgIGlmIChhdG9pKGJ1ZmZlcikgPT0gMjQ2KSB7Ci0gICAgICAgICAgICBzb2NfZmlsZSA9IGZvcGVuKCIvc3lzL2RldmljZXMvc29jMC9yZXZpc2lvbiIsICJyIik7Ci0gICAgICAgICAgICBpZiAoc29jX2ZpbGUpIHsKLSAgICAgICAgICAgICAgICBmcmVhZChidWZmZXIsIDEsIDQsIHNvY19maWxlKTsKLSAgICAgICAgICAgICAgICBmY2xvc2Uoc29jX2ZpbGUpOwotICAgICAgICAgICAgICAgIGlmIChhdG9pKGJ1ZmZlcikgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBpc190aHVsaXVtX3YxID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiaXNfdGh1bGl1bV92MSA9IFRSVUUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBfQU5EUk9JRF8KLSAgICAvKgotICAgICAqIHR1cm4gb2ZmIGZyYW1lIHBhcnNpbmcgZm9yIEFuZHJvaWQgYnkgZGVmYXVsdC4KLSAgICAgKiBDbGllbnRzIG1heSBjb25maWd1cmUgT01YX1FDT01fRnJhbWVQYWNraW5nX0FyYml0cmFyeSB0byBlbmFibGUgdGhpcyBtb2RlCi0gICAgICovCi0gICAgYXJiaXRyYXJ5X2J5dGVzID0gZmFsc2U7Ci0gICAgcHJvcGVydHlfZ2V0KCJ2aWRjLmRlYy5kZWJ1Zy5hcmJpdHJhcnlieXRlcy5tb2RlIiwgcHJvcGVydHlfdmFsdWUsICIwIik7Ci0gICAgaWYgKGF0b2kocHJvcGVydHlfdmFsdWUpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goImFyYml0cmFyeV9ieXRlcyBtb2RlIGVuYWJsZWQgdmlhIHByb3BlcnR5IGNvbW1hbmQiKTsKLSAgICAgICAgYXJiaXRyYXJ5X2J5dGVzID0gdHJ1ZTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICghc3RybmNtcChyb2xlLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMuc2VjdXJlIiwKLSAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgc2VjdXJlX21vZGUgPSB0cnVlOwotICAgICAgICBhcmJpdHJhcnlfYnl0ZXMgPSBmYWxzZTsKLSAgICAgICAgcm9sZSA9IChPTVhfU1RSSU5HKSJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2YyI7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChyb2xlLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMi5zZWN1cmUiLAotICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBzZWN1cmVfbW9kZSA9IHRydWU7Ci0gICAgICAgIGFyYml0cmFyeV9ieXRlcyA9IGZhbHNlOwotICAgICAgICByb2xlID0gKE9NWF9TVFJJTkcpIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzIiOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAocm9sZSwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaGV2Yy5zZWN1cmUiLAotICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBzZWN1cmVfbW9kZSA9IHRydWU7Ci0gICAgICAgIGFyYml0cmFyeV9ieXRlcyA9IGZhbHNlOwotICAgICAgICByb2xlID0gKE9NWF9TVFJJTkcpIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaGV2YyI7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChyb2xlLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDkuc2VjdXJlIiwKLSAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgc2VjdXJlX21vZGUgPSB0cnVlOwotICAgICAgICBhcmJpdHJhcnlfYnl0ZXMgPSBmYWxzZTsKLSAgICAgICAgcm9sZSA9IChPTVhfU1RSSU5HKSJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJuY21wKHJvbGUsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOC5zZWN1cmUiLAotICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBzZWN1cmVfbW9kZSA9IHRydWU7Ci0gICAgICAgIGFyYml0cmFyeV9ieXRlcyA9IGZhbHNlOwotICAgICAgICByb2xlID0gKE9NWF9TVFJJTkcpIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA4IjsKLSAgICB9Ci0KLSAgICBkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCA9IG9wZW4oZGV2aWNlX25hbWUsIE9fUkRXUik7Ci0KLSAgICBERUJVR19QUklOVF9JTkZPKCJjb21wb25lbnRfaW5pdDogJXMgOiBmZD0lZCIsIHJvbGUsIGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkKTsKLQotICAgIGlmIChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCA8IDApIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk9teF92ZGVjOjpDb21wIEluaXQgUmV0dXJuaW5nIGZhaWx1cmUsIGVycm5vICVkIiwgZXJybm8pOwotICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgIH0KLSAgICBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX251bWVyYXRvciA9IERFRkFVTFRfRlBTOwotICAgIGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfZGVub21pbmF0b3IgPSAxOwotICAgIG9wZXJhdGluZ19mcmFtZV9yYXRlID0gREVGQVVMVF9GUFM7Ci0gICAgbV9wb2xsX2VmZCA9IGV2ZW50ZmQoMCwgMCk7Ci0gICAgaWYgKG1fcG9sbF9lZmQgPCAwKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIGV2ZW50IGZkKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgfQotICAgIHJldCA9IHN1YnNjcmliZV90b19ldmVudHMoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQpOwotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIGFzeW5jX3RocmVhZF9jcmVhdGVkID0gdHJ1ZTsKLSAgICAgICAgcmV0ID0gcHRocmVhZF9jcmVhdGUoJmFzeW5jX3RocmVhZF9pZCwwLGFzeW5jX21lc3NhZ2VfdGhyZWFkLHRoaXMpOwotICAgIH0KLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIGFzeW5jX21lc3NhZ2VfdGhyZWFkIik7Ci0gICAgICAgIGFzeW5jX3RocmVhZF9jcmVhdGVkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgfQotCi0jaWZkZWYgT1VUUFVUX0VYVFJBREFUQV9MT0cKLSAgICBvdXRwdXRFeHRyYWRhdGFGaWxlID0gZm9wZW4gKG91dHB1dF9leHRyYWRhdGFfZmlsZW5hbWUsICJhYiIpOwotI2VuZGlmCi0KLSAgICAvLyBDb3B5IHRoZSByb2xlIGluZm9ybWF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoZSBkZWNvZGVyIGtpbmQKLSAgICBzdHJsY3B5KGRydl9jdHgua2luZCxyb2xlLDEyOCk7Ci0KLQotICAgIGlmICghc3RybmNtcChkcnZfY3R4LmtpbmQsIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzIiLFwKLSAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgc3RybGNweSgoY2hhciAqKW1fY1JvbGUsICJ2aWRlb19kZWNvZGVyLm1wZWcyIixcCi0gICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICBkcnZfY3R4LmRlY29kZXJfZm9ybWF0ID0gVkRFQ19DT0RFQ1RZUEVfTVBFRzI7Ci0gICAgICAgIG91dHB1dF9jYXBhYmlsaXR5ID0gVjRMMl9QSVhfRk1UX01QRUcyOwotICAgICAgICBlQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzI7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChkcnZfY3R4LmtpbmQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2YyIsXAotICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBzdHJsY3B5KChjaGFyICopbV9jUm9sZSwgInZpZGVvX2RlY29kZXIuYXZjIixPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgIGRydl9jdHguZGVjb2Rlcl9mb3JtYXQgPSBWREVDX0NPREVDVFlQRV9IMjY0OwotICAgICAgICBvdXRwdXRfY2FwYWJpbGl0eT1WNEwyX1BJWF9GTVRfSDI2NDsKLSAgICAgICAgZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKLSAgICAgICAgaWYgKGlzX3RodWxpdW1fdjEpIHsKLSAgICAgICAgICAgIGFyYml0cmFyeV9ieXRlcyA9IHRydWU7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJFbmFibGUgYXJiaXRyYXJ5X2J5dGVzIGZvciBoMjY0Iik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRydl9jdHgua2luZCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXZjIixcCi0gICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgIHN0cmxjcHkoKGNoYXIgKiltX2NSb2xlLCAidmlkZW9fZGVjb2Rlci5tdmMiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgIGRydl9jdHguZGVjb2Rlcl9mb3JtYXQgPSBWREVDX0NPREVDVFlQRV9NVkM7Ci0gICAgICAgIG91dHB1dF9jYXBhYmlsaXR5ID0gVjRMMl9QSVhfRk1UX0gyNjRfTVZDOwotICAgICAgICBlQ29tcHJlc3Npb25Gb3JtYXQgPSAoT01YX1ZJREVPX0NPRElOR1RZUEUpUU9NWF9WSURFT19Db2RpbmdNVkM7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChkcnZfY3R4LmtpbmQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmhldmMiLFwKLSAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgc3RybGNweSgoY2hhciAqKW1fY1JvbGUsICJ2aWRlb19kZWNvZGVyLmhldmMiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgZHJ2X2N0eC5kZWNvZGVyX2Zvcm1hdCA9IFZERUNfQ09ERUNUWVBFX0hFVkM7Ci0gICAgICAgIG91dHB1dF9jYXBhYmlsaXR5ID0gVjRMMl9QSVhfRk1UX0hFVkM7Ci0gICAgICAgIGVDb21wcmVzc2lvbkZvcm1hdCA9IChPTVhfVklERU9fQ09ESU5HVFlQRSlRT01YX1ZJREVPX0NvZGluZ0hldmM7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChkcnZfY3R4LmtpbmQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOCIsICAgIFwKLSAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgc3RybGNweSgoY2hhciAqKW1fY1JvbGUsICJ2aWRlb19kZWNvZGVyLnZwOCIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICBkcnZfY3R4LmRlY29kZXJfZm9ybWF0ID0gVkRFQ19DT0RFQ1RZUEVfVlA4OwotICAgICAgICBvdXRwdXRfY2FwYWJpbGl0eSA9IFY0TDJfUElYX0ZNVF9WUDg7Ci0gICAgICAgIGVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdWUDg7Ci0gICAgICAgIGFyYml0cmFyeV9ieXRlcyA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDkiLCAgICBcCi0gICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgIHN0cmxjcHkoKGNoYXIgKiltX2NSb2xlLCAidmlkZW9fZGVjb2Rlci52cDkiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgZHJ2X2N0eC5kZWNvZGVyX2Zvcm1hdCA9IFZERUNfQ09ERUNUWVBFX1ZQOTsKLSAgICAgICAgb3V0cHV0X2NhcGFiaWxpdHkgPSBWNEwyX1BJWF9GTVRfVlA5OwotICAgICAgICBlQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVlA5OwotICAgICAgICBhcmJpdHJhcnlfYnl0ZXMgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6VW5rbm93biBDb21wb25lbnQiKTsKLSAgICAgICAgZVJldCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnROYW1lOwotICAgIH0KLQotICAgIGlmIChlUmV0ID09IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZGVzdF9jb2xvcl9mb3JtYXQ7Ci0gICAgICAgIGlmIChtX2Rpc2FibGVfdWJ3Y19tb2RlKSB7Ci0gICAgICAgICAgICBkcnZfY3R4Lm91dHB1dF9mb3JtYXQgPSBWREVDX1lVVl9GT1JNQVRfTlYxMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRydl9jdHgub3V0cHV0X2Zvcm1hdCA9IFZERUNfWVVWX0ZPUk1BVF9OVjEyX1VCV0M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVDb21wcmVzc2lvbkZvcm1hdCA9PSAoT01YX1ZJREVPX0NPRElOR1RZUEUpUU9NWF9WSURFT19Db2RpbmdNVkMpCi0gICAgICAgICAgICBkZXN0X2NvbG9yX2Zvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSkKLSAgICAgICAgICAgICAgICBRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm1NdWx0aVZpZXc7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRlc3RfY29sb3JfZm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKQotICAgICAgICAgICAgICAgIFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybTsKLSAgICAgICAgaWYgKCFjbGllbnRfYnVmZmVycy5zZXRfY29sb3JfZm9ybWF0KGRlc3RfY29sb3JfZm9ybWF0KSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldHRpbmcgY29sb3IgZm9ybWF0IGZhaWxlZCIpOwotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotCi0gICAgICAgIGRwYl9iaXRfZGVwdGggPSBNU01fVklEQ19CSVRfREVQVEhfODsKLSAgICAgICAgbV9wcm9ncmVzc2l2ZSA9IE1TTV9WSURDX1BJQ19TVFJVQ1RfUFJPR1JFU1NJVkU7Ci0KLSAgICAgICAgaWYgKG1fZGlzYWJsZV91YndjX21vZGUpIHsKLSAgICAgICAgICAgIGNhcHR1cmVfY2FwYWJpbGl0eSA9IFY0TDJfUElYX0ZNVF9OVjEyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FwdHVyZV9jYXBhYmlsaXR5ID0gVjRMMl9QSVhfRk1UX05WMTJfVUJXQzsKLSAgICAgICAgfQotCi0gICAgICAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgY2FwOwotICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1FVRVJZQ0FQLCAmY2FwKTsKLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBxdWVyeSBjYXBhYmlsaXRpZXMiKTsKLSAgICAgICAgICAgIC8qVE9ETzogSG93IHRvIGhhbmRsZSB0aGlzIGNhc2UgKi8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiQ2FwYWJpbGl0aWVzOiBkcml2ZXJfbmFtZSA9ICVzLCBjYXJkID0gJXMsIGJ1c19pbmZvID0gJXMsIgotICAgICAgICAgICAgICAgICIgdmVyc2lvbiA9ICVkLCBjYXBhYmlsaXRpZXMgPSAleCIsIGNhcC5kcml2ZXIsIGNhcC5jYXJkLAotICAgICAgICAgICAgICAgIGNhcC5idXNfaW5mbywgY2FwLnZlcnNpb24sIGNhcC5jYXBhYmlsaXRpZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldD0wOwotICAgICAgICBmZGVzYy50eXBlPVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgICAgIGZkZXNjLmluZGV4PTA7Ci0gICAgICAgIHdoaWxlIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0VOVU1fRk1ULCAmZmRlc2MpID09IDApIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goImZtdDogZGVzY3JpcHRpb246ICVzLCBmbXQ6ICV4LCBmbGFncyA9ICV4IiwgZmRlc2MuZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgIGZkZXNjLnBpeGVsZm9ybWF0LCBmZGVzYy5mbGFncyk7Ci0gICAgICAgICAgICBmZGVzYy5pbmRleCsrOwotICAgICAgICB9Ci0gICAgICAgIGZkZXNjLnR5cGU9VjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICBmZGVzYy5pbmRleD0wOwotICAgICAgICB3aGlsZSAoaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19FTlVNX0ZNVCwgJmZkZXNjKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goImZtdDogZGVzY3JpcHRpb246ICVzLCBmbXQ6ICV4LCBmbGFncyA9ICV4IiwgZmRlc2MuZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgIGZkZXNjLnBpeGVsZm9ybWF0LCBmZGVzYy5mbGFncyk7Ci0gICAgICAgICAgICBmZGVzYy5pbmRleCsrOwotICAgICAgICB9Ci0gICAgICAgIG1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfcmVjdC5uTGVmdCA9IDA7Ci0gICAgICAgIG1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfcmVjdC5uVG9wID0gMDsKLSAgICAgICAgbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5XaWR0aCA9IDMyMDsKLSAgICAgICAgbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5IZWlnaHQgPSAyNDA7Ci0gICAgICAgIHVwZGF0ZV9yZXNvbHV0aW9uKDMyMCwgMjQwLCAzMjAsIDI0MCk7Ci0KLSAgICAgICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLmhlaWdodCA9IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQ7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoOwotICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IG91dHB1dF9jYXBhYmlsaXR5OwotICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfRk1ULCAmZm10KTsKLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgLypUT0RPOiBIb3cgdG8gaGFuZGxlIHRoaXMgY2FzZSAqLwotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgZm9ybWF0IG9uIG91dHB1dCBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlNldCBGb3JtYXQgd2FzIHN1Y2Nlc3NmdWwiKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiByZWZlciBtYWNybyBERUZBVUxUX0NPTkNFQUxfQ09MT1IgdG8gc2V0IGNvbmNlYWwgY29sb3IgdmFsdWVzCi0gICAgICAgICAqLwotICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QudmlkYy5kZWMuY29uY2VhbF9jb2xvciIsIHByb3BlcnR5X3ZhbHVlLCAiMCIpOwotICAgICAgICBtX2NvbmNlYWxfY29sb3I9IGF0b2kocHJvcGVydHlfdmFsdWUpOwotICAgICAgICBpZiAobV9jb25jZWFsX2NvbG9yKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJ0cnlpbmcgdG8gc2V0IDB4JXUgYXMgY29uY2VhbCBjb2xvclxuIiwgKHVuc2lnbmVkIGludCltX2NvbmNlYWxfY29sb3IpOwotICAgICAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19DT05DRUFMX0NPTE9SOwotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IG1fY29uY2VhbF9jb2xvcjsKLSAgICAgICAgICAgIHJldCA9IGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgY29uY2VhbCBjb2xvciAlZFxuIiwgcmV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vR2V0IHRoZSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgbWVtc2V0KCh2b2lkICopJmZybXNpemUsMCxzaXplb2YoZnJtc2l6ZSkpOwotICAgICAgICBmcm1zaXplLmluZGV4ID0gMDsKLSAgICAgICAgZnJtc2l6ZS5waXhlbF9mb3JtYXQgPSBvdXRwdXRfY2FwYWJpbGl0eTsKLSAgICAgICAgcmV0ID0gaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsCi0gICAgICAgICAgICAgICAgVklESU9DX0VOVU1fRlJBTUVTSVpFUywgJmZybXNpemUpOwotICAgICAgICBpZiAocmV0IHx8IGZybXNpemUudHlwZSAhPSBWNEwyX0ZSTVNJWkVfVFlQRV9TVEVQV0lTRSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBnZXQgZnJhbWVzaXplcyIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckhhcmR3YXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZybXNpemUudHlwZSA9PSBWNEwyX0ZSTVNJWkVfVFlQRV9TVEVQV0lTRSkgewotICAgICAgICAgICAgbV9kZWNvZGVyX2NhcGFiaWxpdHkubWluX3dpZHRoID0gZnJtc2l6ZS5zdGVwd2lzZS5taW5fd2lkdGg7Ci0gICAgICAgICAgICBtX2RlY29kZXJfY2FwYWJpbGl0eS5tYXhfd2lkdGggPSBmcm1zaXplLnN0ZXB3aXNlLm1heF93aWR0aDsKLSAgICAgICAgICAgIG1fZGVjb2Rlcl9jYXBhYmlsaXR5Lm1pbl9oZWlnaHQgPSBmcm1zaXplLnN0ZXB3aXNlLm1pbl9oZWlnaHQ7Ci0gICAgICAgICAgICBtX2RlY29kZXJfY2FwYWJpbGl0eS5tYXhfaGVpZ2h0ID0gZnJtc2l6ZS5zdGVwd2lzZS5tYXhfaGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtc2V0KCZmbXQsIDB4MCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCkpOwotICAgICAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLmhlaWdodCA9IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQ7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoOwotICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IGNhcHR1cmVfY2FwYWJpbGl0eTsKLSAgICAgICAgcmV0ID0gaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX0ZNVCwgJmZtdCk7Ci0gICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgIC8qVE9ETzogSG93IHRvIGhhbmRsZSB0aGlzIGNhc2UgKi8KLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGZvcm1hdCBvbiBjYXB0dXJlIHBvcnQiKTsKLSAgICAgICAgfQotICAgICAgICBtZW1zZXQoJmZyYW1lc2l6ZSwgMCwgc2l6ZW9mKE9NWF9GUkFNRVNJWkVUWVBFKSk7Ci0gICAgICAgIGZyYW1lc2l6ZS5uV2lkdGggPSBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGg7Ci0gICAgICAgIGZyYW1lc2l6ZS5uSGVpZ2h0ID0gZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodDsKLQotICAgICAgICBtZW1zZXQoJnJlY3RhbmdsZSwgMCwgc2l6ZW9mKE9NWF9DT05GSUdfUkVDVFRZUEUpKTsKLSAgICAgICAgcmVjdGFuZ2xlLm5XaWR0aCA9IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aDsKLSAgICAgICAgcmVjdGFuZ2xlLm5IZWlnaHQgPSBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0OwotCi0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlNldCBGb3JtYXQgd2FzIHN1Y2Nlc3NmdWwiKTsKLSAgICAgICAgaWYgKHNlY3VyZV9tb2RlKSB7Ci0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1NFQ1VSRTsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSAxOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJPbXhfdmRlYzo6IGNhbGxpbmcgdG8gb3BlbiBzZWN1cmUgZGV2aWNlICVkIiwgcmV0KTsKLSAgICAgICAgICAgIHJldD1pb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwmY29udHJvbCk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk9teF92ZGVjOjogVW5hYmxlIHRvIG9wZW4gc2VjdXJlIGRldmljZSAlZCIsIHJldCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc190aHVsaXVtX3YxKSB7Ci0gICAgICAgICAgICBlUmV0ID0gZW5hYmxlX3Ntb290aHN0cmVhbWluZygpOwotICAgICAgICAgICAgaWYgKGVSZXQgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBlbmFibGUgc21vb3RoIHN0cmVhbWluZyBvbiBkcml2ZXIiKTsKLSAgICAgICAgICAgICAgIHJldHVybiBlUmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLypHZXQgdGhlIEJ1ZmZlciByZXF1aXJlbWVudHMgZm9yIGlucHV0IGFuZCBvdXRwdXQgcG9ydHMqLwotICAgICAgICBkcnZfY3R4LmlwX2J1Zi5idWZmZXJfdHlwZSA9IFZERUNfQlVGRkVSX1RZUEVfSU5QVVQ7Ci0gICAgICAgIGRydl9jdHgub3BfYnVmLmJ1ZmZlcl90eXBlID0gVkRFQ19CVUZGRVJfVFlQRV9PVVRQVVQ7Ci0KLSAgICAgICAgaWYgKHNlY3VyZV9tb2RlKSB7Ci0gICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5hbGlnbm1lbnQgPSBTRUNVUkVfQUxJR047Ci0gICAgICAgICAgICBkcnZfY3R4LmlwX2J1Zi5hbGlnbm1lbnQgPSBTRUNVUkVfQUxJR047Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5hbGlnbm1lbnQgPSBTWl80SzsKLSAgICAgICAgICAgIGRydl9jdHguaXBfYnVmLmFsaWdubWVudCA9IFNaXzRLOwotICAgICAgICB9Ci0KLSAgICAgICAgZHJ2X2N0eC5pbnRlcmxhY2UgPSBWREVDX0ludGVybGFjZUZyYW1lUHJvZ3Jlc3NpdmU7Ci0gICAgICAgIGRydl9jdHguZXh0cmFkYXRhID0gMDsKLSAgICAgICAgZHJ2X2N0eC5waWN0dXJlX29yZGVyID0gVkRFQ19PUkRFUl9ESVNQTEFZOwotICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX09VVFBVVF9PUkRFUjsKLSAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX1ZJREVPX09VVFBVVF9PUkRFUl9ESVNQTEFZOwotICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotICAgICAgICBkcnZfY3R4Lmlkcl9vbmx5X2RlY29kaW5nID0gMDsKLQotI2lmZGVmIF9BTkRST0lEXwotICAgICAgICBwcm9wZXJ0eV9nZXQoInZpZGMuZGVjLmVuYWJsZS5kb3duc2NhbGFyIixwcm9wZXJ0eV92YWx1ZSwiMCIpOwotICAgICAgICBpZiAoYXRvaShwcm9wZXJ0eV92YWx1ZSkpIHsKLSAgICAgICAgICAgIG1fZW5hYmxlX2Rvd25zY2FsYXIgPSAgYXRvaShwcm9wZXJ0eV92YWx1ZSk7Ci0gICAgICAgICAgICBwcm9wZXJ0eV9nZXQoInZpZGMuZGVjLmRvd25zY2FsYXJfd2lkdGgiLHByb3BlcnR5X3ZhbHVlLCIwIik7Ci0gICAgICAgICAgICBpZiAoYXRvaShwcm9wZXJ0eV92YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBtX2Rvd25zY2FsYXJfd2lkdGggPSBhdG9pKHByb3BlcnR5X3ZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5X2dldCgidmlkYy5kZWMuZG93bnNjYWxhcl9oZWlnaHQiLHByb3BlcnR5X3ZhbHVlLCIwIik7Ci0gICAgICAgICAgICBpZiAoYXRvaShwcm9wZXJ0eV92YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBtX2Rvd25zY2FsYXJfaGVpZ2h0ID0gYXRvaShwcm9wZXJ0eV92YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtX2Rvd25zY2FsYXJfd2lkdGggPCBtX2RlY29kZXJfY2FwYWJpbGl0eS5taW5fd2lkdGggfHwKLSAgICAgICAgICAgICAgICBtX2Rvd25zY2FsYXJfaGVpZ2h0IDwgbV9kZWNvZGVyX2NhcGFiaWxpdHkubWluX2hlaWdodCkgewotICAgICAgICAgICAgICAgIG1fZG93bnNjYWxhcl93aWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgbV9kb3duc2NhbGFyX2hlaWdodCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRG93bnNjYWxlciBjb25maWd1cmVkIFd4SCAlZHglZFxuIiwKLSAgICAgICAgICAgICAgICBtX2Rvd25zY2FsYXJfd2lkdGgsIG1fZG93bnNjYWxhcl9oZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnR5X2dldCgidmlkYy5kaXNhYmxlLnNwbGl0Lm1vZGUiLHByb3BlcnR5X3ZhbHVlLCIwIik7Ci0gICAgICAgIG1fZGlzYWJsZV9zcGxpdF9tb2RlID0gYXRvaShwcm9wZXJ0eV92YWx1ZSk7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNwbGl0IG1vZGUgaXMgJXMiLCBtX2Rpc2FibGVfc3BsaXRfbW9kZSA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOwotI2VuZGlmCi0gICAgICAgIG1fc3RhdGUgPSBPTVhfU3RhdGVMb2FkZWQ7Ci0jaWZkZWYgREVGQVVMVF9FWFRSQURBVEEKLSAgICAgICAgZW5hYmxlX2V4dHJhZGF0YShERUZBVUxUX0VYVFJBREFUQSwgdHJ1ZSwgdHJ1ZSk7Ci0jZW5kaWYKLSAgICAgICAgZVJldCA9IGdldF9idWZmZXJfcmVxKCZkcnZfY3R4LmlwX2J1Zik7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIklucHV0IEJ1ZmZlciBTaXplID0ldSIsKHVuc2lnbmVkIGludClkcnZfY3R4LmlwX2J1Zi5idWZmZXJfc2l6ZSk7Ci0gICAgICAgIGdldF9idWZmZXJfcmVxKCZkcnZfY3R4Lm9wX2J1Zik7Ci0gICAgICAgIGlmIChkcnZfY3R4LmRlY29kZXJfZm9ybWF0ID09IFZERUNfQ09ERUNUWVBFX0gyNjQgfHwKLSAgICAgICAgICAgICAgICBkcnZfY3R4LmRlY29kZXJfZm9ybWF0ID09IFZERUNfQ09ERUNUWVBFX0hFVkMgfHwKLSAgICAgICAgICAgICAgICBkcnZfY3R4LmRlY29kZXJfZm9ybWF0ID09IFZERUNfQ09ERUNUWVBFX01WQykgewotICAgICAgICAgICAgICAgICAgICBoMjY0X3NjcmF0Y2gubkFsbG9jTGVuID0gZHJ2X2N0eC5pcF9idWYuYnVmZmVyX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGgyNjRfc2NyYXRjaC5wQnVmZmVyID0gKE9NWF9VOCAqKW1hbGxvYyAoZHJ2X2N0eC5pcF9idWYuYnVmZmVyX3NpemUpOwotICAgICAgICAgICAgICAgICAgICBoMjY0X3NjcmF0Y2gubkZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGgyNjRfc2NyYXRjaC5uT2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaDI2NF9zY3JhdGNoLnBCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImgyNjRfc2NyYXRjaC5wQnVmZmVyIEFsbG9jYXRpb24gZmFpbGVkICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbXNnX3RocmVhZF9jcmVhdGVkID0gdHJ1ZTsKLSAgICAgICAgciA9IHB0aHJlYWRfY3JlYXRlKCZtc2dfdGhyZWFkX2lkLDAsbWVzc2FnZV90aHJlYWRfZGVjLHRoaXMpOwotCi0gICAgICAgIGlmIChyIDwgMCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImNvbXBvbmVudF9pbml0KCk6IG1lc3NhZ2VfdGhyZWFkX2RlYyBjcmVhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIG1zZ190aHJlYWRfY3JlYXRlZCA9IGZhbHNlOwotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHsKLSAgICAgICAgVmVuZG9yRXh0ZW5zaW9uU3RvcmUgKmV4dFN0b3JlID0gY29uc3RfY2FzdDxWZW5kb3JFeHRlbnNpb25TdG9yZSAqPigmbVZlbmRvckV4dGVuc2lvblN0b3JlKTsKLSAgICAgICAgaW5pdF92ZW5kb3JfZXh0ZW5zaW9ucygqZXh0U3RvcmUpOwotICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uU3RvcmUuZHVtcEV4dGVuc2lvbnMoKGNvbnN0IGNoYXIgKilyb2xlKTsKLSAgICB9Ci0KLSAgICBpZiAoZVJldCAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJDb21wb25lbnQgSW5pdCBGYWlsZWQiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9JTkZPKCJvbXhfdmRlYzo6Y29tcG9uZW50X2luaXQoKSBzdWNjZXNzIDogZmQ9JWQiLAotICAgICAgICAgICAgICAgIGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkKTsKLSAgICB9Ci0gICAgLy9tZW1zZXQoJmgyNjRfbXZfYnVmZiwwLHNpemVvZihzdHJ1Y3QgaDI2NF9tdl9idWZmZXIpKTsKLSAgICByZXR1cm4gZVJldDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZGVjOjpHZXRDb21wb25lbnRWZXJzaW9uCi0KLSAgIERFU0NSSVBUSU9OCi0gICBSZXR1cm5zIHRoZSBjb21wb25lbnQgdmVyc2lvbi4KLQotICAgUEFSQU1FVEVSUwotICAgVEJELgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIE9NWF9FcnJvck5vbmUuCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmRlYzo6Z2V0X2NvbXBvbmVudF92ZXJzaW9uCi0oCi0gT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wLAotIE9NWF9PVVQgT01YX1NUUklORyBjb21wb25lbnROYW1lLAotIE9NWF9PVVQgT01YX1ZFUlNJT05UWVBFKiBjb21wb25lbnRWZXJzaW9uLAotIE9NWF9PVVQgT01YX1ZFUlNJT05UWVBFKiBzcGVjVmVyc2lvbiwKLSBPTVhfT1VUIE9NWF9VVUlEVFlQRSogY29tcG9uZW50VVVJRAotICkKLXsKLSAgICAodm9pZCkgaENvbXA7Ci0gICAgKHZvaWQpIGNvbXBvbmVudE5hbWU7Ci0gICAgKHZvaWQpIGNvbXBvbmVudFZlcnNpb247Ci0gICAgKHZvaWQpIGNvbXBvbmVudFVVSUQ7Ci0gICAgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiR2V0IENvbXAgVmVyc2lvbiBpbiBJbnZhbGlkIFN0YXRlIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotICAgIC8qIFRCRCAtLSBSZXR1cm4gdGhlIHByb3BlciB2ZXJzaW9uICovCi0gICAgaWYgKHNwZWNWZXJzaW9uKSB7Ci0gICAgICAgIHNwZWNWZXJzaW9uLT5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgfQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZGVjOjpTZW5kQ29tbWFuZAotCi0gICBERVNDUklQVElPTgotICAgUmV0dXJucyB6ZXJvIGlmIGFsbCB0aGUgYnVmZmVycyByZWxlYXNlZC4uCi0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUuCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgdHJ1ZS9mYWxzZQotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZkZWM6OnNlbmRfY29tbWFuZChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgIE9NWF9JTiBPTVhfQ09NTUFORFRZUEUgY21kLAotICAgICAgICBPTVhfSU4gT01YX1UzMiBwYXJhbTEsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSIGNtZERhdGEKLSAgICAgICAgKQotewotICAgICh2b2lkKSBoQ29tcDsKLSAgICAodm9pZCkgY21kRGF0YTsKLSAgICBERUJVR19QUklOVF9MT1coInNlbmRfY29tbWFuZDogUmVjaWV2ZWQgYSBDb21tYW5kIGZyb20gQ2xpZW50Iik7Ci0gICAgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNlbmQgQ29tbWFuZCBpbiBJbnZhbGlkIFN0YXRlIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotICAgIGlmIChjbWQgPT0gT01YX0NvbW1hbmRGbHVzaCAmJiBwYXJhbTEgIT0gT01YX0NPUkVfSU5QVVRfUE9SVF9JTkRFWAotICAgICAgICAgICAgJiYgcGFyYW0xICE9IE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYICYmIHBhcmFtMSAhPSBPTVhfQUxMKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZW5kX2NvbW1hbmQoKTogRVJST1IgT01YX0NvbW1hbmRGbHVzaCAiCi0gICAgICAgICAgICAgICAgInRvIGludmFsaWQgcG9ydDogJXUiLCAodW5zaWduZWQgaW50KXBhcmFtMSk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgfQotCi0gICAgcG9zdF9ldmVudCgodW5zaWduZWQpY21kLCh1bnNpZ25lZClwYXJhbTEsT01YX0NPTVBPTkVOVF9HRU5FUkFURV9DT01NQU5EKTsKLSAgICBzZW1fd2FpdCgmbV9jbWRfbG9jayk7Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJzZW5kX2NvbW1hbmQ6IENvbW1hbmQgUHJvY2Vzc2VkIik7Ci0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6U2VuZENvbW1hbmQKLQotICAgREVTQ1JJUFRJT04KLSAgIFJldHVybnMgemVybyBpZiBhbGwgdGhlIGJ1ZmZlcnMgcmVsZWFzZWQuLgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UKLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZGVjOjpzZW5kX2NvbW1hbmRfcHJveHkoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICBPTVhfSU4gT01YX0NPTU1BTkRUWVBFIGNtZCwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgcGFyYW0xLAotICAgICAgICBPTVhfSU4gT01YX1BUUiBjbWREYXRhCi0gICAgICAgICkKLXsKLSAgICAodm9pZCkgaENvbXA7Ci0gICAgKHZvaWQpIGNtZERhdGE7Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICBPTVhfU1RBVEVUWVBFIGVTdGF0ZSA9IChPTVhfU1RBVEVUWVBFKSBwYXJhbTE7Ci0gICAgaW50IGJGbGFnID0gMSxzZW1fcG9zdGVkID0gMCxyZXQ9MDsKLQotICAgIERFQlVHX1BSSU5UX0xPVygic2VuZF9jb21tYW5kX3Byb3h5KCk6IGNtZCA9ICVkIiwgY21kKTsKLSAgICBERUJVR19QUklOVF9ISUdIKCJzZW5kX2NvbW1hbmRfcHJveHkoKTogQ3VycmVudCBTdGF0ZSAlZCwgRXhwZWN0ZWQgU3RhdGUgJWQiLAotICAgICAgICAgICAgbV9zdGF0ZSwgZVN0YXRlKTsKLQotICAgIGlmIChjbWQgPT0gT01YX0NvbW1hbmRTdGF0ZVNldCkgewotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZW5kX2NvbW1hbmRfcHJveHkoKTogT01YX0NvbW1hbmRTdGF0ZVNldCBpc3N1ZWQiKTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiQ3VycmVudCBTdGF0ZSAlZCwgRXhwZWN0ZWQgU3RhdGUgJWQiLCBtX3N0YXRlLCBlU3RhdGUpOwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiBDdXJyZW50IFN0YXRlIGlzIExvYWRlZCAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpIHsKLSAgICAgICAgICAgIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgewotICAgICAgICAgICAgICAgIC8vaWYgYWxsIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCBvciBhbGwgcG9ydHMgZGlzYWJsZWQKLSAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdGVfZG9uZSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAobV9pbnBfYkVuYWJsZWQgPT0gT01YX0ZBTFNFICYmIG1fb3V0X2JFbmFibGVkID09IE9NWF9GQUxTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZW5kX2NvbW1hbmRfcHJveHkoKTogTG9hZGVkLS0+SWRsZSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2VuZF9jb21tYW5kX3Byb3h5KCk6IExvYWRlZC0tPklkbGUtUGVuZGluZyIpOwotICAgICAgICAgICAgICAgICAgICBCSVRNQVNLX1NFVCgmbV9mbGFncywgT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBldmVudCBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgYkZsYWcgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIExvYWRlZCB0byBMb2FkZWQgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6OnNlbmRfY29tbWFuZF9wcm94eSgpOiBMb2FkZWQtLT5Mb2FkZWQiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvclNhbWVTdGF0ZSxcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yU2FtZVN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gTG9hZGVkIHRvIFdhaXRGb3JSZXNvdXJjZXMgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgLyogU2luY2UgZXJyb3IgaXMgTm9uZSAsIHdlIHdpbGwgcG9zdCBhbiBldmVudAotICAgICAgICAgICAgICAgICAgIGF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbiBkZWZpbml0aW9uICovCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZW5kX2NvbW1hbmRfcHJveHkoKTogTG9hZGVkLS0+V2FpdEZvclJlc291cmNlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gTG9hZGVkIHRvIEV4ZWN1dGluZyAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjo6c2VuZF9jb21tYW5kX3Byb3h5KCk6IExvYWRlZC0tPkV4ZWN1dGluZyIpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBMb2FkZWQgdG8gUGF1c2UgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjo6c2VuZF9jb21tYW5kX3Byb3h5KCk6IExvYWRlZC0tPlBhdXNlIik7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb24sXAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIExvYWRlZCB0byBJbnZhbGlkICovCi0gICAgICAgICAgICBlbHNlIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjo6c2VuZF9jb21tYW5kX3Byb3h5KCk6IExvYWRlZC0tPkludmFsaWQiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLGVTdGF0ZSxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6OnNlbmRfY29tbWFuZF9wcm94eSgpOiBMb2FkZWQtLT5JbnZhbGlkKCVkIE5vdCBIYW5kbGVkKSIsXAotICAgICAgICAgICAgICAgICAgICAgICAgZVN0YXRlKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogQ3VycmVudCBTdGF0ZSBpcyBJRExFICovCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGVsc2UgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgewotICAgICAgICAgICAgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVsZWFzZV9kb25lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogU2luY2UgZXJyb3IgaXMgTm9uZSAsIHdlIHdpbGwgcG9zdCBhbiBldmVudCBhdCB0aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgICAqIG9mIHRoaXMgZnVuY3Rpb24gZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgICAgICAgKiBSZXNldCBidWZmZXIgcmVxdWlyZW1lbnRzIGhlcmUgdG8gZW5zdXJlIHNldHRpbmcgYnVmZmVyIHJlcXVpcmVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAqIHdoZW4gY29tcG9uZW50IG1vdmUgdG8gZXhlY3V0aW5nIHN0YXRlIGZyb20gbG9hZGVkIHN0YXRlIHZpYSBJZGxlLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2VuZF9jb21tYW5kX3Byb3h5KCk6IElkbGUtLT5Mb2FkZWQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNlbmRfY29tbWFuZF9wcm94eSgpOiBJZGxlLS0+TG9hZGVkLVBlbmRpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsIE9NWF9DT01QT05FTlRfTE9BRElOR19QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgIGJGbGFnID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBJZGxlIHRvIEV4ZWN1dGluZyAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2VuZF9jb21tYW5kX3Byb3h5KCk6IElkbGUtLT5FeGVjdXRpbmciKTsKLSAgICAgICAgICAgICAgICAvL0JJVE1BU0tfU0VUKCZtX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX0VYRUNVVEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgYkZsYWcgPSAxOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2VuZF9jb21tYW5kX3Byb3h5KCk6IElkbGUtLT5FeGVjdXRpbmciKTsKLSAgICAgICAgICAgICAgICBtX3N0YXRlPU9NWF9TdGF0ZUV4ZWN1dGluZzsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJTdHJlYW0gT24gQ0FQVFVSRSBXYXMgc3VjY2Vzc2Z1bCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gSWRsZSB0byBJZGxlICovCi0gICAgICAgICAgICBlbHNlIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjo6c2VuZF9jb21tYW5kX3Byb3h5KCk6IElkbGUtLT5JZGxlIik7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JTYW1lU3RhdGUsXAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclNhbWVTdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIElkbGUgdG8gV2FpdEZvclJlc291cmNlcyAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6OnNlbmRfY29tbWFuZF9wcm94eSgpOiBJZGxlLS0+V2FpdEZvclJlc291cmNlcyIpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBJZGxlIHRvIFBhdXNlICovCi0gICAgICAgICAgICBlbHNlIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpIHsKLSAgICAgICAgICAgICAgICAvKlRvIHBhdXNlIHRoZSBWaWRlbyBjb3JlIHdlIG5lZWQgdG8gc3RhcnQgdGhlIGRyaXZlciovCi0gICAgICAgICAgICAgICAgaWYgKC8qaW9jdGwgKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLFZERUNfSU9DVExfQ01EX1NUQVJULAotICAgICAgICAgICAgICAgICAgICAgIE5VTEwpIDwgKi8wKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJWREVDX0lPQ1RMX0NNRF9TVEFSVCBGQUlMRUQiKTsKLSAgICAgICAgICAgICAgICAgICAgb214X3JlcG9ydF9lcnJvciAoKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckhhcmR3YXJlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEJJVE1BU0tfU0VUKCZtX2ZsYWdzLE9NWF9DT01QT05FTlRfUEFVU0VfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2VuZF9jb21tYW5kX3Byb3h5KCk6IElkbGUtLT5QYXVzZSIpOwotICAgICAgICAgICAgICAgICAgICBiRmxhZyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gSWRsZSB0byBJbnZhbGlkICovCi0gICAgICAgICAgICBlbHNlIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjo6c2VuZF9jb21tYW5kX3Byb3h5KCk6IElkbGUtLT5JbnZhbGlkIik7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixlU3RhdGUsT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOjpzZW5kX2NvbW1hbmRfcHJveHkoKTogSWRsZSAtLT4gJWQgTm90IEhhbmRsZWQiLGVTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIEN1cnJlbnQgU3RhdGUgaXMgRXhlY3V0aW5nICovCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGVsc2UgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkNvbW1hbmQgUmVjaWV2ZWQgaW4gT01YX1N0YXRlRXhlY3V0aW5nIik7Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBFeGVjdXRpbmcgdG8gSWRsZSAqLwotICAgICAgICAgICAgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSB7Ci0gICAgICAgICAgICAgICAgLyogU2luY2UgZXJyb3IgaXMgTm9uZSAsIHdlIHdpbGwgcG9zdCBhbiBldmVudAotICAgICAgICAgICAgICAgICAgIGF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbiBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZW5kX2NvbW1hbmRfcHJveHkoKTogRXhlY3V0aW5nIC0tPiBJZGxlIik7Ci0gICAgICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgIGlmICghc2VtX3Bvc3RlZCkgewotICAgICAgICAgICAgICAgICAgICBzZW1fcG9zdGVkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgc2VtX3Bvc3QgKCZtX2NtZF9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZV9vbXhfZmx1c2goT01YX0FMTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJGbGFnID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIEV4ZWN1dGluZyB0byBQYXVzZWQgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiUEFVU0UgQ29tbWFuZCBJc3N1ZWQiKTsKLSAgICAgICAgICAgICAgICBtX3N0YXRlID0gT01YX1N0YXRlUGF1c2U7Ci0gICAgICAgICAgICAgICAgYkZsYWcgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gRXhlY3V0aW5nIHRvIExvYWRlZCAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZW5kX2NvbW1hbmRfcHJveHkoKTogRXhlY3V0aW5nIC0tPiBMb2FkZWQiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbixcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gRXhlY3V0aW5nIHRvIFdhaXRGb3JSZXNvdXJjZXMgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInNlbmRfY29tbWFuZF9wcm94eSgpOiBFeGVjdXRpbmcgLS0+IFdhaXRGb3JSZXNvdXJjZXMiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbixcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gRXhlY3V0aW5nIHRvIEV4ZWN1dGluZyAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZW5kX2NvbW1hbmRfcHJveHkoKTogRXhlY3V0aW5nIC0tPiBFeGVjdXRpbmciKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvclNhbWVTdGF0ZSxcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yU2FtZVN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gRXhlY3V0aW5nIHRvIEludmFsaWQgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInNlbmRfY29tbWFuZF9wcm94eSgpOiBFeGVjdXRpbmcgLS0+IEludmFsaWQiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLGVTdGF0ZSxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6OnNlbmRfY29tbWFuZF9wcm94eSgpOiBFeGVjdXRpbmcgLS0+ICVkIE5vdCBIYW5kbGVkIixlU3RhdGUpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogQ3VycmVudCBTdGF0ZSBpcyBQYXVzZSAgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgZWxzZSBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgewotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gUGF1c2UgdG8gRXhlY3V0aW5nICovCi0gICAgICAgICAgICBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiUGF1c2UgLS0+IEV4ZWN1dGluZyIpOwotICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBPTVhfU3RhdGVFeGVjdXRpbmc7Ci0gICAgICAgICAgICAgICAgYkZsYWcgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gUGF1c2UgdG8gSWRsZSAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUlkbGUpIHsKLSAgICAgICAgICAgICAgICAvKiBTaW5jZSBlcnJvciBpcyBOb25lICwgd2Ugd2lsbCBwb3N0IGFuIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uIGRlZmluaXRpb24gKi8KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlBhdXNlIC0tPiBJZGxlIik7Ci0gICAgICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgIGlmICghc2VtX3Bvc3RlZCkgewotICAgICAgICAgICAgICAgICAgICBzZW1fcG9zdGVkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgc2VtX3Bvc3QgKCZtX2NtZF9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZV9vbXhfZmx1c2goT01YX0FMTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJGbGFnID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIFBhdXNlIHRvIGxvYWRlZCAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJQYXVzZSAtLT4gbG9hZGVkIik7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb24sXAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIFBhdXNlIHRvIFdhaXRGb3JSZXNvdXJjZXMgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlBhdXNlIC0tPiBXYWl0Rm9yUmVzb3VyY2VzIik7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb24sXAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIFBhdXNlIHRvIFBhdXNlICovCi0gICAgICAgICAgICBlbHNlIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiUGF1c2UgLS0+IFBhdXNlIik7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JTYW1lU3RhdGUsXAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclNhbWVTdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIFBhdXNlIHRvIEludmFsaWQgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlBhdXNlIC0tPiBJbnZhbGlkIik7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixlU3RhdGUsT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOjpzZW5kX2NvbW1hbmRfcHJveHkoKTogUGF1c2VkIC0tPiAlZCBOb3QgSGFuZGxlZCIsZVN0YXRlKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIEN1cnJlbnQgU3RhdGUgaXMgV2FpdEZvclJlc291cmNlcyAgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgZWxzZSBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBXYWl0Rm9yUmVzb3VyY2VzIHRvIExvYWRlZCAqLwotICAgICAgICAgICAgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpIHsKLSAgICAgICAgICAgICAgICAvKiBTaW5jZSBlcnJvciBpcyBOb25lICwgd2Ugd2lsbCBwb3N0IGFuIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uIGRlZmluaXRpb24gKi8KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNlbmRfY29tbWFuZF9wcm94eSgpOiBXYWl0Rm9yUmVzb3VyY2VzLS0+TG9hZGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBXYWl0Rm9yUmVzb3VyY2VzIHRvIFdhaXRGb3JSZXNvdXJjZXMgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOjpzZW5kX2NvbW1hbmRfcHJveHkoKTogV2FpdEZvclJlc291cmNlcy0tPldhaXRGb3JSZXNvdXJjZXMiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvclNhbWVTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JTYW1lU3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBXYWl0Rm9yUmVzb3VyY2VzIHRvIEV4ZWN1dGluZyAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjo6c2VuZF9jb21tYW5kX3Byb3h5KCk6IFdhaXRGb3JSZXNvdXJjZXMtLT5FeGVjdXRpbmciKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbixcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gV2FpdEZvclJlc291cmNlcyB0byBQYXVzZSAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZVBhdXNlKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOjpzZW5kX2NvbW1hbmRfcHJveHkoKTogV2FpdEZvclJlc291cmNlcy0tPlBhdXNlIik7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb24sXAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIFdhaXRGb3JSZXNvdXJjZXMgdG8gSW52YWxpZCAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6OnNlbmRfY29tbWFuZF9wcm94eSgpOiBXYWl0Rm9yUmVzb3VyY2VzLS0+SW52YWxpZCIpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsZVN0YXRlLE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBXYWl0Rm9yUmVzb3VyY2VzIHRvIExvYWRlZCAtCi0gICAgICAgICAgICAgICBpcyBOT1QgdGVzdGVkIGJ5IEtocm9ub3MgVFMgKi8KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOjpzZW5kX2NvbW1hbmRfcHJveHkoKTogJWQgLS0+ICVkKE5vdCBIYW5kbGVkKSIsbV9zdGF0ZSxlU3RhdGUpOwotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogQ3VycmVudCBTdGF0ZSBpcyBJbnZhbGlkICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgZWxzZSBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgIC8qIFN0YXRlIFRyYW5zaXRpb24gZnJvbSBJbmF2bGlkIHRvIGFueSBzdGF0ZSAqLwotICAgICAgICBpZiAoZVN0YXRlID09IChPTVhfU3RhdGVMb2FkZWQgfHwgT01YX1N0YXRlV2FpdEZvclJlc291cmNlcwotICAgICAgICAgICAgICAgICAgICB8fCBPTVhfU3RhdGVJZGxlIHx8IE9NWF9TdGF0ZUV4ZWN1dGluZwotICAgICAgICAgICAgICAgICAgICB8fCBPTVhfU3RhdGVQYXVzZSB8fCBPTVhfU3RhdGVJbnZhbGlkKSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOjpzZW5kX2NvbW1hbmRfcHJveHkoKTogSW52YWxpZCAtLT5Mb2FkZWQiKTsKLSAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsT01YX0Vycm9ySW52YWxpZFN0YXRlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjbWQgPT0gT01YX0NvbW1hbmRGbHVzaCkgewotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZW5kX2NvbW1hbmRfcHJveHkoKTogT01YX0NvbW1hbmRGbHVzaCBpc3N1ZWQiCi0gICAgICAgICAgICAgICAgIndpdGggcGFyYW0xOiAldSIsICh1bnNpZ25lZCBpbnQpcGFyYW0xKTsKLSAgICAgICAgc2VuZF9jb2RlY19jb25maWcoKTsKLSAgICAgICAgaWYgKGNtZCA9PSBPTVhfQ29tbWFuZEZsdXNoICYmIChwYXJhbTEgPT0gT01YX0NPUkVfSU5QVVRfUE9SVF9JTkRFWCB8fAotICAgICAgICAgICAgICAgICAgICBwYXJhbTEgPT0gT01YX0FMTCkpIHsKLSAgICAgICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19hZGQoMCwgJm1fcXVldWVkX2NvZGVjX2NvbmZpZ19jb3VudCkgPiAwKSB7Ci0gICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0KLSAgICAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7Ci0gICAgICAgICAgICAgICB0cy50dl9zZWMgKz0gMjsKLSAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygid2FpdGluZyBmb3IgJWQgRUJEcyBvZiBDT0RFQyBDT05GSUcgYnVmZmVycyAiLAotICAgICAgICAgICAgICAgICAgICAgICBtX3F1ZXVlZF9jb2RlY19jb25maWdfY291bnQpOwotICAgICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsIE9NWF9DT01QT05FTlRfRkxVU0hfREVGRVJSRUQpOwotICAgICAgICAgICAgICAgaWYgKHNlbV90aW1lZHdhaXQoJm1fc2FmZV9mbHVzaCwgJnRzKSkgewotICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gd2FpdCBmb3IgRUJEcyBvZiBDT0RFQyBDT05GSUcgYnVmZmVycyIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUiAoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9GTFVTSF9ERUZFUlJFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoT01YX0NPUkVfSU5QVVRfUE9SVF9JTkRFWCA9PSBwYXJhbTEgfHwgT01YX0FMTCA9PSBwYXJhbTEpIHsKLSAgICAgICAgICAgIEJJVE1BU0tfU0VUKCZtX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX0lOUFVUX0ZMVVNIX1BFTkRJTkcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCA9PSBwYXJhbTEgfHwgT01YX0FMTCA9PSBwYXJhbTEpIHsKLSAgICAgICAgICAgIEJJVE1BU0tfU0VUKCZtX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX09VVFBVVF9GTFVTSF9QRU5ESU5HKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXNlbV9wb3N0ZWQpIHsKLSAgICAgICAgICAgIHNlbV9wb3N0ZWQgPSAxOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXQgdGhlIFNlbWFwaG9yZSIpOwotICAgICAgICAgICAgc2VtX3Bvc3QgKCZtX2NtZF9sb2NrKTsKLSAgICAgICAgICAgIGV4ZWN1dGVfb214X2ZsdXNoKHBhcmFtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgYkZsYWcgPSAwOwotICAgIH0gZWxzZSBpZiAoIGNtZCA9PSBPTVhfQ29tbWFuZFBvcnRFbmFibGUpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgic2VuZF9jb21tYW5kX3Byb3h5KCk6IE9NWF9Db21tYW5kUG9ydEVuYWJsZSBpc3N1ZWQiCi0gICAgICAgICAgICAgICAgIndpdGggcGFyYW0xOiAldSIsICh1bnNpZ25lZCBpbnQpcGFyYW0xKTsKLSAgICAgICAgaWYgKHBhcmFtMSA9PSBPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYIHx8IHBhcmFtMSA9PSBPTVhfQUxMKSB7Ci0gICAgICAgICAgICBtX2lucF9iRW5hYmxlZCA9IE9NWF9UUlVFOwotCi0gICAgICAgICAgICBpZiAoIChtX3N0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIUJJVE1BU0tfUFJFU0VOVCgmbV9mbGFncyxPTVhfQ09NUE9ORU5UX0lETEVfUEVORElORykpCi0gICAgICAgICAgICAgICAgICAgIHx8IGFsbG9jYXRlX2lucHV0X2RvbmUoKSkgewotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0NvbW1hbmRQb3J0RW5hYmxlLE9NWF9DT1JFX0lOUFVUX1BPUlRfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZW5kX2NvbW1hbmRfcHJveHkoKTogRGlzYWJsZWQtLT5FbmFibGVkIFBlbmRpbmciKTsKLSAgICAgICAgICAgICAgICBCSVRNQVNLX1NFVCgmbV9mbGFncywgT01YX0NPTVBPTkVOVF9JTlBVVF9FTkFCTEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgYkZsYWcgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbTEgPT0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVggfHwgcGFyYW0xID09IE9NWF9BTEwpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRW5hYmxlIG91dHB1dCBQb3J0IGNvbW1hbmQgcmVjaWV2ZWQiKTsKLSAgICAgICAgICAgIG1fb3V0X2JFbmFibGVkID0gT01YX1RSVUU7Ci0KLSAgICAgICAgICAgIGlmICggKG1fc3RhdGUgPT0gT01YX1N0YXRlTG9hZGVkICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhQklUTUFTS19QUkVTRU5UKCZtX2ZsYWdzLE9NWF9DT01QT05FTlRfSURMRV9QRU5ESU5HKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKGFsbG9jYXRlX291dHB1dF9kb25lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfQ29tbWFuZFBvcnRFbmFibGUsT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNlbmRfY29tbWFuZF9wcm94eSgpOiBEaXNhYmxlZC0tPkVuYWJsZWQgUGVuZGluZyIpOwotICAgICAgICAgICAgICAgIEJJVE1BU0tfU0VUKCZtX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX09VVFBVVF9FTkFCTEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgYkZsYWcgPSAwOwotICAgICAgICAgICAgICAgIC8qIGVuYWJsZS9kaXNhYmxlIGRvd25zY2FsaW5nIGlmIHJlcXVpcmVkICovCi0gICAgICAgICAgICAgICAgcmV0ID0gZGVjaWRlX2Rvd25zY2FsYXIoKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZGVjaWRlX2Rvd25zY2FsYXIgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNtZCA9PSBPTVhfQ29tbWFuZFBvcnREaXNhYmxlKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNlbmRfY29tbWFuZF9wcm94eSgpOiBPTVhfQ29tbWFuZFBvcnREaXNhYmxlIGlzc3VlZCIKLSAgICAgICAgICAgICAgICAid2l0aCBwYXJhbTE6ICV1IiwgKHVuc2lnbmVkIGludClwYXJhbTEpOwotICAgICAgICBpZiAocGFyYW0xID09IE9NWF9DT1JFX0lOUFVUX1BPUlRfSU5ERVggfHwgcGFyYW0xID09IE9NWF9BTEwpIHsKLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZ19mbGFnID0gZmFsc2U7Ci0gICAgICAgICAgICBtX2lucF9iRW5hYmxlZCA9IE9NWF9GQUxTRTsKLSAgICAgICAgICAgIGlmICgobV9zdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQgfHwgbV9zdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKQotICAgICAgICAgICAgICAgICAgICAmJiByZWxlYXNlX2lucHV0X2RvbmUoKSkgewotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0NvbW1hbmRQb3J0RGlzYWJsZSxPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEJJVE1BU0tfU0VUKCZtX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX0lOUFVUX0RJU0FCTEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlUGF1c2UgfHxtX3N0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbV9wb3N0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbV9wb3N0ZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VtX3Bvc3QgKCZtX2NtZF9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBleGVjdXRlX29teF9mbHVzaChPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBldmVudCBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICBiRmxhZyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtMSA9PSBPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCB8fCBwYXJhbTEgPT0gT01YX0FMTCkgewotICAgICAgICAgICAgbV9vdXRfYkVuYWJsZWQgPSBPTVhfRkFMU0U7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkRpc2FibGUgb3V0cHV0IFBvcnQgY29tbWFuZCByZWNpZXZlZCIpOwotICAgICAgICAgICAgaWYgKChtX3N0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCB8fCBtX3N0YXRlID09IE9NWF9TdGF0ZUlkbGUpCi0gICAgICAgICAgICAgICAgICAgICYmIHJlbGVhc2Vfb3V0cHV0X2RvbmUoKSkgewotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0NvbW1hbmRQb3J0RGlzYWJsZSxPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCxcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsIE9NWF9DT01QT05FTlRfT1VUUFVUX0RJU0FCTEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlUGF1c2UgfHxtX3N0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbV9wb3N0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbV9wb3N0ZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VtX3Bvc3QgKCZtX2NtZF9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBCSVRNQVNLX1NFVCgmbV9mbGFncywgT01YX0NPTVBPTkVOVF9PVVRQVVRfRkxVU0hfSU5fRElTQUJMRV9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZV9vbXhfZmx1c2goT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBldmVudCBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICBiRmxhZyA9IDA7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFcnJvcjogSW52YWxpZCBDb21tYW5kIG90aGVyIHRoYW4gU3RhdGVTZXQgKCVkKSIsY21kKTsKLSAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vdEltcGxlbWVudGVkOwotICAgIH0KLSAgICBpZiAoZVJldCA9PSBPTVhfRXJyb3JOb25lICYmIGJGbGFnKSB7Ci0gICAgICAgIHBvc3RfZXZlbnQoY21kLGVTdGF0ZSxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICB9Ci0gICAgaWYgKCFzZW1fcG9zdGVkKSB7Ci0gICAgICAgIHNlbV9wb3N0KCZtX2NtZF9sb2NrKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZVJldDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZGVjOjpFeGVjdXRlT214Rmx1c2gKLQotICAgREVTQ1JJUFRJT04KLSAgIEV4ZWN1dGVzIHRoZSBPTVggZmx1c2guCi0KLSAgIFBBUkFNRVRFUlMKLSAgIGZsdXNodHlwZSAtIGlucHV0IGZsdXNoKDEpL291dHB1dCBmbHVzaCgwKS8gYm90aC4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1ib29sIG9teF92ZGVjOjpleGVjdXRlX29teF9mbHVzaChPTVhfVTMyIGZsdXNoVHlwZSkKLXsKLSAgICBib29sIGJSZXQgPSBmYWxzZTsKLSAgICBzdHJ1Y3QgdjRsMl9wbGFuZSBwbGFuZTsKLSAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgdjRsMl9idWY7Ci0gICAgc3RydWN0IHY0bDJfZGVjb2Rlcl9jbWQgZGVjOwotICAgIERFQlVHX1BSSU5UX0xPVygiaW4gJXMsIGZsdXNoaW5nICV1IiwgX19mdW5jX18sICh1bnNpZ25lZCBpbnQpZmx1c2hUeXBlKTsKLSAgICBtZW1zZXQoKHZvaWQgKikmdjRsMl9idWYsMCxzaXplb2YodjRsMl9idWYpKTsKLSAgICBkZWMuY21kID0gVjRMMl9RQ09NX0NNRF9GTFVTSDsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goImluICVzOiByZWNvbmZpZz8gJWQiLCBfX2Z1bmNfXywgaW5fcmVjb25maWcpOwotCi0gICAgaWYgKGluX3JlY29uZmlnICYmIGZsdXNoVHlwZSA9PSBPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCkgewotICAgICAgICBvdXRwdXRfZmx1c2hfcHJvZ3Jlc3MgPSB0cnVlOwotICAgICAgICBkZWMuZmxhZ3MgPSBWNEwyX1FDT01fQ01EX0ZMVVNIX0NBUFRVUkU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogWFhYOiBUaGUgZHJpdmVyL2hhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZmx1c2hpbmcgb2YgaW5kaXZpZHVhbCBwb3J0cwotICAgICAgICAgKiBpbiBhbGwgc3RhdGVzLiBTbyB3ZSBwcmV0dHkgbXVjaCBuZWVkIHRvIGZsdXNoIGJvdGggcG9ydHMgaW50ZXJuYWxseSwKLSAgICAgICAgICogYnV0IGNsaWVudCBzaG91bGQgb25seSBnZXQgdGhlIEZMVVNIXyhJTlBVVHxPVVRQVVQpX0RPTkUgZm9yIHRoZSBvbmUgaXQKLSAgICAgICAgICogcmVxdWVzdGVkLiAgU2luY2UgT01YX0NPTVBPTkVOVF8oT1VUUFVUfElOUFVUKV9GTFVTSF9QRU5ESU5HIGlzbid0IHNldCwKLSAgICAgICAgICogd2UgYXV0b21hdGljYWxseSBvbWl0IHNlbmRpbmcgdGhlIEZMVVNIIGRvbmUgZm9yIHRoZSAib3Bwb3NpdGUiIHBvcnQuICovCi0gICAgICAgIGlucHV0X2ZsdXNoX3Byb2dyZXNzID0gdHJ1ZTsKLSAgICAgICAgb3V0cHV0X2ZsdXNoX3Byb2dyZXNzID0gdHJ1ZTsKLSAgICAgICAgZGVjLmZsYWdzID0gVjRMMl9RQ09NX0NNRF9GTFVTSF9PVVRQVVQgfCBWNEwyX1FDT01fQ01EX0ZMVVNIX0NBUFRVUkU7Ci0gICAgfQotCi0gICAgaWYgKGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfREVDT0RFUl9DTUQsICZkZWMpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGbHVzaCBQb3J0ICgldSkgRmFpbGVkICIsICh1bnNpZ25lZCBpbnQpZmx1c2hUeXBlKTsKLSAgICAgICAgYlJldCA9IGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBiUmV0OwotfQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiA6IGV4ZWN1dGVfb3V0cHV0X2ZsdXNoCi0KLURFU0NSSVBUSU9OCi1FeGVjdXRlcyB0aGUgT01YIGZsdXNoIGF0IE9VVFBVVCBQT1JULgotCi1QQVJBTUVURVJTCi1Ob25lLgotCi1SRVRVUk4gVkFMVUUKLXRydWUvZmFsc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWJvb2wgb214X3ZkZWM6OmV4ZWN1dGVfb3V0cHV0X2ZsdXNoKCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHAxID0gMDsgLy8gUGFyYW1ldGVyIC0gMQotICAgIHVuc2lnbmVkIGxvbmcgcDIgPSAwOyAvLyBQYXJhbWV0ZXIgLSAyCi0gICAgdW5zaWduZWQgbG9uZyBpZGVudCA9IDA7Ci0gICAgYm9vbCBiUmV0ID0gdHJ1ZTsKLQotICAgIC8qR2VuZXJhdGUgRkJEIGZvciBhbGwgQnVmZmVycyBpbiB0aGUgRlRCcSovCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOwotICAgIERFQlVHX1BSSU5UX0xPVygiSW5pdGlhdGUgT3V0cHV0IEZsdXNoIik7Ci0KLSAgICAvL3Jlc2V0IGxhc3QgcmVuZGVyIFRTCi0gICAgaWYobV9sYXN0X3JlbmRlcmVkX1RTID4gMCkgewotICAgICAgICBtX2xhc3RfcmVuZGVyZWRfVFMgPSAwOwotICAgIH0KLQotICAgIHdoaWxlIChtX2Z0Yl9xLm1fc2l6ZSkgewotICAgICAgICBERUJVR19QUklOVF9MT1coIkJ1ZmZlciBxdWV1ZSBzaXplICVsdSBwZW5kaW5nIGJ1ZiBjbnQgJWQiLAotICAgICAgICAgICAgICAgIG1fZnRiX3EubV9zaXplLHBlbmRpbmdfb3V0cHV0X2J1ZmZlcnMpOwotICAgICAgICBtX2Z0Yl9xLnBvcF9lbnRyeSgmcDEsJnAyLCZpZGVudCk7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiSUQoJWx4KSBQMSglbHgpIFAyKCVseCkiLCBpZGVudCwgcDEsIHAyKTsKLSAgICAgICAgaWYgKGlkZW50ID09IG1fZmlsbF9vdXRwdXRfbXNnICkgewotICAgICAgICAgICAgbV9jYi5GaWxsQnVmZmVyRG9uZSgmbV9jbXAsIG1fYXBwX2RhdGEsIChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKShpbnRwdHJfdClwMik7Ci0gICAgICAgIH0gZWxzZSBpZiAoaWRlbnQgPT0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GQkQpIHsKLSAgICAgICAgICAgIGZpbGxfYnVmZmVyX2RvbmUoJm1fY21wLChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKShpbnRwdHJfdClwMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7Ci0gICAgb3V0cHV0X2ZsdXNoX3Byb2dyZXNzID0gZmFsc2U7Ci0KLSAgICBpZiAoYXJiaXRyYXJ5X2J5dGVzKSB7Ci0gICAgICAgIHByZXZfdHMgPSBMTE9OR19NQVg7Ci0gICAgICAgIHJzdF9wcmV2X3RzID0gdHJ1ZTsKLSAgICB9Ci0gICAgREVCVUdfUFJJTlRfSElHSCgiT01YIGZsdXNoIG8vcCBQb3J0IGNvbXBsZXRlIFBlbkJ1ZiglZCkiLCBwZW5kaW5nX291dHB1dF9idWZmZXJzKTsKLSAgICByZXR1cm4gYlJldDsKLX0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gOiBleGVjdXRlX2lucHV0X2ZsdXNoCi0KLURFU0NSSVBUSU9OCi1FeGVjdXRlcyB0aGUgT01YIGZsdXNoIGF0IElOUFVUIFBPUlQuCi0KLVBBUkFNRVRFUlMKLU5vbmUuCi0KLVJFVFVSTiBWQUxVRQotdHJ1ZS9mYWxzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotYm9vbCBvbXhfdmRlYzo6ZXhlY3V0ZV9pbnB1dF9mbHVzaCgpCi17Ci0gICAgdW5zaWduZWQgICAgICAgaSA9MDsKLSAgICB1bnNpZ25lZCBsb25nIHAxID0gMDsgLy8gUGFyYW1ldGVyIC0gMQotICAgIHVuc2lnbmVkIGxvbmcgcDIgPSAwOyAvLyBQYXJhbWV0ZXIgLSAyCi0gICAgdW5zaWduZWQgbG9uZyBpZGVudCA9IDA7Ci0gICAgYm9vbCBiUmV0ID0gdHJ1ZTsKLQotICAgIC8qR2VuZXJhdGUgRUJEIGZvciBhbGwgQnVmZmVycyBpbiB0aGUgRVRCcSovCi0gICAgREVCVUdfUFJJTlRfTE9XKCJJbml0aWF0ZSBJbnB1dCBGbHVzaCIpOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOwotICAgIERFQlVHX1BSSU5UX0xPVygiQ2hlY2sgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5Iik7Ci0gICAgd2hpbGUgKG1fZXRiX3EubV9zaXplKSB7Ci0gICAgICAgIG1fZXRiX3EucG9wX2VudHJ5KCZwMSwmcDIsJmlkZW50KTsKLQotICAgICAgICBpZiAoaWRlbnQgPT0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVEJfQVJCSVRSQVJZKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkZsdXNoIElucHV0IEhlYXAgQnVmZmVyICVwIiwoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMik7Ci0gICAgICAgICAgICBtX2NiLkVtcHR5QnVmZmVyRG9uZSgmbV9jbXAgLG1fYXBwX2RhdGEsIChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKXAyKTsKLSAgICAgICAgfSBlbHNlIGlmIChpZGVudCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQikgewotICAgICAgICAgICAgcGVuZGluZ19pbnB1dF9idWZmZXJzKys7Ci0gICAgICAgICAgICBWSURDX1RSQUNFX0lOVF9MT1coIkVUQi1wZW5kaW5nIiwgcGVuZGluZ19pbnB1dF9idWZmZXJzKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRmx1c2ggSW5wdXQgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVEIgJXAsIHBlbmRpbmdfaW5wdXRfYnVmZmVycyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKXAyLCBwZW5kaW5nX2lucHV0X2J1ZmZlcnMpOwotICAgICAgICAgICAgZW1wdHlfYnVmZmVyX2RvbmUoJm1fY21wLChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKXAyKTsKLSAgICAgICAgfSBlbHNlIGlmIChpZGVudCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VCRCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGbHVzaCBJbnB1dCBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VCRCAlcCIsCi0gICAgICAgICAgICAgICAgICAgIChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKXAxKTsKLSAgICAgICAgICAgIGVtcHR5X2J1ZmZlcl9kb25lKCZtX2NtcCwoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGltZV9zdGFtcF9kdHMuZmx1c2hfdGltZXN0YW1wKCk7Ci0gICAgLypDaGVjayBpZiBIZWFwIEJ1ZmZlcnMgYXJlIHRvIGJlIGZsdXNoZWQqLwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOwotICAgIGlucHV0X2ZsdXNoX3Byb2dyZXNzID0gZmFsc2U7Ci0gICAgaWYgKCFhcmJpdHJhcnlfYnl0ZXMpIHsKLSAgICAgICAgcHJldl90cyA9IExMT05HX01BWDsKLSAgICAgICAgcnN0X3ByZXZfdHMgPSB0cnVlOwotICAgIH0KLSNpZmRlZiBfQU5EUk9JRF8KLSAgICBpZiAobV9kZWJ1Z190aW1lc3RhbXApIHsKLSAgICAgICAgbV90aW1lc3RhbXBfbGlzdC5yZXNldF90c19saXN0KCk7Ci0gICAgfQotI2VuZGlmCi0gICAgREVCVUdfUFJJTlRfSElHSCgiT01YIGZsdXNoIGkvcCBQb3J0IGNvbXBsZXRlIFBlbkJ1ZiglZCkiLCBwZW5kaW5nX2lucHV0X2J1ZmZlcnMpOwotICAgIHJldHVybiBiUmV0OwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6U2VuZENvbW1hbmRFdmVudAotCi0gICBERVNDUklQVElPTgotICAgU2VuZCB0aGUgZXZlbnQgdG8gZGVjb2RlciBwaXBlLiAgVGhpcyBpcyBuZWVkZWQgdG8gZ2VuZXJhdGUgdGhlIGNhbGxiYWNrcwotICAgaW4gZGVjb2RlciB0aHJlYWQgY29udGV4dC4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1ib29sIG9teF92ZGVjOjpwb3N0X2V2ZW50KHVuc2lnbmVkIGxvbmcgcDEsCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgcDIsCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgaWQpCi17Ci0gICAgYm9vbCBiUmV0ID0gZmFsc2U7Ci0KLSAgICAvKiBKdXN0IGRyb3AgbWVzc2FnZXMgdHlwaWNhbGx5IGdlbmVyYXRlZCBieSBoYXJkd2FyZSAody9vIGNsaWVudCByZXF1ZXN0KSwKLSAgICAgKiBpZiB3ZSd2ZSByZXBvcnRlZCBhbiBlcnJvciB0byBjbGllbnQuICovCi0gICAgaWYgKG1fZXJyb3JfcHJvcG9nYXRlZCkgewotICAgICAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgICAgICAgICBjYXNlIE9NWF9DT01QT05FTlRfR0VORVJBVEVfUE9SVF9SRUNPTkZJRzoKLSAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9IQVJEV0FSRV9FUlJPUjoKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRHJvcHBpbmcgbWVzc2FnZSAlbHggIgotICAgICAgICAgICAgICAgICAgICAgICAgInNpbmNlIGNsaWVudCBleHBlY3RlZCB0byBiZSBpbiBlcnJvciBzdGF0ZSIsIGlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8qIHdoYXRldmVyICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbG9jayk7Ci0KLSAgICBpZiAoaWQgPT0gbV9maWxsX291dHB1dF9tc2cgfHwKLSAgICAgICAgICAgIGlkID09IE9NWF9DT01QT05FTlRfR0VORVJBVEVfRkJEIHx8Ci0gICAgICAgICAgICBpZCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1BPUlRfUkVDT05GSUcgfHwKLSAgICAgICAgICAgIGlkID09IE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlRfT1VUUFVUX0ZMVVNIKSB7Ci0gICAgICAgIG1fZnRiX3EuaW5zZXJ0X2VudHJ5KHAxLHAyLGlkKTsKLSAgICB9IGVsc2UgaWYgKGlkID09IE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVRCIHx8Ci0gICAgICAgICAgICBpZCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VCRCB8fAotICAgICAgICAgICAgaWQgPT0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVEJfQVJCSVRSQVJZIHx8Ci0gICAgICAgICAgICBpZCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UX0lOUFVUX0ZMVVNIKSB7Ci0gICAgICAgIG1fZXRiX3EuaW5zZXJ0X2VudHJ5KHAxLHAyLGlkKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX2NtZF9xLmluc2VydF9lbnRyeShwMSxwMixpZCk7Ci0gICAgfQotCi0gICAgYlJldCA9IHRydWU7Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJWYWx1ZSBvZiB0aGlzIHBvaW50ZXIgaW4gcG9zdF9ldmVudCAlcCIsdGhpcyk7Ci0gICAgcG9zdF9tZXNzYWdlKHRoaXMsIGlkKTsKLQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOwotCi0gICAgcmV0dXJuIGJSZXQ7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgb214X3ZkZWM6OmdldF9zdXBwb3J0ZWRfcHJvZmlsZV9sZXZlbChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcHJvZmlsZUxldmVsVHlwZSkKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIGlmICghcHJvZmlsZUxldmVsVHlwZSkKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLQotICAgIGlmIChwcm9maWxlTGV2ZWxUeXBlLT5uUG9ydEluZGV4ID09IDApIHsKLSAgICAgICAgaWYgKCFzdHJuY21wKGRydl9jdHgua2luZCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjIixPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDUxOwotICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXggPT0gMCkgewotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUxldmVsVHlwZS0+blByb2ZpbGVJbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsVHlwZS0+ZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZU1haW47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXggPT0gMikgewotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlTGV2ZWxUeXBlLT5uUHJvZmlsZUluZGV4ID09IDMpIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUxldmVsVHlwZS0+blByb2ZpbGVJbmRleCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsVHlwZS0+ZVByb2ZpbGUgPSBRT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlTGV2ZWxUeXBlLT5uUHJvZmlsZUluZGV4ID09IDUpIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlTGV2ZWxUeXBlLT5uUHJvZmlsZUluZGV4ID09IDYpIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lUHJvZmlsZSA9IFFPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQgblByb2ZpbGVJbmRleCByZXQgTm9Nb3JlICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcHJvZmlsZUxldmVsVHlwZS0+blByb2ZpbGVJbmRleCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vTW9yZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChkcnZfY3R4LmtpbmQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLm12YyIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXggPT0gMCkgewotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVQcm9maWxlID0gUU9NWF9WSURFT19NVkNQcm9maWxlU3RlcmVvSGlnaDsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lTGV2ZWwgICA9IFFPTVhfVklERU9fTVZDTGV2ZWw1MTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQgblByb2ZpbGVJbmRleCByZXQgTm9Nb3JlICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwcm9maWxlTGV2ZWxUeXBlLT5uUHJvZmlsZUluZGV4KTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yTm9Nb3JlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRydl9jdHgua2luZCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaGV2YyIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXggPT0gMCkgewotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVQcm9maWxlID0gT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lTGV2ZWwgICA9IE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDUxOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlTGV2ZWxUeXBlLT5uUHJvZmlsZUluZGV4ID09IDEpIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lUHJvZmlsZSA9IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4xMDsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lTGV2ZWwgICA9IE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDUxOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlTGV2ZWxUeXBlLT5uUHJvZmlsZUluZGV4ID09IDIpIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lUHJvZmlsZSA9IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4xMEhEUjEwOwotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVMZXZlbCAgID0gT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNTE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkIG5Qcm9maWxlSW5kZXggcmV0IE5vTW9yZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXgpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDgiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSB8fAotICAgICAgICAgICAgICAgICFzdHJuY21wKGRydl9jdHgua2luZCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA5IixPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMiIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZUxldmVsVHlwZS0+blByb2ZpbGVJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsVHlwZS0+ZVByb2ZpbGUgPSBPTVhfVklERU9fTVBFRzJQcm9maWxlU2ltcGxlOwotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVMZXZlbCAgID0gT01YX1ZJREVPX01QRUcyTGV2ZWxITDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUxldmVsVHlwZS0+blByb2ZpbGVJbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsVHlwZS0+ZVByb2ZpbGUgPSBPTVhfVklERU9fTVBFRzJQcm9maWxlTWFpbjsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lTGV2ZWwgICA9IE9NWF9WSURFT19NUEVHMkxldmVsSEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkIG5Qcm9maWxlSW5kZXggcmV0IE5vTW9yZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcHJvZmlsZUxldmVsVHlwZS0+blByb2ZpbGVJbmRleCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vTW9yZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQgcmV0IE5vTW9yZSBmb3IgY29kZWM6ICVzIiwgZHJ2X2N0eC5raW5kKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkIHNob3VsZCBiZSBxdWVyaWVzIG9uIElucHV0IHBvcnQgb25seSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcHJvZmlsZUxldmVsVHlwZS0+blBvcnRJbmRleCk7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgfQotICAgIHJldHVybiBlUmV0OwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6OkdldFBhcmFtZXRlcgotCi0gICBERVNDUklQVElPTgotICAgT01YIEdldCBQYXJhbWV0ZXIgbWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgIFBBUkFNRVRFUlMKLSAgIDxUQkQ+LgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIEVycm9yIE5vbmUgaWYgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZGVjOjpnZXRfcGFyYW1ldGVyKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFIHBhcmFtSW5kZXgsCi0gICAgICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICBwYXJhbURhdGEpCi17Ci0gICAgKHZvaWQpIGhDb21wOwotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBERUJVR19QUklOVF9MT1coImdldF9wYXJhbWV0ZXI6Iik7Ci0gICAgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiR2V0IFBhcmFtIGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0gICAgaWYgKHBhcmFtRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiR2V0IFBhcmFtIGluIEludmFsaWQgcGFyYW1EYXRhIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotICAgIHN3aXRjaCAoKHVuc2lnbmVkIGxvbmcpcGFyYW1JbmRleCkgewotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb246IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWZuID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2lkZV9kcGJfYnVmZmVyX21vZGUoaXNfZG93bl9zY2FsYXJfZW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IHVwZGF0ZV9wb3J0ZGVmKHBvcnREZWZuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVJldCA9PSBPTVhfRXJyb3JOb25lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfZGVmID0gKnBvcnREZWZuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Jbml0OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9QT1JUX1BBUkFNX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BPUlRfUEFSQU1fVFlQRSAqcG9ydFBhcmFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9QT1JUX1BBUkFNX1RZUEUgKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvSW5pdCIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0UGFyYW1UeXBlLT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0UGFyYW1UeXBlLT5uU2l6ZSA9IHNpemVvZihPTVhfUE9SVF9QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRQYXJhbVR5cGUtPm5Qb3J0cyAgICAgICAgICAgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFBhcmFtVHlwZS0+blN0YXJ0UG9ydE51bWJlciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpwb3J0Rm10ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Rm10LT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRGbXQtPm5TaXplICAgICAgICAgICAgID0gc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gcG9ydEZtdC0+blBvcnRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gcG9ydEZtdC0+bkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEZtdC0+ZUNvbG9yRm9ybWF0ID0gIE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEZtdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gZUNvbXByZXNzaW9uRm9ybWF0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6IlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTm9Nb3JlIGNvbXByZXNzaW9uIGZvcm1hdHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gIE9NWF9FcnJvck5vTW9yZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgxID09IHBvcnRGbXQtPm5Qb3J0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRGbXQtPmVDb21wcmVzc2lvbkZvcm1hdCA9ICBPTVhfVklERU9fQ29kaW5nVW51c2VkOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXN0aW5ndWlzaCBub24tc3VyZmFjZSBtb2RlIGZyb20gbm9ybWFsIHBsYXliYWNrIHVzZS1jYXNlIGJhc2VkIG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2FnZSBoaW50ZWQgdmlhICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgudXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcjIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm9uLWFuZHJvaWQsIHVzZSB0aGUgZGVmYXVsdCBsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIHVzZSBkZWZhdWx0IGZvcm1hdC1saXN0IGlmIEZMRVhJQkxFIFlVViBpcyBzdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgY2xpZW50IG5lZ290aWF0ZXMgdGhlIHN0YW5kYXJkIGNvbG9yLWZvcm1hdCBpZiBpdCBuZWVkcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VOb25TdXJmYWNlTW9kZSA9IGZhbHNlOwotI2lmIGRlZmluZWQoX0FORFJPSURfKSAmJiAhZGVmaW5lZChGTEVYWVVWX1NVUFBPUlRFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZU5vblN1cmZhY2VNb2RlID0gKG1fZW5hYmxlX2FuZHJvaWRfbmF0aXZlX2J1ZmZlcnMgPT0gT01YX0ZBTFNFKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX3RodWxpdW1fdjEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Rm10LT5lQ29sb3JGb3JtYXQgPSBnZXRQcmVmZXJyZWRDb2xvckZvcm1hdERlZmF1bHRNb2RlKHBvcnRGbXQtPm5JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRGbXQtPmVDb2xvckZvcm1hdCA9IHVzZU5vblN1cmZhY2VNb2RlID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlZmVycmVkQ29sb3JGb3JtYXROb25TdXJmYWNlTW9kZShwb3J0Rm10LT5uSW5kZXgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlZmVycmVkQ29sb3JGb3JtYXREZWZhdWx0TW9kZShwb3J0Rm10LT5uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydEZtdC0+ZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRNYXggKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vTW9yZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImdldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OiJcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIE5vTW9yZSBDb2xvciBmb3JtYXRzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJyZXR1cm5pbmcgY29sb3ItZm9ybWF0OiAweCV4IiwgcG9ydEZtdC0+ZUNvbG9yRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJnZXRfcGFyYW1ldGVyOiBCYWQgcG9ydCBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcG9ydEZtdC0+blBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkNvbXBvbmVudCBzaG91bGQgc3VwcG9ydCB0aGlzIHBvcnQgZGVmaW5pdGlvbiovCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0luaXQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1BPUlRfUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUE9SVF9QQVJBTV9UWVBFICphdWRpb1BvcnRQYXJhbVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUE9SVF9QQVJBTV9UWVBFICopIHBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1BdWRpb0luaXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvUG9ydFBhcmFtVHlwZS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Qb3J0UGFyYW1UeXBlLT5uU2l6ZSA9IHNpemVvZihPTVhfUE9SVF9QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvUG9ydFBhcmFtVHlwZS0+blBvcnRzICAgICAgICAgICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1BvcnRQYXJhbVR5cGUtPm5TdGFydFBvcnROdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLypDb21wb25lbnQgc2hvdWxkIHN1cHBvcnQgdGhpcyBwb3J0IGRlZmluaXRpb24qLwotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtSW1hZ2VJbml0OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9QT1JUX1BBUkFNX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BPUlRfUEFSQU1fVFlQRSAqaW1hZ2VQb3J0UGFyYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1BPUlRfUEFSQU1fVFlQRSAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImdldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtSW1hZ2VJbml0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVBvcnRQYXJhbVR5cGUtPm5WZXJzaW9uLm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUG9ydFBhcmFtVHlwZS0+blNpemUgPSBzaXplb2YoT01YX1BPUlRfUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVBvcnRQYXJhbVR5cGUtPm5Qb3J0cyAgICAgICAgICAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb3J0UGFyYW1UeXBlLT5uU3RhcnRQb3J0TnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLypDb21wb25lbnQgc2hvdWxkIHN1cHBvcnQgdGhpcyBwb3J0IGRlZmluaXRpb24qLwotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtT3RoZXJJbml0OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1PdGhlckluaXQgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9T01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpjb21wX3JvbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcF9yb2xlID0gKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcF9yb2xlLT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcF9yb2xlLT5uU2l6ZSA9IHNpemVvZigqY29tcF9yb2xlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiR2V0cGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsY3B5KChjaGFyKiljb21wX3JvbGUtPmNSb2xlLChjb25zdCBjaGFyKiltX2NSb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkZWQgZm9yIHBhcmFtZXRlciB0ZXN0ICovCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qcmlvcml0eU1nbXQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUFJJT1JJVFlNR01UVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QUklPUklUWU1HTVRUWVBFICpwcmlvcml0eU1nbVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9QUklPUklUWU1HTVRUWVBFICopIHBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVByaW9yaXR5TWdtdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eU1nbVR5cGUtPm5WZXJzaW9uLm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHlNZ21UeXBlLT5uU2l6ZSA9IHNpemVvZihPTVhfUFJJT1JJVFlNR01UVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZGVkIGZvciBwYXJhbWV0ZXIgdGVzdCAqLwotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgKmJ1ZmZlclN1cHBsaWVyVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSopIHBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbUNvbXBCdWZmZXJTdXBwbGllciIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclN1cHBsaWVyVHlwZS0+blNpemUgPSBzaXplb2YoT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclN1cHBsaWVyVHlwZS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBidWZmZXJTdXBwbGllclR5cGUtPm5Qb3J0SW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTdXBwbGllclR5cGUtPm5Qb3J0SW5kZXggPSBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKDEgPT0gYnVmZmVyU3VwcGxpZXJUeXBlLT5uUG9ydEluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU3VwcGxpZXJUeXBlLT5uUG9ydEluZGV4ID0gT01YX0J1ZmZlclN1cHBseVVuc3BlY2lmaWVkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgKE9NWF9JTkRFWFRZUEUpUU9NWF9JbmRleFBhcmFtVmlkZW9NdmM6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBRT01YX0luZGV4UGFyYW1WaWRlb012YyAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnMjogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb01wZWcyICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQgJTA4eCIsIHBhcmFtSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwcm9maWxlTGV2ZWxUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBnZXRfc3VwcG9ydGVkX3Byb2ZpbGVfbGV2ZWwocHJvZmlsZUxldmVsVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWYgZGVmaW5lZCAoX0FORFJPSURfSE9ORVlDT01CXykgfHwgZGVmaW5lZCAoX0FORFJPSURfSUNTXykKLSAgICAgICAgY2FzZSBPTVhfR29vZ2xlQW5kcm9pZEluZGV4R2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlclVzYWdlOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBHZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2VQYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0dvb2dsZUFuZHJvaWRJbmRleEdldEFuZHJvaWROYXRpdmVCdWZmZXJVc2FnZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEFuZHJvaWROYXRpdmVCdWZmZXJVc2FnZVBhcmFtcyogbmF0aXZlQnVmZmVyc1VzYWdlID0gKEdldEFuZHJvaWROYXRpdmVCdWZmZXJVc2FnZVBhcmFtcyAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUJ1ZmZlcnNVc2FnZS0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWN1cmVfbW9kZSAmJiAhc2VjdXJlX3NjYWxpbmdfdG9fbm9uX3NlY3VyZV9vcGIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUJ1ZmZlcnNVc2FnZS0+blVzYWdlID0gKEdSQUxMT0NfVVNBR0VfUFJJVkFURV9NTV9IRUFQIHwgR1JBTExPQ19VU0FHRV9QUk9URUNURUQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1BSSVZBVEVfVU5DQUNIRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQnVmZmVyc1VzYWdlLT5uVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1BSSVZBVEVfVU5DQUNIRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJnZXRfcGFyYW1ldGVyOiBPTVhfR29vZ2xlQW5kcm9pZEluZGV4R2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlclVzYWdlIGZhaWxlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgRkxFWFlVVl9TVVBQT1JURUQKLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4RmxleGlibGVZVVZEZXNjcmlwdGlvbjogewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogZGVzY3JpYmVDb2xvckZvcm1hdCIpOwotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IGRlc2NyaWJlQ29sb3JGb3JtYXQocGFyYW1EYXRhKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50OiB7Ci0gICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSk7Ci0gICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUqIHBQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSopcGFyYW1EYXRhOwotICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgcHJvZmlsZV9jb250cm9sLCBsZXZlbF9jb250cm9sOwotCi0gICAgICAgICAgICAgc3dpdGNoIChkcnZfY3R4LmRlY29kZXJfZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgIGNhc2UgVkRFQ19DT0RFQ1RZUEVfSDI2NDoKLSAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFOwotICAgICAgICAgICAgICAgICAgICAgbGV2ZWxfY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTDsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImdldF9wYXJhbSBvZiBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudCBvbmx5IGF2YWlsYWJsZSBmb3IgSDI2NCIpOwotICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vdEltcGxlbWVudGVkOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgaWYgKCFlUmV0ICYmICFpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0dfQ1RSTCwgJnByb2ZpbGVfY29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKChlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X3Byb2ZpbGUpcHJvZmlsZV9jb250cm9sLnZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9CQVNFTElORToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0NPTlNUUkFJTkVEX0JBU0VMSU5FOgotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01BSU46Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9FWFRFTkRFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+ZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUV4dGVuZGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIOgotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+ZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gxMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80MjI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9QUkVESUNUSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMF9JTlRSQToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDIyX0lOVFJBOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80NDRfSU5UUkE6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9DQVZMQ180NDRfSU5UUkE6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9CQVNFTElORToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0hJR0g6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9ISUdIX0lOVFJBOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU1RFUkVPX0hJR0g6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NVUxUSVZJRVdfSElHSDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0NPTlNUUkFJTkVEX0hJR0g6Ci0gICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgIGlmICghZVJldCAmJiAhaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19HX0NUUkwsICZsZXZlbF9jb250cm9sKSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoKGVudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfbGV2ZWwpbGV2ZWxfY29udHJvbC52YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+ZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFCOgotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5lTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMToKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+ZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDEyOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8zOgotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5lTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+ZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMToKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+ZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDIyOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18wOgotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5lTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18xOgotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5lTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+ZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQxOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8yOgotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5lTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw0MjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+ZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMToKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+ZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDUyOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RVElJbmRleFBhcmFtVmlkZW9DbGllbnRFeHRyYWRhdGE6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9FWFRSQURBVEFfRU5BQkxFKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX1FUSUluZGV4UGFyYW1WaWRlb0NsaWVudEV4dHJhZGF0YSIpOwotICAgICAgICAgICAgUU9NWF9FWFRSQURBVEFfRU5BQkxFICpwUGFyYW0gPQotICAgICAgICAgICAgICAgIChRT01YX0VYVFJBREFUQV9FTkFCTEUgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IE9NWF9DT1JFX09VVFBVVF9FWFRSQURBVEFfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICBwUGFyYW0tPmJFbmFibGUgPSBjbGllbnRfZXh0cmFkYXRhID8gT01YX1RSVUUgOiBPTVhfRkFMU0U7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhQYXJhbURpdGhlckNvbnRyb2w6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9WSURFT19ESVRIRVJfQ09OVFJPTCk7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coImdldF9wYXJhbWV0ZXI6IFFPTVhfVklERU9fRElUSEVSX0NPTlRST0wiKTsKLSAgICAgICAgICAgIFFPTVhfVklERU9fRElUSEVSX0NPTlRST0wgKnBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgKFFPTVhfVklERU9fRElUSEVSX0NPTlRST0wgKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgcFBhcmFtLT5lRGl0aGVyVHlwZSA9IChRT01YX1ZJREVPX0RJVEhFUlRZUEUpIG1fZGl0aGVyX2NvbmZpZzsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZ2V0X3BhcmFtZXRlcjogdW5rbm93biBwYXJhbSAlMDh4IiwgcGFyYW1JbmRleCk7Ci0gICAgICAgICAgICAgICAgIGVSZXQgPU9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgfQotCi0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyIHJldHVybmluZyBXeEgoJWQgeCAlZCkgU3hTSCglZCB4ICVkKSIsCi0gICAgICAgICAgICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGgsCi0gICAgICAgICAgICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0LAotICAgICAgICAgICAgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLnN0cmlkZSwKLSAgICAgICAgICAgIGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5zY2FuX2xpbmVzKTsKLQotICAgIHJldHVybiBlUmV0OwotfQotCi0jaWYgZGVmaW5lZCAoX0FORFJPSURfSE9ORVlDT01CXykgfHwgZGVmaW5lZCAoX0FORFJPSURfSUNTXykKLU9NWF9FUlJPUlRZUEUgb214X3ZkZWM6OnVzZV9hbmRyb2lkX25hdGl2ZV9idWZmZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wLCBPTVhfUFRSIGRhdGEpCi17Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJJbnNpZGUgdXNlX2FuZHJvaWRfbmF0aXZlX2J1ZmZlciIpOwotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlclBhcmFtcyAqcGFyYW1zID0gKFVzZUFuZHJvaWROYXRpdmVCdWZmZXJQYXJhbXMgKilkYXRhOwotCi0gICAgaWYgKChwYXJhbXMgPT0gTlVMTCkgfHwKLSAgICAgICAgICAgIChwYXJhbXMtPm5hdGl2ZUJ1ZmZlciA9PSBOVUxMKSB8fAotICAgICAgICAgICAgKHBhcmFtcy0+bmF0aXZlQnVmZmVyLT5oYW5kbGUgPT0gTlVMTCkgfHwKLSAgICAgICAgICAgICFtX2VuYWJsZV9hbmRyb2lkX25hdGl2ZV9idWZmZXJzKQotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIG1fdXNlX2FuZHJvaWRfbmF0aXZlX2J1ZmZlcnMgPSBPTVhfVFJVRTsKLSAgICBzcDxhbmRyb2lkX25hdGl2ZV9idWZmZXJfdD4gbkJ1ZiA9IHBhcmFtcy0+bmF0aXZlQnVmZmVyOwotICAgIHByaXZhdGVfaGFuZGxlX3QgKmhhbmRsZSA9IChwcml2YXRlX2hhbmRsZV90ICopbkJ1Zi0+aGFuZGxlOwotICAgIGlmIChPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCA9PSBwYXJhbXMtPm5Qb3J0SW5kZXgpIHsgLy9hbmRyb2lkIG5hdGl2ZSBidWZmZXJzIGNhbiBiZSB1c2VkIG9ubHkgb24gT3V0cHV0IHBvcnQKLSAgICAgICAgT01YX1U4ICpidWZmZXIgPSBOVUxMOwotICAgICAgICBpZiAoIXNlY3VyZV9tb2RlKSB7Ci0gICAgICAgICAgICBidWZmZXIgPSAoT01YX1U4KiltbWFwKDAsIGhhbmRsZS0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGhhbmRsZS0+ZmQsIDApOwotICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBtbWFwIHBtZW0gd2l0aCBmZCA9ICVkLCBzaXplID0gJWQiLCBoYW5kbGUtPmZkLCBoYW5kbGUtPnNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZVJldCA9IHVzZV9idWZmZXIoaENvbXAscGFyYW1zLT5idWZmZXJIZWFkZXIscGFyYW1zLT5uUG9ydEluZGV4LGRhdGEsaGFuZGxlLT5zaXplLGJ1ZmZlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0jZW5kaWYKLQotT01YX0VSUk9SVFlQRSBvbXhfdmRlYzo6ZW5hYmxlX3Ntb290aHN0cmVhbWluZygpIHsKLSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0gICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKLSAgICAvKmNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fQ09OVElOVUVfREFUQV9UUkFOU0ZFUjsKLSAgICBjb250cm9sLnZhbHVlID0gMTsKLSAgICBpbnQgcmMgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwmY29udHJvbCk7Ci0gICAgaWYgKHJjIDwgMCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIGVuYWJsZSBTbW9vdGggU3RyZWFtaW5nIG9uIGRyaXZlci4iKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckhhcmR3YXJlOwotICAgIH0qLwotICAgIG1fc21vb3Roc3RyZWFtaW5nX21vZGUgPSB0cnVlOwotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6OlNldHBhcmFtZXRlcgotCi0gICBERVNDUklQVElPTgotICAgT01YIFNldCBQYXJhbWV0ZXIgbWV0aG9kIGltcGxlbWVudGF0aW9uLgotCi0gICBQQVJBTUVURVJTCi0gICA8VEJEPi4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBPTVggRXJyb3IgTm9uZSBpZiBzdWNjZXNzZnVsLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZkZWM6OnNldF9wYXJhbWV0ZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgcGFyYW1JbmRleCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBhcmFtRGF0YSkKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIGludCByZXQ9MDsKLSAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm10OwotI2lmZGVmIF9BTkRST0lEXwotICAgIGNoYXIgcHJvcGVydHlfdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLSNlbmRpZgotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldCBQYXJhbSBpbiBJbnZhbGlkIFN0YXRlIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotICAgIGlmIChwYXJhbURhdGEgPT0gTlVMTCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiR2V0IFBhcmFtIGluIEludmFsaWQgcGFyYW1EYXRhIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotICAgIGlmICgobV9zdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmCi0gICAgICAgICAgICBCSVRNQVNLX0FCU0VOVCgmbV9mbGFncyxPTVhfQ09NUE9ORU5UX09VVFBVVF9FTkFCTEVfUEVORElORykgJiYKLSAgICAgICAgICAgIChtX291dF9iRW5hYmxlZCA9PSBPTVhfVFJVRSkgJiYKLSAgICAgICAgICAgIEJJVE1BU0tfQUJTRU5UKCZtX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX0lOUFVUX0VOQUJMRV9QRU5ESU5HKSAmJgotICAgICAgICAgICAgKG1faW5wX2JFbmFibGVkID09IE9NWF9UUlVFKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU2V0IFBhcmFtIGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOwotICAgIH0KLSAgICBzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKXBhcmFtSW5kZXgpIHsKLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbiA9IChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopIHBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IENoZWNrIGlmIGFueSBhbGxvY2F0ZSBidWZmZXIvdXNlIGJ1ZmZlci91c2VOYXRpdmVCdWZmZXIgaGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iZWVuIGNhbGxlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24gSD0gJWQsIFcgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsID4gTUFYX05VTV9JTlBVVF9PVVRQVVRfQlVGRkVSUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEJ1ZmZlcnMgcmVxdWVzdGVkIGV4Y2VlZHMgbWF4IGxpbWl0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPTVhfQ09SRV9PVVRQVVRfRVhUUkFEQVRBX0lOREVYID09IHBvcnREZWZuLT5uUG9ydEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsIDwgTUlOX05VTV9JTlBVVF9PVVRQVVRfRVhUUkFEQVRBX0JVRkZFUlMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+bkJ1ZmZlclNpemUgIT0gbV9jbGllbnRfb3V0X2V4dHJhZGF0YV9pbmZvLmdldFNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogQmFkIHBhcmFtZWV0ZXJzIHJlcXVlc3QgZm9yIGV4dHJhZGF0YSBsaW1pdCAlZCBzaXplIC0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwsIHBvcnREZWZuLT5uQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jbGllbnRfb3V0X2V4dHJhZGF0YV9pbmZvLnNldF9leHRyYWRhdGFfaW5mbyhwb3J0RGVmbi0+bkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9NWF9EaXJPdXRwdXQgPT0gcG9ydERlZm4tPmVEaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uIE9QIHBvcnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb3J0X2Zvcm1hdF9jaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGlzcGxheV9pZCA9IHBvcnREZWZuLT5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgb3V0cHV0IHBvcnQgcmVzb2x1dGlvbiB3aXRoIGNsaWVudCBzdXBwbGllZCBkaW1lbnNpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugc2NhbGluZyBpcyBlbmFibGVkLCBlbHNlIGl0IGZvbGxvd3MgaW5wdXQgcmVzb2x1dGlvbiBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaWRlX2RwYl9idWZmZXJfbW9kZShpc19kb3duX3NjYWxhcl9lbmFibGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2Rvd25fc2NhbGFyX2VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiU2V0UGFyYW0gT1A6IFd4SCgldSB4ICV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgIT0gMHgwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggIT0gMHgwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZmbXQsIDB4MCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IGNhcHR1cmVfY2FwYWJpbGl0eTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmZm10KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJHZXQgUmVzb2x1dGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckhhcmR3YXJlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAhPSAodW5zaWduZWQgaW50KWZtdC5mbXQucGl4X21wLmhlaWdodCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggIT0gKHVuc2lnbmVkIGludClmbXQuZm10LnBpeF9tcC53aWR0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfZm9ybWF0X2NoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBjcm9wIGluZm8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGUubkxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RhbmdsZS5uVG9wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGUubldpZHRoID0gcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGUubkhlaWdodCA9IHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5MZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2V4dHJhZGF0YV9pbmZvLm91dHB1dF9jcm9wX3JlY3QublRvcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5XaWR0aCA9IHJlY3RhbmdsZS5uV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5IZWlnaHQgPSByZWN0YW5nbGUubkhlaWdodDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBpc192aWRlb19zZXNzaW9uX3N1cHBvcnRlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlUmV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJmZtdCwgMHgwLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLmhlaWdodCA9ICh1bnNpZ25lZCBpbnQpcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAud2lkdGggPSAodW5zaWduZWQgaW50KXBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBjYXB0dXJlX2NhcGFiaWxpdHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJmbXQuZm10LnBpeF9tcC5oZWlnaHQgPSAlZCAsIGZtdC5mbXQucGl4X21wLndpZHRoID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5oZWlnaHQsIGZtdC5mbXQucGl4X21wLndpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfRk1ULCAmZm10KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXQgUmVzb2x1dGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IGdldF9idWZmZXJfcmVxKCZkcnZfY3R4Lm9wX2J1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlUmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVJldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCA+IE1BWF9OVU1fSU5QVVRfT1VUUFVUX0JVRkZFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJSZXF1ZXN0ZWQgby9wIGJ1ZiBjb3VudCAoJXUpIGV4Y2VlZHMgbGltaXQgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwsIE1BWF9OVU1fSU5QVVRfT1VUUFVUX0JVRkZFUlMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2xpZW50X2J1ZmZlcnMuZ2V0X2J1ZmZlcl9yZXEoYnVmZmVyX3NpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRXJyb3IgaW4gZ2V0dGluZyBidWZmZXIgcmVxdWlyZW1lbnRzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFwb3J0X2Zvcm1hdF9jaGFuZ2VkKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBjb3VudCBjYW4gY2hhbmdlIG9ubHkgd2hlbiBwb3J0IGlzIHVuYWxsb2NhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9vdXRfbWVtX3B0ciAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwgIT0gZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uQnVmZmVyU2l6ZSAhPSBkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJDYW5ub3QgY2hhbmdlIG8vcCBidWZmZXIgY291bnQgc2luY2UgYWxsIGJ1ZmZlcnMgYXJlIG5vdCBmcmVlZCB5ZXQgISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdXRlIHVwZGF0aW5nIG9mIGJ1ZmZlciByZXF1aXJlbWVudHMgdmlhIGMyZCBwcm94eS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJhc2VkIG9uIHdoZXRoZXIgYzJkIGlzIGVuYWJsZWQsIHJlcXVpcmVtZW50cyB3aWxsIGJlIGhhbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHZpZGMgZHJpdmVyIGFwcHJvcHJpYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBjbGllbnRfYnVmZmVycy5zZXRfYnVmZmVyX3JlcShwb3J0RGVmbi0+bkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlUmV0ID09IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcnRfZGVmID0gKnBvcnREZWZuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE9QIFJlcXVpcmVtZW50cygjJWQ6ICV1KSBSZXF1ZXN0ZWQoIyV1OiAldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYubWluY291bnQsICh1bnNpZ25lZCBpbnQpYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwsICh1bnNpZ25lZCBpbnQpcG9ydERlZm4tPm5CdWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChPTVhfRGlySW5wdXQgPT0gcG9ydERlZm4tPmVEaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uIElQIHBvcnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb3J0X2Zvcm1hdF9jaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG9ydERlZm4tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID4+IDE2KSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9ydERlZm4tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID4+IDE2KSA8PSBNQVhfU1VQUE9SVEVEX0ZQUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnJhbWUgcmF0ZSBvbmx5IHNob3VsZCBiZSBzZXQgaWYgdGhpcyBpcyBhICJrbm93biB2YWx1ZSIgb3IgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGl2YXRlIHRzIHByZWRpY3Rpb24gbG9naWMgKGFyYml0cmFyeSBtb2RlIG9ubHkpIHNlbmRpbmcgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVzdGFtcHMgd2l0aCBtYXggdmFsdWUgKExMT05HX01BWCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Zwc19yZWNlaXZlZCA9IHBvcnREZWZuLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldF9wYXJhbWV0ZXI6IGZyYW1lIHJhdGUgc2V0IGJ5IG9teCBjbGllbnQgOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcG9ydERlZm4tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFExNlRvRnJhY3Rpb24ocG9ydERlZm4tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlLCBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX251bWVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19kZW5vbWluYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRydl9jdHguZnJhbWVfcmF0ZS5mcHNfbnVtZXJhdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk51bWVyYXRvciBpcyB6ZXJvIHNldHRpbmcgdG8gMzAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX251bWVyYXRvciA9IDMwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfZGVub21pbmF0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19udW1lcmF0b3IgPSAoaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX251bWVyYXRvciAvIGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfZGVub21pbmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX2Rlbm9taW5hdG9yID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZybV9pbnQgPSBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX2Rlbm9taW5hdG9yICogMWU2IC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX251bWVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogZnJtX2ludCgldSkgZnBzKCUuMmYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClmcm1faW50LCBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX251bWVyYXRvciAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX2Rlbm9taW5hdG9yKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfb3V0cHV0cGFybSBvcGFybTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qWFhYOiB3ZSdyZSBwcm92aWRpbmcgdGltaW5nIGluZm8gYXMgc2Vjb25kcyBwZXIgZnJhbWUgcmF0aGVyIHRoYW4gZnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwZXIgc2Vjb25kLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFybS50aW1lcGVyZnJhbWUubnVtZXJhdG9yID0gZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19kZW5vbWluYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYXJtLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfbnVtZXJhdG9yOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIHNwYXJtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhcm0udHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXJtLnBhcm0ub3V0cHV0ID0gb3Bhcm07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX1BBUk0sICZzcGFybSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiVW5hYmxlIHRvIGNvbnZleSBmcHMgaW5mbyB0byBkcml2ZXIsIHBlcmZvcm1hbmNlIG1pZ2h0IGJlIGFmZmVjdGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckhhcmR3YXJlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aCAgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlNldFBhcmFtIElQOiBXeEgoJXUgeCAldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9mb3JtYXRfY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyIGZyYW1lV2lkdGggPSBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiBmcmFtZUhlaWdodCA9IHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lSGVpZ2h0ICE9IDB4MCAmJiBmcmFtZVdpZHRoICE9IDB4MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3Ntb290aHN0cmVhbWluZ19tb2RlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZyYW1lV2lkdGggKiBmcmFtZUhlaWdodCkgPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fc21vb3Roc3RyZWFtaW5nX3dpZHRoICogbV9zbW9vdGhzdHJlYW1pbmdfaGVpZ2h0KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVXaWR0aCA9IG1fc21vb3Roc3RyZWFtaW5nX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUhlaWdodCA9IG1fc21vb3Roc3RyZWFtaW5nX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJOT1RFOiBTZXR0aW5nIHJlc29sdXRpb24gJXUgeCAldSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBhZGFwdGl2ZS1wbGF5YmFjay9zbW9vdGgtc3RyZWFtaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWZyYW1lV2lkdGgsICh1bnNpZ25lZCBpbnQpZnJhbWVIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfcmVjdC5uTGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5Ub3AgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfcmVjdC5uV2lkdGggPSBmcmFtZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfcmVjdC5uSGVpZ2h0ID0gZnJhbWVIZWlnaHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfcmVzb2x1dGlvbihmcmFtZVdpZHRoLCBmcmFtZUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lV2lkdGgsIGZyYW1lSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gaXNfdmlkZW9fc2Vzc2lvbl9zdXBwb3J0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVJldCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2Rvd25fc2NhbGFyX2VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZmbXQsIDB4MCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAuaGVpZ2h0ID0gZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAud2lkdGggPSBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gb3V0cHV0X2NhcGFiaWxpdHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRFMgRW5hYmxlZCA6IGhlaWdodCA9ICVkICwgd2lkdGggPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5oZWlnaHQsZm10LmZtdC5waXhfbXAud2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfRk1ULCAmZm10KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJmZtdCwgMHgwLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5oZWlnaHQgPSBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC53aWR0aCA9IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBvdXRwdXRfY2FwYWJpbGl0eTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJEUyBEaXNhYmxlZCA6IGhlaWdodCA9ICVkICwgd2lkdGggPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5oZWlnaHQsZm10LmZtdC5waXhfbXAud2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfRk1ULCAmZm10KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IGNhcHR1cmVfY2FwYWJpbGl0eTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX0ZNVCwgJmZtdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldCBSZXNvbHV0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNfZG93bl9zY2FsYXJfZW5hYmxlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBnZXRfYnVmZmVyX3JlcSgmZHJ2X2N0eC5vcF9idWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9jdXN0b21fYnVmZmVyc2l6ZS5pbnB1dF9idWZmZXJzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBvcnREZWZuLT5uQnVmZmVyU2l6ZSA+IG1fY3VzdG9tX2J1ZmZlcnNpemUuaW5wdXRfYnVmZmVyc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogQ3VzdG9tIGJ1ZmZlciBzaXplIHNldCBieSBjbGllbnQ6ICVkLCB0cnlpbmcgdG8gc2V0OiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY3VzdG9tX2J1ZmZlcnNpemUuaW5wdXRfYnVmZmVyc2l6ZSwgcG9ydERlZm4tPm5CdWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCA+IE1BWF9OVU1fSU5QVVRfT1VUUFVUX0JVRkZFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJSZXF1ZXN0ZWQgaS9wIGJ1ZiBjb3VudCAoJXUpIGV4Y2VlZHMgbGltaXQgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwsIE1BWF9OVU1fSU5QVVRfT1VUUFVUX0JVRkZFUlMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBjb3VudCBjYW4gY2hhbmdlIG9ubHkgd2hlbiBwb3J0IGlzIHVuYWxsb2NhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lucF9tZW1fcHRyICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsICE9IGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uQnVmZmVyU2l6ZSAhPSBkcnZfY3R4LmlwX2J1Zi5idWZmZXJfc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJDYW5ub3QgY2hhbmdlIGkvcCBidWZmZXIgY291bnQgc2luY2UgYWxsIGJ1ZmZlcnMgYXJlIG5vdCBmcmVlZCB5ZXQgISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwgPj0gZHJ2X2N0eC5pcF9idWYubWluY291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwb3J0RGVmbi0+bkJ1ZmZlclNpemUgIT0gZHJ2X2N0eC5pcF9idWYuYnVmZmVyX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfZm9ybWF0X2NoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRlY19hbGxvY2F0b3Jwcm9wZXJ0eSAqYnVmZmVyX3Byb3AgPSAmZHJ2X2N0eC5pcF9idWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudCA9IHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LmlwX2J1Zi5idWZmZXJfc2l6ZSA9IChwb3J0RGVmbi0+bkJ1ZmZlclNpemUgKyBidWZmZXJfcHJvcC0+YWxpZ25tZW50IC0gMSkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh+KGJ1ZmZlcl9wcm9wLT5hbGlnbm1lbnQgLSAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gc2V0X2J1ZmZlcl9yZXEoYnVmZmVyX3Byb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PSBwb3J0X2Zvcm1hdF9jaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IElQIFJlcXVpcmVtZW50cygjJWQ6ICV1KSBSZXF1ZXN0ZWQoIyV1OiAldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LmlwX2J1Zi5taW5jb3VudCwgKHVuc2lnbmVkIGludClkcnZfY3R4LmlwX2J1Zi5idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsLCAodW5zaWduZWQgaW50KXBvcnREZWZuLT5uQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3J0RGVmbi0+ZURpciA9PSAgT01YX0Rpck1heCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiIFNldF9wYXJhbWV0ZXI6IEJhZCBQb3J0IGlkeCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwb3J0RGVmbi0+blBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKnBvcnRGbXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldD0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm10OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0IDB4JXgsIHBvcnQ6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Rm10LT5lQ29sb3JGb3JtYXQsICh1bnNpZ25lZCBpbnQpcG9ydEZtdC0+blBvcnRJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZmbXQsIDB4MCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PSBwb3J0Rm10LT5uUG9ydEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmZm10KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiBGYWlsZWQgdG8gZ2V0IGZvcm1hdCBvbiBjYXB0dXJlIG1wbGFuZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSB2ZGVjX291dHB1dF9mb3JtYXQgb3BfZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRGbXQtPmVDb2xvckZvcm1hdCA9PSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRGbXQtPmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2Zvcm1hdCA9IChlbnVtIHZkZWNfb3V0cHV0X2Zvcm1hdClWREVDX1lVVl9GT1JNQVRfTlYxMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IGNhcHR1cmVfY2FwYWJpbGl0eSA9IFY0TDJfUElYX0ZNVF9OVjEyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3J0Rm10LT5lQ29sb3JGb3JtYXQgPT0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtQ29tcHJlc3NlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Rm10LT5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2Zvcm1hdCA9IChlbnVtIHZkZWNfb3V0cHV0X2Zvcm1hdClWREVDX1lVVl9GT1JNQVRfTlYxMl9VQldDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gY2FwdHVyZV9jYXBhYmlsaXR5ID0gVjRMMl9QSVhfRk1UX05WMTJfVUJXQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVSZXQgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHgub3V0cHV0X2Zvcm1hdCA9IG9wX2Zvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfRk1ULCAmZm10KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXQgb3V0cHV0IGZvcm1hdCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUT0RPOiBIb3cgdG8gaGFuZGxlIHRoaXMgY2FzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBnZXRfYnVmZmVyX3JlcSgmZHJ2X2N0eC5vcF9idWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlUmV0ID09IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsaWVudF9idWZmZXJzLnNldF9jb2xvcl9mb3JtYXQocG9ydEZtdC0+ZUNvbG9yRm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU2V0IGNvbG9yIGZvcm1hdCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UG9ydERlZm46IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9RQ09NX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1FDT01fUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0Rm10ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9RQ09NX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhRY29tUGFyYW1Qb3J0RGVmaW5pdGlvblR5cGUgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwb3J0Rm10LT5uRnJhbWVQYWNraW5nRm9ybWF0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IHBvcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydEZtdC0+blBvcnRJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyYml0cmFyeV9ieXRlcyBtb2RlIGNhbm5vdCBiZSBjaGFuZ2VkIGFyYml0cmFyaWx5IHNpbmNlIHRoaXMgY29udHJvbHMgaG93OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gaGVhZGVycyBhcmUgYWxsb2NhdGVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gaGVhZGVycy1pbmRpY2VzIGFyZSBkZXJpdmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIGNoYW5naW5nIGFyYml0cmFyeV9ieXRlcyB3aGVuIHRoZSBwb3J0IGlzIGFscmVhZHkgYWxsb2NhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lucF9tZW1fcHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiQ2Fubm90IGNoYW5nZSBhcmJpdHJhcnktYnl0ZXMtbW9kZSBzaW5jZSBpbnB1dCBwb3J0IGlzIG5vdCBmcmVlISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydEZtdC0+bkZyYW1lUGFja2luZ0Zvcm1hdCA9PSBPTVhfUUNPTV9GcmFtZVBhY2tpbmdfQXJiaXRyYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjdXJlX21vZGUgfHwgbV9pbnB1dF9wYXNzX2J1ZmZlcl9mZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYml0cmFyeV9ieXRlcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRwYXJhbWV0ZXI6IGNhbm5vdCBzZXQgdG8gYXJiaXRhcnkgYnl0ZXMgbW9kZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYml0cmFyeV9ieXRlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9ydEZtdC0+bkZyYW1lUGFja2luZ0Zvcm1hdCA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9RQ09NX0ZyYW1lUGFja2luZ19Pbmx5T25lQ29tcGxldGVGcmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJiaXRyYXJ5X2J5dGVzID0gZmFsc2U7Ci0jaWZkZWYgX0FORFJPSURfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoInZpZGMuZGVjLmRlYnVnLmFyYml0cmFyeWJ5dGVzLm1vZGUiLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdG9pKHByb3BlcnR5X3ZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goImFyYml0cmFyeV9ieXRlcyBlbmFibGVkIHZpYSBwcm9wZXJ0eSBjb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJiaXRyYXJ5X2J5dGVzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldHBhcmFtZXRlcjogdW5rbm93biBGcmFtZVBhY2tpbmcgZm9ybWF0ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwb3J0Rm10LT5uRnJhbWVQYWNraW5nRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvcnRGbXQtPm5Qb3J0SW5kZXggPT0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgic2V0X3BhcmFtZXRlcjogT01YX0luZGV4UWNvbVBhcmFtUG9ydERlZmluaXRpb25UeXBlIE9QIFBvcnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAocG9ydEZtdC0+bk1lbVJlZ2lvbiA+IE9NWF9RQ09NX01lbVJlZ2lvbkludmFsaWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEZtdC0+bk1lbVJlZ2lvbiA8IE9NWF9RQ09NX01lbVJlZ2lvbk1heCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Rm10LT5uQ2FjaGVBdHRyID09IE9NWF9RQ09NX0NhY2hlQXR0ck5vbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0X21lbV9yZWdpb25fc21pID0gT01YX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1fb3V0X21lbV9yZWdpb25fc21pICYmIG1fb3V0X3B2dF9lbnRyeV9wbWVtKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFFjb21QYXJhbVBvcnREZWZpbml0aW9uVHlwZSBPUCBQb3J0OiBvdXQgcG1lbSBzZXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3VzZV9vdXRwdXRfcG1lbSA9IE9NWF9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX3RodWxpdW1fdjEgJiYgIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJiaXRyYXJ5X2J5dGVzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJGb3JjZSBhcmJpdHJhcnlfYnl0ZXMgdG8gdHJ1ZSBmb3IgaDI2NCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhQYXJhbVZpZGVvQ2xpZW50RXh0cmFkYXRhOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX0VYVFJBREFUQV9FTkFCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX1FUSUluZGV4UGFyYW1WaWRlb0NsaWVudEV4dHJhZGF0YSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFPTVhfRVhUUkFEQVRBX0VOQUJMRSAqcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFFPTVhfRVhUUkFEQVRBX0VOQUJMRSAqKXBhcmFtRGF0YTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU2V0IFBhcmFtZXRlciBjYWxsZWQgaW4gSW52YWxpZCBzdGF0ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9PVVRQVVRfRVhUUkFEQVRBX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY2xpZW50X291dF9leHRyYWRhdGFfaW5mby5lbmFibGVfY2xpZW50X2V4dHJhZGF0YShwUGFyYW0tPmJFbmFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbmNvcnJlY3QgcG9ydEluZGV4IC0gJWQiLCBwUGFyYW0tPm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpjb21wX3JvbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcF9yb2xlID0gKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wX3JvbGUtPmNSb2xlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobV9zdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFCSVRNQVNLX1BSRVNFTlQoJm1fZmxhZ3MsIE9NWF9DT01QT05FTlRfSURMRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlNldCBQYXJhbWV0ZXIgY2FsbGVkIGluIHZhbGlkIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldCBQYXJhbWV0ZXIgY2FsbGVkIGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChkcnZfY3R4LmtpbmQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2YyIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoKGNoYXIqKWNvbXBfcm9sZS0+Y1JvbGUsICJ2aWRlb19kZWNvZGVyLmF2YyIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGNweSgoY2hhciopbV9jUm9sZSwgInZpZGVvX2RlY29kZXIuYXZjIiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldHBhcmFtZXRlcjogdW5rbm93biBJbmRleCAlcyIsIGNvbXBfcm9sZS0+Y1JvbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9T01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChkcnZfY3R4LmtpbmQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLm12YyIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoKGNoYXIqKWNvbXBfcm9sZS0+Y1JvbGUsICJ2aWRlb19kZWNvZGVyLm12YyIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGNweSgoY2hhciopbV9jUm9sZSwgInZpZGVvX2RlY29kZXIubXZjIiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldHBhcmFtZXRlcjogdW5rbm93biBJbmRleCAlcyIsIGNvbXBfcm9sZS0+Y1JvbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMiIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoKGNvbnN0IGNoYXIqKWNvbXBfcm9sZS0+Y1JvbGUsICJ2aWRlb19kZWNvZGVyLm1wZWcyIiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsY3B5KChjaGFyKiltX2NSb2xlLCAidmlkZW9fZGVjb2Rlci5tcGVnMiIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXRwYXJhbWV0ZXI6IHVua25vd24gSW5kZXggJXMiLCBjb21wX3JvbGUtPmNSb2xlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRydl9jdHgua2luZCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA4IiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RybmNtcCgoY29uc3QgY2hhciopY29tcF9yb2xlLT5jUm9sZSwgInZpZGVvX2RlY29kZXIudnA4IiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cm5jbXAoKGNvbnN0IGNoYXIqKWNvbXBfcm9sZS0+Y1JvbGUsICJ2aWRlb19kZWNvZGVyLnZweCIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGNweSgoY2hhciopbV9jUm9sZSwgInZpZGVvX2RlY29kZXIudnA4IiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldHBhcmFtZXRlcjogdW5rbm93biBJbmRleCAlcyIsIGNvbXBfcm9sZS0+Y1JvbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci52cDkiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKChjb25zdCBjaGFyKiljb21wX3JvbGUtPmNSb2xlLCAidmlkZW9fZGVjb2Rlci52cDkiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RybmNtcCgoY29uc3QgY2hhciopY29tcF9yb2xlLT5jUm9sZSwgInZpZGVvX2RlY29kZXIudnB4IiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsY3B5KChjaGFyKiltX2NSb2xlLCAidmlkZW9fZGVjb2Rlci52cDkiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU2V0cGFyYW1ldGVyOiB1bmtub3duIEluZGV4ICVzIiwgY29tcF9yb2xlLT5jUm9sZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChkcnZfY3R4LmtpbmQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmhldmMiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKChjb25zdCBjaGFyKiljb21wX3JvbGUtPmNSb2xlLCAidmlkZW9fZGVjb2Rlci5oZXZjIiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsY3B5KChjaGFyKiltX2NSb2xlLCAidmlkZW9fZGVjb2Rlci5oZXZjIiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldHBhcmFtZXRlcjogdW5rbm93biBJbmRleCAlcyIsIGNvbXBfcm9sZS0+Y1JvbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXRwYXJhbWV0ZXI6IHVua25vd24gcGFyYW0gJXMiLCBkcnZfY3R4LmtpbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qcmlvcml0eU1nbXQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUFJJT1JJVFlNR01UVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldCBQYXJhbWV0ZXIgY2FsbGVkIGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFJJT1JJVFlNR01UVFlQRSAqcHJpb3JpdHlNZ210eXBlID0gKE9NWF9QUklPUklUWU1HTVRUWVBFKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtUHJpb3JpdHlNZ210ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXByaW9yaXR5TWdtdHlwZS0+bkdyb3VwSUQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogcHJpb3JpdHlNZ210eXBlICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXByaW9yaXR5TWdtdHlwZS0+bkdyb3VwUHJpb3JpdHkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJpb3JpdHlfbWdtLm5Hcm91cElEID0gcHJpb3JpdHlNZ210eXBlLT5uR3JvdXBJRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wcmlvcml0eV9tZ20ubkdyb3VwUHJpb3JpdHkgPSBwcmlvcml0eU1nbXR5cGUtPm5Hcm91cFByaW9yaXR5OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgKmJ1ZmZlclN1cHBsaWVyVHlwZSA9IChPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTdXBwbGllclR5cGUtPmVCdWZmZXJTdXBwbGllcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJTdXBwbGllclR5cGUtPm5Qb3J0SW5kZXggPT0gMCB8fCBidWZmZXJTdXBwbGllclR5cGUtPm5Qb3J0SW5kZXggPT0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9idWZmZXJfc3VwcGxpZXIuZUJ1ZmZlclN1cHBsaWVyID0gYnVmZmVyU3VwcGxpZXJUeXBlLT5lQnVmZmVyU3VwcGxpZXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICBjYXNlIChPTVhfSU5ERVhUWVBFKVFPTVhfSW5kZXhQYXJhbVZpZGVvTXZjOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBRT01YX0luZGV4UGFyYW1WaWRlb012YyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnMjogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb01wZWcyICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RVElJbmRleFBhcmFtTG93TGF0ZW5jeU1vZGU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRT01YX0VYVE5JTkRFWF9WSURFT19MT1dfTEFURU5DWV9NT0RFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUU9NWF9FWFROSU5ERVhfVklERU9fTE9XX0xBVEVOQ1lfTU9ERSopcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0xPV0xBVEVOQ1lfTU9ERTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+YkVuYWJsZUxvd0xhdGVuY3lNb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19MT1dMQVRFTkNZX0VOQUJMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19MT1dMQVRFTkNZX0RJU0FCTEU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXQgbG93IGxhdGVuY3kgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9EZWNvZGVyUGljdHVyZU9yZGVyOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX1ZJREVPX0RFQ09ERVJfUElDVFVSRV9PUkRFUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU9NWF9WSURFT19ERUNPREVSX1BJQ1RVUkVfT1JERVIgKnBpY3R1cmVPcmRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChRT01YX1ZJREVPX0RFQ09ERVJfUElDVFVSRV9PUkRFUiAqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpY19vcmRlcixyYz0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldF9wYXJhbWV0ZXI6IE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvRGVjb2RlclBpY3R1cmVPcmRlciAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlT3JkZXItPmVPdXRwdXRQaWN0dXJlT3JkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaWN0dXJlT3JkZXItPmVPdXRwdXRQaWN0dXJlT3JkZXIgPT0gUU9NWF9WSURFT19ESVNQTEFZX09SREVSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY19vcmRlciA9IFY0TDJfTVBFR19WSURDX1ZJREVPX09VVFBVVF9PUkRFUl9ESVNQTEFZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGljdHVyZU9yZGVyLT5lT3V0cHV0UGljdHVyZU9yZGVyID09IFFPTVhfVklERU9fREVDT0RFX09SREVSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY19vcmRlciA9IFY0TDJfTVBFR19WSURDX1ZJREVPX09VVFBVVF9PUkRFUl9ERUNPREU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfc3RhbXBfZHRzLnNldF90aW1lc3RhbXBfcmVvcmRlcl9tb2RlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVJldCA9PSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fT1VUUFVUX09SREVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gcGljX29yZGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyA9IGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldCBwaWN0dXJlIG9yZGVyIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RlY29kZV9vcmRlcl9tb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZU9yZGVyLT5lT3V0cHV0UGljdHVyZU9yZGVyID09IFFPTVhfVklERU9fREVDT0RFX09SREVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbUNvbmNlYWxNQk1hcEV4dHJhRGF0YToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIFFPTVhfRU5BQkxFVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IGVuYWJsZV9leHRyYWRhdGEoT01YX01CX0VSUk9SX01BUF9FWFRSQURBVEEsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChRT01YX0VOQUJMRVRZUEUgKilwYXJhbURhdGEpLT5iRW5hYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1GcmFtZUluZm9FeHRyYURhdGE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX0VOQUJMRVRZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBlbmFibGVfZXh0cmFkYXRhKE9NWF9GUkFNRUlORk9fRVhUUkFEQVRBLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUU9NWF9FTkFCTEVUWVBFICopcGFyYW1EYXRhKS0+YkVuYWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX0V4dHJhRGF0YUZyYW1lRGltZW5zaW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9FTkFCTEVUWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gZW5hYmxlX2V4dHJhZGF0YShPTVhfRlJBTUVESU1FTlNJT05fRVhUUkFEQVRBLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUU9NWF9FTkFCTEVUWVBFICopcGFyYW1EYXRhKS0+YkVuYWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtSW50ZXJsYWNlRXh0cmFEYXRhOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9FTkFCTEVUWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gZW5hYmxlX2V4dHJhZGF0YShPTVhfSU5URVJMQUNFX0VYVFJBREFUQSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFFPTVhfRU5BQkxFVFlQRSAqKXBhcmFtRGF0YSktPmJFbmFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbUgyNjRUaW1lSW5mbzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIFFPTVhfRU5BQkxFVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IGVuYWJsZV9leHRyYWRhdGEoT01YX1RJTUVJTkZPX0VYVFJBREFUQSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFFPTVhfRU5BQkxFVFlQRSAqKXBhcmFtRGF0YSktPmJFbmFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvRnJhbWVQYWNraW5nRXh0cmFkYXRhOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9FTkFCTEVUWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gZW5hYmxlX2V4dHJhZGF0YShPTVhfRlJBTUVQQUNLX0VYVFJBREFUQSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFFPTVhfRU5BQkxFVFlQRSAqKXBhcmFtRGF0YSktPmJFbmFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvUVBFeHRyYURhdGE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX0VOQUJMRVRZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBlbmFibGVfZXh0cmFkYXRhKE9NWF9RUF9FWFRSQURBVEEsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChRT01YX0VOQUJMRVRZUEUgKilwYXJhbURhdGEpLT5iRW5hYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0lucHV0Qml0c0luZm9FeHRyYURhdGE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX0VOQUJMRVRZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBlbmFibGVfZXh0cmFkYXRhKE9NWF9CSVRTSU5GT19FWFRSQURBVEEsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChRT01YX0VOQUJMRVRZUEUgKilwYXJhbURhdGEpLT5iRW5hYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4RW5hYmxlRXh0blVzZXJEYXRhOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9FTkFCTEVUWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IGVuYWJsZV9leHRyYWRhdGEoT01YX0VYVE5VU0VSX0VYVFJBREFUQSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFFPTVhfRU5BQkxFVFlQRSAqKXBhcmFtRGF0YSktPmJFbmFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhQYXJhbVZRWmlwU0VJRXh0cmFEYXRhOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9FTkFCTEVUWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IGVuYWJsZV9leHRyYWRhdGEoT01YX1ZRWklQU0VJX0VYVFJBREFUQSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFFPTVhfRU5BQkxFVFlQRSAqKXBhcmFtRGF0YSktPmJFbmFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0Rpdng6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFPTVhfVklERU9fUEFSQU1fRElWWFRZUEUqIGRpdlhUeXBlID0gKFFPTVhfVklERU9fUEFSQU1fRElWWFRZUEUgKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQbGF0Zm9ybVB2dDogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1FDT01fUExBVEZPUk1QUklWQVRFX0VYVE4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldF9wYXJhbWV0ZXI6IE9NWF9RY29tSW5kZXhQbGF0Zm9ybVB2dCBPUCBQb3J0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1FDT01fUExBVEZPUk1QUklWQVRFX0VYVE4qIGVudHJ5VHlwZSA9IChPTVhfUUNPTV9QTEFURk9STVBSSVZBVEVfRVhUTiAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5VHlwZS0+dHlwZSAhPSBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgic2V0X3BhcmFtZXRlcjogUGxhdGZvcm0gUHJpdmF0ZSBlbnRyeSB0eXBlICglZCkgbm90IHN1cHBvcnRlZC4iLCBlbnRyeVR5cGUtPnR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0X3B2dF9lbnRyeV9wbWVtID0gT01YX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobV9vdXRfbWVtX3JlZ2lvbl9zbWkgJiYgbV9vdXRfcHZ0X2VudHJ5X3BtZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZXRfcGFyYW1ldGVyOiBPTVhfUWNvbUluZGV4UGxhdGZvcm1QdnQgT1AgUG9ydDogb3V0IHBtZW0gc2V0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3VzZV9vdXRwdXRfcG1lbSA9IE9NWF9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb1N5bmNGcmFtZURlY29kaW5nTW9kZTogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgic2V0X3BhcmFtZXRlcjogT01YX1Fjb21JbmRleFBhcmFtVmlkZW9TeW5jRnJhbWVEZWNvZGluZ01vZGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldCBpZHIgb25seSBkZWNvZGluZyBmb3IgdGh1bWJuYWlsIG1vZGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHguaWRyX29ubHlfZGVjb2RpbmcgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19PVVRQVVRfT1JERVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fT1VUUFVUX09SREVSX0RFQ09ERTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXQgcGljdHVyZSBvcmRlciBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1NZTkNfRlJBTUVfREVDT0RFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19TWU5DX0ZSQU1FX0RFQ09ERV9FTkFCTEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU3luYyBmcmFtZSBzZXR0aW5nIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlNldHRpbmcgc3luYyBmcmFtZSBkZWNvZGluZyBvbiBkcml2ZXIgbWlnaHQgY2hhbmdlIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlcXVpcmVtZW50cyBzbyB1cGRhdGUgdGhlbSBoZXJlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2J1ZmZlcl9yZXEoJmRydl9jdHguaXBfYnVmKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU3luYyBmcmFtZSBzZXR0aW5nIGZhaWxlZDogZmFsaWVkIHRvIGdldCBidWZmZXIgaS9wIHJlcXVpcmVtZW50cyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2J1ZmZlcl9yZXEoJmRydl9jdHgub3BfYnVmKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU3luYyBmcmFtZSBzZXR0aW5nIGZhaWxlZDogZmFsaWVkIHRvIGdldCBidWZmZXIgby9wIHJlcXVpcmVtZW50cyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbUluZGV4RXh0cmFEYXRhVHlwZTogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX0lOREVYRVhUUkFEQVRBVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRT01YX0lOREVYRVhUUkFEQVRBVFlQRSAqZXh0cmFkYXRhSW5kZXhUeXBlID0gKFFPTVhfSU5ERVhFWFRSQURBVEFUWVBFICopIHBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZXh0cmFkYXRhSW5kZXhUeXBlLT5uSW5kZXggPT0gT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4dHJhZGF0YUluZGV4VHlwZS0+YkVuYWJsZWQgPT0gT01YX1RSVUUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHRyYWRhdGFJbmRleFR5cGUtPm5Qb3J0SW5kZXggPT0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZXRfcGFyYW1ldGVyOiAgT01YX1Fjb21JbmRleFBhcmFtSW5kZXhFeHRyYURhdGFUeXBlIFNtb290aFN0cmVhbWluZyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBlbmFibGVfZXh0cmFkYXRhKE9NWF9QT1JUREVGX0VYVFJBREFUQSwgZmFsc2UsIGV4dHJhZGF0YUluZGV4VHlwZS0+YkVuYWJsZWQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtRW5hYmxlU21vb3RoU3RyZWFtaW5nOiB7Ci0jaWZuZGVmIFNNT09USF9TVFJFQU1JTkdfRElTQUJMRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IGVuYWJsZV9zbW9vdGhzdHJlYW1pbmcoKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWYgZGVmaW5lZCAoX0FORFJPSURfSE9ORVlDT01CXykgfHwgZGVmaW5lZCAoX0FORFJPSURfSUNTXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkIHRvIGFsbG93IGZvbGxvd2luZyB0d28gc2V0X3BhcmFtZXRlcnMgZXZlbiBpbiBJZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhdGUuIFRoaXMgaXMgQU5EUk9JRCBhcmNoaXRlY3R1cmUgd2hpY2ggaXMgbm90IGluIHN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIG9wZW5tYXggc3RhbmRhcmQuICovCi0gICAgICAgIGNhc2UgT01YX0dvb2dsZUFuZHJvaWRJbmRleEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBFbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVyc1BhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnNQYXJhbXMqIGVuYWJsZU5hdGl2ZUJ1ZmZlcnMgPSAoRW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnNQYXJhbXMgKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVOYXRpdmVCdWZmZXJzLT5uUG9ydEluZGV4ICE9IE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRW5hYmxlL0Rpc2FibGUgYW5kcm9pZC1uYXRpdmUtYnVmZmVycyBhbGxvd2VkIG9ubHkgb24gb3V0cHV0IHBvcnQhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX291dF9tZW1fcHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRW5hYmxlL0Rpc2FibGUgYW5kcm9pZC1uYXRpdmUtYnVmZmVycyBpcyBub3QgYWxsb3dlZCBzaW5jZSBPdXRwdXQgcG9ydCBpcyBub3QgZnJlZSAhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVOYXRpdmVCdWZmZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZW5hYmxlX2FuZHJvaWRfbmF0aXZlX2J1ZmZlcnMgPSBlbmFibGVOYXRpdmVCdWZmZXJzLT5lbmFibGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmICFkZWZpbmVkKEZMRVhZVVZfU1VQUE9SVEVEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2VuYWJsZV9hbmRyb2lkX25hdGl2ZV9idWZmZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgbW9zdC1wcmVmZXJyZWQtbmF0aXZlLWNvbG9yLWZvcm1hdCBhcyBzdXJmYWNlLW1vZGUgaXMgaGludGVkIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWNsaWVudF9idWZmZXJzLnNldF9jb2xvcl9mb3JtYXQoZ2V0UHJlZmVycmVkQ29sb3JGb3JtYXREZWZhdWx0TW9kZSgwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IG5hdGl2ZSBjb2xvciBmb3JtYXQhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfR29vZ2xlQW5kcm9pZEluZGV4VXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcjogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBVc2VBbmRyb2lkTmF0aXZlQnVmZmVyUGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPSB1c2VfYW5kcm9pZF9uYXRpdmVfYnVmZmVyKGhDb21wLCBwYXJhbURhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmIEFMTE9DQVRFX09VVFBVVF9OQVRJVkVIQU5ETEUKLSAgICAgICAgY2FzZSBPTVhfR29vZ2xlQW5kcm9pZEluZGV4QWxsb2NhdGVOYXRpdmVIYW5kbGU6IHsKLQotICAgICAgICAgICAgICAgIEFsbG9jYXRlTmF0aXZlSGFuZGxlUGFyYW1zKiBhbGxvY2F0ZU5hdGl2ZUhhbmRsZVBhcmFtcyA9IChBbGxvY2F0ZU5hdGl2ZUhhbmRsZVBhcmFtcyAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBBbGxvY2F0ZU5hdGl2ZUhhbmRsZVBhcmFtcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdGVOYXRpdmVIYW5kbGVQYXJhbXMtPm5Qb3J0SW5kZXggIT0gT01YX0NPUkVfSU5QVVRfUE9SVF9JTkRFWCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRW5hYmxlL0Rpc2FibGUgYWxsb2NhdGUtbmF0aXZlLWhhbmRsZSBhbGxvd2VkIG9ubHkgb24gaW5wdXQgcG9ydCEiKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX2lucF9tZW1fcHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFbmFibGUvRGlzYWJsZSBhbGxvY2F0ZS1uYXRpdmUtaGFuZGxlIGlzIG5vdCBhbGxvd2VkIHNpbmNlIElucHV0IHBvcnQgaXMgbm90IGZyZWUgISIpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdGVOYXRpdmVIYW5kbGVQYXJhbXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZV9uYXRpdmVfaGFuZGxlID0gYWxsb2NhdGVOYXRpdmVIYW5kbGVQYXJhbXMtPmVuYWJsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZiAvL0FMTE9DQVRFX09VVFBVVF9OQVRJVkVIQU5ETEUKLSNlbmRpZgotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbUVuYWJsZVRpbWVTdGFtcFJlb3JkZXI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9JTkRFWFRJTUVTVEFNUFJFT1JERVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU9NWF9JTkRFWFRJTUVTVEFNUFJFT1JERVIgKnJlb3JkZXIgPSAoUU9NWF9JTkRFWFRJTUVTVEFNUFJFT1JERVIgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJ2X2N0eC5waWN0dXJlX29yZGVyID09ICh2ZGVjX291dHB1dF9vcmRlcilRT01YX1ZJREVPX0RJU1BMQVlfT1JERVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVvcmRlci0+YkVuYWJsZSA9PSBPTVhfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm1faW50ID0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3N0YW1wX2R0cy5zZXRfdGltZXN0YW1wX3Jlb3JkZXJfbW9kZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9zdGFtcF9kdHMuc2V0X3RpbWVzdGFtcF9yZW9yZGVyX21vZGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3N0YW1wX2R0cy5zZXRfdGltZXN0YW1wX3Jlb3JkZXJfbW9kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXItPmJFbmFibGUgPT0gT01YX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQYXJhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Byb2ZpbGVfbHZsLmVQcm9maWxlID0gcFBhcmFtLT5lUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wcm9maWxlX2x2bC5lTGV2ZWwgPSBwUGFyYW0tPmVMZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb01ldGFCdWZmZXJNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMpOwotICAgICAgICAgICAgU3RvcmVNZXRhRGF0YUluQnVmZmVyc1BhcmFtcyAqbWV0YWJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICBpZiAoIW1ldGFidWZmZXIpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSW52YWxpZCBwYXJhbTogJXAiLCBtZXRhYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fZGlzYWJsZV9keW5hbWljX2J1Zl9tb2RlKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRHluYW1pYyBidWZmZXIgbW9kZSBpcyBkaXNhYmxlZCIpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0YWJ1ZmZlci0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCkgewotCi0gICAgICAgICAgICAgICAgaWYgKG1fb3V0X21lbV9wdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVuYWJsZS9EaXNhYmxlIGR5bmFtaWMtYnVmZmVyLW1vZGUgaXMgbm90IGFsbG93ZWQgc2luY2UgT3V0cHV0IHBvcnQgaXMgbm90IGZyZWUgISIpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkeW5hbWljX2J1Zl9tb2RlID0gbWV0YWJ1ZmZlci0+YlN0b3JlTWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiJXMgYnVmZmVyIG1vZGUiLAotICAgICAgICAgICAgICAgICAgICAobWV0YWJ1ZmZlci0+YlN0b3JlTWV0YURhdGEgPT0gdHJ1ZSk/ICJFbmFibGVkIGR5bmFtaWMiIDogIkRpc2FibGVkIGR5bmFtaWMiKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigKLSAgICAgICAgICAgICAgICAgICAiT01YX1Fjb21JbmRleFBhcmFtVmlkZW9NZXRhQnVmZmVyTW9kZSBub3Qgc3VwcG9ydGVkIGZvciBwb3J0OiAldSIsCi0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCltZXRhYnVmZmVyLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0Rvd25TY2FsYXI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9JTkRFWERPV05TQ0FMQVIpOwotICAgICAgICAgICAgUU9NWF9JTkRFWERPV05TQ0FMQVIqIHBQYXJhbSA9IChRT01YX0lOREVYRE9XTlNDQUxBUiopcGFyYW1EYXRhOwotICAgICAgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgICAgICAgICAgaW50IHJjOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0Rvd25TY2FsYXIgJWRcbiIsIHBQYXJhbS0+YkVuYWJsZSk7Ci0KLSAgICAgICAgICAgIGlmIChwUGFyYW0gJiYgcFBhcmFtLT5iRW5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmMgPSBlbmFibGVfZG93bnNjYWxhcigpOwotICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiBlbmFibGVfZG93bnNjYWxhciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9mb3JjZV9kb3duX3NjYWxhciA9IHBQYXJhbS0+YkVuYWJsZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmMgPSBkaXNhYmxlX2Rvd25zY2FsYXIoKTsKLSAgICAgICAgICAgICAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlczogZGlzYWJsZV9kb3duc2NhbGFyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX2ZvcmNlX2Rvd25fc2NhbGFyID0gcFBhcmFtLT5iRW5hYmxlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSNpZmRlZiBBREFQVElWRV9QTEFZQkFDS19TVVBQT1JURUQKLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0FkYXB0aXZlUGxheWJhY2tNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIFByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrUGFyYW1zKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX0dvb2dsZUFuZHJvaWRJbmRleFByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrIik7Ci0gICAgICAgICAgICBQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja1BhcmFtcyogcFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja1BhcmFtcyAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICBpZiAocFBhcmFtcy0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCkgewotICAgICAgICAgICAgICAgIGlmICghcFBhcmFtcy0+YkVuYWJsZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbXMtPm5NYXhGcmFtZVdpZHRoID4gbWF4U21vb3RoU3RyZWFtaW5nV2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBQYXJhbXMtPm5NYXhGcmFtZUhlaWdodCA+IG1heFNtb290aFN0cmVhbWluZ0hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRhcHRpdmUgcGxheWJhY2sgcmVxdWVzdCBleGNlZWRzIG1heCBzdXBwb3J0ZWQgcmVzb2x1dGlvbiA6IFsldSB4ICV1XSB2cyBbJXUgeCAldV0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBQYXJhbXMtPm5NYXhGcmFtZVdpZHRoLCAodW5zaWduZWQgaW50KXBQYXJhbXMtPm5NYXhGcmFtZUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCltYXhTbW9vdGhTdHJlYW1pbmdXaWR0aCwgKHVuc2lnbmVkIGludCltYXhTbW9vdGhTdHJlYW1pbmdIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVSZXQgPSBlbmFibGVfYWRhcHRpdmVfcGxheWJhY2socFBhcmFtcy0+bk1heEZyYW1lV2lkdGgsIHBQYXJhbXMtPm5NYXhGcmFtZUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigKLSAgICAgICAgICAgICAgICAgICAgICAgICJQcmVwYXJlIGZvciBhZGFwdGl2ZSBwbGF5YmFjayBzdXBwb3J0ZWQgb25seSBvbiBvdXRwdXQgcG9ydCIpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX1FUSUluZGV4UGFyYW1WaWRlb1ByZWZlckFkYXB0aXZlUGxheWJhY2s6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9FTkFCTEVUWVBFKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX1FUSUluZGV4UGFyYW1WaWRlb1ByZWZlckFkYXB0aXZlUGxheWJhY2siKTsKLSAgICAgICAgICAgIG1fZGlzYWJsZV9keW5hbWljX2J1Zl9tb2RlID0gKChRT01YX0VOQUJMRVRZUEUgKilwYXJhbURhdGEpLT5iRW5hYmxlOwotICAgICAgICAgICAgaWYgKG1fZGlzYWJsZV9keW5hbWljX2J1Zl9tb2RlKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiUHJlZmVyIEFkYXB0aXZlIFBsYXliYWNrIGlzIHNldCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvQ3VzdG9tQnVmZmVyU2l6ZToKLSAgICAgICAgewotICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX1ZJREVPX0NVU1RPTV9CVUZGRVJTSVpFKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX1Fjb21JbmRleFBhcmFtVmlkZW9DdXN0b21CdWZmZXJTaXplIik7Ci0gICAgICAgICAgICBRT01YX1ZJREVPX0NVU1RPTV9CVUZGRVJTSVpFKiBwUGFyYW0gPSAoUU9NWF9WSURFT19DVVNUT01fQlVGRkVSU0laRSopcGFyYW1EYXRhOwotICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgICAgICAgICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fQlVGRkVSX1NJWkVfTElNSVQ7Ci0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IHBQYXJhbS0+bkJ1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgaWYgKGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgaW5wdXQgYnVmZmVyIHNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gZ2V0X2J1ZmZlcl9yZXEoJmRydl9jdHguaXBfYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVSZXQgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9jdXN0b21fYnVmZmVyc2l6ZS5pbnB1dF9idWZmZXJzaXplID0gZHJ2X2N0eC5pcF9idWYuYnVmZmVyX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJTdWNjZXNzZnVsbHkgc2V0IGN1c3RvbSBpbnB1dCBidWZmZXIgc2l6ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2N1c3RvbV9idWZmZXJzaXplLmlucHV0X2J1ZmZlcnNpemUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBnZXQgYnVmZmVyIHJlcXVpcmVtZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogQ3VzdG9tIGJ1ZmZlciBzaXplIGluIG5vdCBzdXBwb3J0ZWQgb24gb3V0cHV0IHBvcnQiKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhQYXJhbVZRWklQU0VJVHlwZToKLSAgICAgICAgewotICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUVRJX1ZJREVPX1BBUkFNX1ZRWklQX1NFSV9UWVBFKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX1FUSUluZGV4UGFyYW1WUVpJUFNFSVR5cGUiKTsKLSAgICAgICAgICAgIE9NWF9RVElfVklERU9fUEFSQU1fVlFaSVBfU0VJX1RZUEUgKnBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgKE9NWF9RVElfVklERU9fUEFSQU1fVlFaSVBfU0VJX1RZUEUgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJFbmFibGUgVlFaSVAgU0VJOiAlZCIsIHBQYXJhbS0+YkVuYWJsZSk7Ci0KLSAgICAgICAgICAgIGVSZXQgPSBlbmFibGVfZXh0cmFkYXRhKE9NWF9WUVpJUFNFSV9FWFRSQURBVEEsIGZhbHNlLAotICAgICAgICAgICAgICAgICgoUU9NWF9FTkFCTEVUWVBFICopcGFyYW1EYXRhKS0+YkVuYWJsZSk7Ci0gICAgICAgICAgICBpZiAoZVJldCAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBGYWlsZWQgdG8gc2V0IFNFSSBFeHRyYWRhdGEiKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgICAgIGNsaWVudF9leHRyYWRhdGEgPSBjbGllbnRfZXh0cmFkYXRhICYgfk9NWF9WUVpJUFNFSV9FWFRSQURBVEE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlUmV0ID0gZW5hYmxlX2V4dHJhZGF0YShPTVhfUVBfRVhUUkFEQVRBLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgKChRT01YX0VOQUJMRVRZUEUgKilwYXJhbURhdGEpLT5iRW5hYmxlKTsKLSAgICAgICAgICAgIGlmIChlUmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEZhaWxlZCB0byBzZXQgUVAgRXh0cmFkYXRhIik7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICBjbGllbnRfZXh0cmFkYXRhID0gY2xpZW50X2V4dHJhZGF0YSAmIH5PTVhfVlFaSVBTRUlfRVhUUkFEQVRBOwotICAgICAgICAgICAgICAgIGNsaWVudF9leHRyYWRhdGEgPSBjbGllbnRfZXh0cmFkYXRhICYgfk9NWF9RUF9FWFRSQURBVEE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlUmV0ID0gZW5hYmxlX2V4dHJhZGF0YShPTVhfRlJBTUVJTkZPX0VYVFJBREFUQSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFFPTVhfRU5BQkxFVFlQRSAqKXBhcmFtRGF0YSktPmJFbmFibGUpOwotICAgICAgICAgICAgaWYgKGVSZXQgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogRmFpbGVkIHRvIHNldCBGcmFtZUluZm8gRXh0cmFkYXRhIik7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICBjbGllbnRfZXh0cmFkYXRhID0gY2xpZW50X2V4dHJhZGF0YSAmIH5PTVhfVlFaSVBTRUlfRVhUUkFEQVRBOwotICAgICAgICAgICAgICAgIGNsaWVudF9leHRyYWRhdGEgPSBjbGllbnRfZXh0cmFkYXRhICYgfk9NWF9RUF9FWFRSQURBVEE7Ci0gICAgICAgICAgICAgICAgY2xpZW50X2V4dHJhZGF0YSA9IGNsaWVudF9leHRyYWRhdGEgJiB+T01YX0ZSQU1FSU5GT19FWFRSQURBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RVElJbmRleFBhcmFtUGFzc0lucHV0QnVmZmVyRmQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9FTkFCTEVUWVBFKTsKLSAgICAgICAgICAgIGlmIChhcmJpdHJhcnlfYnl0ZXMpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiT01YX1FUSUluZGV4UGFyYW1QYXNzSW5wdXRCdWZmZXJGZCBub3Qgc3VwcG9ydGVkIGluIGFyYml0cmFyeSBidWZmZXIgbW9kZSIpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1faW5wdXRfcGFzc19idWZmZXJfZmQgPSAoKFFPTVhfRU5BQkxFVFlQRSAqKXBhcmFtRGF0YSktPmJFbmFibGU7Ci0gICAgICAgICAgICBpZiAobV9pbnB1dF9wYXNzX2J1ZmZlcl9mZCkKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkVuYWJsZSBwYXNzaW5nIGlucHV0IGJ1ZmZlciBGRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhQYXJhbUZvcmNlQ29tcHJlc3NlZEZvckRQQjoKLSAgICAgICAgewotICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUVRJX1ZJREVPX1BBUkFNX0ZPUkNFX0NPTVBSRVNTRURfRk9SX0RQQl9UWVBFKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX1FUSUluZGV4UGFyYW1Gb3JjZUNvbXByZXNzZWRGb3JEUEIiKTsKLSAgICAgICAgICAgIE9NWF9RVElfVklERU9fUEFSQU1fRk9SQ0VfQ09NUFJFU1NFRF9GT1JfRFBCX1RZUEUgKnBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgKE9NWF9RVElfVklERU9fUEFSQU1fRk9SQ0VfQ09NUFJFU1NFRF9GT1JfRFBCX1RZUEUgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICBpZiAobV9kaXNhYmxlX3Vid2NfbW9kZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJPTVhfUVRJSW5kZXhQYXJhbUZvcmNlQ29tcHJlc3NlZEZvckRQQiBub3Qgc3VwcG9ydGVkIHdoZW4gdWJ3YyBkaXNhYmxlZCIpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXBhcmFtRGF0YSkgewotICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInNldF9wYXJhbWV0ZXI6IE9NWF9RVElJbmRleFBhcmFtRm9yY2VDb21wcmVzc2VkRm9yRFBCIHBhcmFtRGF0YSBOVUxMIik7Ci0gICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1fZm9yY2VfY29tcHJlc3NlZF9mb3JfZHBiID0gcFBhcmFtLT5iRW5hYmxlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhQYXJhbUZvcmNlVW5Db21wcmVzc2VkRm9yT1BCOgotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9RVElJbmRleFBhcmFtRm9yY2VVbkNvbXByZXNzZWRGb3JPUEIiKTsKLSAgICAgICAgICAgIE9NWF9RVElfVklERU9fUEFSQU1fRk9SQ0VfVU5DT01QUkVTU0VEX0ZPUl9PUEJfVFlQRSAqcFBhcmFtID0KLSAgICAgICAgICAgICAgICAoT01YX1FUSV9WSURFT19QQVJBTV9GT1JDRV9VTkNPTVBSRVNTRURfRk9SX09QQl9UWVBFICopcGFyYW1EYXRhOwotICAgICAgICAgICAgaWYgKCFwYXJhbURhdGEpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigic2V0X3BhcmFtZXRlcjogT01YX1FUSUluZGV4UGFyYW1Gb3JjZVVuQ29tcHJlc3NlZEZvck9QQiBwYXJhbURhdGEgaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2Rpc2FibGVfdWJ3Y19tb2RlID0gcFBhcmFtLT5iRW5hYmxlOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBVQldDICVzIGZvciBPUEIiLCBwUGFyYW0tPmJFbmFibGUgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1FUSUluZGV4UGFyYW1EaXRoZXJDb250cm9sOgotICAgICAgICB7Ci0gICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIFFPTVhfVklERU9fRElUSEVSX0NPTlRST0wpOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfUVRJSW5kZXhQYXJhbURpdGhlckNvbnRyb2wiKTsKLSAgICAgICAgICAgIFFPTVhfVklERU9fRElUSEVSX0NPTlRST0wgKnBQYXJhbSA9IChRT01YX1ZJREVPX0RJVEhFUl9DT05UUk9MICopcGFyYW1EYXRhOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBEaXRoZXIgQ29uZmlnIGZyb20gY2xpZW50IGlzOiAlZCIsIHBQYXJhbS0+ZURpdGhlclR5cGUpOwotICAgICAgICAgICAgaWYgKCggcFBhcmFtLT5lRGl0aGVyVHlwZSA8IFFPTVhfRElUSEVSX0RJU0FCTEUgKSB8fAotICAgICAgICAgICAgICAgICggcFBhcmFtLT5lRGl0aGVyVHlwZSA+IFFPTVhfRElUSEVSX0FMTF9DT0xPUlNQQUNFKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfcGFyYW1ldGVyOiBEaXRoZXJUeXBlIG91dHNpZGUgdGhlIHJhbmdlIik7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fZGl0aGVyX2NvbmZpZyA9IGlzX3BsYXRmb3JtX3RwMTBjYXB0dXJlX3N1cHBvcnRlZCgpID8gKGRpdGhlcl90eXBlKXBQYXJhbS0+ZURpdGhlclR5cGUgOiBESVRIRVJfQUxMX0NPTE9SU1BBQ0U7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IEZpbmFsIERpdGhlciBDb25maWcgaXM6ICVkIiwgbV9kaXRoZXJfY29uZmlnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldHBhcmFtZXRlcjogdW5rbm93biBwYXJhbSAlZCIsIHBhcmFtSW5kZXgpOwotICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICB9Ci0gICAgfQotICAgIGlmIChlUmV0ICE9IE9NWF9FcnJvck5vbmUpCi0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfcGFyYW1ldGVyOiBFcnJvcjogMHgleCwgc2V0dGluZyBwYXJhbSAweCV4IiwgZVJldCwgcGFyYW1JbmRleCk7Ci0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6R2V0Q29uZmlnCi0KLSAgIERFU0NSSVBUSU9OCi0gICBPTVggR2V0IENvbmZpZyBNZXRob2QgaW1wbGVtZW50YXRpb24uCi0KLSAgIFBBUkFNRVRFUlMKLSAgIDxUQkQ+LgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIE9NWCBFcnJvciBOb25lIGlmIHN1Y2Nlc3NmdWwuCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmRlYzo6Z2V0X2NvbmZpZyhPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgY29uZmlnSW5kZXgsCi0gICAgICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICBjb25maWdEYXRhKQotewotICAgICh2b2lkKSBoQ29tcDsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiR2V0IENvbmZpZyBpbiBJbnZhbGlkIFN0YXRlIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotCi0gICAgc3dpdGNoICgodW5zaWduZWQgbG9uZyljb25maWdJbmRleCkgewotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhRdWVyeU51bWJlck9mVmlkZW9EZWNJbnN0YW5jZTogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIFFPTVhfVklERU9fUVVFUllfREVDT0RFUl9JTlNUQU5DRVMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFPTVhfVklERU9fUVVFUllfREVDT0RFUl9JTlNUQU5DRVMgKmRlY29kZXJpbnN0YW5jZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUU9NWF9WSURFT19RVUVSWV9ERUNPREVSX0lOU1RBTkNFUyopY29uZmlnRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyaW5zdGFuY2VzLT5uTnVtT2ZJbnN0YW5jZXMgPSAxNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRPRE86IEhvdyB0byBoYW5kbGUgdGhpcyBjYXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleENvbmZpZ1ZpZGVvRnJhbWVQYWNraW5nQXJyYW5nZW1lbnQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcnZfY3R4LmRlY29kZXJfZm9ybWF0ID09IFZERUNfQ09ERUNUWVBFX0gyNjQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBPTVhfUUNPTV9GUkFNRV9QQUNLX0FSUkFOR0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUUNPTV9GUkFNRV9QQUNLX0FSUkFOR0VNRU5UICpjb25maWdGbXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1FDT01fRlJBTUVfUEFDS19BUlJBTkdFTUVOVCAqKSBjb25maWdEYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb25maWdGbXQsICZtX2ZyYW1lX3BhY2tfYXJyYW5nZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihPTVhfUUNPTV9GUkFNRV9QQUNLX0FSUkFOR0VNRU5UKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJnZXRfY29uZmlnOiBGcmFtZXBhY2sgZGF0YSBub3Qgc3VwcG9ydGVkIGZvciBub24gSDI2NCBjb2RlY3MiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcDogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIE9NWF9DT05GSUdfUkVDVFRZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfUkVDVFRZUEUgKnJlY3QgPSAoT01YX0NPTkZJR19SRUNUVFlQRSAqKSBjb25maWdEYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShyZWN0LCAmcmVjdGFuZ2xlLCBzaXplb2YoT01YX0NPTkZJR19SRUNUVFlQRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goImdldF9jb25maWc6IGNyb3AgaW5mbzogTDogJXUsIFQ6ICV1LCBSOiAldSwgQjogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RhbmdsZS5uTGVmdCwgcmVjdGFuZ2xlLm5Ub3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdGFuZ2xlLm5XaWR0aCwgcmVjdGFuZ2xlLm5IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhDb25maWdIMjY0RW50cm9weUNvZGluZ0NhYmFjOiB7Ci0gICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBRT01YX1ZJREVPX0gyNjRFTlRST1BZQ09ESU5HVFlQRSk7Ci0gICAgICAgICAgICBRT01YX1ZJREVPX0gyNjRFTlRST1BZQ09ESU5HVFlQRSAqY29kaW5nID0gKFFPTVhfVklERU9fSDI2NEVOVFJPUFlDT0RJTkdUWVBFICopY29uZmlnRGF0YTsKLSAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLQotICAgICAgICAgICAgaWYgKGRydl9jdHguZGVjb2Rlcl9mb3JtYXQgIT0gVkRFQ19DT0RFQ1RZUEVfSDI2NCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJnZXRfY29uZmlnIG9mIE9NWF9RY29tSW5kZXhDb25maWdIMjY0RW50cm9weUNvZGluZ0NhYmFjIG9ubHkgYXZhaWxhYmxlIGZvciBIMjY0Iik7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vdEltcGxlbWVudGVkOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERTsKLSAgICAgICAgICAgIGlmICghaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19HX0NUUkwsICZjb250cm9sKSkgewotICAgICAgICAgICAgICAgIGNvZGluZy0+YkNhYmFjID0gKE9NWF9CT09MKQotICAgICAgICAgICAgICAgICAgICAoY29udHJvbC52YWx1ZSA9PSBWNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FCQUMpOwotICAgICAgICAgICAgICAgIC8qIFdlIGNhbid0IHF1ZXJ5IGRyaXZlciBhdCB0aGUgbW9tZW50IGZvciB0aGUgY2FiYWMgbW9kZSwgc28KLSAgICAgICAgICAgICAgICAgKiBqdXN0IHVzZSAweGZmLi4uZiBhcyBhIHBsYWNlIGhvbGRlciBmb3IgZnV0dXJlIGltcHJvdmVtZW50ICovCi0gICAgICAgICAgICAgICAgY29kaW5nLT5uQ2FiYWNJbml0SWRjID0gfjA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RVElJbmRleENvbmZpZ0Rlc2NyaWJlQ29sb3JBc3BlY3RzOgotICAgICAgICB7Ci0gICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBEZXNjcmliZUNvbG9yQXNwZWN0c1BhcmFtcyk7Ci0gICAgICAgICAgICBEZXNjcmliZUNvbG9yQXNwZWN0c1BhcmFtcyAqcGFyYW1zID0gKERlc2NyaWJlQ29sb3JBc3BlY3RzUGFyYW1zICopY29uZmlnRGF0YTsKLQotICAgICAgICAgICAgcHJpbnRfZGVidWdfY29sb3JfYXNwZWN0cygmKG1fY2xpZW50X2NvbG9yX3NwYWNlLnNBc3BlY3RzKSwgIkdldENvbmZpZyBDbGllbnQiKTsKLSAgICAgICAgICAgIHByaW50X2RlYnVnX2NvbG9yX2FzcGVjdHMoJihtX2ludGVybmFsX2NvbG9yX3NwYWNlLnNBc3BlY3RzKSwgIkdldENvbmZpZyBJbnRlcm5hbCIpOwotCi0gICAgICAgICAgICBpZiAocGFyYW1zLT5iUmVxdWVzdGluZ0RhdGFTcGFjZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJEb2VzIG5vdCBoYW5kbGUgZGF0YXNwYWNlIHJlcXVlc3QiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1faW50ZXJuYWxfY29sb3Jfc3BhY2UuYkRhdGFTcGFjZUNoYW5nZWQgPT0gT01YX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlVwZGF0aW5nIENsaWVudCdzIGNvbG9yIGFzcGVjdHMgd2l0aCBpbnRlcm5hbCIpOwotICAgICAgICAgICAgICAgIG1lbWNweSgmKG1fY2xpZW50X2NvbG9yX3NwYWNlLnNBc3BlY3RzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYobV9pbnRlcm5hbF9jb2xvcl9zcGFjZS5zQXNwZWN0cyksIHNpemVvZihDb2xvckFzcGVjdHMpKTsKLSAgICAgICAgICAgICAgICBtX2ludGVybmFsX2NvbG9yX3NwYWNlLmJEYXRhU3BhY2VDaGFuZ2VkID0gT01YX0ZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KCYocGFyYW1zLT5zQXNwZWN0cyksICYobV9jbGllbnRfY29sb3Jfc3BhY2Uuc0FzcGVjdHMpLCBzaXplb2YoQ29sb3JBc3BlY3RzKSk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1FUSUluZGV4Q29uZmlnRGVzY3JpYmVIRFJDb2xvckluZm86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyk7Ci0gICAgICAgICAgICBEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMgKnBhcmFtcyA9IChEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMgKiljb25maWdEYXRhOwotICAgICAgICAgICAgYXV0b19sb2NrIGxvY2sobV9oZHJfaW5mb19jbGllbnRfbG9jayk7Ci0KLSAgICAgICAgICAgIHByaW50X2RlYnVnX2hkcl9jb2xvcl9pbmZvKCYobV9jbGllbnRfaGRyX2luZm8uc0luZm8pLCAiR2V0Q29uZmlnIENsaWVudCBIRFIiKTsKLSAgICAgICAgICAgIHByaW50X2RlYnVnX2hkcl9jb2xvcl9pbmZvKCYobV9pbnRlcm5hbF9oZHJfaW5mby5zSW5mbyksICJHZXRDb25maWcgSW50ZXJuYWwgSERSIik7Ci0KLSAgICAgICAgICAgIGlmIChtX2NoYW5nZV9jbGllbnRfaGRyX2luZm8pIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlVwZGF0aW5nIENsaWVudCdzIEhEUiBJbmZvIHdpdGggaW50ZXJuYWwiKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJm1fY2xpZW50X2hkcl9pbmZvLnNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAmbV9pbnRlcm5hbF9oZHJfaW5mby5zSW5mbywgc2l6ZW9mKEhEUlN0YXRpY0luZm8pKTsKLSAgICAgICAgICAgICAgICBtX2NoYW5nZV9jbGllbnRfaGRyX2luZm8gPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtY3B5KCYocGFyYW1zLT5zSW5mbyksICYobV9jbGllbnRfaGRyX2luZm8uc0luZm8pLCBzaXplb2YoSERSU3RhdGljSW5mbykpOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0FuZHJvaWRWZW5kb3JFeHRlbnNpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSk7Ci0KLSAgICAgICAgICAgIE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0ID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqPihjb25maWdEYXRhKTsKLSAgICAgICAgICAgIFZBTElEQVRFX09NWF9WRU5ET1JfRVhURU5TSU9OX1BBUkFNX0RBVEEoZXh0KTsKLSAgICAgICAgICAgIHJldHVybiBnZXRfdmVuZG9yX2V4dGVuc2lvbl9jb25maWcoZXh0KTsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZ2V0X2NvbmZpZzogdW5rbm93biBwYXJhbSAlZCIsY29uZmlnSW5kZXgpOwotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6U2V0Q29uZmlnCi0KLSAgIERFU0NSSVBUSU9OCi0gICBPTVggU2V0IENvbmZpZyBtZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgUEFSQU1FVEVSUwotICAgPFRCRD4uCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgT01YIEVycm9yIE5vbmUgaWYgc3VjY2Vzc2Z1bC4KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmRlYzo6c2V0X2NvbmZpZyhPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgY29uZmlnSW5kZXgsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBjb25maWdEYXRhKQotewotICAgICh2b2lkKSBoQ29tcDsKLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJHZXQgQ29uZmlnIGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0KLSAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFICpwTmFsOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJTZXQgQ29uZmlnIENhbGxlZCIpOwotCi0gICAgaWYgKGNvbmZpZ0luZGV4ID09IE9NWF9JbmRleENvbmZpZ1ZpZGVvTmFsU2l6ZSkgewotICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIHRlbXA7Ci0gICAgICAgIHRlbXAuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fU1RSRUFNX0ZPUk1BVDsKLQotICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBPTVhfVklERU9fQ09ORklHX05BTFNJWkUpOwotICAgICAgICBwTmFsID0gcmVpbnRlcnByZXRfY2FzdCA8IE9NWF9WSURFT19DT05GSUdfTkFMU0laRSAqID4oY29uZmlnRGF0YSk7Ci0gICAgICAgIHN3aXRjaCAocE5hbC0+bk5hbHVCeXRlcykgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHRlbXAudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19OQUxfRk9STUFUX1NUQVJUQ09ERVM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgdGVtcC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX1ZJREVPX05BTF9GT1JNQVRfVFdPX0JZVEVfTEVOR1RIOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIHRlbXAudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19OQUxfRk9STUFUX0ZPVVJfQllURV9MRU5HVEg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFyYml0cmFyeV9ieXRlcykgewotICAgICAgICAgICAgLyogSW4gYXJiaXRyYXJ5IGJ5dGVzIG1vZGUsIHRoZSBhc3NlbWJsZXIgc3RyaXBzIG91dCBuYWwgc2l6ZSBhbmQgcmVwbGFjZXMKLSAgICAgICAgICAgICAqIHdpdGggc3RhcnQgY29kZSwgc28gb25seSBuZWVkIHRvIG5vdGlmeSBkcml2ZXIgaW4gZnJhbWUgYnkgZnJhbWUgbW9kZSAqLwotICAgICAgICAgICAgaWYgKGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmdGVtcCkpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fU1RSRUFNX0ZPUk1BVCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JIYXJkd2FyZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG5hbF9sZW5ndGggPSBwTmFsLT5uTmFsdUJ5dGVzOwotCi0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiT01YX0luZGV4Q29uZmlnVmlkZW9OYWxTaXplIGNhbGxlZCB3aXRoIFNpemUgJWQiLCBuYWxfbGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9IGVsc2UgaWYgKChpbnQpY29uZmlnSW5kZXggPT0gKGludClPTVhfSW5kZXhWZW5kb3JWaWRlb0ZyYW1lUmF0ZSkgewotICAgICAgICBPTVhfVkVORE9SX1ZJREVPRlJBTUVSQVRFICpjb25maWcgPSAoT01YX1ZFTkRPUl9WSURFT0ZSQU1FUkFURSAqKSBjb25maWdEYXRhOwotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJJbmRleCBPTVhfSW5kZXhWZW5kb3JWaWRlb0ZyYW1lUmF0ZSAldSIsICh1bnNpZ25lZCBpbnQpY29uZmlnLT5uRnBzKTsKLQotICAgICAgICBpZiAoY29uZmlnLT5uUG9ydEluZGV4ID09IE9NWF9DT1JFX0lOUFVUX1BPUlRfSU5ERVgpIHsKLSAgICAgICAgICAgIGlmIChjb25maWctPmJFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChjb25maWctPm5GcHMgPj4gMTYpID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+bkZwcyA+PiAxNikgPD0gTUFYX1NVUFBPUlRFRF9GUFMpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9mcHNfcmVjZWl2ZWQgPSBjb25maWctPm5GcHM7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldF9jb25maWc6IGZyYW1lIHJhdGUgc2V0IGJ5IG9teCBjbGllbnQgOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljb25maWctPm5GcHMgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBRMTZUb0ZyYWN0aW9uKGNvbmZpZy0+bkZwcywgZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19udW1lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19kZW5vbWluYXRvcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX251bWVyYXRvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk51bWVyYXRvciBpcyB6ZXJvIHNldHRpbmcgdG8gMzAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfbnVtZXJhdG9yID0gMzA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19kZW5vbWluYXRvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19udW1lcmF0b3IgPSAoaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfbnVtZXJhdG9yIC8gZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19kZW5vbWluYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfZGVub21pbmF0b3IgPSAxOwotICAgICAgICAgICAgICAgICAgICBmcm1faW50ID0gZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19kZW5vbWluYXRvciAqIDFlNiAvCi0gICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX251bWVyYXRvcjsKLQotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9vdXRwdXRwYXJtIG9wYXJtOwotICAgICAgICAgICAgICAgICAgICAvKlhYWDogd2UncmUgcHJvdmlkaW5nIHRpbWluZyBpbmZvIGFzIHNlY29uZHMgcGVyIGZyYW1lIHJhdGhlciB0aGFuIGZyYW1lcwotICAgICAgICAgICAgICAgICAgICAgKiBwZXIgc2Vjb25kLiovCi0gICAgICAgICAgICAgICAgICAgIG9wYXJtLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX2Rlbm9taW5hdG9yOwotICAgICAgICAgICAgICAgICAgICBvcGFybS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX251bWVyYXRvcjsKLQotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIHNwYXJtOwotICAgICAgICAgICAgICAgICAgICBzcGFybS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICAgICAgICAgICAgICBzcGFybS5wYXJtLm91dHB1dCA9IG9wYXJtOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX1BBUk0sICZzcGFybSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJVbmFibGUgdG8gY29udmV5IGZwcyBpbmZvIHRvIGRyaXZlciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSBtaWdodCBiZSBhZmZlY3RlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySGFyZHdhcmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50X3NldF9mcHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGcmFtZSByYXRlIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldF9jb25maWc6IERpc2FibGVkIGNsaWVudCdzIGZyYW1lIHJhdGUiKTsKLSAgICAgICAgICAgICAgICBjbGllbnRfc2V0X2ZwcyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiBTZXRfY29uZmlnOiBCYWQgUG9ydCBpZHggJWQiLAotICAgICAgICAgICAgICAgICAgICAoaW50KWNvbmZpZy0+blBvcnRJbmRleCk7Ci0gICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0gZWxzZSBpZiAoKGludCljb25maWdJbmRleCA9PSAoaW50KU9NWF9RY29tSW5kZXhDb25maWdQaWN0dXJlVHlwZURlY29kZSkgewotICAgICAgICBPTVhfUUNPTV9WSURFT19DT05GSUdfUElDVFVSRV9UWVBFX0RFQ09ERSAqY29uZmlnID0KLSAgICAgICAgICAgIChPTVhfUUNPTV9WSURFT19DT05GSUdfUElDVFVSRV9UWVBFX0RFQ09ERSAqKWNvbmZpZ0RhdGE7Ci0gICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXQgcGljdHVyZSB0eXBlIGRlY29kZTogJWQiLCBjb25maWctPmVEZWNvZGVUeXBlKTsKLSAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19QSUNUWVBFX0RFQ19NT0RFOwotCi0gICAgICAgIHN3aXRjaCAoY29uZmlnLT5lRGVjb2RlVHlwZSkgewotICAgICAgICAgICAgY2FzZSBPTVhfUUNPTV9QaWN0eXBlRGVjb2RlX0k6Ci0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX1ZJREVPX1BJQ1RZUEVfREVDT0RFX09OOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfUUNPTV9QaWN0eXBlRGVjb2RlX0lQQjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX1ZJREVPX1BJQ1RZUEVfREVDT0RFX09GRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHJldCA9IChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpIDwgMCkgPwotICAgICAgICAgICAgICAgIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyA6IE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIGlmIChyZXQpCi0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBwaWN0dXJlIHR5cGUgZGVjb2RlIik7Ci0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9IGVsc2UgaWYgKChpbnQpY29uZmlnSW5kZXggPT0gKGludClPTVhfSW5kZXhDb25maWdQcmlvcml0eSkgewotICAgICAgICBPTVhfUEFSQU1fVTMyVFlQRSAqcHJpb3JpdHkgPSAoT01YX1BBUkFNX1UzMlRZUEUgKiljb25maWdEYXRhOwotICAgICAgICBERUJVR19QUklOVF9MT1coIlNldF9jb25maWc6IHByaW9yaXR5ICVkIixwcmlvcml0eS0+blUzMik7Ci0KLSAgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotCi0gICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUFJJT1JJVFk7Ci0gICAgICAgIGlmIChwcmlvcml0eS0+blUzMiA9PSAwKQotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX1ZJREVPX1BSSU9SSVRZX1JFQUxUSU1FX0VOQUJMRTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX1ZJREVPX1BSSU9SSVRZX1JFQUxUSU1FX0RJU0FCTEU7Ci0KLSAgICAgICAgaWYgKGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IFByaW9yaXR5Iik7Ci0gICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9IGVsc2UgaWYgKChpbnQpY29uZmlnSW5kZXggPT0gKGludClPTVhfSW5kZXhDb25maWdPcGVyYXRpbmdSYXRlKSB7Ci0gICAgICAgIE9NWF9QQVJBTV9VMzJUWVBFICpyYXRlID0gKE9NWF9QQVJBTV9VMzJUWVBFICopY29uZmlnRGF0YTsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXRfY29uZmlnOiBvcGVyYXRpbmctcmF0ZSAldSBmcHMiLCByYXRlLT5uVTMyID4+IDE2KTsKLQotICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0KLSAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19PUEVSQVRJTkdfUkFURTsKLSAgICAgICAgY29udHJvbC52YWx1ZSA9IHJhdGUtPm5VMzI7Ci0KLSAgICAgICAgb3BlcmF0aW5nX2ZyYW1lX3JhdGUgPSByYXRlLT5uVTMyID4+IDE2OwotCi0gICAgICAgIGlmIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICByZXQgPSBlcnJubyA9PSAtRUJVU1kgPyBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXMgOgotICAgICAgICAgICAgICAgICAgICBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBvcGVyYXRpbmcgcmF0ZSAldSBmcHMgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgIHJhdGUtPm5VMzIgPj4gMTYsIGVycm5vID09IC1FQlVTWSA/ICJIVyBPdmVybG9hZCIgOiBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICB9IGVsc2UgaWYgKChpbnQpY29uZmlnSW5kZXggPT0gKGludClPTVhfUVRJSW5kZXhDb25maWdEZXNjcmliZUNvbG9yQXNwZWN0cykgewotICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBEZXNjcmliZUNvbG9yQXNwZWN0c1BhcmFtcyk7Ci0gICAgICAgIERlc2NyaWJlQ29sb3JBc3BlY3RzUGFyYW1zICpwYXJhbXMgPSAoRGVzY3JpYmVDb2xvckFzcGVjdHNQYXJhbXMgKiljb25maWdEYXRhOwotICAgICAgICBpZiAoIURFRkFVTFRfRVhUUkFEQVRBICYgT01YX0RJU1BMQVlfSU5GT19FWFRSQURBVEEpIHsKLSAgICAgICAgICAgIGVuYWJsZV9leHRyYWRhdGEoT01YX0RJU1BMQVlfSU5GT19FWFRSQURBVEEsIHRydWUsIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRfZGVidWdfY29sb3JfYXNwZWN0cygmKHBhcmFtcy0+c0FzcGVjdHMpLCAiU2V0IENvbmZpZyIpOwotICAgICAgICBtZW1jcHkoJm1fY2xpZW50X2NvbG9yX3NwYWNlLCBwYXJhbXMsIHNpemVvZihEZXNjcmliZUNvbG9yQXNwZWN0c1BhcmFtcykpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0gZWxzZSBpZiAoKGludCljb25maWdJbmRleCA9PSAoaW50KU9NWF9RVElJbmRleENvbmZpZ0Rlc2NyaWJlSERSQ29sb3JJbmZvKSB7Ci0gICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyk7Ci0gICAgICAgIERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAqcGFyYW1zID0gKERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAqKWNvbmZpZ0RhdGE7Ci0gICAgICAgIGlmICghREVGQVVMVF9FWFRSQURBVEEgJiBPTVhfSERSX0NPTE9SX0lORk9fRVhUUkFEQVRBKSB7Ci0gICAgICAgICAgICByZXQgPSBlbmFibGVfZXh0cmFkYXRhKE9NWF9IRFJfQ09MT1JfSU5GT19FWFRSQURBVEEsIHRydWUsIHRydWUpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBlbmFibGUgT01YX0hEUl9DT0xPUl9JTkZPX0VYVFJBREFUQSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcmludF9kZWJ1Z19oZHJfY29sb3JfaW5mbygmKHBhcmFtcy0+c0luZm8pLCAiU2V0IENvbmZpZyBIRFIiKTsKLSAgICAgICAgbWVtY3B5KCZtX2NsaWVudF9oZHJfaW5mbywgcGFyYW1zLCBzaXplb2YoRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zKSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICB9IGVsc2UgaWYgKChpbnQpY29uZmlnSW5kZXggPT0gKGludClPTVhfSW5kZXhDb25maWdBbmRyb2lkVmVuZG9yRXh0ZW5zaW9uKSB7Ci0gICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSk7Ci0KLSAgICAgICAgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICpleHQgPQotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8T01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICo+KGNvbmZpZ0RhdGEpOwotICAgICAgICBWQUxJREFURV9PTVhfVkVORE9SX0VYVEVOU0lPTl9QQVJBTV9EQVRBKGV4dCk7Ci0KLSAgICAgICAgcmV0dXJuIHNldF92ZW5kb3JfZXh0ZW5zaW9uX2NvbmZpZyhleHQpOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZDsKLX0KLQotI2RlZmluZSBleHRuX2VxdWFscyhwYXJhbSwgZXh0bikgKCFzdHJjbXAocGFyYW0sIGV4dG4pKQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6OkdldEV4dGVuc2lvbkluZGV4Ci0KLSAgIERFU0NSSVBUSU9OCi0gICBPTVggR2V0RXh0ZW5zaW9uSW5kZXggbWV0aG9kIGltcGxlbWVudGFpb24uICA8VEJEPgotCi0gICBQQVJBTUVURVJTCi0gICA8VEJEPi4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBPTVggRXJyb3IgTm9uZSBpZiBldmVyeXRoaW5nIHN1Y2Nlc3NmdWwuCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmRlYzo6Z2V0X2V4dGVuc2lvbl9pbmRleChPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBwYXJhbU5hbWUsCi0gICAgICAgIE9NWF9PVVQgT01YX0lOREVYVFlQRSogaW5kZXhUeXBlKQotewotICAgICh2b2lkKSBoQ29tcDsKLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJHZXQgRXh0ZW5zaW9uIEluZGV4IGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9IGVsc2UgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLlN5bmNGcmFtZURlY29kaW5nTW9kZSIpKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfUWNvbUluZGV4UGFyYW1WaWRlb1N5bmNGcmFtZURlY29kaW5nTW9kZTsKLSAgICB9IGVsc2UgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5RQ09NLmluZGV4LnBhcmFtLkluZGV4RXh0cmFEYXRhIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhQYXJhbUluZGV4RXh0cmFEYXRhVHlwZTsKLSAgICB9IGVsc2UgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgT01YX1FDT01fSU5ERVhfUEFSQU1fVklERU9fRlJBTUVQQUNLSU5HX0VYVFJBREFUQSkpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhQYXJhbVZpZGVvRnJhbWVQYWNraW5nRXh0cmFkYXRhOwotICAgIH0gZWxzZSBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCBPTVhfUUNPTV9JTkRFWF9DT05GSUdfVklERU9fRlJBTUVQQUNLSU5HX0lORk8pKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfUWNvbUluZGV4Q29uZmlnVmlkZW9GcmFtZVBhY2tpbmdBcnJhbmdlbWVudDsKLSAgICB9IGVsc2UgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgT01YX1FDT01fSU5ERVhfUEFSQU1fVklERU9fUVBfRVhUUkFEQVRBKSkgewotICAgICAgICAqaW5kZXhUeXBlID0gKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleFBhcmFtVmlkZW9RUEV4dHJhRGF0YTsKLSAgICB9IGVsc2UgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgT01YX1FDT01fSU5ERVhfUEFSQU1fVklERU9fSU5QVVRCSVRTSU5GT19FWFRSQURBVEEpKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0lucHV0Qml0c0luZm9FeHRyYURhdGE7Ci0gICAgfSBlbHNlIGlmIChleHRuX2VxdWFscyhwYXJhbU5hbWUsIE9NWF9RQ09NX0lOREVYX1BBUkFNX1ZJREVPX0VYVE5VU0VSX0VYVFJBREFUQSkpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhFbmFibGVFeHRuVXNlckRhdGE7Ci0gICAgfQotI2lmIGRlZmluZWQgKF9BTkRST0lEX0hPTkVZQ09NQl8pIHx8IGRlZmluZWQgKF9BTkRST0lEX0lDU18pCi0gICAgZWxzZSBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9Hb29nbGVBbmRyb2lkSW5kZXhFbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVyczsKLSAgICB9IGVsc2UgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC51c2VBbmRyb2lkTmF0aXZlQnVmZmVyMiIpKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfR29vZ2xlQW5kcm9pZEluZGV4VXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcjI7Ci0gICAgfSBlbHNlIGlmIChleHRuX2VxdWFscyhwYXJhbU5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgudXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciIpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFeHRlbnNpb246ICVzIGlzIHN1cHBvcnRlZCIsIHBhcmFtTmFtZSk7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfR29vZ2xlQW5kcm9pZEluZGV4VXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcjsKLSAgICB9IGVsc2UgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5nZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2UiKSkgewotICAgICAgICAqaW5kZXhUeXBlID0gKE9NWF9JTkRFWFRZUEUpT01YX0dvb2dsZUFuZHJvaWRJbmRleEdldEFuZHJvaWROYXRpdmVCdWZmZXJVc2FnZTsKLSAgICB9Ci0jaWYgQUxMT0NBVEVfT1VUUFVUX05BVElWRUhBTkRMRQotICAgIGVsc2UgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5hbGxvY2F0ZU5hdGl2ZUhhbmRsZSIpKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfR29vZ2xlQW5kcm9pZEluZGV4QWxsb2NhdGVOYXRpdmVIYW5kbGU7Ci0gICAgfQotI2VuZGlmIC8vQUxMT0NBVEVfT1VUUFVUX05BVElWRUhBTkRMRQotI2VuZGlmCi0gICAgZWxzZSBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKSkgewotICAgICAgICAqaW5kZXhUeXBlID0gKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleFBhcmFtVmlkZW9NZXRhQnVmZmVyTW9kZTsKLSAgICB9Ci0jaWZkZWYgQURBUFRJVkVfUExBWUJBQ0tfU1VQUE9SVEVECi0gICAgZWxzZSBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhQYXJhbVZpZGVvQWRhcHRpdmVQbGF5YmFja01vZGU7Ci0gICAgfSBlbHNlIGlmIChleHRuX2VxdWFscyhwYXJhbU5hbWUsIE9NWF9RVElfSU5ERVhfUEFSQU1fVklERU9fUFJFRkVSX0FEQVBUSVZFX1BMQVlCQUNLKSkgewotICAgICAgICAqaW5kZXhUeXBlID0gKE9NWF9JTkRFWFRZUEUpT01YX1FUSUluZGV4UGFyYW1WaWRlb1ByZWZlckFkYXB0aXZlUGxheWJhY2s7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgRkxFWFlVVl9TVVBQT1JURUQKLSAgICBlbHNlIGlmIChleHRuX2VxdWFscyhwYXJhbU5hbWUsIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5kZXNjcmliZUNvbG9yRm9ybWF0IikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhGbGV4aWJsZVlVVkRlc2NyaXB0aW9uOwotICAgIH0KLSNlbmRpZgotICAgIGVsc2UgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLlBhc3NJbnB1dEJ1ZmZlckZkIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RVElJbmRleFBhcmFtUGFzc0lucHV0QnVmZmVyRmQ7Ci0gICAgfSBlbHNlIGlmIChleHRuX2VxdWFscyhwYXJhbU5hbWUsICJPTVguUVRJLmluZGV4LnBhcmFtLnZpZGVvLkZvcmNlQ29tcHJlc3NlZEZvckRQQiIpKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfUVRJSW5kZXhQYXJhbUZvcmNlQ29tcHJlc3NlZEZvckRQQjsKLSAgICB9IGVsc2UgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5RVEkuaW5kZXgucGFyYW0udmlkZW8uRm9yY2VVbkNvbXByZXNzZWRGb3JPUEIiKSkgewotICAgICAgICAqaW5kZXhUeXBlID0gKE9NWF9JTkRFWFRZUEUpT01YX1FUSUluZGV4UGFyYW1Gb3JjZVVuQ29tcHJlc3NlZEZvck9QQjsKLSAgICB9IGVsc2UgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5RVEkuaW5kZXgucGFyYW0udmlkZW8uTG93TGF0ZW5jeSIpKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfUVRJSW5kZXhQYXJhbUxvd0xhdGVuY3lNb2RlOwotICAgIH0gZWxzZSBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCBPTVhfUVRJX0lOREVYX1BBUkFNX1ZJREVPX0NMSUVOVF9FWFRSQURBVEEpKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfUVRJSW5kZXhQYXJhbVZpZGVvQ2xpZW50RXh0cmFkYXRhOwotICAgIH0gZWxzZSBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlQ29sb3JBc3BlY3RzIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RVElJbmRleENvbmZpZ0Rlc2NyaWJlQ29sb3JBc3BlY3RzOwotICAgIH0gZWxzZSBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlSERSU3RhdGljSW5mbyIpKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfUVRJSW5kZXhDb25maWdEZXNjcmliZUhEUkNvbG9ySW5mbzsKLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRXh0ZW5zaW9uOiAlcyBub3QgaW1wbGVtZW50ZWQiLCBwYXJhbU5hbWUpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci0gICAgfQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6OkdldFN0YXRlCi0KLSAgIERFU0NSSVBUSU9OCi0gICBSZXR1cm5zIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBiYWNrIHRvIHRoZSBjYWxsZXIuPFRCRD4KLQotICAgUEFSQU1FVEVSUwotICAgPFRCRD4uCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgRXJyb3IgTm9uZSBpZiBldmVyeXRoaW5nIGlzIHN1Y2Nlc3NmdWwuCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZkZWM6OmdldF9zdGF0ZShPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wLAotICAgICAgICBPTVhfT1VUIE9NWF9TVEFURVRZUEUqIHN0YXRlKQotewotICAgICh2b2lkKSBoQ29tcDsKLSAgICAqc3RhdGUgPSBtX3N0YXRlOwotICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3N0YXRlOiBSZXR1cm5pbmcgdGhlIHN0YXRlICVkIiwqc3RhdGUpOwotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6OkNvbXBvbmVudFR1bm5lbFJlcXVlc3QKLQotICAgREVTQ1JJUFRJT04KLSAgIE9NWCBDb21wb25lbnQgVHVubmVsIFJlcXVlc3QgbWV0aG9kIGltcGxlbWVudGF0aW9uLiA8VEJEPgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIE9NWCBFcnJvciBOb25lIGlmIGV2ZXJ5dGhpbmcgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZGVjOjpjb21wb25lbnRfdHVubmVsX3JlcXVlc3QoT01YX0lOIE9NWF9IQU5ETEVUWVBFICBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgIHBlZXJDb21wb25lbnQsCi0gICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgICBwZWVyUG9ydCwKLSAgICAgICAgT01YX0lOT1VUIE9NWF9UVU5ORUxTRVRVUFRZUEUqIHR1bm5lbFNldHVwKQotewotICAgICh2b2lkKSBoQ29tcDsKLSAgICAodm9pZCkgcG9ydDsKLSAgICAodm9pZCkgcGVlckNvbXBvbmVudDsKLSAgICAodm9pZCkgcGVlclBvcnQ7Ci0gICAgKHZvaWQpIHR1bm5lbFNldHVwOwotICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFcnJvcjogY29tcG9uZW50X3R1bm5lbF9yZXF1ZXN0IE5vdCBJbXBsZW1lbnRlZCIpOwotICAgIHJldHVybiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZGVjOjpVc2VPdXRwdXRCdWZmZXIKLQotICAgREVTQ1JJUFRJT04KLSAgIEhlbHBlciBmdW5jdGlvbiBmb3IgVXNlIGJ1ZmZlciBpbiB0aGUgaW5wdXQgcGluCi0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUuCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgdHJ1ZS9mYWxzZQotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSBvbXhfdmRlYzo6YWxsb2NhdGVfZXh0cmFkYXRhKCkKLXsKLSNpZmRlZiBVU0VfSU9OCi0gICAgaWYgKGRydl9jdHguZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemUpIHsKLSAgICAgICAgaWYgKGRydl9jdHguZXh0cmFkYXRhX2luZm8uaW9uLmlvbl9hbGxvY19kYXRhLmhhbmRsZSkgewotICAgICAgICAgICAgbXVubWFwKCh2b2lkICopZHJ2X2N0eC5leHRyYWRhdGFfaW5mby51YWRkciwgZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5zaXplKTsKLSAgICAgICAgICAgIGNsb3NlKGRydl9jdHguZXh0cmFkYXRhX2luZm8uaW9uLmZkX2lvbl9kYXRhLmZkKTsKLSAgICAgICAgICAgIGZyZWVfaW9uX21lbW9yeSgmZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5pb24pOwotICAgICAgICB9Ci0gICAgICAgIGRydl9jdHguZXh0cmFkYXRhX2luZm8uc2l6ZSA9IChkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLnNpemUgKyA0MDk1KSAmICh+NDA5NSk7Ci0gICAgICAgIGRydl9jdHguZXh0cmFkYXRhX2luZm8uaW9uLmlvbl9kZXZpY2VfZmQgPSBhbGxvY19tYXBfaW9uX21lbW9yeSgKLSAgICAgICAgICAgICAgICBkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLnNpemUsIDQwOTYsCi0gICAgICAgICAgICAgICAgJmRydl9jdHguZXh0cmFkYXRhX2luZm8uaW9uLmlvbl9hbGxvY19kYXRhLAotICAgICAgICAgICAgICAgICZkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLmlvbi5mZF9pb25fZGF0YSwgMCk7Ci0gICAgICAgIGlmIChkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLmlvbi5pb25fZGV2aWNlX2ZkIDwgMCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBhbGxvYyBleHRyYWRhdGEgbWVtb3J5Iik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0gICAgICAgIGRydl9jdHguZXh0cmFkYXRhX2luZm8udWFkZHIgPSAoY2hhciAqKW1tYXAoTlVMTCwKLSAgICAgICAgICAgICAgICBkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLnNpemUsCi0gICAgICAgICAgICAgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCi0gICAgICAgICAgICAgICAgZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5pb24uZmRfaW9uX2RhdGEuZmQgLCAwKTsKLSAgICAgICAgaWYgKGRydl9jdHguZXh0cmFkYXRhX2luZm8udWFkZHIgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBtYXAgZXh0cmFkYXRhIG1lbW9yeSIpOwotICAgICAgICAgICAgY2xvc2UoZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5pb24uZmRfaW9uX2RhdGEuZmQpOwotICAgICAgICAgICAgZnJlZV9pb25fbWVtb3J5KCZkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLmlvbik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0gICAgaWYgKCFtX290aGVyX2V4dHJhZGF0YSkgewotICAgICAgICBtX290aGVyX2V4dHJhZGF0YSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKW1hbGxvYyhkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLmJ1ZmZlcl9zaXplKTsKLSAgICAgICAgaWYgKCFtX290aGVyX2V4dHJhZGF0YSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBhbGxvYyBtZW1vcnlcbiIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLX0KLQotdm9pZCBvbXhfdmRlYzo6ZnJlZV9leHRyYWRhdGEoKQotewotI2lmZGVmIFVTRV9JT04KLSAgICBpZiAoZHJ2X2N0eC5leHRyYWRhdGFfaW5mby51YWRkcikgewotICAgICAgICBtdW5tYXAoKHZvaWQgKilkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLnVhZGRyLCBkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLnNpemUpOwotICAgICAgICBjbG9zZShkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLmlvbi5mZF9pb25fZGF0YS5mZCk7Ci0gICAgICAgIGZyZWVfaW9uX21lbW9yeSgmZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5pb24pOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChtX290aGVyX2V4dHJhZGF0YSkgewotICAgICAgICBmcmVlKG1fb3RoZXJfZXh0cmFkYXRhKTsKLSAgICAgICAgbV9vdGhlcl9leHRyYWRhdGEgPSBOVUxMOwotICAgIH0KLX0KLQotT01YX0VSUk9SVFlQRSAgb214X3ZkZWM6OnVzZV9vdXRwdXRfYnVmZmVyKAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogYnVmZmVySGRyLAotICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBieXRlcywKLSAgICAgICAgT01YX0lOIE9NWF9VOCogICAgICAgICAgICAgICAgICAgYnVmZmVyKQotewotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICAgICAgKmJ1Zkhkcj0gTlVMTDsgLy8gYnVmZmVyIGhlYWRlcgotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgIGk9IDA7IC8vIFRlbXBvcmFyeSBjb3VudGVyCi0gICAgT01YX1BUUiBwcml2YXRlQXBwRGF0YSA9IE5VTEw7Ci0gICAgcHJpdmF0ZV9oYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKLSAgICBPTVhfVTggKmJ1ZmYgPSBidWZmZXI7Ci0gICAgKHZvaWQpIGhDb21wOwotICAgICh2b2lkKSBwb3J0OwotCi0gICAgaWYgKCFtX291dF9tZW1fcHRyKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlVzZV9vcF9idWY6QWxsb2NhdGluZyBvdXRwdXQgaGVhZGVycyIpOwotICAgICAgICBlUmV0ID0gYWxsb2NhdGVfb3V0cHV0X2hlYWRlcnMoKTsKLSAgICAgICAgaWYgKGVSZXQgPT0gT01YX0Vycm9yTm9uZSkKLSAgICAgICAgICAgIGVSZXQgPSBhbGxvY2F0ZV9leHRyYWRhdGEoKTsKLSAgICB9Ci0KLSAgICBpZiAoZVJldCA9PSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIGZvciAoaT0wOyBpPCBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoQklUTUFTS19BQlNFTlQoJm1fb3V0X2JtX2NvdW50LGkpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaSA+PSBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiQWxyZWFkeSB1c2luZyAlZCBvL3AgYnVmZmVycyIsIGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50KTsKLSAgICAgICAgZVJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICB9Ci0KLSAgICBpZiAoZVJldCAhPSBPTVhfRXJyb3JOb25lKQotICAgICAgIHJldHVybiBlUmV0OwotCi0gICAgaWYgKGR5bmFtaWNfYnVmX21vZGUpIHsKLSAgICAgICAgKmJ1ZmZlckhkciA9IChtX291dF9tZW1fcHRyICsgaSApOwotICAgICAgICAoKmJ1ZmZlckhkciktPnBCdWZmZXIgPSBOVUxMOwotICAgICAgICBpZiAoaSA9PSAoZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQgLSAxKSAmJiAhc3RyZWFtaW5nW0NBUFRVUkVfUE9SVF0pIHsKLSAgICAgICAgICAgIGVudW0gdjRsMl9idWZfdHlwZSBidWZfdHlwZTsKLSAgICAgICAgICAgIGludCByciA9IDA7Ci0gICAgICAgICAgICBidWZfdHlwZT1WNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgICAgICAgICAgaWYgKHJyID0gaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TVFJFQU1PTiwgJmJ1Zl90eXBlKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTVFJFQU1PTiBGQUlMRUQgOiAlZCIsIHJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1pbmdbQ0FQVFVSRV9QT1JUXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTVFJFQU1PTiBTdWNjZXNzZnVsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQklUTUFTS19TRVQoJm1fb3V0X2JtX2NvdW50LGkpOwotICAgICAgICAoKmJ1ZmZlckhkciktPnBBcHBQcml2YXRlID0gYXBwRGF0YTsKLSAgICAgICAgKCpidWZmZXJIZHIpLT5wQnVmZmVyID0gYnVmZmVyOwotICAgICAgICAoKmJ1ZmZlckhkciktPm5BbGxvY0xlbiA9IHNpemVvZihzdHJ1Y3QgVmlkZW9EZWNvZGVyT3V0cHV0TWV0YURhdGEpOwotICAgICAgICByZXR1cm4gZVJldDsKLSAgICB9Ci0KLSAgICBpZiAoZVJldCA9PSBPTVhfRXJyb3JOb25lKSB7Ci0jaWYgZGVmaW5lZChfQU5EUk9JRF9IT05FWUNPTUJfKSB8fCBkZWZpbmVkKF9BTkRST0lEX0lDU18pCi0gICAgICAgIGlmIChtX2VuYWJsZV9hbmRyb2lkX25hdGl2ZV9idWZmZXJzKSB7Ci0gICAgICAgICAgICBpZiAobV91c2VfYW5kcm9pZF9uYXRpdmVfYnVmZmVycykgewotICAgICAgICAgICAgICAgIFVzZUFuZHJvaWROYXRpdmVCdWZmZXJQYXJhbXMgKnBhcmFtcyA9IChVc2VBbmRyb2lkTmF0aXZlQnVmZmVyUGFyYW1zICopYXBwRGF0YTsKLSAgICAgICAgICAgICAgICBzcDxhbmRyb2lkX25hdGl2ZV9idWZmZXJfdD4gbkJ1ZiA9IHBhcmFtcy0+bmF0aXZlQnVmZmVyOwotICAgICAgICAgICAgICAgIGhhbmRsZSA9IChwcml2YXRlX2hhbmRsZV90ICopbkJ1Zi0+aGFuZGxlOwotICAgICAgICAgICAgICAgIHByaXZhdGVBcHBEYXRhID0gcGFyYW1zLT5wQXBwUHJpdmF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlID0gKHByaXZhdGVfaGFuZGxlX3QgKilidWZmOwotICAgICAgICAgICAgICAgIHByaXZhdGVBcHBEYXRhID0gYXBwRGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImhhbmRsZSBpcyBpbnZhbGlkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChPTVhfVTMyKWhhbmRsZS0+c2l6ZSA8IGRydl9jdHgub3BfYnVmLmJ1ZmZlcl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlY3VyZV9tb2RlICYmIHNlY3VyZV9zY2FsaW5nX3RvX25vbl9zZWN1cmVfb3BiKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkJ1ZmZlciBzaXplIGV4cGVjdGVkICV1LCBnb3QgJXUsIGJ1dCBpdCdzIG9rIHNpbmNlIHdlIHdpbGwgbmV2ZXIgbWFwIGl0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUsICh1bnNpZ25lZCBpbnQpaGFuZGxlLT5zaXplKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSW5zdWZmaWNpZW50IHNpemVkIGJ1ZmZlciBnaXZlbiBmb3IgcGxheWJhY2ssIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXhwZWN0ZWQgJXUsIGdvdCAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSwgKHVuc2lnbmVkIGludCloYW5kbGUtPnNpemUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUgPSBoYW5kbGUtPnNpemU7Ci0KLSAgICAgICAgICAgIGlmICghbV91c2VfYW5kcm9pZF9uYXRpdmVfYnVmZmVycykgewotICAgICAgICAgICAgICAgIGlmICghc2VjdXJlX21vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZiA9ICAoT01YX1U4KiltbWFwKDAsIGhhbmRsZS0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgaGFuZGxlLT5mZCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWZmID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gbW1hcCBwbWVtIHdpdGggZmQgPSAlZCwgc2l6ZSA9ICVkIiwgaGFuZGxlLT5mZCwgaGFuZGxlLT5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jaWYgZGVmaW5lZChfQU5EUk9JRF9JQ1NfKQotICAgICAgICAgICAgbmF0aXZlX2J1ZmZlcltpXS5uYXRpdmVoYW5kbGUgPSBoYW5kbGU7Ci0gICAgICAgICAgICBuYXRpdmVfYnVmZmVyW2ldLnByaXZhdGVoYW5kbGUgPSBoYW5kbGU7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmICghaGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk5hdGl2ZSBCdWZmZXIgaGFuZGxlIGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLnBtZW1fZmQgPSBoYW5kbGUtPmZkOwotICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLm9mZnNldCA9IDA7Ci0gICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0uYnVmZmVyYWRkciA9IGJ1ZmY7Ci0gICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0uYnVmZmVyX2xlbiA9IGRydl9jdHgub3BfYnVmLmJ1ZmZlcl9zaXplOwotICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLm1tYXBlZF9zaXplID0gaGFuZGxlLT5zaXplOwotICAgICAgICB9IGVsc2UKLSNlbmRpZgotCi0gICAgICAgICAgICBpZiAoIW91cHV0X2VnbF9idWZmZXJzICYmICFtX3VzZV9vdXRwdXRfcG1lbSkgewotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zl9pb25faW5mb1tpXS5pb25fZGV2aWNlX2ZkID0gYWxsb2NfbWFwX2lvbl9tZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSxkcnZfY3R4Lm9wX2J1Zi5hbGlnbm1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmZHJ2X2N0eC5vcF9idWZfaW9uX2luZm9baV0uaW9uX2FsbG9jX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmZHJ2X2N0eC5vcF9idWZfaW9uX2luZm9baV0uZmRfaW9uX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmVfbW9kZSA/IFNFQ1VSRV9GTEFHU19PVVRQVVRfQlVGRkVSIDogMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRydl9jdHgub3BfYnVmX2lvbl9pbmZvW2ldLmlvbl9kZXZpY2VfZmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJT04gZGV2aWNlIGZkIGlzIGJhZCAlZCIsIGRydl9jdHgub3BfYnVmX2lvbl9pbmZvW2ldLmlvbl9kZXZpY2VfZmQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0ucG1lbV9mZCA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWZfaW9uX2luZm9baV0uZmRfaW9uX2RhdGEuZmQ7Ci0jZWxzZQotICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5wbWVtX2ZkID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuIChNRU1fREVWSUNFLE9fUkRXUik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLnBtZW1fZmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJT04vcG1lbSBidWZmZXIgZmQgaXMgYmFkICVkIiwgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLnBtZW1fZmQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIEZJWE1FOiB3aHkgaXMgdGhpcyBjb2RlIGV2ZW4gaGVyZT8gV2UgYWxyZWFkeSBvcGVuIE1FTV9ERVZJQ0UgYSBmZXcgbGluZXMgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICBpZiAoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLnBtZW1fZmQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0ucG1lbV9mZCA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gKE1FTV9ERVZJQ0UsT19SRFdSKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5wbWVtX2ZkIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIklPTi9wbWVtIGJ1ZmZlciBmZCBpcyBiYWQgJWQiLCBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0ucG1lbV9mZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFhbGlnbl9wbWVtX2J1ZmZlcnMoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLnBtZW1fZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYuYWxpZ25tZW50KSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiYWxpZ25fcG1lbV9idWZmZXJzKCkgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlKGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5wbWVtX2ZkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBpZiAoIXNlY3VyZV9tb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5idWZmZXJhZGRyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopbW1hcChOVUxMLCBkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5wbWVtX2ZkLDApOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLmJ1ZmZlcmFkZHIgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLnBtZW1fZmQpOwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfaW9uX21lbW9yeSgmZHJ2X2N0eC5vcF9idWZfaW9uX2luZm9baV0pOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiVW5hYmxlIHRvIG1tYXAgb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0ub2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICBwcml2YXRlQXBwRGF0YSA9IGFwcERhdGE7Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJVc2Vfb3BfYnVmOiBvdXRfcG1lbT0lZCIsbV91c2Vfb3V0cHV0X3BtZW0pOwotICAgICAgICAgICAgICAgIGlmICghYXBwRGF0YSB8fCAhYnl0ZXMgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2VjdXJlX21vZGUgJiYgIWJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkJhZCBwYXJhbWV0ZXJzIGZvciB1c2UgYnVmZmVyIGluIEVHTCBpbWFnZSBjYXNlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9MSVNUICpwbWVtX2xpc3Q7Ci0gICAgICAgICAgICAgICAgT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9QTUVNX0lORk8gKnBtZW1faW5mbzsKLSAgICAgICAgICAgICAgICBwbWVtX2xpc3QgPSAoT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9MSVNUKikgYXBwRGF0YTsKLSAgICAgICAgICAgICAgICBpZiAoIXBtZW1fbGlzdCB8fCAhcG1lbV9saXN0LT5lbnRyeUxpc3QgfHwgIXBtZW1fbGlzdC0+ZW50cnlMaXN0LT5lbnRyeSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIXBtZW1fbGlzdC0+bkVudHJpZXMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBtZW1fbGlzdC0+ZW50cnlMaXN0LT50eXBlICE9IE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfUE1FTSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiUG1lbSBpbmZvIG5vdCB2YWxpZCBpbiB1c2UgYnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBtZW1faW5mbyA9IChPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU1fSU5GTyAqKQotICAgICAgICAgICAgICAgICAgICBwbWVtX2xpc3QtPmVudHJ5TGlzdC0+ZW50cnk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ2ZGVjOiB1c2UgYnVmOiBwbWVtX2ZkPTB4JWx4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBtZW1faW5mby0+cG1lbV9mZCk7Ci0gICAgICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLnBtZW1fZmQgPSBwbWVtX2luZm8tPnBtZW1fZmQ7Ci0gICAgICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLm9mZnNldCA9IHBtZW1faW5mby0+b2Zmc2V0OwotICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5idWZmZXJhZGRyID0gYnVmZjsKLSAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0ubW1hcGVkX3NpemUgPQotICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0uYnVmZmVyX2xlbiA9IGRydl9jdHgub3BfYnVmLmJ1ZmZlcl9zaXplOwotICAgICAgICAgICAgICAgIHByaXZhdGVBcHBEYXRhID0gYXBwRGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgbV9wbWVtX2luZm9baV0ub2Zmc2V0ID0gZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLm9mZnNldDsKLSAgICAgICAgbV9wbWVtX2luZm9baV0ucG1lbV9mZCA9IGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5wbWVtX2ZkOwotICAgICAgICBtX3BtZW1faW5mb1tpXS5zaXplID0gZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLmJ1ZmZlcl9sZW47Ci0gICAgICAgIG1fcG1lbV9pbmZvW2ldLm1hcHBlZF9zaXplID0gZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLm1tYXBlZF9zaXplOwotICAgICAgICBtX3BtZW1faW5mb1tpXS5idWZmZXIgPSBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0uYnVmZmVyYWRkcjsKLQotICAgICAgICAqYnVmZmVySGRyID0gKG1fb3V0X21lbV9wdHIgKyBpICk7Ci0gICAgICAgIGlmIChzZWN1cmVfbW9kZSkKLSAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5idWZmZXJhZGRyID0gKmJ1ZmZlckhkcjsKLQotICAgICAgICBpZiAoaSA9PSAoZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQgLTEpICYmICFzdHJlYW1pbmdbQ0FQVFVSRV9QT1JUXSkgewotICAgICAgICAgICAgZW51bSB2NGwyX2J1Zl90eXBlIGJ1Zl90eXBlOwotICAgICAgICAgICAgYnVmX3R5cGU9VjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICAgICAgICAgIGlmIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NUUkVBTU9OLCZidWZfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1pbmdbQ0FQVFVSRV9QT1JUXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTVFJFQU1PTiBTdWNjZXNzZnVsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAoKmJ1ZmZlckhkciktPm5BbGxvY0xlbiA9IGRydl9jdHgub3BfYnVmLmJ1ZmZlcl9zaXplOwotICAgICAgICBpZiAobV9lbmFibGVfYW5kcm9pZF9uYXRpdmVfYnVmZmVycykgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXR0aW5nIHBCdWZmZXIgdG8gcHJpdmF0ZV9oYW5kbGVfdCAlcCIsIGhhbmRsZSk7Ci0gICAgICAgICAgICAoKmJ1ZmZlckhkciktPnBCdWZmZXIgPSAoT01YX1U4ICopaGFuZGxlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKCpidWZmZXJIZHIpLT5wQnVmZmVyID0gYnVmZjsKLSAgICAgICAgfQotICAgICAgICAoKmJ1ZmZlckhkciktPnBBcHBQcml2YXRlID0gcHJpdmF0ZUFwcERhdGE7Ci0gICAgICAgIEJJVE1BU0tfU0VUKCZtX291dF9ibV9jb3VudCxpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgb214X3ZkZWM6OmFsbG9jYXRlX2NsaWVudF9vdXRwdXRfZXh0cmFkYXRhX2hlYWRlcnMoKSB7Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmSGRyID0gTlVMTDsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBpZiAoIW1fY2xpZW50X291dHB1dF9leHRyYWRhdGFfbWVtX3B0cikgewotICAgICAgICBpbnQgbkJ1ZmZlckNvdW50ICAgICAgID0gMDsKLQotICAgICAgICBuQnVmZmVyQ291bnQgPSBtX2NsaWVudF9vdXRfZXh0cmFkYXRhX2luZm8uZ2V0QnVmZmVyQ291bnQoKTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiYWxsb2NhdGVfY2xpZW50X291dHB1dF9leHRyYWRhdGFfaGVhZGVycyBidWZmZXJfY291bnQgLSAlZCIsIG5CdWZmZXJDb3VudCk7Ci0KLSAgICAgICAgbV9jbGllbnRfb3V0cHV0X2V4dHJhZGF0YV9tZW1fcHRyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICAqKWNhbGxvYyhuQnVmZmVyQ291bnQsIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOwotCi0gICAgICAgIGlmIChtX2NsaWVudF9vdXRwdXRfZXh0cmFkYXRhX21lbV9wdHIpIHsKLSAgICAgICAgICAgIGJ1ZkhkciAgICAgICAgICA9ICBtX2NsaWVudF9vdXRwdXRfZXh0cmFkYXRhX21lbV9wdHI7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG5CdWZmZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVmSGRyLT5uU2l6ZSAgICAgICAgICAgICAgPSBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+blZlcnNpb24ublZlcnNpb24gID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHZhbHVlcyB3aGVuIHdlIGRldGVybWluZSB0aGUgcmlnaHQgSHhXIHBhcmFtCi0gICAgICAgICAgICAgICAgYnVmSGRyLT5uQWxsb2NMZW4gICAgICAgICAgPSAwOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+bkZpbGxlZExlbiAgICAgICAgID0gMDsKLSAgICAgICAgICAgICAgICBidWZIZHItPnBBcHBQcml2YXRlICAgICAgICA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYnVmSGRyLT5uT3V0cHV0UG9ydEluZGV4ICAgPSBPTVhfQ09SRV9PVVRQVVRfRVhUUkFEQVRBX0lOREVYOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+cEJ1ZmZlciAgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgICAgICAgICBidWZIZHItPnBPdXRwdXRQb3J0UHJpdmF0ZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYnVmSGRyKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkV4dHJhZGF0YSBoZWFkZXIgYnVmIG1lbSBhbGxvYyBmYWlsZWRbMHglcF0iLFwKLSAgICAgICAgICAgICAgICAgICAgbV9jbGllbnRfb3V0cHV0X2V4dHJhZGF0YV9tZW1fcHRyKTsKLSAgICAgICAgICAgICAgZVJldCA9ICBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVSZXQ7Ci19Ci1PTVhfRVJST1JUWVBFICBvbXhfdmRlYzo6dXNlX2NsaWVudF9vdXRwdXRfZXh0cmFkYXRhX2J1ZmZlcigKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIGJ1ZmZlckhkciwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgYnl0ZXMsCi0gICAgICAgIE9NWF9JTiBPTVhfVTgqICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIHVuc2lnbmVkIGkgPSAwOyAvLyBUZW1wb3JhcnkgY291bnRlcgotICAgIHVuc2lnbmVkIGJ1ZmZlcl9jb3VudCA9IG1fY2xpZW50X291dF9leHRyYWRhdGFfaW5mby5nZXRCdWZmZXJDb3VudCgpOzsKLSAgICBPTVhfVTMyIGJ1ZmZlcl9zaXplID0gbV9jbGllbnRfb3V0X2V4dHJhZGF0YV9pbmZvLmdldFNpemUoKTsKLSAgICAodm9pZCkgaENvbXA7Ci0KLSAgICBpZiAocG9ydCAhPSBPTVhfQ09SRV9PVVRQVVRfRVhUUkFEQVRBX0lOREVYIHx8Ci0gICAgICAgICAgICAhY2xpZW50X2V4dHJhZGF0YSB8fCBieXRlcyAhPSBidWZmZXJfc2l6ZXx8IGJ1ZmZlckhkciA9PSBOVUxMKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJCYWQgUGFyYW1ldGVycyBQb3J0SW5kZXggaXMgLSAlZCBleHBlY3RlZCBpcy0gJWQsIgotICAgICAgICAgICAgImNsaWVudF9leHRyYWRhdGEgLSAlZCwgYnl0ZXMgPSAlZCBleHBlY3RlZCBpcyAlZCBidWZmZXJIZHIgLSAlcCIsIHBvcnQsCi0gICAgICAgICAgICBPTVhfQ09SRV9PVVRQVVRfRVhUUkFEQVRBX0lOREVYLCBjbGllbnRfZXh0cmFkYXRhLCBieXRlcywgYnVmZmVyX3NpemUsIGJ1ZmZlckhkcik7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIHJldHVybiBlUmV0OwotICAgIH0KLQotICAgIGlmICghbV9jbGllbnRfb3V0cHV0X2V4dHJhZGF0YV9tZW1fcHRyKSB7Ci0gICAgICAgIGVSZXQgPSBhbGxvY2F0ZV9jbGllbnRfb3V0cHV0X2V4dHJhZGF0YV9oZWFkZXJzKCk7Ci0gICAgfQotCi0gICAgaWYgKGVSZXQgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2NvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChCSVRNQVNLX0FCU0VOVCgmbV9vdXRfZXh0cmFkYXRhX2JtX2NvdW50LGkpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaSA+PSBidWZmZXJfY291bnQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkFscmVhZHkgdXNpbmcgJWQgRXh0cmFkYXRhIG8vcCBidWZmZXJzIiwgYnVmZmVyX2NvdW50KTsKLSAgICAgICAgZVJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICB9Ci0KLSAgICBpZiAoZVJldCA9PSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIEJJVE1BU0tfU0VUKCZtX291dF9leHRyYWRhdGFfYm1fY291bnQsaSk7Ci0gICAgICAgICpidWZmZXJIZHIgPSAobV9jbGllbnRfb3V0cHV0X2V4dHJhZGF0YV9tZW1fcHRyICsgaSApOwotICAgICAgICAoKmJ1ZmZlckhkciktPnBBcHBQcml2YXRlID0gYXBwRGF0YTsKLSAgICAgICAgKCpidWZmZXJIZHIpLT5wQnVmZmVyID0gYnVmZmVyOwotICAgICAgICAoKmJ1ZmZlckhkciktPm5BbGxvY0xlbiA9IGJ5dGVzOwotICAgIH0KLQotICAgIHJldHVybiBlUmV0OwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZGVjOjp1c2VfaW5wdXRfaGVhcF9idWZmZXJzCi0KLSAgIERFU0NSSVBUSU9OCi0gICBPTVggVXNlIEJ1ZmZlciBIZWFwIGFsbG9jYXRpb24gbWV0aG9kIGltcGxlbWVudGF0aW9uLgotCi0gICBQQVJBTUVURVJTCi0gICA8VEJEPi4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBPTVggRXJyb3IgTm9uZSAsIGlmIGV2ZXJ5dGhpbmcgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZGVjOjp1c2VfaW5wdXRfaGVhcF9idWZmZXJzKAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogYnVmZmVySGRyLAotICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBieXRlcywKLSAgICAgICAgT01YX0lOIE9NWF9VOCogICAgICAgICAgICAgICAgICAgYnVmZmVyKQotewotICAgIERFQlVHX1BSSU5UX0xPVygiSW5zaWRlICVzLCAlcCIsIF9fRlVOQ1RJT05fXywgYnVmZmVyKTsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotCi0gICAgaWYgKHNlY3VyZV9tb2RlKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJ1c2VfaW5wdXRfaGVhcF9idWZmZXJzIGlzIG5vdCBhbGxvd2VkIGluIHNlY3VyZSBtb2RlIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgfQotCi0gICAgaWYgKCFtX2lucF9oZWFwX3B0cikKLSAgICAgICAgbV9pbnBfaGVhcF9wdHIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUqKQotICAgICAgICAgICAgY2FsbG9jKCAoc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSksCi0gICAgICAgICAgICAgICAgICAgIGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50KTsKLSAgICBpZiAoIW1fcGhkcl9wbWVtX3B0cikKLSAgICAgICAgbV9waGRyX3BtZW1fcHRyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFKiopCi0gICAgICAgICAgICBjYWxsb2MoIChzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUqKSksCi0gICAgICAgICAgICAgICAgICAgIGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50KTsKLSAgICBpZiAoIW1faW5wX2hlYXBfcHRyIHx8ICFtX3BoZHJfcG1lbV9wdHIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkluc3VmZmljZW50IG1lbW9yeSIpOwotICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgIH0gZWxzZSBpZiAobV9pbl9hbGxvY19jbnQgPCBkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudCkgewotICAgICAgICBpbnB1dF91c2VfYnVmZmVyID0gdHJ1ZTsKLSAgICAgICAgbWVtc2V0KCZtX2lucF9oZWFwX3B0clttX2luX2FsbG9jX2NudF0sIDAsIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOwotICAgICAgICBtX2lucF9oZWFwX3B0clttX2luX2FsbG9jX2NudF0ucEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgbV9pbnBfaGVhcF9wdHJbbV9pbl9hbGxvY19jbnRdLm5BbGxvY0xlbiA9IGJ5dGVzOwotICAgICAgICBtX2lucF9oZWFwX3B0clttX2luX2FsbG9jX2NudF0ucEFwcFByaXZhdGUgPSBhcHBEYXRhOwotICAgICAgICBtX2lucF9oZWFwX3B0clttX2luX2FsbG9jX2NudF0ubklucHV0UG9ydEluZGV4ID0gKE9NWF9VMzIpIE9NWF9EaXJJbnB1dDsKLSAgICAgICAgbV9pbnBfaGVhcF9wdHJbbV9pbl9hbGxvY19jbnRdLm5PdXRwdXRQb3J0SW5kZXggPSAoT01YX1UzMikgT01YX0Rpck1heDsKLSAgICAgICAgKmJ1ZmZlckhkciA9ICZtX2lucF9oZWFwX3B0clttX2luX2FsbG9jX2NudF07Ci0gICAgICAgIGVSZXQgPSBhbGxvY2F0ZV9pbnB1dF9idWZmZXIoaENvbXAsICZtX3BoZHJfcG1lbV9wdHJbbV9pbl9hbGxvY19jbnRdLCBwb3J0LCBhcHBEYXRhLCBieXRlcyk7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkhlYXAgYnVmZmVyKCVwKSBQbWVtIGJ1ZmZlciglcCkiLCAqYnVmZmVySGRyLCBtX3BoZHJfcG1lbV9wdHJbbV9pbl9hbGxvY19jbnRdKTsKLSAgICAgICAgaWYgKCFtX2lucHV0X2ZyZWVfcS5pbnNlcnRfZW50cnkoKHVuc2lnbmVkIGxvbmcpbV9waGRyX3BtZW1fcHRyW21faW5fYWxsb2NfY250XSwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKU5VTEwsICh1bnNpZ25lZClOVUxMKSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOkZyZWVfcSBpcyBmdWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0gICAgICAgIG1faW5fYWxsb2NfY250Kys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkFsbCBpL3AgYnVmZmVycyBoYXZlIGJlZW4gc2V0ISIpOwotICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgIH0KLSAgICByZXR1cm4gZVJldDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZGVjOjpVc2VCdWZmZXIKLQotICAgREVTQ1JJUFRJT04KLSAgIE9NWCBVc2UgQnVmZmVyIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KLQotICAgUEFSQU1FVEVSUwotICAgPFRCRD4uCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgT01YIEVycm9yIE5vbmUgLCBpZiBldmVyeXRoaW5nIHN1Y2Nlc3NmdWwuCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmRlYzo6dXNlX2J1ZmZlcigKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIGJ1ZmZlckhkciwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgYnl0ZXMsCi0gICAgICAgIE9NWF9JTiBPTVhfVTgqICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVycm9yID0gT01YX0Vycm9yTm9uZTsKLQotICAgIGlmIChidWZmZXJIZHIgPT0gTlVMTCB8fCBieXRlcyA9PSAwIHx8ICghc2VjdXJlX21vZGUgJiYgYnVmZmVyID09IE5VTEwpKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiYmFkIHBhcmFtIDB4JXAgJXUgMHglcCIsYnVmZmVySGRyLCAodW5zaWduZWQgaW50KWJ5dGVzLCBidWZmZXIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiVXNlIEJ1ZmZlciBpbiBJbnZhbGlkIFN0YXRlIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotICAgIGlmIChwb3J0ID09IE9NWF9DT1JFX0lOUFVUX1BPUlRfSU5ERVgpIHsKLSAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGFsbG9jYXRpb24gKGkuZSBtX2lucF9tZW1fcHRyIGlzIGFsbG9jYXRlZCksCi0gICAgICAgIC8vIGVuc3VyZSB0aGF0IHVzZS1idWZmZXIgd2FzIGNhbGxlZCBmb3IgcHJldmlvdXMgYWxsb2NhdGlvbi4KLSAgICAgICAgLy8gTWl4LWFuZC1tYXRjaCBvZiB1c2VCdWZmZXIgYW5kIGFsbG9jYXRlQnVmZmVyIGlzIG5vdCBhbGxvd2VkCi0gICAgICAgIGlmIChtX2lucF9tZW1fcHRyICYmICFpbnB1dF91c2VfYnVmZmVyKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJ1VzZScgSW5wdXQgYnVmZmVyIGNhbGxlZCBhZnRlciAnQWxsb2NhdGUnIElucHV0IGJ1ZmZlciAhIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICB9Ci0gICAgICAgIGVycm9yID0gdXNlX2lucHV0X2hlYXBfYnVmZmVycyhoQ29tcCwgYnVmZmVySGRyLCBwb3J0LCBhcHBEYXRhLCBieXRlcywgYnVmZmVyKTsKLSAgICB9IGVsc2UgaWYgKHBvcnQgPT0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgpIHsKLSAgICAgICAgZXJyb3IgPSB1c2Vfb3V0cHV0X2J1ZmZlcihoQ29tcCxidWZmZXJIZHIscG9ydCxhcHBEYXRhLGJ5dGVzLGJ1ZmZlcik7IC8vbm90IHRlc3RlZAotICAgIH0gZWxzZSBpZiAocG9ydCA9PSBPTVhfQ09SRV9PVVRQVVRfRVhUUkFEQVRBX0lOREVYKSB7Ci0gICAgICAgIGVycm9yID0gdXNlX2NsaWVudF9vdXRwdXRfZXh0cmFkYXRhX2J1ZmZlcihoQ29tcCxidWZmZXJIZHIscG9ydCxhcHBEYXRhLGJ5dGVzLGJ1ZmZlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVycm9yOiBJbnZhbGlkIFBvcnQgSW5kZXggcmVjZWl2ZWQgJWQiLChpbnQpcG9ydCk7Ci0gICAgICAgIGVycm9yID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgIH0KLSAgICBERUJVR19QUklOVF9MT1coIlVzZSBCdWZmZXI6IHBvcnQgJXUsIGJ1ZmZlciAlcCwgZVJldCAlZCIsICh1bnNpZ25lZCBpbnQpcG9ydCwgKmJ1ZmZlckhkciwgZXJyb3IpOwotICAgIGlmIChlcnJvciA9PSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIGlmIChhbGxvY2F0ZV9kb25lKCkgJiYgQklUTUFTS19QUkVTRU5UKCZtX2ZsYWdzLE9NWF9DT01QT05FTlRfSURMRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgLy8gU2VuZCB0aGUgY2FsbGJhY2sgbm93Ci0gICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCgmbV9mbGFncyksT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpOwotICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfQ29tbWFuZFN0YXRlU2V0LE9NWF9TdGF0ZUlkbGUsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3J0ID09IE9NWF9DT1JFX0lOUFVUX1BPUlRfSU5ERVggJiYgbV9pbnBfYlBvcHVsYXRlZCAmJgotICAgICAgICAgICAgICAgIEJJVE1BU0tfUFJFU0VOVCgmbV9mbGFncyxPTVhfQ09NUE9ORU5UX0lOUFVUX0VOQUJMRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgQklUTUFTS19DTEVBUigoJm1fZmxhZ3MpLE9NWF9DT01QT05FTlRfSU5QVVRfRU5BQkxFX1BFTkRJTkcpOwotICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfQ29tbWFuZFBvcnRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9DT1JFX0lOUFVUX1BPUlRfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICB9IGVsc2UgaWYgKHBvcnQgPT0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVggJiYgbV9vdXRfYlBvcHVsYXRlZCAmJgotICAgICAgICAgICAgICAgIEJJVE1BU0tfUFJFU0VOVCgmbV9mbGFncyxPTVhfQ09NUE9ORU5UX09VVFBVVF9FTkFCTEVfUEVORElORykpIHsKLSAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoKCZtX2ZsYWdzKSxPTVhfQ09NUE9ORU5UX09VVFBVVF9FTkFCTEVfUEVORElORyk7Ci0gICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9Db21tYW5kUG9ydEVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnJvcjsKLX0KLQotT01YX0VSUk9SVFlQRSBvbXhfdmRlYzo6ZnJlZV9pbnB1dF9idWZmZXIodW5zaWduZWQgaW50IGJ1ZmZlcmluZGV4LAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcG1lbV9idWZmZXJIZHIpCi17Ci0gICAgaWYgKG1faW5wX2hlYXBfcHRyICYmICFpbnB1dF91c2VfYnVmZmVyICYmIGFyYml0cmFyeV9ieXRlcykgewotICAgICAgICBpZiAobV9pbnBfaGVhcF9wdHJbYnVmZmVyaW5kZXhdLnBCdWZmZXIpCi0gICAgICAgICAgICBmcmVlKG1faW5wX2hlYXBfcHRyW2J1ZmZlcmluZGV4XS5wQnVmZmVyKTsKLSAgICAgICAgbV9pbnBfaGVhcF9wdHJbYnVmZmVyaW5kZXhdLnBCdWZmZXIgPSBOVUxMOwotICAgIH0KLSAgICBpZiAocG1lbV9idWZmZXJIZHIpCi0gICAgICAgIGZyZWVfaW5wdXRfYnVmZmVyKHBtZW1fYnVmZmVySGRyKTsKLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLX0KLQotT01YX0VSUk9SVFlQRSBvbXhfdmRlYzo6ZnJlZV9pbnB1dF9idWZmZXIoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlckhkcikKLXsKLSAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSAwOwotICAgIGlmIChidWZmZXJIZHIgPT0gTlVMTCB8fCBtX2lucF9tZW1fcHRyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBpbmRleCA9IGJ1ZmZlckhkciAtIG1faW5wX21lbV9wdHI7Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlIElucHV0IEJ1ZmZlciBpbmRleCA9ICVkIixpbmRleCk7Ci0KLSAgICBhdXRvX2xvY2sgbChidWZfbG9jayk7Ci0gICAgYnVmZmVySGRyLT5wSW5wdXRQb3J0UHJpdmF0ZSA9IE5VTEw7Ci0KLSAgICBpZiAoaW5kZXggPCBkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudCAmJiBkcnZfY3R4LnB0cl9pbnB1dGJ1ZmZlcikgewotICAgICAgICBERUJVR19QUklOVF9MT1coIkZyZWUgSW5wdXQgQnVmZmVyIGluZGV4ID0gJWQiLGluZGV4KTsKLSAgICAgICAgaWYgKGRydl9jdHgucHRyX2lucHV0YnVmZmVyW2luZGV4XS5wbWVtX2ZkID49IDApIHsKLSAgICAgICAgICAgIGlmICghc2VjdXJlX21vZGUpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInVubWFwIHRoZSBpbnB1dCBidWZmZXIgZmQ9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5wdHJfaW5wdXRidWZmZXJbaW5kZXhdLnBtZW1fZmQpOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidW5tYXAgdGhlIGlucHV0IGJ1ZmZlciBzaXplPSV1ICBhZGRyZXNzID0gJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClkcnZfY3R4LnB0cl9pbnB1dGJ1ZmZlcltpbmRleF0ubW1hcGVkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9pbnB1dGJ1ZmZlcltpbmRleF0uYnVmZmVyYWRkcik7Ci0gICAgICAgICAgICAgICAgbXVubWFwIChkcnZfY3R4LnB0cl9pbnB1dGJ1ZmZlcltpbmRleF0uYnVmZmVyYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX2lucHV0YnVmZmVyW2luZGV4XS5tbWFwZWRfc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhbGxvY2F0ZV9uYXRpdmVfaGFuZGxlKXsKLSAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKm5oID0gKG5hdGl2ZV9oYW5kbGVfdCAqKWJ1ZmZlckhkci0+cEJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG5oKTsKLSAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIENsb3NlIGZkIGZvciBub24tc2VjdXJlIGFuZCBzZWN1cmUgbm9uLW5hdGl2ZS1oYW5kbGUgY2FzZQotICAgICAgICAgICAgICAgIGNsb3NlKGRydl9jdHgucHRyX2lucHV0YnVmZmVyW2luZGV4XS5wbWVtX2ZkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRydl9jdHgucHRyX2lucHV0YnVmZmVyW2luZGV4XS5wbWVtX2ZkID0gLTE7Ci0KLSAgICAgICAgICAgIGlmIChtX2Rlc2NfYnVmZmVyX3B0ciAmJiBtX2Rlc2NfYnVmZmVyX3B0cltpbmRleF0uYnVmX2FkZHIpIHsKLSAgICAgICAgICAgICAgICBmcmVlKG1fZGVzY19idWZmZXJfcHRyW2luZGV4XS5idWZfYWRkcik7Ci0gICAgICAgICAgICAgICAgbV9kZXNjX2J1ZmZlcl9wdHJbaW5kZXhdLmJ1Zl9hZGRyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBtX2Rlc2NfYnVmZmVyX3B0cltpbmRleF0uZGVzY19kYXRhX3NpemUgPSAwOwotICAgICAgICAgICAgfQotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgIGZyZWVfaW9uX21lbW9yeSgmZHJ2X2N0eC5pcF9idWZfaW9uX2luZm9baW5kZXhdKTsKLSNlbmRpZgotICAgICAgICAgICAgbV9pbl9hbGxvY19jbnQtLTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92ZGVjOjpmcmVlX291dHB1dF9idWZmZXIoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlckhkcikKLXsKLSAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSAwOwotCi0gICAgaWYgKGJ1ZmZlckhkciA9PSBOVUxMIHx8IG1fb3V0X21lbV9wdHIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGluZGV4ID0gYnVmZmVySGRyIC0gbV9vdXRfbWVtX3B0cjsKLSAgICBERUJVR19QUklOVF9MT1coIkZyZWUgb3VwdXQgQnVmZmVyIGluZGV4ID0gJWQiLGluZGV4KTsKLQotICAgIGlmIChpbmRleCA8IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50Ci0gICAgICAgICAgICAmJiBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlIG91cHV0IEJ1ZmZlciBpbmRleCA9ICVkIGFkZHIgPSAlcCIsIGluZGV4LAotICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpbmRleF0uYnVmZmVyYWRkcik7Ci0KLSAgICAgICAgaWYgKCFkeW5hbWljX2J1Zl9tb2RlKSB7Ci0gICAgICAgICAgICBpZiAoc3RyZWFtaW5nW0NBUFRVUkVfUE9SVF0gJiYKLSAgICAgICAgICAgICAgICAhKGluX3JlY29uZmlnIHx8IEJJVE1BU0tfUFJFU0VOVCgmbV9mbGFncyxPTVhfQ09NUE9ORU5UX09VVFBVVF9GTFVTSF9QRU5ESU5HKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtX29mZihPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNUUkVBTU9GRiBGYWlsZWQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlNUUkVBTU9GRiBTdWNjZXNzZnVsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotI2lmZGVmIF9BTkRST0lEXwotICAgICAgICAgICAgaWYgKG1fZW5hYmxlX2FuZHJvaWRfbmF0aXZlX2J1ZmZlcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXNlY3VyZV9tb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaW5kZXhdLnBtZW1fZmQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtdW5tYXAoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2luZGV4XS5idWZmZXJhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaW5kZXhdLm1tYXBlZF9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaW5kZXhdLnBtZW1fZmQgPSAtMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBpZiAoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyWzBdLnBtZW1fZmQgPiAwICYmICFvdXB1dF9lZ2xfYnVmZmVycyAmJiAhbV91c2Vfb3V0cHV0X3BtZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWN1cmVfbW9kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ1bm1hcCB0aGUgb3V0cHV0IGJ1ZmZlciBmZCA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyWzBdLnBtZW1fZmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ1bm1hcCB0aGUgb3VwdXQgYnVmZmVyIHNpemU9JXUgIGFkZHJlc3MgPSAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyWzBdLm1tYXBlZF9zaXplICogZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlclswXS5idWZmZXJhZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG11bm1hcCAoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyWzBdLmJ1ZmZlcmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlclswXS5tbWFwZWRfc2l6ZSAqIGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjbG9zZSAoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyWzBdLnBtZW1fZmQpOwotICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbMF0ucG1lbV9mZCA9IC0xOwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgICAgICAgICAgZnJlZV9pb25fbWVtb3J5KCZkcnZfY3R4Lm9wX2J1Zl9pb25faW5mb1swXSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgX0FORFJPSURfCi0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfSAvLyFkeW5hbWljX2J1Zl9tb2RlCi0gICAgICAgIGlmIChyZWxlYXNlX291dHB1dF9kb25lKCkpIHsKLSAgICAgICAgICAgIGZyZWVfZXh0cmFkYXRhKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLQotfQotCi1PTVhfRVJST1JUWVBFIG9teF92ZGVjOjphbGxvY2F0ZV9pbnB1dF9oZWFwX2J1ZmZlcihPTVhfSEFORExFVFlQRSAgICAgICBoQ29tcCwKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZHIsCi0gICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgIE9NWF9QVFIgICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgIGJ5dGVzKQotewotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbnB1dCA9IE5VTEw7Ci0gICAgdW5zaWduZWQgY2hhciAqYnVmX2FkZHIgPSBOVUxMOwotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgdW5zaWduZWQgICBpID0gMDsKLQotICAgIC8qIFNhbml0eSBDaGVjayovCi0gICAgaWYgKGJ1ZmZlckhkciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgaWYgKG1faW5wX2hlYXBfcHRyID09IE5VTEwpIHsKLSAgICAgICAgbV9pbnBfaGVhcF9wdHIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUqKSBcCi0gICAgICAgICAgICAgICAgIGNhbGxvYyggKHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50KTsKLSAgICAgICAgbV9waGRyX3BtZW1fcHRyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFKiopIFwKLSAgICAgICAgICAgICAgICAgIGNhbGxvYyggKHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSopKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQpOwotCi0gICAgICAgIGlmIChtX2lucF9oZWFwX3B0ciA9PSBOVUxMIHx8IG1fcGhkcl9wbWVtX3B0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigibV9pbnBfaGVhcF9wdHIgb3IgbV9waGRyX3BtZW1fcHRyIEFsbG9jYXRpb24gZmFpbGVkICIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qRmluZCBhIEZyZWUgaW5kZXgqLwotICAgIGZvciAoaT0wOyBpPCBkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChCSVRNQVNLX0FCU0VOVCgmbV9oZWFwX2lucF9ibV9jb3VudCxpKSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlIElucHV0IEJ1ZmZlciBJbmRleCAlZCIsaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpIDwgZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQpIHsKLSAgICAgICAgYnVmX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyAoZHJ2X2N0eC5pcF9idWYuYnVmZmVyX3NpemUpOwotCi0gICAgICAgIGlmIChidWZfYWRkciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgKmJ1ZmZlckhkciA9IChtX2lucF9oZWFwX3B0ciArIGkpOwotICAgICAgICBpbnB1dCA9ICpidWZmZXJIZHI7Ci0gICAgICAgIEJJVE1BU0tfU0VUKCZtX2hlYXBfaW5wX2JtX2NvdW50LGkpOwotCi0gICAgICAgIGlucHV0LT5wQnVmZmVyICAgICAgICAgICA9IChPTVhfVTggKilidWZfYWRkcjsKLSAgICAgICAgaW5wdXQtPm5TaXplICAgICAgICAgICAgID0gc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKTsKLSAgICAgICAgaW5wdXQtPm5WZXJzaW9uLm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICAgICAgaW5wdXQtPm5BbGxvY0xlbiAgICAgICAgID0gZHJ2X2N0eC5pcF9idWYuYnVmZmVyX3NpemU7Ci0gICAgICAgIGlucHV0LT5wQXBwUHJpdmF0ZSAgICAgICA9IGFwcERhdGE7Ci0gICAgICAgIGlucHV0LT5uSW5wdXRQb3J0SW5kZXggICA9IE9NWF9DT1JFX0lOUFVUX1BPUlRfSU5ERVg7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiQWRkcmVzcyBvZiBIZWFwIEJ1ZmZlciAlcCIsKmJ1ZmZlckhkciApOwotICAgICAgICBlUmV0ID0gYWxsb2NhdGVfaW5wdXRfYnVmZmVyKGhDb21wLCZtX3BoZHJfcG1lbV9wdHIgW2ldLHBvcnQsYXBwRGF0YSxieXRlcyk7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiQWRkcmVzcyBvZiBQbWVtIEJ1ZmZlciAlcCIsbV9waGRyX3BtZW1fcHRyW2ldKTsKLSAgICAgICAgLypBZGQgdGhlIEJ1ZmZlcnMgdG8gZnJlZXEqLwotICAgICAgICBpZiAoIW1faW5wdXRfZnJlZV9xLmluc2VydF9lbnRyeSgodW5zaWduZWQgbG9uZyltX3BoZHJfcG1lbV9wdHJbaV0sCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClOVUxMLCAodW5zaWduZWQpTlVMTCkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjpGcmVlX3EgaXMgZnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVSZXQ7Ci0KLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6OkFsbG9jYXRlSW5wdXRCdWZmZXIKLQotICAgREVTQ1JJUFRJT04KLSAgIEhlbHBlciBmdW5jdGlvbiBmb3IgYWxsb2NhdGUgYnVmZmVyIGluIHRoZSBpbnB1dCBwaW4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmRlYzo6YWxsb2NhdGVfaW5wdXRfYnVmZmVyKAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogYnVmZmVySGRyLAotICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBieXRlcykKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbnB1dCA9IE5VTEw7Ci0gICAgdW5zaWduZWQgICBpID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZfYWRkciA9IE5VTEw7Ci0gICAgaW50IHBtZW1fZmQgPSAtMTsKLQotICAgICh2b2lkKSBoQ29tcDsKLSAgICAodm9pZCkgcG9ydDsKLQotCi0gICAgaWYgKGJ5dGVzICE9IGRydl9jdHguaXBfYnVmLmJ1ZmZlcl9zaXplKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiUmVxdWVzdGVkIFNpemUgaXMgd3JvbmcgJXUgZXBlY3RlZCBpcyAldSIsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClieXRlcywgKHVuc2lnbmVkIGludClkcnZfY3R4LmlwX2J1Zi5idWZmZXJfc2l6ZSk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgaWYgKCFtX2lucF9tZW1fcHRyKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkFsbG9jYXRlIGkvcCBidWZmZXIgSGVhZGVyOiBDbnQoJWQpIFN6KCV1KSIsCi0gICAgICAgICAgICAgICAgZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClkcnZfY3R4LmlwX2J1Zi5idWZmZXJfc2l6ZSk7Ci0KLSAgICAgICAgbV9pbnBfbWVtX3B0ciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSopIFwKLSAgICAgICAgICAgICAgICBjYWxsb2MoIChzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKSwgZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQpOwotCi0gICAgICAgIGlmIChtX2lucF9tZW1fcHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBkcnZfY3R4LnB0cl9pbnB1dGJ1ZmZlciA9IChzdHJ1Y3QgdmRlY19idWZmZXJwYXlsb2FkICopIFwKLSAgICAgICAgICAgICAgICAgICAgICBjYWxsb2MgKChzaXplb2YgKHN0cnVjdCB2ZGVjX2J1ZmZlcnBheWxvYWQpKSxkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudCk7Ci0KLSAgICAgICAgaWYgKGRydl9jdHgucHRyX2lucHV0YnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgIGRydl9jdHguaXBfYnVmX2lvbl9pbmZvID0gKHN0cnVjdCB2ZGVjX2lvbiAqKSBcCi0gICAgICAgICAgICAgICAgICAgICAgY2FsbG9jICgoc2l6ZW9mIChzdHJ1Y3QgdmRlY19pb24pKSxkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudCk7Ci0KLSAgICAgICAgaWYgKGRydl9jdHguaXBfYnVmX2lvbl9pbmZvID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQ7IGkrKykgewotICAgICAgICAgICAgZHJ2X2N0eC5wdHJfaW5wdXRidWZmZXIgW2ldLnBtZW1fZmQgPSAtMTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgICAgICBkcnZfY3R4LmlwX2J1Zl9pb25faW5mb1tpXS5pb25fZGV2aWNlX2ZkID0gLTE7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaT0wOyBpPCBkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChCSVRNQVNLX0FCU0VOVCgmbV9pbnBfYm1fY291bnQsaSkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZSBJbnB1dCBCdWZmZXIgSW5kZXggJWQiLGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaSA8IGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50KSB7Ci0gICAgICAgIGludCByYzsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJBbGxvY2F0ZSBpbnB1dCBCdWZmZXIiKTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgIGRydl9jdHguaXBfYnVmX2lvbl9pbmZvW2ldLmlvbl9kZXZpY2VfZmQgPSBhbGxvY19tYXBfaW9uX21lbW9yeSgKLSAgICAgICAgICAgICAgICBkcnZfY3R4LmlwX2J1Zi5idWZmZXJfc2l6ZSxkcnZfY3R4Lm9wX2J1Zi5hbGlnbm1lbnQsCi0gICAgICAgICAgICAgICAgJmRydl9jdHguaXBfYnVmX2lvbl9pbmZvW2ldLmlvbl9hbGxvY19kYXRhLAotICAgICAgICAgICAgICAgICZkcnZfY3R4LmlwX2J1Zl9pb25faW5mb1tpXS5mZF9pb25fZGF0YSwgc2VjdXJlX21vZGUgPwotICAgICAgICAgICAgICAgIFNFQ1VSRV9GTEFHU19JTlBVVF9CVUZGRVIgOiAwKTsKLSAgICAgICAgaWYgKGRydl9jdHguaXBfYnVmX2lvbl9pbmZvW2ldLmlvbl9kZXZpY2VfZmQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0gICAgICAgIHBtZW1fZmQgPSBkcnZfY3R4LmlwX2J1Zl9pb25faW5mb1tpXS5mZF9pb25fZGF0YS5mZDsKLSNlbHNlCi0gICAgICAgIHBtZW1fZmQgPSBvcGVuIChNRU1fREVWSUNFLE9fUkRXUik7Ci0KLSAgICAgICAgaWYgKHBtZW1fZmQgPCAwKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigib3BlbiBmYWlsZWQgZm9yIHBtZW0vYWRzcCBmb3IgaW5wdXQgYnVmZmVyIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBtZW1fZmQgPT0gMCkgewotICAgICAgICAgICAgcG1lbV9mZCA9IG9wZW4gKE1FTV9ERVZJQ0UsT19SRFdSKTsKLQotICAgICAgICAgICAgaWYgKHBtZW1fZmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIm9wZW4gZmFpbGVkIGZvciBwbWVtL2Fkc3AgZm9yIGlucHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFsaWduX3BtZW1fYnVmZmVycyhwbWVtX2ZkLCBkcnZfY3R4LmlwX2J1Zi5idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5pcF9idWYuYWxpZ25tZW50KSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImFsaWduX3BtZW1fYnVmZmVycygpIGZhaWxlZCIpOwotICAgICAgICAgICAgY2xvc2UocG1lbV9mZCk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKCFzZWN1cmVfbW9kZSkgewotICAgICAgICAgICAgYnVmX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5pcF9idWYuYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBwbWVtX2ZkLCAwKTsKLQotICAgICAgICAgICAgaWYgKGJ1Zl9hZGRyID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgICAgICAgICBjbG9zZShwbWVtX2ZkKTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgICAgICAgICAgZnJlZV9pb25fbWVtb3J5KCZkcnZfY3R4LmlwX2J1Zl9pb25faW5mb1tpXSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiTWFwIEZhaWxlZCB0byBhbGxvY2F0ZSBpbnB1dCBidWZmZXIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICpidWZmZXJIZHIgPSAobV9pbnBfbWVtX3B0ciArIGkpOwotICAgICAgICBpZiAoc2VjdXJlX21vZGUpCi0gICAgICAgICAgICBkcnZfY3R4LnB0cl9pbnB1dGJ1ZmZlciBbaV0uYnVmZmVyYWRkciA9ICpidWZmZXJIZHI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRydl9jdHgucHRyX2lucHV0YnVmZmVyIFtpXS5idWZmZXJhZGRyID0gYnVmX2FkZHI7Ci0gICAgICAgIGRydl9jdHgucHRyX2lucHV0YnVmZmVyIFtpXS5wbWVtX2ZkID0gcG1lbV9mZDsKLSAgICAgICAgZHJ2X2N0eC5wdHJfaW5wdXRidWZmZXIgW2ldLmJ1ZmZlcl9sZW4gPSBkcnZfY3R4LmlwX2J1Zi5idWZmZXJfc2l6ZTsKLSAgICAgICAgZHJ2X2N0eC5wdHJfaW5wdXRidWZmZXIgW2ldLm1tYXBlZF9zaXplID0gZHJ2X2N0eC5pcF9idWYuYnVmZmVyX3NpemU7Ci0gICAgICAgIGRydl9jdHgucHRyX2lucHV0YnVmZmVyIFtpXS5vZmZzZXQgPSAwOwotCi0gICAgICAgIGlucHV0ID0gKmJ1ZmZlckhkcjsKLSAgICAgICAgQklUTUFTS19TRVQoJm1faW5wX2JtX2NvdW50LGkpOwotICAgICAgICBERUJVR19QUklOVF9MT1coIkJ1ZmZlciBhZGRyZXNzICVwIG9mIHBtZW0iLCpidWZmZXJIZHIpOwotICAgICAgICBpZiAoYWxsb2NhdGVfbmF0aXZlX2hhbmRsZSkgewotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEgLypudW1GZHMqLywgMCAvKm51bUludHMqLyk7Ci0gICAgICAgICAgICBpZiAoIW5oKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk5hdGl2ZSBoYW5kbGUgY3JlYXRlIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuaC0+ZGF0YVswXSA9IGRydl9jdHgucHRyX2lucHV0YnVmZmVyW2ldLnBtZW1fZmQ7Ci0gICAgICAgICAgICBpbnB1dC0+cEJ1ZmZlciA9IChPTVhfVTggKiluaDsKLSAgICAgICAgfSBlbHNlIGlmIChzZWN1cmVfbW9kZSB8fCBtX2lucHV0X3Bhc3NfYnVmZmVyX2ZkKSB7Ci0gICAgICAgICAgICAvKkxlZ2FjeSBtZXRob2QsIHBhc3MgaW9uIGZkIHN0YXNoZWQgZGlyZWN0bHkgaW4gcEJ1ZmZlciovCi0gICAgICAgICAgICBpbnB1dC0+cEJ1ZmZlciA9IChPTVhfVTggKikoaW50cHRyX3QpZHJ2X2N0eC5wdHJfaW5wdXRidWZmZXJbaV0ucG1lbV9mZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlucHV0LT5wQnVmZmVyICAgICAgICAgICA9IChPTVhfVTggKilidWZfYWRkcjsKLSAgICAgICAgfQotICAgICAgICBpbnB1dC0+blNpemUgICAgICAgICAgICAgPSBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpOwotICAgICAgICBpbnB1dC0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICBpbnB1dC0+bkFsbG9jTGVuICAgICAgICAgPSBkcnZfY3R4LmlwX2J1Zi5idWZmZXJfc2l6ZTsKLSAgICAgICAgaW5wdXQtPnBBcHBQcml2YXRlICAgICAgID0gYXBwRGF0YTsKLSAgICAgICAgaW5wdXQtPm5JbnB1dFBvcnRJbmRleCAgID0gT01YX0NPUkVfSU5QVVRfUE9SVF9JTkRFWDsKLSAgICAgICAgaW5wdXQtPnBJbnB1dFBvcnRQcml2YXRlID0gKHZvaWQgKikmZHJ2X2N0eC5wdHJfaW5wdXRidWZmZXIgW2ldOwotCi0gICAgICAgIGlmIChkcnZfY3R4LmRpc2FibGVfZG14KSB7Ci0gICAgICAgICAgICBlUmV0ID0gYWxsb2NhdGVfZGVzY19idWZmZXIoaSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6SW5wdXQgQnVmZmVyIEluZGV4IG5vdCBmb3VuZCIpOwotICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgIH0KLSAgICByZXR1cm4gZVJldDsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6OkFsbG9jYXRlT3V0cHV0QnVmZmVyCi0KLSAgIERFU0NSSVBUSU9OCi0gICBIZWxwZXIgZm4gZm9yIEFsbG9jYXRlQnVmZmVyIGluIHRoZSBvdXRwdXQgcGluCi0KLSAgIFBBUkFNRVRFUlMKLSAgIDxUQkQ+LgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIE9NWCBFcnJvciBOb25lIGlmIGV2ZXJ5dGhpbmcgd2VudCB3ZWxsLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZkZWM6OmFsbG9jYXRlX291dHB1dF9idWZmZXIoCi0gICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgICAgIGhDb21wLAotICAgICAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqKiBidWZmZXJIZHIsCi0gICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIGJ5dGVzKQotewotICAgICh2b2lkKWhDb21wOwotICAgICh2b2lkKXBvcnQ7Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgICAgICAqYnVmSGRyPSBOVUxMOyAvLyBidWZmZXIgaGVhZGVyCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgaT0gMDsgLy8gVGVtcG9yYXJ5IGNvdW50ZXIKLSNpZmRlZiBVU0VfSU9OCi0gICAgaW50IGlvbl9kZXZpY2VfZmQgPS0xOwotICAgIHN0cnVjdCBpb25fYWxsb2NhdGlvbl9kYXRhIGlvbl9hbGxvY19kYXRhOwotICAgIHN0cnVjdCBpb25fZmRfZGF0YSBmZF9pb25fZGF0YTsKLSNlbmRpZgotICAgIGlmICghbV9vdXRfbWVtX3B0cikgewotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJBbGxvY2F0ZSBvL3AgYnVmZmVyIEhlYWRlcjogQ250KCVkKSBTeigldSkiLAotICAgICAgICAgICAgICAgIGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50LAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUpOwotICAgICAgICBpbnQgbkJ1ZkhkclNpemUgICAgICAgID0gMDsKLSAgICAgICAgaW50IG5QbGF0Zm9ybUVudHJ5U2l6ZSA9IDA7Ci0gICAgICAgIGludCBuUGxhdGZvcm1MaXN0U2l6ZSAgPSAwOwotICAgICAgICBpbnQgblBNRU1JbmZvU2l6ZSA9IDA7Ci0gICAgICAgIGludCBwbWVtX2ZkID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnBtZW1fYmFzZWFkZHJlc3MgPSBOVUxMOwotCi0gICAgICAgIE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfTElTVCAgICAgICpwUGxhdGZvcm1MaXN0OwotICAgICAgICBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0VOVFJZICAgICAqcFBsYXRmb3JtRW50cnk7Ci0gICAgICAgIE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfUE1FTV9JTkZPICpwUE1FTUluZm87Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJBbGxvY2F0aW5nIEZpcnN0IE91dHB1dCBCdWZmZXIoJWQpIiwKLSAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCk7Ci0gICAgICAgIG5CdWZIZHJTaXplICAgICAgICA9IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50ICoKLSAgICAgICAgICAgIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSk7Ci0KLSAgICAgICAgblBNRU1JbmZvU2l6ZSAgICAgID0gZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQgKgotICAgICAgICAgICAgc2l6ZW9mKE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfUE1FTV9JTkZPKTsKLSAgICAgICAgblBsYXRmb3JtTGlzdFNpemUgID0gZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQgKgotICAgICAgICAgICAgc2l6ZW9mKE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfTElTVCk7Ci0gICAgICAgIG5QbGF0Zm9ybUVudHJ5U2l6ZSA9IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50ICoKLSAgICAgICAgICAgIHNpemVvZihPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0VOVFJZKTsKLQotICAgICAgICBERUJVR19QUklOVF9MT1coIlRvdGFsQnVmSGRyICVkIEJ1ZkhkclNpemUgJXUgUE1FTSAlZCBQTCAlZCIsbkJ1ZkhkclNpemUsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpLAotICAgICAgICAgICAgICAgIG5QTUVNSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgblBsYXRmb3JtTGlzdFNpemUpOwotICAgICAgICBERUJVR19QUklOVF9MT1coIlBFICVkIE91dHB1dEJ1ZmZlciBDb3VudCAlZCIsblBsYXRmb3JtRW50cnlTaXplLAotICAgICAgICAgICAgICAgIGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50KTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgIC8vIEFsbG9jYXRlIG91dHB1dCBidWZmZXJzIGFzIGNhY2hlZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIHNvZnR3YXJlLXJlYWRpbmcKLSAgICAgICAgLy8gb2YgdGhlIFlVVnMuIE91dHB1dCBidWZmZXJzIGFyZSBjYWNoZS1pbnZhbGlkYXRlZCBpbiBkcml2ZXIuCi0gICAgICAgIC8vIElmIGNvbG9yLWNvbnZlcnNpb24gaXMgaW52b2x2ZWQsIE9ubHkgdGhlIEMyRCBvdXRwdXQgYnVmZmVycyBhcmUgY2FjaGVkLCBubwotICAgICAgICAvLyBuZWVkIHRvIGNhY2hlIHRoZSBkZWNvZGVyJ3Mgb3V0cHV0IGJ1ZmZlcnMKLSAgICAgICAgaW50IGNhY2hlX2ZsYWcgPSBjbGllbnRfYnVmZmVycy5pc19jb2xvcl9jb252ZXJzaW9uX2VuYWJsZWQoKSA/IDAgOiBJT05fRkxBR19DQUNIRUQ7Ci0gICAgICAgIGlvbl9kZXZpY2VfZmQgPSBhbGxvY19tYXBfaW9uX21lbW9yeSgKLSAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSAqIGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50LAotICAgICAgICAgICAgICAgIHNlY3VyZV9zY2FsaW5nX3RvX25vbl9zZWN1cmVfb3BiID8gU1pfNEsgOiBkcnZfY3R4Lm9wX2J1Zi5hbGlnbm1lbnQsCi0gICAgICAgICAgICAgICAgJmlvbl9hbGxvY19kYXRhLCAmZmRfaW9uX2RhdGEsCi0gICAgICAgICAgICAgICAgKHNlY3VyZV9tb2RlICYmICFzZWN1cmVfc2NhbGluZ190b19ub25fc2VjdXJlX29wYikgPwotICAgICAgICAgICAgICAgIFNFQ1VSRV9GTEFHU19PVVRQVVRfQlVGRkVSIDogY2FjaGVfZmxhZyk7Ci0gICAgICAgIGlmIChpb25fZGV2aWNlX2ZkIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgICAgICBwbWVtX2ZkID0gZmRfaW9uX2RhdGEuZmQ7Ci0jZWxzZQotICAgICAgICBwbWVtX2ZkID0gb3BlbiAoTUVNX0RFVklDRSxPX1JEV1IpOwotCi0gICAgICAgIGlmIChwbWVtX2ZkIDwgMCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOnBtZW0gZmQgZm9yIG91dHB1dCBidWZmZXIgJWQiLAotICAgICAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhbGlnbl9wbWVtX2J1ZmZlcnMocG1lbV9mZCwgZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUgKgotICAgICAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYuYWxpZ25tZW50KSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImFsaWduX3BtZW1fYnVmZmVycygpIGZhaWxlZCIpOwotICAgICAgICAgICAgY2xvc2UocG1lbV9mZCk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKCFzZWN1cmVfbW9kZSkgewotICAgICAgICAgICAgcG1lbV9iYXNlYWRkcmVzcyA9ICh1bnNpZ25lZCBjaGFyICopbW1hcChOVUxMLAotICAgICAgICAgICAgICAgICAgICAoZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUgKgotICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpLAotICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUR8UFJPVF9XUklURSxNQVBfU0hBUkVELHBtZW1fZmQsMCk7Ci0gICAgICAgICAgICBpZiAocG1lbV9iYXNlYWRkcmVzcyA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk1NQVAgZmFpbGVkIGZvciBTaXplICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUpOwotICAgICAgICAgICAgICAgIGNsb3NlKHBtZW1fZmQpOwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgICAgICBmcmVlX2lvbl9tZW1vcnkoJmRydl9jdHgub3BfYnVmX2lvbl9pbmZvW2ldKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9vdXRfbWVtX3B0ciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAgKiljYWxsb2MobkJ1ZkhkclNpemUsMSk7Ci0gICAgICAgIC8vIEFsbG9jIG1lbSBmb3IgcGxhdGZvcm0gc3BlY2lmaWMgaW5mbwotICAgICAgICBjaGFyICpwUHRyPU5VTEw7Ci0gICAgICAgIHBQdHIgPSAoY2hhciopIGNhbGxvYyhuUGxhdGZvcm1MaXN0U2l6ZSArIG5QbGF0Zm9ybUVudHJ5U2l6ZSArCi0gICAgICAgICAgICAgICAgblBNRU1JbmZvU2l6ZSwxKTsKLSAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyID0gKHN0cnVjdCB2ZGVjX2J1ZmZlcnBheWxvYWQgKilcCi0gICAgICAgICAgICAgICAgICAgICAgIGNhbGxvYyAoc2l6ZW9mKHN0cnVjdCB2ZGVjX2J1ZmZlcnBheWxvYWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50KTsKLSAgICAgICAgZHJ2X2N0eC5wdHJfcmVzcGJ1ZmZlciA9IChzdHJ1Y3QgdmRlY19vdXRwdXRfZnJhbWVpbmZvICAqKVwKLSAgICAgICAgICAgICAgICAgICAgIGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdmRlY19vdXRwdXRfZnJhbWVpbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpOwotICAgICAgICBpZiAoIWRydl9jdHgucHRyX291dHB1dGJ1ZmZlciB8fCAhZHJ2X2N0eC5wdHJfcmVzcGJ1ZmZlcikgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBhbGxvYyBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXIgb3IgZHJ2X2N0eC5wdHJfcmVzcGJ1ZmZlciAiKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLQotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgZHJ2X2N0eC5vcF9idWZfaW9uX2luZm8gPSAoc3RydWN0IHZkZWNfaW9uICopXAotICAgICAgICAgICAgICAgICAgICAgIGNhbGxvYyAoc2l6ZW9mKHN0cnVjdCB2ZGVjX2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCk7Ci0gICAgICAgIGlmICghZHJ2X2N0eC5vcF9idWZfaW9uX2luZm8pIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2MgZHJ2X2N0eC5vcF9idWZfaW9uX2luZm8iKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGlmIChtX291dF9tZW1fcHRyICYmIHBQdHIgJiYgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyCi0gICAgICAgICAgICAgICAgJiYgZHJ2X2N0eC5wdHJfcmVzcGJ1ZmZlcikgewotICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyWzBdLm1tYXBlZF9zaXplID0KLSAgICAgICAgICAgICAgICAoZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUgKgotICAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCk7Ci0gICAgICAgICAgICBidWZIZHIgICAgICAgICAgPSAgbV9vdXRfbWVtX3B0cjsKLSAgICAgICAgICAgIG1fcGxhdGZvcm1fbGlzdCA9IChPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0xJU1QgKikocFB0cik7Ci0gICAgICAgICAgICBtX3BsYXRmb3JtX2VudHJ5PSAoT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9FTlRSWSAqKQotICAgICAgICAgICAgICAgICgoKGNoYXIgKikgbV9wbGF0Zm9ybV9saXN0KSAgKyBuUGxhdGZvcm1MaXN0U2l6ZSk7Ci0gICAgICAgICAgICBtX3BtZW1faW5mbyAgICAgPSAoT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9QTUVNX0lORk8gKikKLSAgICAgICAgICAgICAgICAoKChjaGFyICopIG1fcGxhdGZvcm1fZW50cnkpICsgblBsYXRmb3JtRW50cnlTaXplKTsKLSAgICAgICAgICAgIHBQbGF0Zm9ybUxpc3QgICA9IG1fcGxhdGZvcm1fbGlzdDsKLSAgICAgICAgICAgIHBQbGF0Zm9ybUVudHJ5ICA9IG1fcGxhdGZvcm1fZW50cnk7Ci0gICAgICAgICAgICBwUE1FTUluZm8gICAgICAgPSBtX3BtZW1faW5mbzsKLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJNZW1vcnkgQWxsb2NhdGlvbiBTdWNjZWVkZWQgZm9yIE9VVCBwb3J0JXAiLG1fb3V0X21lbV9wdHIpOwotCi0gICAgICAgICAgICAvLyBTZXR0dGluZyB0aGUgZW50aXJlIHN0b3JhZ2UgbmljZWx5Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coImJIZHIgJXAgT3V0TWVtICVwIFBFICVwIixidWZIZHIsIG1fb3V0X21lbV9wdHIscFBsYXRmb3JtRW50cnkpOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCIgUG1lbSBJbmZvID0gJXAiLHBQTUVNSW5mbyk7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVmSGRyLT5uU2l6ZSAgICAgICAgICAgICAgPSBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+blZlcnNpb24ublZlcnNpb24gID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHZhbHVlcyB3aGVuIHdlIGRldGVybWluZSB0aGUgcmlnaHQgSHhXIHBhcmFtCi0gICAgICAgICAgICAgICAgYnVmSGRyLT5uQWxsb2NMZW4gICAgICAgICAgPSBieXRlczsKLSAgICAgICAgICAgICAgICBidWZIZHItPm5GaWxsZWRMZW4gICAgICAgICA9IDA7Ci0gICAgICAgICAgICAgICAgYnVmSGRyLT5wQXBwUHJpdmF0ZSAgICAgICAgPSBhcHBEYXRhOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+bk91dHB1dFBvcnRJbmRleCAgID0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVg7Ci0gICAgICAgICAgICAgICAgLy8gUGxhdGZvcm0gc3BlY2lmaWMgUE1FTSBJbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIFBsYXRmb3JtIEVudHJ5Ci0gICAgICAgICAgICAgICAgLy9ERUJVR19QUklOVF9MT1coIkluaXRpYWxpemluZyB0aGUgUGxhdGZvcm0gRW50cnkgZm9yICVkIixpKTsKLSAgICAgICAgICAgICAgICBwUGxhdGZvcm1FbnRyeS0+dHlwZSAgICAgICA9IE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfUE1FTTsKLSAgICAgICAgICAgICAgICBwUGxhdGZvcm1FbnRyeS0+ZW50cnkgICAgICA9IHBQTUVNSW5mbzsKLSAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBQbGF0Zm9ybSBMaXN0Ci0gICAgICAgICAgICAgICAgcFBsYXRmb3JtTGlzdC0+bkVudHJpZXMgICAgPSAxOwotICAgICAgICAgICAgICAgIHBQbGF0Zm9ybUxpc3QtPmVudHJ5TGlzdCAgID0gcFBsYXRmb3JtRW50cnk7Ci0gICAgICAgICAgICAgICAgLy8gS2VlcCBwQnVmZmVyIE5VTEwgdGlsbCB2ZGVjIGlzIG9wZW5lZAotICAgICAgICAgICAgICAgIGJ1Zkhkci0+cEJ1ZmZlciAgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgICAgICAgICBidWZIZHItPm5PZmZzZXQgICAgICAgICAgICA9IDA7Ci0KLSAgICAgICAgICAgICAgICBwUE1FTUluZm8tPm9mZnNldCAgICAgICAgICA9ICBkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSppOwotICAgICAgICAgICAgICAgIHBQTUVNSW5mby0+cG1lbV9mZCA9IC0xOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+cFBsYXRmb3JtUHJpdmF0ZSA9IHBQbGF0Zm9ybUxpc3Q7Ci0KLSAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0ucG1lbV9mZCA9IHBtZW1fZmQ7Ci0gICAgICAgICAgICAgICAgbV9wbWVtX2luZm9baV0ucG1lbV9mZCA9IHBtZW1fZmQ7Ci0jaWZkZWYgVVNFX0lPTgotICAgICAgICAgICAgICAgIGRydl9jdHgub3BfYnVmX2lvbl9pbmZvW2ldLmlvbl9kZXZpY2VfZmQgPSBpb25fZGV2aWNlX2ZkOwotICAgICAgICAgICAgICAgIGRydl9jdHgub3BfYnVmX2lvbl9pbmZvW2ldLmlvbl9hbGxvY19kYXRhID0gaW9uX2FsbG9jX2RhdGE7Ci0gICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWZfaW9uX2luZm9baV0uZmRfaW9uX2RhdGEgPSBmZF9pb25fZGF0YTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgLypDcmVhdGUgYSBtYXBwaW5nIGJldHdlZW4gYnVmZmVycyovCi0gICAgICAgICAgICAgICAgYnVmSGRyLT5wT3V0cHV0UG9ydFByaXZhdGUgPSAmZHJ2X2N0eC5wdHJfcmVzcGJ1ZmZlcltpXTsKLSAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9yZXNwYnVmZmVyW2ldLmNsaWVudF9kYXRhID0gKHZvaWQgKilcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldOwotICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5vZmZzZXQgPSBkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSppOwotICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5idWZmZXJhZGRyID0KLSAgICAgICAgICAgICAgICAgICAgcG1lbV9iYXNlYWRkcmVzcyArIChkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSppKTsKLSAgICAgICAgICAgICAgICBtX3BtZW1faW5mb1tpXS5zaXplID0gZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLmJ1ZmZlcl9sZW47Ci0gICAgICAgICAgICAgICAgbV9wbWVtX2luZm9baV0ubWFwcGVkX3NpemUgPSBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0ubW1hcGVkX3NpemU7Ci0gICAgICAgICAgICAgICAgbV9wbWVtX2luZm9baV0uYnVmZmVyID0gZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLmJ1ZmZlcmFkZHI7Ci0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInBtZW1fZmQgPSAlZCBvZmZzZXQgPSAldSBhZGRyZXNzID0gJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgcG1lbV9mZCwgKHVuc2lnbmVkIGludClkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0ub2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLmJ1ZmZlcmFkZHIpOwotICAgICAgICAgICAgICAgIC8vIE1vdmUgdGhlIGJ1ZmZlciBhbmQgYnVmZmVyIGhlYWRlciBwb2ludGVycwotICAgICAgICAgICAgICAgIGJ1ZkhkcisrOwotICAgICAgICAgICAgICAgIHBQTUVNSW5mbysrOwotICAgICAgICAgICAgICAgIHBQbGF0Zm9ybUVudHJ5Kys7Ci0gICAgICAgICAgICAgICAgcFBsYXRmb3JtTGlzdCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk91dHB1dCBidWYgbWVtIGFsbG9jIGZhaWxlZFsweCVwXVsweCVwXSIsXAotICAgICAgICAgICAgICAgICAgICBtX291dF9tZW1fcHRyLCBwUHRyKTsKLSAgICAgICAgICAgIGlmIChtX291dF9tZW1fcHRyKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtX291dF9tZW1fcHRyKTsKLSAgICAgICAgICAgICAgICBtX291dF9tZW1fcHRyID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwUHRyKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwUHRyKTsKLSAgICAgICAgICAgICAgICBwUHRyID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXIpIHsKLSAgICAgICAgICAgICAgICBmcmVlKGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkcnZfY3R4LnB0cl9yZXNwYnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShkcnZfY3R4LnB0cl9yZXNwYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9yZXNwYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgICAgICBpZiAoZHJ2X2N0eC5vcF9idWZfaW9uX2luZm8pIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkZyZWUgby9wIGlvbiBjb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgZnJlZShkcnZfY3R4Lm9wX2J1Zl9pb25faW5mbyk7Ci0gICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWZfaW9uX2luZm8gPSBOVUxMOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBlUmV0ID0gIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgICAgICBpZiAoZVJldCA9PSBPTVhfRXJyb3JOb25lKQotICAgICAgICAgICAgZVJldCA9IGFsbG9jYXRlX2V4dHJhZGF0YSgpOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpPCBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChCSVRNQVNLX0FCU0VOVCgmbV9vdXRfYm1fY291bnQsaSkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRm91bmQgYSBGcmVlIE91dHB1dCBCdWZmZXIgJWQiLGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZVJldCA9PSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIGlmIChpIDwgZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpIHsKLSAgICAgICAgICAgIGludCByYzsKLSAgICAgICAgICAgIG1fcG1lbV9pbmZvW2ldLm9mZnNldCA9IGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5vZmZzZXQ7Ci0KLSAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5idWZmZXJfbGVuID0KLSAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZTsKLQotICAgICAgICAgICAgKmJ1ZmZlckhkciA9IChtX291dF9tZW1fcHRyICsgaSApOwotICAgICAgICAgICAgaWYgKHNlY3VyZV9tb2RlKSB7Ci0jaWZkZWYgVVNFX0lPTgotICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltpXS5idWZmZXJhZGRyID0KLSAgICAgICAgICAgICAgICAgICAgKE9NWF9VOCAqKShpbnRwdHJfdClkcnZfY3R4Lm9wX2J1Zl9pb25faW5mb1tpXS5mZF9pb25fZGF0YS5mZDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2ldLmJ1ZmZlcmFkZHIgPSAqYnVmZmVySGRyOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0ubW1hcGVkX3NpemUgPSBkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKGkgPT0gKGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50IC0xICkgJiYgIXN0cmVhbWluZ1tDQVBUVVJFX1BPUlRdKSB7Ci0gICAgICAgICAgICAgICAgZW51bSB2NGwyX2J1Zl90eXBlIGJ1Zl90eXBlOwotICAgICAgICAgICAgICAgIGJ1Zl90eXBlPVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgICAgICAgICAgICAgcmM9aW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TVFJFQU1PTiwmYnVmX3R5cGUpOwotICAgICAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbWluZ1tDQVBUVVJFX1BPUlRdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTVFJFQU1PTiBTdWNjZXNzZnVsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAoKmJ1ZmZlckhkciktPnBCdWZmZXIgPSAoT01YX1U4KilkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0uYnVmZmVyYWRkcjsKLSAgICAgICAgICAgICgqYnVmZmVySGRyKS0+cEFwcFByaXZhdGUgPSBhcHBEYXRhOwotICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fb3V0X2JtX2NvdW50LGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkFsbCB0aGUgT3V0cHV0IEJ1ZmZlcnMgaGF2ZSBiZWVuIEFsbG9jYXRlZCA7IFJldHVybmluZyBJbnN1ZmZpY2llbnQiKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZVJldDsKLX0KLQotCi0vLyBBbGxvY2F0ZUJ1ZmZlciAgLS0gQVBJIENhbGwKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6QWxsb2NhdGVCdWZmZXIKLQotICAgREVTQ1JJUFRJT04KLSAgIFJldHVybnMgemVybyBpZiBhbGwgdGhlIGJ1ZmZlcnMgcmVsZWFzZWQuLgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UKLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZGVjOjphbGxvY2F0ZV9idWZmZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICAgIGhDb21wLAotICAgICAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqKiBidWZmZXJIZHIsCi0gICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpCi17Ci0gICAgdW5zaWduZWQgaSA9IDA7Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsgLy8gT01YIHJldHVybiB0eXBlCi0KLSAgICBERUJVR19QUklOVF9MT1coIkFsbG9jYXRlIGJ1ZmZlciBvbiBwb3J0ICVkIiwgKGludClwb3J0KTsKLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJBbGxvY2F0ZSBCdWYgaW4gSW52YWxpZCBTdGF0ZSIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgIH0KLQotICAgIGlmIChwb3J0ID09IE9NWF9DT1JFX0lOUFVUX1BPUlRfSU5ERVgpIHsKLSAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGFsbG9jYXRpb24gKGkuZSBtX2lucF9tZW1fcHRyIGlzIGFsbG9jYXRlZCksCi0gICAgICAgIC8vIGVuc3VyZSB0aGF0IHVzZS1idWZmZXIgd2FzIG5ldmVyIGNhbGxlZC4KLSAgICAgICAgLy8gTWl4LWFuZC1tYXRjaCBvZiB1c2VCdWZmZXIgYW5kIGFsbG9jYXRlQnVmZmVyIGlzIG5vdCBhbGxvd2VkCi0gICAgICAgIGlmIChtX2lucF9tZW1fcHRyICYmIGlucHV0X3VzZV9idWZmZXIpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCInQWxsb2NhdGUnIElucHV0IGJ1ZmZlciBjYWxsZWQgYWZ0ZXIgJ1VzZScgSW5wdXQgYnVmZmVyICEiKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFyYml0cmFyeV9ieXRlcykgewotICAgICAgICAgICAgZVJldCA9IGFsbG9jYXRlX2lucHV0X2hlYXBfYnVmZmVyIChoQ29tcCxidWZmZXJIZHIscG9ydCxhcHBEYXRhLGJ5dGVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVSZXQgPSBhbGxvY2F0ZV9pbnB1dF9idWZmZXIoaENvbXAsYnVmZmVySGRyLHBvcnQsYXBwRGF0YSxieXRlcyk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBvcnQgPT0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgpIHsKLSAgICAgICAgZVJldCA9IGNsaWVudF9idWZmZXJzLmFsbG9jYXRlX2J1ZmZlcnNfY29sb3JfY29udmVydChoQ29tcCxidWZmZXJIZHIscG9ydCwKLSAgICAgICAgICAgICAgICBhcHBEYXRhLGJ5dGVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRXJyb3I6IEludmFsaWQgUG9ydCBJbmRleCByZWNlaXZlZCAlZCIsKGludClwb3J0KTsKLSAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICB9Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJDaGVja2luZyBmb3IgT3V0cHV0IEFsbG9jYXRlIGJ1ZmZlciBEb25lIik7Ci0gICAgaWYgKGVSZXQgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBpZiAoYWxsb2NhdGVfZG9uZSgpKSB7Ci0gICAgICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCZtX2ZsYWdzLE9NWF9DT01QT05FTlRfSURMRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNhbGxiYWNrIG5vdwotICAgICAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoKCZtX2ZsYWdzKSxPTVhfQ09NUE9ORU5UX0lETEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfQ29tbWFuZFN0YXRlU2V0LE9NWF9TdGF0ZUlkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocG9ydCA9PSBPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYICYmIG1faW5wX2JQb3B1bGF0ZWQpIHsKLSAgICAgICAgICAgIGlmIChCSVRNQVNLX1BSRVNFTlQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9JTlBVVF9FTkFCTEVfUEVORElORykpIHsKLSAgICAgICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCgmbV9mbGFncyksT01YX0NPTVBPTkVOVF9JTlBVVF9FTkFCTEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfQ29tbWFuZFBvcnRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvcnQgPT0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVggJiYgbV9vdXRfYlBvcHVsYXRlZCkgewotICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmbV9mbGFncyxPTVhfQ09NUE9ORU5UX09VVFBVVF9FTkFCTEVfUEVORElORykpIHsKLSAgICAgICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCgmbV9mbGFncyksT01YX0NPTVBPTkVOVF9PVVRQVVRfRU5BQkxFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0NvbW1hbmRQb3J0RW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBERUJVR19QUklOVF9MT1coIkFsbG9jYXRlIEJ1ZmZlciBleGl0IHdpdGggcmV0IENvZGUgJWQiLGVSZXQpOwotICAgIHJldHVybiBlUmV0OwotfQotCi0vLyBGcmVlIEJ1ZmZlciAtIEFQSSBjYWxsCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6OkZyZWVCdWZmZXIKLQotICAgREVTQ1JJUFRJT04KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmRlYzo6ZnJlZV9idWZmZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIGJ1ZmZlcikKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIHVuc2lnbmVkIGludCBuUG9ydEluZGV4OwotICAgICh2b2lkKSBoQ29tcDsKLSAgICBERUJVR19QUklOVF9MT1coIkluIGZvciBkZWNvZGVyIGZyZWVfYnVmZmVyIik7Ci0KLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJZGxlICYmCi0gICAgICAgICAgICAoQklUTUFTS19QUkVTRU5UKCZtX2ZsYWdzICxPTVhfQ09NUE9ORU5UX0xPQURJTkdfUEVORElORykpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiIGZyZWUgYnVmZmVyIHdoaWxlIENvbXBvbmVudCBpbiBMb2FkaW5nIHBlbmRpbmciKTsKLSAgICB9IGVsc2UgaWYgKChtX2lucF9iRW5hYmxlZCA9PSBPTVhfRkFMU0UgJiYgcG9ydCA9PSBPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYKXx8Ci0gICAgICAgICAgICAobV9vdXRfYkVuYWJsZWQgPT0gT01YX0ZBTFNFICYmIHBvcnQgPT0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZSBCdWZmZXIgd2hpbGUgcG9ydCAldSBkaXNhYmxlZCIsICh1bnNpZ25lZCBpbnQpcG9ydCk7Ci0gICAgfSBlbHNlIGlmICgocG9ydCA9PSBPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYICYmCi0gICAgICAgICAgICAgICAgQklUTUFTS19QUkVTRU5UKCZtX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX0lOUFVUX0VOQUJMRV9QRU5ESU5HKSkgfHwKLSAgICAgICAgICAgIChwb3J0ID09IE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYICYmCi0gICAgICAgICAgICAgQklUTUFTS19QUkVTRU5UKCZtX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX09VVFBVVF9FTkFCTEVfUEVORElORykpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZSBCdWZmZXIgd2hpbGUgcG9ydCAldSBlbmFibGUgcGVuZGluZyIsICh1bnNpZ25lZCBpbnQpcG9ydCk7Ci0gICAgfSBlbHNlIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZyB8fCBtX3N0YXRlID09IE9NWF9TdGF0ZVBhdXNlKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIHN0YXRlIHRvIGZyZWUgYnVmZmVyLHBvcnRzIG5lZWQgdG8gYmUgZGlzYWJsZWQiKTsKLSAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvciwKLSAgICAgICAgICAgICAgICBPTVhfRXJyb3JQb3J0VW5wb3B1bGF0ZWQsCi0gICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0KLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOwotICAgIH0gZWxzZSBpZiAobV9zdGF0ZSAhPSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIHN0YXRlIHRvIGZyZWUgYnVmZmVyLHBvcnQgbG9zdCBCdWZmZXJzIik7Ci0gICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsCi0gICAgICAgICAgICAgICAgT01YX0Vycm9yUG9ydFVucG9wdWxhdGVkLAotICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgIH0KLQotICAgIGlmIChwb3J0ID09IE9NWF9DT1JFX0lOUFVUX1BPUlRfSU5ERVgpIHsKLSAgICAgICAgLypDaGVjayBpZiBhcmJpdHJhcnkgYnl0ZXMqLwotICAgICAgICBpZiAoIWFyYml0cmFyeV9ieXRlcyAmJiAhaW5wdXRfdXNlX2J1ZmZlcikKLSAgICAgICAgICAgIG5Qb3J0SW5kZXggPSBidWZmZXIgLSBtX2lucF9tZW1fcHRyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuUG9ydEluZGV4ID0gYnVmZmVyIC0gbV9pbnBfaGVhcF9wdHI7Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJmcmVlX2J1ZmZlciBvbiBpL3AgcG9ydCAtIFBvcnQgaWR4ICVkIiwgblBvcnRJbmRleCk7Ci0gICAgICAgIGlmIChuUG9ydEluZGV4IDwgZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQgJiYKLSAgICAgICAgICAgICAgICBCSVRNQVNLX1BSRVNFTlQoJm1faW5wX2JtX2NvdW50LCBuUG9ydEluZGV4KSkgewotICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGJpdCBhc3NvY2lhdGVkIHdpdGggaXQuCi0gICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCZtX2lucF9ibV9jb3VudCxuUG9ydEluZGV4KTsKLSAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoJm1faGVhcF9pbnBfYm1fY291bnQsblBvcnRJbmRleCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXRfdXNlX2J1ZmZlciA9PSB0cnVlKSB7Ci0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkZyZWUgcG1lbSBCdWZmZXIgaW5kZXggJWQiLG5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChtX3BoZHJfcG1lbV9wdHIpCi0gICAgICAgICAgICAgICAgICAgIGZyZWVfaW5wdXRfYnVmZmVyKG1fcGhkcl9wbWVtX3B0cltuUG9ydEluZGV4XSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChhcmJpdHJhcnlfYnl0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fcGhkcl9wbWVtX3B0cikKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfaW5wdXRfYnVmZmVyKG5Qb3J0SW5kZXgsbV9waGRyX3BtZW1fcHRyW25Qb3J0SW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9pbnB1dF9idWZmZXIoblBvcnRJbmRleCxOVUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZnJlZV9pbnB1dF9idWZmZXIoYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1faW5wX2JQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7Ci0gICAgICAgICAgICBpZihyZWxlYXNlX2lucHV0X2RvbmUoKSkKLSAgICAgICAgICAgICAgICByZWxlYXNlX2J1ZmZlcnModGhpcywgVkRFQ19CVUZGRVJfVFlQRV9JTlBVVCk7Ci0gICAgICAgICAgICAvKkZyZWUgdGhlIEJ1ZmZlciBIZWFkZXIqLwotICAgICAgICAgICAgaWYgKHJlbGVhc2VfaW5wdXRfZG9uZSgpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiQUxMIGlucHV0IGJ1ZmZlcnMgYXJlIGZyZWVkL3JlbGVhc2VkIik7Ci0gICAgICAgICAgICAgICAgZnJlZV9pbnB1dF9idWZmZXJfaGVhZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRXJyb3I6IGZyZWVfYnVmZmVyICxQb3J0IEluZGV4IEludmFsaWQiKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCgmbV9mbGFncyksT01YX0NPTVBPTkVOVF9JTlBVVF9ESVNBQkxFX1BFTkRJTkcpCi0gICAgICAgICAgICAgICAgJiYgcmVsZWFzZV9pbnB1dF9kb25lKCkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiTU9WSU5HIFRPIERJU0FCTEVEIFNUQVRFIik7Ci0gICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCgmbV9mbGFncyksT01YX0NPTVBPTkVOVF9JTlBVVF9ESVNBQkxFX1BFTkRJTkcpOwotICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfQ29tbWFuZFBvcnREaXNhYmxlLAotICAgICAgICAgICAgICAgICAgICBPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYLAotICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocG9ydCA9PSBPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCkgewotICAgICAgICAvLyBjaGVjayBpZiB0aGUgYnVmZmVyIGlzIHZhbGlkCi0gICAgICAgIG5Qb3J0SW5kZXggPSBidWZmZXIgLSBjbGllbnRfYnVmZmVycy5nZXRfaWxfYnVmX2hkcigpOwotICAgICAgICBpZiAoblBvcnRJbmRleCA8IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50ICYmCi0gICAgICAgICAgICAgICAgQklUTUFTS19QUkVTRU5UKCZtX291dF9ibV9jb3VudCwgblBvcnRJbmRleCkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZnJlZV9idWZmZXIgb24gby9wIHBvcnQgLSBQb3J0IGlkeCAlZCIsIG5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGJpdCBhc3NvY2lhdGVkIHdpdGggaXQuCi0gICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCZtX291dF9ibV9jb3VudCxuUG9ydEluZGV4KTsKLSAgICAgICAgICAgIG1fb3V0X2JQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7Ci0gICAgICAgICAgICBjbGllbnRfYnVmZmVycy5mcmVlX291dHB1dF9idWZmZXIgKGJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIGlmKHJlbGVhc2Vfb3V0cHV0X2RvbmUoKSkgewotICAgICAgICAgICAgICAgIHJlbGVhc2VfYnVmZmVycyh0aGlzLCBWREVDX0JVRkZFUl9UWVBFX09VVFBVVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVsZWFzZV9vdXRwdXRfZG9uZSgpKSB7Ci0gICAgICAgICAgICAgICAgZnJlZV9vdXRwdXRfYnVmZmVyX2hlYWRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVycm9yOiBmcmVlX2J1ZmZlciAsIFBvcnQgSW5kZXggSW52YWxpZCIpOwotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgfQotICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCgmbV9mbGFncyksT01YX0NPTVBPTkVOVF9PVVRQVVRfRElTQUJMRV9QRU5ESU5HKQotICAgICAgICAgICAgICAgICYmIHJlbGVhc2Vfb3V0cHV0X2RvbmUoKSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlQnVmZmVyIDogSWYgYW55IERpc2FibGUgZXZlbnQgcGVuZGluZyxwb3N0IGl0Iik7Ci0KLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiTU9WSU5HIFRPIERJU0FCTEVEIFNUQVRFIik7Ci0gICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCgmbV9mbGFncyksT01YX0NPTVBPTkVOVF9PVVRQVVRfRElTQUJMRV9QRU5ESU5HKTsKLSNpZmRlZiBfQU5EUk9JRF9JQ1NfCi0gICAgICAgICAgICBpZiAobV9lbmFibGVfYW5kcm9pZF9uYXRpdmVfYnVmZmVycykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZUJ1ZmZlciAtIG91dHBvcnQgZGlzYWJsZWQ6IHJlc2V0IG5hdGl2ZSBidWZmZXJzIik7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KCZuYXRpdmVfYnVmZmVyLCAwICwoc2l6ZW9mKHN0cnVjdCBuYXRpdmVidWZmZXIpICogTUFYX05VTV9JTlBVVF9PVVRQVVRfQlVGRkVSUykpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChwb3J0ID09IE9NWF9DT1JFX09VVFBVVF9FWFRSQURBVEFfSU5ERVgpIHsKLSAgICAgICAgblBvcnRJbmRleCA9IGJ1ZmZlciAtIG1fY2xpZW50X291dHB1dF9leHRyYWRhdGFfbWVtX3B0cjsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJmcmVlX2J1ZmZlciBvbiBleHRyYWRhdGEgb3V0cHV0IHBvcnQgLSBQb3J0IGlkeCAlZCIsIG5Qb3J0SW5kZXgpOwotCi0gICAgICAgIEJJVE1BU0tfQ0xFQVIoJm1fb3V0X2V4dHJhZGF0YV9ibV9jb3VudCxuUG9ydEluZGV4KTsKLQotICAgICAgICBpZiAocmVsZWFzZV9vdXRwdXRfZXh0cmFkYXRhX2RvbmUoKSkgewotICAgICAgICAgICAgZnJlZV9vdXRwdXRfZXh0cmFkYXRhX2J1ZmZlcl9oZWFkZXIoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgfQotICAgIGlmICgoZVJldCA9PSBPTVhfRXJyb3JOb25lKSAmJgotICAgICAgICAgICAgKEJJVE1BU0tfUFJFU0VOVCgmbV9mbGFncyAsT01YX0NPTVBPTkVOVF9MT0FESU5HX1BFTkRJTkcpKSkgewotICAgICAgICBpZiAocmVsZWFzZV9kb25lKCkpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBSZXNldCBidWZmZXIgcmVxdWlyZW1lbnRzIGhlcmUgdG8gZW5zdXJlIHNldHRpbmcgYnVmZmVyIHJlcXVpcmVtZW50Ci0gICAgICAgICAgICAgKiB3aGVuIGNvbXBvbmVudCBtb3ZlIHRvIGV4ZWN1dGluZyBzdGF0ZSBmcm9tIGxvYWRlZCBzdGF0ZSB2aWEgaWRsZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUgPSAwOwotICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQgPSAwOwotCi0gICAgICAgICAgICAvLyBTZW5kIHRoZSBjYWxsYmFjayBub3cKLSAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoKCZtX2ZsYWdzKSxPTVhfQ09NUE9ORU5UX0xPQURJTkdfUEVORElORyk7Ci0gICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9Db21tYW5kU3RhdGVTZXQsIE9NWF9TdGF0ZUxvYWRlZCwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZGVjOjpFbXB0eVRoaXNCdWZmZXIKLQotICAgREVTQ1JJUFRJT04KLSAgIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHB1c2ggdGhlIGVuY29kZWQgdmlkZW8gZnJhbWVzIHRvCi0gICB0aGUgdmlkZW8gZGVjb2Rlci4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBPTVggRXJyb3IgTm9uZSBpZiBldmVyeXRoaW5nIHdlbnQgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZGVjOjplbXB0eV90aGlzX2J1ZmZlcihPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBidWZmZXIpCi17Ci0gICAgT01YX0VSUk9SVFlQRSByZXQxID0gT01YX0Vycm9yTm9uZTsKLSAgICB1bnNpZ25lZCBpbnQgbkJ1ZmZlckluZGV4ID0gZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQ7Ci0KLSAgICBpZiAobV9zdGF0ZSAhPSBPTVhfU3RhdGVFeGVjdXRpbmcgJiYKLSAgICAgICAgICAgIG1fc3RhdGUgIT0gT01YX1N0YXRlUGF1c2UgJiYKLSAgICAgICAgICAgIG1fc3RhdGUgIT0gT01YX1N0YXRlSWRsZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRW1wdHkgdGhpcyBidWZmZXIgaW4gSW52YWxpZCBTdGF0ZSIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgIH0KLQotICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6RVRCIEJ1ZmZlciBpcyBOVUxMIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgaWYgKCFtX2lucF9iRW5hYmxlZCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6RVRCIGluY29ycmVjdCBzdGF0ZSBvcGVyYXRpb24sIGlucHV0IHBvcnQgaXMgZGlzYWJsZWQuIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBpZiAoYnVmZmVyLT5uSW5wdXRQb3J0SW5kZXggIT0gT01YX0NPUkVfSU5QVVRfUE9SVF9JTkRFWCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6RVRCIGludmFsaWQgcG9ydCBpbiBoZWFkZXIgJXUiLCAodW5zaWduZWQgaW50KWJ1ZmZlci0+bklucHV0UG9ydEluZGV4KTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICB9Ci0KLSAgICBpZiAocGVyZl9mbGFnKSB7Ci0gICAgICAgIGlmICghbGF0ZW5jeSkgewotICAgICAgICAgICAgZGVjX3RpbWUuc3RvcCgpOwotICAgICAgICAgICAgbGF0ZW5jeSA9IGRlY190aW1lLnByb2Nlc3NpbmdfdGltZV91cygpOwotICAgICAgICAgICAgZGVjX3RpbWUuc3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChhcmJpdHJhcnlfYnl0ZXMpIHsKLSAgICAgICAgbkJ1ZmZlckluZGV4ID0gYnVmZmVyIC0gbV9pbnBfaGVhcF9wdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGlucHV0X3VzZV9idWZmZXIgPT0gdHJ1ZSkgewotICAgICAgICAgICAgbkJ1ZmZlckluZGV4ID0gYnVmZmVyIC0gbV9pbnBfaGVhcF9wdHI7Ci0gICAgICAgICAgICBpZiAobkJ1ZmZlckluZGV4ID49IGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50ICkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogRVRCIG5CdWZmZXJJbmRleCBpcyBpbnZhbGlkIGluIHVzZS1idWZmZXIgbW9kZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2lucF9tZW1fcHRyW25CdWZmZXJJbmRleF0ubkZpbGxlZExlbiA9IG1faW5wX2hlYXBfcHRyW25CdWZmZXJJbmRleF0ubkZpbGxlZExlbjsKLSAgICAgICAgICAgIG1faW5wX21lbV9wdHJbbkJ1ZmZlckluZGV4XS5uVGltZVN0YW1wID0gbV9pbnBfaGVhcF9wdHJbbkJ1ZmZlckluZGV4XS5uVGltZVN0YW1wOwotICAgICAgICAgICAgbV9pbnBfbWVtX3B0cltuQnVmZmVySW5kZXhdLm5GbGFncyA9IG1faW5wX2hlYXBfcHRyW25CdWZmZXJJbmRleF0ubkZsYWdzOwotICAgICAgICAgICAgYnVmZmVyID0gJm1faW5wX21lbV9wdHJbbkJ1ZmZlckluZGV4XTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiTm9uLUFyYml0cmFyeSBtb2RlIC0gYnVmZmVyIGFkZHJlc3MgaXM6IG1hbGxvYyAlcCwgcG1lbSVwIGluIEluZGV4ICVkLCBidWZmZXIgJXAgb2Ygc2l6ZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICZtX2lucF9oZWFwX3B0cltuQnVmZmVySW5kZXhdLCAmbV9pbnBfbWVtX3B0cltuQnVmZmVySW5kZXhdLG5CdWZmZXJJbmRleCwgYnVmZmVyLCAodW5zaWduZWQgaW50KWJ1ZmZlci0+bkZpbGxlZExlbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuQnVmZmVySW5kZXggPSBidWZmZXIgLSBtX2lucF9tZW1fcHRyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5CdWZmZXJJbmRleCA+PSBkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudCApIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOkVUQiBuQnVmZmVySW5kZXggaXMgaW52YWxpZCIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGlmIChidWZmZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ19mbGFnID0gdHJ1ZTsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCIlczogY29kZWNfY29uZmlnIGJ1ZmZlciIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotCi0gICAgLyogVGhlIGNsaWVudCBzaG91bGQgbm90IHNldCB0aGlzIHdoZW4gY29kZWMgaXMgaW4gYXJiaXRyYXJ5IGJ5dGVzIG1vZGUgKi8KLSAgICBpZiAobV9pbnB1dF9wYXNzX2J1ZmZlcl9mZCkgewotICAgICAgICBidWZmZXItPnBCdWZmZXIgPSAoT01YX1U4KilkcnZfY3R4LnB0cl9pbnB1dGJ1ZmZlcltuQnVmZmVySW5kZXhdLmJ1ZmZlcmFkZHI7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJbRVRCXSBCSGRyKCVwKSBwQnVmKCVwKSBuVFMoJWxsZCkgbkZMKCV1KSIsCi0gICAgICAgICAgICBidWZmZXIsIGJ1ZmZlci0+cEJ1ZmZlciwgYnVmZmVyLT5uVGltZVN0YW1wLCAodW5zaWduZWQgaW50KWJ1ZmZlci0+bkZpbGxlZExlbik7Ci0gICAgaWYgKGFyYml0cmFyeV9ieXRlcykgewotICAgICAgICBwb3N0X2V2ZW50ICgodW5zaWduZWQgbG9uZyloQ29tcCwodW5zaWduZWQgbG9uZylidWZmZXIsCi0gICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVEJfQVJCSVRSQVJZKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwb3N0X2V2ZW50ICgodW5zaWduZWQgbG9uZyloQ29tcCwodW5zaWduZWQgbG9uZylidWZmZXIsT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVEIpOwotICAgIH0KLSAgICB0aW1lX3N0YW1wX2R0cy5pbnNlcnRfdGltZXN0YW1wKGJ1ZmZlcik7Ci0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6ZW1wdHlfdGhpc19idWZmZXJfcHJveHkKLQotICAgREVTQ1JJUFRJT04KLSAgIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHB1c2ggdGhlIGVuY29kZWQgdmlkZW8gZnJhbWVzIHRvCi0gICB0aGUgdmlkZW8gZGVjb2Rlci4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBPTVggRXJyb3IgTm9uZSBpZiBldmVyeXRoaW5nIHdlbnQgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZGVjOjplbXB0eV90aGlzX2J1ZmZlcl9wcm94eShPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wLAotICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIGJ1ZmZlcikKLXsKLSAgICBWSURDX1RSQUNFX05BTUVfSElHSCgiRVRCIik7Ci0gICAgKHZvaWQpIGhDb21wOwotICAgIGludCBwdXNoX2NudCA9IDAsaT0wOwotICAgIHVuc2lnbmVkIG5Qb3J0SW5kZXggPSAwOwotICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICBzdHJ1Y3QgdmRlY19idWZmZXJwYXlsb2FkICp0ZW1wX2J1ZmZlcjsKLSAgICBib29sIHBvcnRfc2V0dGluZ19jaGFuZ2VkID0gdHJ1ZTsKLQotICAgIC8qU2hvdWxkIHdlIGdlbmVyYXRlIGEgQXluYyBlcnJvciBldmVudCovCi0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlci0+cElucHV0UG9ydFByaXZhdGUgPT0gTlVMTCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6ZW1wdHlfdGhpc19idWZmZXJfcHJveHkgaXMgaW52YWxpZCIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIG5Qb3J0SW5kZXggPSBidWZmZXItKChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKW1faW5wX21lbV9wdHIpOwotCi0gICAgaWYgKG5Qb3J0SW5kZXggPj0gZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOmVtcHR5X3RoaXNfYnVmZmVyX3Byb3h5IGludmFsaWQgblBvcnRJbmRleFsldV0iLAotICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIHBlbmRpbmdfaW5wdXRfYnVmZmVycysrOwotICAgIFZJRENfVFJBQ0VfSU5UX0xPVygiRVRCLXBlbmRpbmciLCBwZW5kaW5nX2lucHV0X2J1ZmZlcnMpOwotCi0gICAgLyogcmV0dXJuIHplcm8gbGVuZ3RoIGFuZCBub3QgYW4gRU9TIGJ1ZmZlciAqLwotICAgIGlmICghYXJiaXRyYXJ5X2J5dGVzICYmIChidWZmZXItPm5GaWxsZWRMZW4gPT0gMCkgJiYKLSAgICAgICAgICAgICgoYnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IDApKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goInJldHVybiB6ZXJvIGxlZ3RoIGJ1ZmZlciIpOwotICAgICAgICBwb3N0X2V2ZW50ICgodW5zaWduZWQgbG9uZylidWZmZXIsVkRFQ19TX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoaW5wdXRfZmx1c2hfcHJvZ3Jlc3MgPT0gdHJ1ZSkgewotICAgICAgICBERUJVR19QUklOVF9MT1coIkZsdXNoIGluIHByb2dyZXNzIHJldHVybiBidWZmZXIgIik7Ci0gICAgICAgIHBvc3RfZXZlbnQgKCh1bnNpZ25lZCBsb25nKWJ1ZmZlcixWREVDX1NfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VCRCk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLQotICAgIGF1dG9fbG9jayBsKGJ1Zl9sb2NrKTsKLSAgICB0ZW1wX2J1ZmZlciA9IChzdHJ1Y3QgdmRlY19idWZmZXJwYXlsb2FkICopYnVmZmVyLT5wSW5wdXRQb3J0UHJpdmF0ZTsKLQotICAgIGlmICghdGVtcF9idWZmZXIgfHwgKHRlbXBfYnVmZmVyIC0gIGRydl9jdHgucHRyX2lucHV0YnVmZmVyKSA+IChpbnQpZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQpIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBWSURDX1RSQUNFX0lOVF9MT1coIkVUQi1UUyIsIGJ1ZmZlci0+blRpbWVTdGFtcCAvIDEwMDApOwotICAgIFZJRENfVFJBQ0VfSU5UX0xPVygiRVRCLXNpemUiLCBidWZmZXItPm5GaWxsZWRMZW4pOwotICAgIERFQlVHX1BSSU5UX0xPVygiRVRCUHJveHk6IGJ1ZmhkciA9ICVwLCBidWZoZHItPnBCdWZmZXIgPSAlcCIsIGJ1ZmZlciwgYnVmZmVyLT5wQnVmZmVyKTsKLSAgICAvKmZvciB1c2UgYnVmZmVyIHdlIG5lZWQgdG8gbWVtY3B5IHRoZSBkYXRhKi8KLSAgICB0ZW1wX2J1ZmZlci0+YnVmZmVyX2xlbiA9IGJ1ZmZlci0+bkZpbGxlZExlbjsKLQotICAgIGlmIChpbnB1dF91c2VfYnVmZmVyICYmIHRlbXBfYnVmZmVyLT5idWZmZXJhZGRyICYmICFzZWN1cmVfbW9kZSkgewotICAgICAgICBpZiAoYnVmZmVyLT5uRmlsbGVkTGVuIDw9IHRlbXBfYnVmZmVyLT5idWZmZXJfbGVuKSB7Ci0gICAgICAgICAgICBpZiAoYXJiaXRyYXJ5X2J5dGVzKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5ICh0ZW1wX2J1ZmZlci0+YnVmZmVyYWRkciwgKGJ1ZmZlci0+cEJ1ZmZlciArIGJ1ZmZlci0+bk9mZnNldCksYnVmZmVyLT5uRmlsbGVkTGVuKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5ICh0ZW1wX2J1ZmZlci0+YnVmZmVyYWRkciwgKG1faW5wX2hlYXBfcHRyW25Qb3J0SW5kZXhdLnBCdWZmZXIgKyBtX2lucF9oZWFwX3B0cltuUG9ydEluZGV4XS5uT2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bkZpbGxlZExlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBpZiAoZHJ2X2N0eC5kaXNhYmxlX2RteCAmJiBtX2Rlc2NfYnVmZmVyX3B0ciAmJiBtX2Rlc2NfYnVmZmVyX3B0cltuUG9ydEluZGV4XS5idWZfYWRkcikgewotICAgICAgICBERUJVR19QUklOVF9MT1coIkVUQjogZG14IGVuYWJsZWQiKTsKLSAgICAgICAgaWYgKG1fZGVtdXhfZW50cmllcyA9PSAwKSB7Ci0gICAgICAgICAgICBleHRyYWN0X2RlbXV4X2FkZHJfb2Zmc2V0cyhidWZmZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJFVEI6IGhhbmRsZV9kZW11eF9kYXRhIC0gZW50cmllcz0ldSIsKHVuc2lnbmVkIGludCltX2RlbXV4X2VudHJpZXMpOwotICAgICAgICBoYW5kbGVfZGVtdXhfZGF0YShidWZmZXIpOwotICAgIH0KLQotI2lmZGVmIF9BTkRST0lEXwotICAgIGlmIChtX2RlYnVnX3RpbWVzdGFtcCkgewotICAgICAgICBpZiAoYXJiaXRyYXJ5X2J5dGVzKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkluc2VydGluZyBUSU1FU1RBTVAgKCVsbGQpIGludG8gcXVldWUiLCBidWZmZXItPm5UaW1lU3RhbXApOwotICAgICAgICAgICAgbV90aW1lc3RhbXBfbGlzdC5pbnNlcnRfdHMoYnVmZmVyLT5uVGltZVN0YW1wKTsKLSAgICAgICAgfSBlbHNlIGlmICghYXJiaXRyYXJ5X2J5dGVzICYmICEoYnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiSW5zZXJ0aW5nIFRJTUVTVEFNUCAoJWxsZCkgaW50byBxdWV1ZSIsIGJ1ZmZlci0+blRpbWVTdGFtcCk7Ci0gICAgICAgICAgICBtX3RpbWVzdGFtcF9saXN0Lmluc2VydF90cyhidWZmZXItPm5UaW1lU3RhbXApOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICBsb2dfaW5wdXRfYnVmZmVycygoY29uc3QgY2hhciAqKXRlbXBfYnVmZmVyLT5idWZmZXJhZGRyLCB0ZW1wX2J1ZmZlci0+YnVmZmVyX2xlbik7Ci0KLWlmIChidWZmZXItPm5GbGFncyAmIFFPTVhfVklERU9fQlVGRkVSRkxBR19FT1NFUSkgewotICAgICAgICBidWZmZXItPm5GbGFncyAmPSB+UU9NWF9WSURFT19CVUZGRVJGTEFHX0VPU0VROwotICAgIH0KLQotICAgIGlmICh0ZW1wX2J1ZmZlci0+YnVmZmVyX2xlbiA9PSAwIHx8IChidWZmZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiUnhkIGkvcCBFT1MsIE5vdGlmeSBEcml2ZXIgdGhhdCBFT1MgaGFzIGJlZW4gcmVhY2hlZCIpOwotICAgICAgICBoMjY0X3NjcmF0Y2gubkZpbGxlZExlbiA9IDA7Ci0gICAgICAgIG5hbF9jb3VudCA9IDA7Ci0gICAgICAgIGxvb2tfYWhlYWRfbmFsID0gZmFsc2U7Ci0gICAgICAgIGZyYW1lX2NvdW50ID0gMDsKLSAgICAgICAgaDI2NF9sYXN0X2F1X3RzID0gTExPTkdfTUFYOwotICAgICAgICBoMjY0X2xhc3RfYXVfZmxhZ3MgPSAwOwotICAgICAgICBtZW1zZXQobV9kZW11eF9vZmZzZXRzLCAwLCAoIHNpemVvZihPTVhfVTMyKSAqIDgxOTIpICk7Ci0gICAgICAgIG1fZGVtdXhfZW50cmllcyA9IDA7Ci0gICAgfQotICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWY7Ci0gICAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmU7Ci0gICAgbWVtc2V0KCAodm9pZCAqKSZidWYsIDAsIHNpemVvZihidWYpKTsKLSAgICBtZW1zZXQoICh2b2lkICopJnBsYW5lLCAwLCBzaXplb2YocGxhbmUpKTsKLSAgICBpbnQgcmM7Ci0gICAgdW5zaWduZWQgbG9uZyAgcHJpbnRfY291bnQ7Ci0gICAgaWYgKHRlbXBfYnVmZmVyLT5idWZmZXJfbGVuID09IDAgfHwgKGJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgewotICAgICAgICBidWYuZmxhZ3MgPSBWNEwyX1FDT01fQlVGX0ZMQUdfRU9TOwotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJJTlBVVCBFT1MgcmVhY2hlZCIpIDsKLSAgICB9Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICBidWYuaW5kZXggPSBuUG9ydEluZGV4OwotICAgIGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgIGJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOwotICAgIHBsYW5lLmJ5dGVzdXNlZCA9IHRlbXBfYnVmZmVyLT5idWZmZXJfbGVuOwotICAgIHBsYW5lLmxlbmd0aCA9IGRydl9jdHguaXBfYnVmLmJ1ZmZlcl9zaXplOwotICAgIHBsYW5lLm0udXNlcnB0ciA9ICh1bnNpZ25lZCBsb25nKXRlbXBfYnVmZmVyLT5idWZmZXJhZGRyIC0KLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpdGVtcF9idWZmZXItPm9mZnNldDsKLSAgICBwbGFuZS5yZXNlcnZlZFswXSA9IHRlbXBfYnVmZmVyLT5wbWVtX2ZkOwotICAgIHBsYW5lLnJlc2VydmVkWzFdID0gdGVtcF9idWZmZXItPm9mZnNldDsKLSAgICBwbGFuZS5kYXRhX29mZnNldCA9IDA7Ci0gICAgYnVmLm0ucGxhbmVzID0gJnBsYW5lOwotICAgIGJ1Zi5sZW5ndGggPSAxOwotICAgIGlmIChidWZmZXItPm5UaW1lU3RhbXAgPj0gTExPTkdfTUFYKSB7Ci0gICAgICAgIGJ1Zi5mbGFncyB8PSBWNEwyX1FDT01fQlVGX1RJTUVTVEFNUF9JTlZBTElEOwotICAgIH0KLSAgICAvL2Fzc3VtcHRpb24gaXMgdGhhdCB0aW1lc3RhbXAgaXMgaW4gbWlsbGlzZWNvbmRzCi0gICAgYnVmLnRpbWVzdGFtcC50dl9zZWMgPSBidWZmZXItPm5UaW1lU3RhbXAgLyAxMDAwMDAwOwotICAgIGJ1Zi50aW1lc3RhbXAudHZfdXNlYyA9IChidWZmZXItPm5UaW1lU3RhbXAgJSAxMDAwMDAwKTsKLSAgICBidWYuZmxhZ3MgfD0gKGJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpID8gVjRMMl9RQ09NX0JVRl9GTEFHX0NPREVDQ09ORklHOiAwOwotICAgIGJ1Zi5mbGFncyB8PSAoYnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19ERUNPREVPTkxZKSA/IFY0TDJfUUNPTV9CVUZfRkxBR19ERUNPREVPTkxZOiAwOwotCi0gICAgaWYgKGJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJJbmNyZW1lbnQgY29kZWNfY29uZmlnIGJ1ZmZlciBjb3VudGVyIik7Ci0gICAgICAgIGFuZHJvaWRfYXRvbWljX2luYygmbV9xdWV1ZWRfY29kZWNfY29uZmlnX2NvdW50KTsKLSAgICB9Ci0KLSAgICByYyA9IGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfUUJVRiwgJmJ1Zik7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gcWJ1ZiBJbnB1dCBidWZmZXIgdG8gZHJpdmVyLCBzZW5kIEVUQiBiYWNrIHRvIGNsaWVudCIpOwotICAgICAgICBtX2NiLkVtcHR5QnVmZmVyRG9uZShoQ29tcCwgbV9hcHBfZGF0YSwgYnVmZmVyKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckhhcmR3YXJlOwotICAgIH0KLQotICAgIGlmIChjb2RlY19jb25maWdfZmxhZyAmJiAhKGJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpKSB7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ19mbGFnID0gZmFsc2U7Ci0gICAgfQotICAgIGlmICghc3RyZWFtaW5nW09VVFBVVF9QT1JUXSkgewotICAgICAgICBlbnVtIHY0bDJfYnVmX3R5cGUgYnVmX3R5cGU7Ci0gICAgICAgIGludCByZXQscjsKLQotICAgICAgICBidWZfdHlwZT1WNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygic2VuZF9jb21tYW5kX3Byb3h5KCk6IElkbGUtLT5FeGVjdXRpbmciKTsKLSAgICAgICAgcmV0PWlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU1RSRUFNT04sJmJ1Zl90eXBlKTsKLSAgICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlN0cmVhbW9uIG9uIE9VVFBVVCBQbGFuZSB3YXMgc3VjY2Vzc2Z1bCIpOwotICAgICAgICAgICAgc3RyZWFtaW5nW09VVFBVVF9QT1JUXSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJybm8gPT0gRUJVU1kpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gY2FsbCBzdHJlYW0gb24gT1VUUFVUIGR1ZSB0byBIV19PVkVSTE9BRCIpOwotICAgICAgICAgICAgcG9zdF9ldmVudCAoKHVuc2lnbmVkIGxvbmcpYnVmZmVyLCBWREVDX1NfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gY2FsbCBzdHJlYW1vbiBvbiBPVVRQVVQiKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiSWYgU3RyZWFtIG9uIGZhaWxlZCBubyBidWZmZXIgc2hvdWxkIGJlIHF1ZXVlZCIpOwotICAgICAgICAgICAgcG9zdF9ldmVudCAoKHVuc2lnbmVkIGxvbmcpYnVmZmVyLCBWREVDX1NfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICBERUJVR19QUklOVF9MT1coIltFVEJQXSBwQnVmKCVwKSBuVFMoJWxsZCkgU3ooJXUpIiwKLSAgICAgICAgICAgIHRlbXBfYnVmZmVyLT5idWZmZXJhZGRyLCAobG9uZyBsb25nKWJ1ZmZlci0+blRpbWVTdGFtcCwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpdGVtcF9idWZmZXItPmJ1ZmZlcl9sZW4pOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZGVjOjpGaWxsVGhpc0J1ZmZlcgotCi0gICBERVNDUklQVElPTgotICAgSUwgY2xpZW50IHVzZXMgdGhpcyBtZXRob2QgdG8gcmVsZWFzZSB0aGUgZnJhbWUgYnVmZmVyCi0gICBhZnRlciBkaXNwbGF5aW5nIHRoZW0uCi0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUuCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgdHJ1ZS9mYWxzZQotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZkZWM6OmZpbGxfdGhpc19idWZmZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFICBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBidWZmZXIpCi17Ci0gICAgaWYgKG1fc3RhdGUgIT0gT01YX1N0YXRlRXhlY3V0aW5nICYmCi0gICAgICAgICAgICBtX3N0YXRlICE9IE9NWF9TdGF0ZVBhdXNlICYmCi0gICAgICAgICAgICBtX3N0YXRlICE9IE9NWF9TdGF0ZUlkbGUpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZUQiBpbiBJbnZhbGlkIFN0YXRlIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotCi0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlci0+bk91dHB1dFBvcnRJbmRleCAhPSBPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6RlRCIGludmFsaWQgYnVmZmVyICVwIG9yIFBvcnRJbmRleCAtICVkIiwKLSAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlciA/IChpbnQpYnVmZmVyLT5uT3V0cHV0UG9ydEluZGV4IDogLTEpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgIH0KLQotICAgIGlmICghbV9vdXRfYkVuYWJsZWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOkZUQiBpbmNvcnJlY3Qgc3RhdGUgb3BlcmF0aW9uLCBvdXRwdXQgcG9ydCBpcyBkaXNhYmxlZC4iKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOwotICAgIH0KLQotICAgIHVuc2lnbmVkIG5Qb3J0SW5kZXggPSAwOwotICAgIGlmIChkeW5hbWljX2J1Zl9tb2RlKSB7Ci0gICAgICAgIHByaXZhdGVfaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHN0cnVjdCBWaWRlb0RlY29kZXJPdXRwdXRNZXRhRGF0YSAqbWV0YTsKLSAgICAgICAgdW5zaWduZWQgaW50IG5Qb3J0SW5kZXggPSAwOwotCi0gICAgICAgIGlmICghYnVmZmVyIHx8ICFidWZmZXItPnBCdWZmZXIpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlczogaW52YWxpZCBwYXJhbXM6ICVwIiwgX19GVU5DVElPTl9fLCBidWZmZXIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vZ2V0IHRoZSBidWZmZXIgdHlwZSBhbmQgZmQgaW5mbwotICAgICAgICBtZXRhID0gKHN0cnVjdCBWaWRlb0RlY29kZXJPdXRwdXRNZXRhRGF0YSAqKWJ1ZmZlci0+cEJ1ZmZlcjsKLSAgICAgICAgaGFuZGxlID0gKHByaXZhdGVfaGFuZGxlX3QgKiltZXRhLT5wSGFuZGxlOwotICAgICAgICBERUJVR19QUklOVF9MT1coIkZUQjogbWV0YWJ1ZjogJXAgYnVmdHlwZTogJWQgYnVmaG5kbDogJXAgIiwgbWV0YSwgbWV0YS0+ZVR5cGUsIG1ldGEtPnBIYW5kbGUpOwotCi0gICAgICAgIGlmICghaGFuZGxlKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRlRCOiBFcnJvcjogSUwgY2xpZW50IHBhc3NlZCBhbiBpbnZhbGlkIGJ1ZiBoYW5kbGUgLSAlcCIsIGhhbmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9Ci0gICAgICAgIC8vRmlsbCBvdXRwdXRidWZmZXIgd2l0aCBidWZmZXIgZGV0YWlscywgdGhpcyB3aWxsIGJlIHNlbnQgdG8gZi93IGR1cmluZyBWSURJT0NfUUJVRgotICAgICAgICBuUG9ydEluZGV4ID0gYnVmZmVyLSgoT01YX0JVRkZFUkhFQURFUlRZUEUgKiljbGllbnRfYnVmZmVycy5nZXRfaWxfYnVmX2hkcigpKTsKLSAgICAgICAgaWYgKG5Qb3J0SW5kZXggPCBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCAmJgotICAgICAgICAgICAgblBvcnRJbmRleCA8IE1BWF9OVU1fSU5QVVRfT1VUUFVUX0JVRkZFUlMpIHsKLSAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltuUG9ydEluZGV4XS5wbWVtX2ZkID0gaGFuZGxlLT5mZDsKLSAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltuUG9ydEluZGV4XS5idWZmZXJhZGRyID0gKE9NWF9VOCopIGJ1ZmZlcjsKLQotICAgICAgICAgICAvL1N0b3JlIHByaXZhdGUgaGFuZGxlIGZyb20gR3JhcGhpY0J1ZmZlcgotICAgICAgICAgICAgbmF0aXZlX2J1ZmZlcltuUG9ydEluZGV4XS5wcml2YXRlaGFuZGxlID0gaGFuZGxlOwotICAgICAgICAgICAgbmF0aXZlX2J1ZmZlcltuUG9ydEluZGV4XS5uYXRpdmVoYW5kbGUgPSBoYW5kbGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiW0ZUQl1JbnZhbGlkIG5hdGl2ZV9idWZmZXIgaW5kZXg6ICVkIiwgblBvcnRJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9idWZmZXItPm5BbGxvY0xlbiB3aWxsIGJlIHNpemVvZihzdHJ1Y3QgVmlkZW9EZWNvZGVyT3V0cHV0TWV0YURhdGEpLiBPdmVyd3JpdGUKLSAgICAgICAgLy90aGlzIHdpdGggYSBtb3JlIHNhbmUgc2l6ZSBzbyB0aGF0IHdlIGRvbid0IGNvbXBlbnNhdGUgaW4gcmVzdCBvZiBjb2RlCi0gICAgICAgIC8vV2UnbGwgcmVzdG9yZSB0aGlzIHNpemUgbGF0ZXIgb24sIHNvIHRoYXQgaXQncyB0cmFuc3BhcmVudCB0byBjbGllbnQKLSAgICAgICAgYnVmZmVyLT5uRmlsbGVkTGVuID0gMDsKLSAgICAgICAgYnVmZmVyLT5uQWxsb2NMZW4gPSBoYW5kbGUtPnNpemU7Ci0KLSAgICAgICAgaWYgKGhhbmRsZS0+ZmxhZ3MgJiBwcml2YXRlX2hhbmRsZV90OjpQUklWX0ZMQUdTX0RJU1BfQ09OU1VNRVIpIHsKLSAgICAgICAgICAgIG1faXNfZGlzcGxheV9zZXNzaW9uID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1faXNfZGlzcGxheV9zZXNzaW9uID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCIlczogbV9pc19kaXNwbGF5X3Nlc3Npb24gPSAlZCIsIF9fZnVuY19fLCBtX2lzX2Rpc3BsYXlfc2Vzc2lvbik7Ci0KLSAgICAgICAgZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUgPSBoYW5kbGUtPnNpemU7Ci0gICAgfQotCi0gICAgblBvcnRJbmRleCA9IGJ1ZmZlciAtIGNsaWVudF9idWZmZXJzLmdldF9pbF9idWZfaGRyKCk7Ci0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAoblBvcnRJbmRleCA+PSBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZUQjogRVJST1I6IGludmFsaWQgYnVmZmVyIGluZGV4LCBuUG9ydEluZGV4ICV1IGJ1ZkNvdW50ICV1IiwKLSAgICAgICAgICAgIG5Qb3J0SW5kZXgsIGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50KTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIltGVEJdIGJ1ZmhkciA9ICVwLCBidWZoZHItPnBCdWZmZXIgPSAlcCIsIGJ1ZmZlciwgYnVmZmVyLT5wQnVmZmVyKTsKLSAgICBwb3N0X2V2ZW50KCh1bnNpZ25lZCBsb25nKSBoQ29tcCwgKHVuc2lnbmVkIGxvbmcpYnVmZmVyLCBtX2ZpbGxfb3V0cHV0X21zZyk7Ci0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6OmZpbGxfdGhpc19idWZmZXJfcHJveHkKLQotICAgREVTQ1JJUFRJT04KLSAgIElMIGNsaWVudCB1c2VzIHRoaXMgbWV0aG9kIHRvIHJlbGVhc2UgdGhlIGZyYW1lIGJ1ZmZlcgotICAgYWZ0ZXIgZGlzcGxheWluZyB0aGVtLgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UKLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZGVjOjpmaWxsX3RoaXNfYnVmZmVyX3Byb3h5KAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgIGhDb21wLAotICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIGJ1ZmZlckFkZCkKLXsKLSAgICBWSURDX1RSQUNFX05BTUVfSElHSCgiRlRCIik7Ci0gICAgT01YX0VSUk9SVFlQRSBuUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyID0gYnVmZmVyQWRkOwotICAgIHVuc2lnbmVkIG5Qb3J0SW5kZXggPSAwOwotICAgIHN0cnVjdCB2ZGVjX2J1ZmZlcnBheWxvYWQgICAgICpwdHJfb3V0cHV0YnVmZmVyID0gTlVMTDsKLSAgICBzdHJ1Y3QgdmRlY19vdXRwdXRfZnJhbWVpbmZvICAqcHRyX3Jlc3BidWZmZXIgPSBOVUxMOwotCi0gICAgblBvcnRJbmRleCA9IGJ1ZmZlci0oKE9NWF9CVUZGRVJIRUFERVJUWVBFICopY2xpZW50X2J1ZmZlcnMuZ2V0X2lsX2J1Zl9oZHIoKSk7Ci0KLSAgICBpZiAoYnVmZmVyQWRkID09IE5VTEwgfHwgblBvcnRJbmRleCA+PSBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRlRCUHJveHk6IEVSUk9SOiBpbnZhbGlkIGJ1ZmZlciBpbmRleCwgblBvcnRJbmRleCAldSBidWZDb3VudCAldSIsCi0gICAgICAgICAgICBuUG9ydEluZGV4LCBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJGVEJQcm94eTogYnVmaGRyID0gJXAsIGJ1Zmhkci0+cEJ1ZmZlciA9ICVwIiwKLSAgICAgICAgICAgIGJ1ZmZlckFkZCwgYnVmZmVyQWRkLT5wQnVmZmVyKTsKLSAgICAvKlJldHVybiBiYWNrIHRoZSBvdXRwdXQgYnVmZmVyIHRvIGNsaWVudCovCi0gICAgaWYgKG1fb3V0X2JFbmFibGVkICE9IE9NWF9UUlVFIHx8IG91dHB1dF9mbHVzaF9wcm9ncmVzcyA9PSB0cnVlIHx8IGluX3JlY29uZmlnKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiT3V0cHV0IEJ1ZmZlcnMgcmV0dXJuIGZsdXNoL2Rpc2FibGUgY29uZGl0aW9uIik7Ci0gICAgICAgIGJ1ZmZlci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgIG1fY2IuRmlsbEJ1ZmZlckRvbmUgKGhDb21wLG1fYXBwX2RhdGEsYnVmZmVyKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgaWYgKGR5bmFtaWNfYnVmX21vZGUpIHsKLSAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW25Qb3J0SW5kZXhdLm9mZnNldCA9IDA7Ci0gICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltuUG9ydEluZGV4XS5idWZmZXJfbGVuID0gYnVmZmVyLT5uQWxsb2NMZW47Ci0gICAgICAgIGJ1Zl9yZWZfYWRkKG5Qb3J0SW5kZXgpOwotICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbblBvcnRJbmRleF0ubW1hcGVkX3NpemUgPSBidWZmZXItPm5BbGxvY0xlbjsKLSAgICB9Ci0KLSAgICBwZW5kaW5nX291dHB1dF9idWZmZXJzKys7Ci0gICAgVklEQ19UUkFDRV9JTlRfTE9XKCJGVEItcGVuZGluZyIsIHBlbmRpbmdfb3V0cHV0X2J1ZmZlcnMpOwotICAgIGJ1ZmZlciA9IGNsaWVudF9idWZmZXJzLmdldF9kcl9idWZfaGRyKGJ1ZmZlckFkZCk7Ci0gICAgaWYgKCFidWZmZXIpIHsKLSAgICAgICBERUJVR19QUklOVF9FUlJPUigiZXJyOiBjbGllbnRfYnVmZmVyIHB0ciBpbnZhbGlkIik7Ci0gICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgcHRyX3Jlc3BidWZmZXIgPSAoc3RydWN0IHZkZWNfb3V0cHV0X2ZyYW1laW5mbyopYnVmZmVyLT5wT3V0cHV0UG9ydFByaXZhdGU7Ci0gICAgaWYgKHB0cl9yZXNwYnVmZmVyKSB7Ci0gICAgICAgIHB0cl9vdXRwdXRidWZmZXIgPSAgKHN0cnVjdCB2ZGVjX2J1ZmZlcnBheWxvYWQqKXB0cl9yZXNwYnVmZmVyLT5jbGllbnRfZGF0YTsKLSAgICB9Ci0KLSAgICBpZiAocHRyX3Jlc3BidWZmZXIgPT0gTlVMTCB8fCBwdHJfb3V0cHV0YnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInJlc3AgYnVmZmVyIG9yIG91dHB1dGJ1ZmZlciBpcyBOVUxMIik7Ci0gICAgICAgIGJ1ZmZlci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgIG1fY2IuRmlsbEJ1ZmZlckRvbmUgKGhDb21wLG1fYXBwX2RhdGEsYnVmZmVyKTsKLSAgICAgICAgcGVuZGluZ19vdXRwdXRfYnVmZmVycy0tOwotICAgICAgICBWSURDX1RSQUNFX0lOVF9MT1coIkZUQi1wZW5kaW5nIiwgcGVuZGluZ19vdXRwdXRfYnVmZmVycyk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgaW50IHJjID0gMDsKLSAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmOwotICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lW1ZJREVPX01BWF9QTEFORVNdOwotICAgIG1lbXNldCggKHZvaWQgKikmYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0gICAgbWVtc2V0KCAodm9pZCAqKXBsYW5lLCAwLCAoc2l6ZW9mKHN0cnVjdCB2NGwyX3BsYW5lKSpWSURFT19NQVhfUExBTkVTKSk7Ci0gICAgdW5zaWduZWQgaW50IGV4dHJhX2lkeCA9IDA7Ci0KLSAgICBidWYuaW5kZXggPSBuUG9ydEluZGV4OwotICAgIGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICBidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICBwbGFuZVswXS5ieXRlc3VzZWQgPSBidWZmZXItPm5GaWxsZWRMZW47Ci0gICAgcGxhbmVbMF0ubGVuZ3RoID0gYnVmZmVyLT5uQWxsb2NMZW47Ci0gICAgcGxhbmVbMF0ubS51c2VycHRyID0KLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW25Qb3J0SW5kZXhdLmJ1ZmZlcmFkZHIgLQotICAgICAgICAodW5zaWduZWQgbG9uZylkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbblBvcnRJbmRleF0ub2Zmc2V0OwotICAgIHBsYW5lWzBdLnJlc2VydmVkWzBdID0gZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW25Qb3J0SW5kZXhdLnBtZW1fZmQ7Ci0gICAgcGxhbmVbMF0ucmVzZXJ2ZWRbMV0gPSBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbblBvcnRJbmRleF0ub2Zmc2V0OwotICAgIHBsYW5lWzBdLmRhdGFfb2Zmc2V0ID0gMDsKLSAgICBleHRyYV9pZHggPSBFWFRSQURBVEFfSURYKGRydl9jdHgubnVtX3BsYW5lcyk7Ci0gICAgaWYgKGV4dHJhX2lkeCAmJiAoZXh0cmFfaWR4IDwgVklERU9fTUFYX1BMQU5FUykpIHsKLSAgICAgICAgcGxhbmVbZXh0cmFfaWR4XS5ieXRlc3VzZWQgPSAwOwotICAgICAgICBwbGFuZVtleHRyYV9pZHhdLmxlbmd0aCA9IGRydl9jdHguZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemU7Ci0gICAgICAgIHBsYW5lW2V4dHJhX2lkeF0ubS51c2VycHRyID0gKGxvbmcgdW5zaWduZWQgaW50KSAoZHJ2X2N0eC5leHRyYWRhdGFfaW5mby51YWRkciArIG5Qb3J0SW5kZXggKiBkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLmJ1ZmZlcl9zaXplKTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgIHBsYW5lW2V4dHJhX2lkeF0ucmVzZXJ2ZWRbMF0gPSBkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLmlvbi5mZF9pb25fZGF0YS5mZDsKLSNlbmRpZgotICAgICAgICBwbGFuZVtleHRyYV9pZHhdLnJlc2VydmVkWzFdID0gblBvcnRJbmRleCAqIGRydl9jdHguZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemU7Ci0gICAgICAgIHBsYW5lW2V4dHJhX2lkeF0uZGF0YV9vZmZzZXQgPSAwOwotICAgIH0gZWxzZSBpZiAoZXh0cmFfaWR4ID49IFZJREVPX01BWF9QTEFORVMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkV4dHJhZGF0YSBpbmRleCBoaWdoZXIgdGhhbiBleHBlY3RlZDogJXUiLCBleHRyYV9pZHgpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICBidWYubS5wbGFuZXMgPSBwbGFuZTsKLSAgICBidWYubGVuZ3RoID0gZHJ2X2N0eC5udW1fcGxhbmVzOwotICAgIERFQlVHX1BSSU5UX0xPVygiU0VORElORyBGVEIgVE8gRi9XIC0gZmRbMF0gPSAlZCBmZFsxXSA9ICVkIG9mZnNldFsxXSA9ICVkIGluX2ZsdXNoID0gJWQiLAotICAgICAgICAgICAgIHBsYW5lWzBdLnJlc2VydmVkWzBdLHBsYW5lW2V4dHJhX2lkeF0ucmVzZXJ2ZWRbMF0sIHBsYW5lW2V4dHJhX2lkeF0ucmVzZXJ2ZWRbMV0sIG91dHB1dF9mbHVzaF9wcm9ncmVzcyk7Ci0KLSAgICByYyA9IGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfUUJVRiwgJmJ1Zik7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIGJ1ZmZlci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gcWJ1ZiB0byBkcml2ZXIsIGVycm9yICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgbV9jYi5GaWxsQnVmZmVyRG9uZShoQ29tcCwgbV9hcHBfZGF0YSwgYnVmZmVyKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckhhcmR3YXJlOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6OlNldENhbGxiYWNrcwotCi0gICBERVNDUklQVElPTgotICAgU2V0IHRoZSBjYWxsYmFja3MuCi0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUuCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgT01YIEVycm9yIE5vbmUgaWYgZXZlcnl0aGluZyBzdWNjZXNzZnVsLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZkZWM6OnNldF9jYWxsYmFja3MoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9DQUxMQkFDS1RZUEUqIGNhbGxiYWNrcywKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgYXBwRGF0YSkKLXsKLSAgICAodm9pZCkgaENvbXA7Ci0gICAgbV9jYiAgICAgICA9ICpjYWxsYmFja3M7Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsYmFja3MgU2V0ICVwICVwICVwIixtX2NiLkVtcHR5QnVmZmVyRG9uZSxcCi0gICAgICAgICAgICBtX2NiLkV2ZW50SGFuZGxlcixtX2NiLkZpbGxCdWZmZXJEb25lKTsKLSAgICBtX2FwcF9kYXRhID0gICAgYXBwRGF0YTsKLSAgICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6Q29tcG9uZW50RGVJbml0Ci0KLSAgIERFU0NSSVBUSU9OCi0gICBEZXN0cm95cyB0aGUgY29tcG9uZW50IGFuZCByZWxlYXNlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gdGhlIGhlYXAuCi0KLSAgIFBBUkFNRVRFUlMKLSAgIDxUQkQ+LgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIE9NWCBFcnJvciBOb25lIGlmIGV2ZXJ5dGhpbmcgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZGVjOjpjb21wb25lbnRfZGVpbml0KE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcCkKLXsKLSAgICh2b2lkKSBoQ29tcDsKLQotICAgIHVuc2lnbmVkIGkgPSAwOwotICAgIGlmIChPTVhfU3RhdGVMb2FkZWQgIT0gbV9zdGF0ZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiV0FSTklORzpSeGQgRGVJbml0LE9NWCBub3QgaW4gTE9BREVEIHN0YXRlICVkIixcCi0gICAgICAgICAgICAgICAgbV9zdGF0ZSk7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJQbGF5YmFjayBFbmRlZCAtIEZBSUxFRCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlBsYXliYWNrIEVuZGVkIC0gUEFTU0VEIik7Ci0gICAgfQotCi0gICAgLypDaGVjayBpZiB0aGUgb3V0cHV0IGJ1ZmZlcnMgaGF2ZSB0byBiZSBjbGVhbmVkIHVwKi8KLSAgICBpZiAobV9vdXRfbWVtX3B0cikgewotICAgICAgICBERUJVR19QUklOVF9MT1coIkZyZWVpbmcgdGhlIE91dHB1dCBNZW1vcnkiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50OyBpKysgKSB7Ci0gICAgICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCZtX291dF9ibV9jb3VudCwgaSkpIHsKLSAgICAgICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCZtX291dF9ibV9jb3VudCwgaSk7Ci0gICAgICAgICAgICAgICAgY2xpZW50X2J1ZmZlcnMuZnJlZV9vdXRwdXRfYnVmZmVyICgmbV9vdXRfbWVtX3B0cltpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZWxlYXNlX291dHB1dF9kb25lKCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2lmZGVmIF9BTkRST0lEX0lDU18KLSAgICAgICAgbWVtc2V0KCZuYXRpdmVfYnVmZmVyLCAwLCAoc2l6ZW9mKG5hdGl2ZWJ1ZmZlcikgKiBNQVhfTlVNX0lOUFVUX09VVFBVVF9CVUZGRVJTKSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICAvKkNoZWNrIGlmIHRoZSBpbnB1dCBidWZmZXJzIGhhdmUgdG8gYmUgY2xlYW5lZCB1cCovCi0gICAgaWYgKG1faW5wX21lbV9wdHIgfHwgbV9pbnBfaGVhcF9wdHIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlaW5nIHRoZSBJbnB1dCBNZW1vcnkiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaTxkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudDsgaSsrICkgewotCi0gICAgICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCZtX2lucF9ibV9jb3VudCwgaSkpIHsKLSAgICAgICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCZtX2lucF9ibV9jb3VudCwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1faW5wX21lbV9wdHIpCi0gICAgICAgICAgICAgICAgICAgIGZyZWVfaW5wdXRfYnVmZmVyIChpLCZtX2lucF9tZW1fcHRyW2ldKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZyZWVfaW5wdXRfYnVmZmVyIChpLE5VTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVsZWFzZV9pbnB1dF9kb25lKCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgfQotICAgIGZyZWVfaW5wdXRfYnVmZmVyX2hlYWRlcigpOwotICAgIGZyZWVfb3V0cHV0X2J1ZmZlcl9oZWFkZXIoKTsKLSAgICBpZiAoaDI2NF9zY3JhdGNoLnBCdWZmZXIpIHsKLSAgICAgICAgZnJlZShoMjY0X3NjcmF0Y2gucEJ1ZmZlcik7Ci0gICAgICAgIGgyNjRfc2NyYXRjaC5wQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobV9wbGF0Zm9ybV9saXN0KSB7Ci0gICAgICAgIGZyZWUobV9wbGF0Zm9ybV9saXN0KTsKLSAgICAgICAgbV9wbGF0Zm9ybV9saXN0ID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fdmVuZG9yX2NvbmZpZy5wRGF0YSkgewotICAgICAgICBmcmVlKG1fdmVuZG9yX2NvbmZpZy5wRGF0YSk7Ci0gICAgICAgIG1fdmVuZG9yX2NvbmZpZy5wRGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgLy8gUmVzZXQgY291bnRlcnMgaW4gbWVzZyBxdWV1ZXMKLSAgICBtX2Z0Yl9xLm1fc2l6ZT0wOwotICAgIG1fY21kX3EubV9zaXplPTA7Ci0gICAgbV9ldGJfcS5tX3NpemU9MDsKLSAgICBtX2Z0Yl9xLm1fcmVhZCA9IG1fZnRiX3EubV93cml0ZSA9MDsKLSAgICBtX2NtZF9xLm1fcmVhZCA9IG1fY21kX3EubV93cml0ZSA9MDsKLSAgICBtX2V0Yl9xLm1fcmVhZCA9IG1fZXRiX3EubV93cml0ZSA9MDsKLSNpZmRlZiBfQU5EUk9JRF8KLSAgICBpZiAobV9kZWJ1Z190aW1lc3RhbXApIHsKLSAgICAgICAgbV90aW1lc3RhbXBfbGlzdC5yZXNldF90c19saXN0KCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBERUJVR19QUklOVF9MT1coIkNhbGxpbmcgVkRFQ19JT0NUTF9TVE9QX05FWFRfTVNHIik7Ci0gICAgLy8odm9pZClpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVkRFQ19JT0NUTF9TVE9QX05FWFRfTVNHLAotICAgIC8vIE5VTEwpOwotICAgIERFQlVHX1BSSU5UX0hJR0goIkNsb3NlIHRoZSBkcml2ZXIgaW5zdGFuY2UiKTsKLQotICAgIGlmIChtX2RlYnVnLmluZmlsZSkgewotICAgICAgICBmY2xvc2UobV9kZWJ1Zy5pbmZpbGUpOwotICAgICAgICBtX2RlYnVnLmluZmlsZSA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChtX2RlYnVnLm91dGZpbGUpIHsKLSAgICAgICAgZmNsb3NlKG1fZGVidWcub3V0ZmlsZSk7Ci0gICAgICAgIG1fZGVidWcub3V0ZmlsZSA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChtX2RlYnVnLm91dF95bWV0YV9maWxlKSB7Ci0gICAgICAgIGZjbG9zZShtX2RlYnVnLm91dF95bWV0YV9maWxlKTsKLSAgICAgICAgbV9kZWJ1Zy5vdXRfeW1ldGFfZmlsZSA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChtX2RlYnVnLm91dF91dm1ldGFfZmlsZSkgewotICAgICAgICBmY2xvc2UobV9kZWJ1Zy5vdXRfdXZtZXRhX2ZpbGUpOwotICAgICAgICBtX2RlYnVnLm91dF91dm1ldGFfZmlsZSA9IE5VTEw7Ci0gICAgfQotI2lmZGVmIE9VVFBVVF9FWFRSQURBVEFfTE9HCi0gICAgaWYgKG91dHB1dEV4dHJhZGF0YUZpbGUpCi0gICAgICAgIGZjbG9zZSAob3V0cHV0RXh0cmFkYXRhRmlsZSk7Ci0jZW5kaWYKLSAgICBERUJVR19QUklOVF9JTkZPKCJvbXhfdmRlYzo6Y29tcG9uZW50X2RlaW5pdCgpIGNvbXBsZXRlIik7Ci0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6VXNlRUdMSW1hZ2UKLQotICAgREVTQ1JJUFRJT04KLSAgIE9NWCBVc2UgRUdMIEltYWdlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiA8VEJEPi4KLQotICAgUEFSQU1FVEVSUwotICAgPFRCRD4uCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgTm90IEltcGxlbWVudGVkIGVycm9yLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZkZWM6OnVzZV9FR0xfaW1hZ2UoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogYnVmZmVySGRyLAotICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgT01YX0lOIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIGVnbEltYWdlKQotewotICAgICh2b2lkKSBhcHBEYXRhOwotICAgIE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfTElTVCBwbWVtX2xpc3Q7Ci0gICAgT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9FTlRSWSBwbWVtX2VudHJ5OwotICAgIE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfUE1FTV9JTkZPIHBtZW1faW5mbzsKLQotI2lmZGVmIFVTRV9FR0xfSU1BR0VfR1BVCi0gICAgUEZORUdMUVVFUllJTUFHRVFVQUxDT01NUFJPQyBlZ2xfcXVlcnlmdW5jOwotICAgIEVHTGludCBmZCA9IC0xLCBvZmZzZXQgPSAwLHBtZW1QdHIgPSAwOwotI2Vsc2UKLSAgICBpbnQgZmQgPSAtMSwgb2Zmc2V0ID0gMDsKLSNlbmRpZgotICAgIERFQlVHX1BSSU5UX0hJR0goInVzZSBFR0wgaW1hZ2Ugc3VwcG9ydCBmb3IgZGVjb2RlciIpOwotICAgIGlmICghYnVmZmVySGRyIHx8ICFlZ2xJbWFnZXx8IHBvcnQgIT0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgRUdMIGltYWdlIik7Ci0gICAgfQotI2lmZGVmIFVTRV9FR0xfSU1BR0VfR1BVCi0gICAgaWYgKG1fZGlzcGxheV9pZCA9PSBOVUxMKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJEaXNwbGF5IElEIGlzIG5vdCBzZXQgYnkgSUwgY2xpZW50Iik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgfQotICAgIGVnbF9xdWVyeWZ1bmMgPSAoUEZORUdMUVVFUllJTUFHRVFVQUxDT01NUFJPQykKLSAgICAgICAgZWdsR2V0UHJvY0FkZHJlc3MoImVnbFF1ZXJ5SW1hZ2VLSFIiKTsKLSAgICBlZ2xfcXVlcnlmdW5jKG1fZGlzcGxheV9pZCwgZWdsSW1hZ2UsIEVHTF9CVUZGRVJfSEFORExFLCAmZmQpOwotICAgIGVnbF9xdWVyeWZ1bmMobV9kaXNwbGF5X2lkLCBlZ2xJbWFnZSwgRUdMX0JVRkZFUl9PRkZTRVQsICZvZmZzZXQpOwotICAgIGVnbF9xdWVyeWZ1bmMobV9kaXNwbGF5X2lkLCBlZ2xJbWFnZSwgRUdMX0JJVE1BUF9QT0lOVEVSX0tIUiwgJnBtZW1QdHIpOwotI2Vsc2UgLy93aXRoIE9NWCB0ZXN0IGFwcAotICAgIHN0cnVjdCB0ZW1wX2VnbCB7Ci0gICAgICAgIGludCBwbWVtX2ZkOwotICAgICAgICBpbnQgb2Zmc2V0OwotICAgIH07Ci0gICAgc3RydWN0IHRlbXBfZWdsICp0ZW1wX2VnbF9pZCA9IE5VTEw7Ci0gICAgdm9pZCAqIHBtZW1QdHIgPSAodm9pZCAqKSBlZ2xJbWFnZTsKLSAgICB0ZW1wX2VnbF9pZCA9IChzdHJ1Y3QgdGVtcF9lZ2wgKillZ2xJbWFnZTsKLSAgICBpZiAodGVtcF9lZ2xfaWQgIT0gTlVMTCkgewotICAgICAgICBmZCA9IHRlbXBfZWdsX2lkLT5wbWVtX2ZkOwotICAgICAgICBvZmZzZXQgPSB0ZW1wX2VnbF9pZC0+b2Zmc2V0OwotICAgIH0KLSNlbmRpZgotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkltcHJvcGVyIHBtZW0gZmQgYnkgRUdMIGNsaWVudCAlZCIsZmQpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgIH0KLSAgICBwbWVtX2luZm8ucG1lbV9mZCA9IChPTVhfVTMyKSBmZDsKLSAgICBwbWVtX2luZm8ub2Zmc2V0ID0gKE9NWF9VMzIpIG9mZnNldDsKLSAgICBwbWVtX2VudHJ5LmVudHJ5ID0gKHZvaWQgKikgJnBtZW1faW5mbzsKLSAgICBwbWVtX2VudHJ5LnR5cGUgPSBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU07Ci0gICAgcG1lbV9saXN0LmVudHJ5TGlzdCA9ICZwbWVtX2VudHJ5OwotICAgIHBtZW1fbGlzdC5uRW50cmllcyA9IDE7Ci0gICAgb3VwdXRfZWdsX2J1ZmZlcnMgPSB0cnVlOwotICAgIGlmIChPTVhfRXJyb3JOb25lICE9IHVzZV9idWZmZXIoaENvbXAsYnVmZmVySGRyLCBwb3J0LAotICAgICAgICAgICAgICAgICh2b2lkICopJnBtZW1fbGlzdCwgZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgKE9NWF9VOCAqKXBtZW1QdHIpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJ1c2UgYnVmZmVyIGNhbGwgZmFpbGVkIGZvciBlZ2wgaW1hZ2UiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6Q29tcG9uZW50Um9sZUVudW0KLQotICAgREVTQ1JJUFRJT04KLSAgIE9NWCBDb21wb25lbnQgUm9sZSBFbnVtIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KLQotICAgUEFSQU1FVEVSUwotICAgPFRCRD4uCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgT01YIEVycm9yIE5vbmUgaWYgZXZlcnl0aGluZyBpcyBzdWNjZXNzZnVsLgotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZGVjOjpjb21wb25lbnRfcm9sZV9lbnVtKE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgT01YX09VVCBPTVhfVTgqICAgICAgICByb2xlLAotICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgaW5kZXgpCi17Ci0gICAgKHZvaWQpIGhDb21wOwotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBpZiAoIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMiIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgIGlmICgoMCA9PSBpbmRleCkgJiYgcm9sZSkgewotICAgICAgICAgICAgc3RybGNweSgoY2hhciAqKXJvbGUsICJ2aWRlb19kZWNvZGVyLm1wZWcyIixPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coImNvbXBvbmVudF9yb2xlX2VudW06IHJvbGUgJXMiLHJvbGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vTW9yZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZHJ2X2N0eC5raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBpZiAoKDAgPT0gaW5kZXgpICYmIHJvbGUpIHsKLSAgICAgICAgICAgIHN0cmxjcHkoKGNoYXIgKilyb2xlLCAidmlkZW9fZGVjb2Rlci5hdmMiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiY29tcG9uZW50X3JvbGVfZW51bTogcm9sZSAlcyIscm9sZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk5vIG1vcmUgcm9sZXMiKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRydl9jdHgua2luZCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXZjIiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgIGlmICgoMCA9PSBpbmRleCkgJiYgcm9sZSkgewotICAgICAgICAgICAgc3RybGNweSgoY2hhciAqKXJvbGUsICJ2aWRlb19kZWNvZGVyLm12YyIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiY29tcG9uZW50X3JvbGVfZW51bTogcm9sZSAlcyIscm9sZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk5vIG1vcmUgcm9sZXMiKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRydl9jdHgua2luZCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaGV2YyIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBpZiAoKDAgPT0gaW5kZXgpICYmIHJvbGUpIHsKLSAgICAgICAgICAgIHN0cmxjcHkoKGNoYXIgKilyb2xlLCAidmlkZW9fZGVjb2Rlci5oZXZjIiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJjb21wb25lbnRfcm9sZV9lbnVtOiByb2xlICVzIiwgcm9sZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk5vIG1vcmUgcm9sZXMiKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRydl9jdHgua2luZCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIudnA4IixPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgaWYgKCgwID09IGluZGV4KSAmJiByb2xlKSB7Ci0gICAgICAgICAgICBzdHJsY3B5KChjaGFyICopcm9sZSwgInZpZGVvX2RlY29kZXIudnA4IixPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coImNvbXBvbmVudF9yb2xlX2VudW06IHJvbGUgJXMiLHJvbGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJObyBtb3JlIHJvbGVzIik7Ci0gICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yTm9Nb3JlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChkcnZfY3R4LmtpbmQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLnZwOSIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgIGlmICgoMCA9PSBpbmRleCkgJiYgcm9sZSkgewotICAgICAgICAgICAgc3RybGNweSgoY2hhciAqKXJvbGUsICJ2aWRlb19kZWNvZGVyLnZwOSIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJjb21wb25lbnRfcm9sZV9lbnVtOiByb2xlICVzIixyb2xlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiTm8gbW9yZSByb2xlcyIpOwotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vTW9yZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjpRdWVyeWluZyBSb2xlIG9uIFVua25vd24gQ29tcG9uZW50Iik7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZTsKLSAgICB9Ci0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6QWxsb2NhdGVEb25lCi0KLSAgIERFU0NSSVBUSU9OCi0gICBDaGVja3MgaWYgZW50aXJlIGJ1ZmZlciBwb29sIGlzIGFsbG9jYXRlZCBieSBJTCBDbGllbnQgb3Igbm90LgotICAgTmVlZCB0aGlzIHRvIG1vdmUgdG8gSURMRSBzdGF0ZS4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotYm9vbCBvbXhfdmRlYzo6YWxsb2NhdGVfZG9uZSh2b2lkKQotewotICAgIGJvb2wgYlJldCA9IGZhbHNlOwotICAgIGJvb2wgYlJldF9JbiA9IGZhbHNlOwotICAgIGJvb2wgYlJldF9PdXQgPSBmYWxzZTsKLSAgICBib29sIGJSZXRfT3V0X0V4dHJhID0gZmFsc2U7Ci0KLSAgICBiUmV0X0luID0gYWxsb2NhdGVfaW5wdXRfZG9uZSgpOwotICAgIGJSZXRfT3V0ID0gYWxsb2NhdGVfb3V0cHV0X2RvbmUoKTsKLSAgICBiUmV0X091dF9FeHRyYSA9IGFsbG9jYXRlX291dHB1dF9leHRyYWRhdGFfZG9uZSgpOwotCi0gICAgaWYgKGJSZXRfSW4gJiYgYlJldF9PdXQgJiYgYlJldF9PdXRfRXh0cmEpIHsKLSAgICAgICAgYlJldCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJSZXQ7Ci19Ci0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZkZWM6OkFsbG9jYXRlSW5wdXREb25lCi0KLSAgIERFU0NSSVBUSU9OCi0gICBDaGVja3MgaWYgSS9QIGJ1ZmZlciBwb29sIGlzIGFsbG9jYXRlZCBieSBJTCBDbGllbnQgb3Igbm90LgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UuCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1ib29sIG9teF92ZGVjOjphbGxvY2F0ZV9pbnB1dF9kb25lKHZvaWQpCi17Ci0gICAgYm9vbCBiUmV0ID0gZmFsc2U7Ci0gICAgdW5zaWduZWQgaT0wOwotCi0gICAgaWYgKG1faW5wX21lbV9wdHIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gYlJldDsKLSAgICB9Ci0gICAgaWYgKG1faW5wX21lbV9wdHIgKSB7Ci0gICAgICAgIGZvciAoOyBpPGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChCSVRNQVNLX0FCU0VOVCgmbV9pbnBfYm1fY291bnQsaSkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaSA9PSBkcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudCkgewotICAgICAgICBiUmV0ID0gdHJ1ZTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiQWxsb2NhdGUgZG9uZSBmb3IgYWxsIGkvcCBidWZmZXJzIik7Ci0gICAgfQotICAgIGlmIChpPT1kcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudCAmJiBtX2lucF9iRW5hYmxlZCkgewotICAgICAgICBtX2lucF9iUG9wdWxhdGVkID0gT01YX1RSVUU7Ci0gICAgfQotICAgIHJldHVybiBiUmV0OwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZGVjOjpBbGxvY2F0ZU91dHB1dERvbmUKLQotICAgREVTQ1JJUFRJT04KLSAgIENoZWNrcyBpZiBlbnRpcmUgTy9QIGJ1ZmZlciBwb29sIGlzIGFsbG9jYXRlZCBieSBJTCBDbGllbnQgb3Igbm90LgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UuCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1ib29sIG9teF92ZGVjOjphbGxvY2F0ZV9vdXRwdXRfZG9uZSh2b2lkKQotewotICAgIGJvb2wgYlJldCA9IGZhbHNlOwotICAgIHVuc2lnbmVkIGo9MDsKLQotICAgIGlmIChtX291dF9tZW1fcHRyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGJSZXQ7Ci0gICAgfQotCi0gICAgaWYgKG1fb3V0X21lbV9wdHIpIHsKLSAgICAgICAgZm9yICg7IGogPCBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudDsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoQklUTUFTS19BQlNFTlQoJm1fb3V0X2JtX2NvdW50LGopKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaiA9PSBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCkgewotICAgICAgICBiUmV0ID0gdHJ1ZTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiQWxsb2NhdGUgZG9uZSBmb3IgYWxsIG8vcCBidWZmZXJzIik7Ci0gICAgICAgIGlmIChtX291dF9iRW5hYmxlZCkKLSAgICAgICAgICAgIG1fb3V0X2JQb3B1bGF0ZWQgPSBPTVhfVFJVRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYlJldDsKLX0KLQotYm9vbCBvbXhfdmRlYzo6YWxsb2NhdGVfb3V0cHV0X2V4dHJhZGF0YV9kb25lKHZvaWQpIHsKLSAgICBib29sIGJSZXQgPSBmYWxzZTsKLSAgICB1bnNpZ25lZCBqPTA7Ci0gICAgdW5zaWduZWQgbkJ1ZmZlckNvdW50ID0gMDsKLQotICAgIG5CdWZmZXJDb3VudCA9IG1fY2xpZW50X291dF9leHRyYWRhdGFfaW5mby5nZXRCdWZmZXJDb3VudCgpOwotCi0gICAgaWYgKCFtX2NsaWVudF9vdXRfZXh0cmFkYXRhX2luZm8uaXNfY2xpZW50X2V4dHJhZGF0YV9lbmFibGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG1fY2xpZW50X291dHB1dF9leHRyYWRhdGFfbWVtX3B0cikgewotICAgICAgICBmb3IgKDsgaiA8IG5CdWZmZXJDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoQklUTUFTS19BQlNFTlQoJm1fb3V0X2V4dHJhZGF0YV9ibV9jb3VudCxqKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGogPT0gbkJ1ZmZlckNvdW50KSB7Ci0gICAgICAgICAgICBiUmV0ID0gdHJ1ZTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkFsbG9jYXRlIGRvbmUgZm9yIGFsbCBleHRyYWRhdGEgby9wIGJ1ZmZlcnMiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBiUmV0OwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZGVjOjpSZWxlYXNlRG9uZQotCi0gICBERVNDUklQVElPTgotICAgQ2hlY2tzIGlmIElMIGNsaWVudCBoYXMgcmVsZWFzZWQgYWxsIHRoZSBidWZmZXJzLgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UKLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWJvb2wgb214X3ZkZWM6OnJlbGVhc2VfZG9uZSh2b2lkKQotewotICAgIGJvb2wgYlJldCA9IGZhbHNlOwotCi0gICAgaWYgKHJlbGVhc2VfaW5wdXRfZG9uZSgpKSB7Ci0gICAgICAgIGlmIChyZWxlYXNlX291dHB1dF9kb25lKCkpIHsKLSAgICAgICAgICAgIGlmIChyZWxlYXNlX291dHB1dF9leHRyYWRhdGFfZG9uZSgpKSB7Ci0gICAgICAgICAgICAgICAgYlJldCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJSZXQ7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZGVjOjpSZWxlYXNlT3V0cHV0RG9uZQotCi0gICBERVNDUklQVElPTgotICAgQ2hlY2tzIGlmIElMIGNsaWVudCBoYXMgcmVsZWFzZWQgYWxsIHRoZSBidWZmZXJzLgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UKLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWJvb2wgb214X3ZkZWM6OnJlbGVhc2Vfb3V0cHV0X2RvbmUodm9pZCkKLXsKLSAgICBib29sIGJSZXQgPSBmYWxzZTsKLSAgICB1bnNpZ25lZCBpPTAsaj0wOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJWYWx1ZSBvZiBtX291dF9tZW1fcHRyICVwIiwgbV9vdXRfbWVtX3B0cik7Ci0gICAgaWYgKG1fb3V0X21lbV9wdHIpIHsKLSAgICAgICAgZm9yICg7IGogPCBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCA7IGorKykgewotICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmbV9vdXRfYm1fY291bnQsaikpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaiA9PSBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCkgewotICAgICAgICAgICAgbV9vdXRfYm1fY291bnQgPSAwOwotICAgICAgICAgICAgYlJldCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX291dF9ibV9jb3VudCA9IDA7Ci0gICAgICAgIGJSZXQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gYlJldDsKLX0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmRlYzo6UmVsZWFzZUlucHV0RG9uZQotCi0gICBERVNDUklQVElPTgotICAgQ2hlY2tzIGlmIElMIGNsaWVudCBoYXMgcmVsZWFzZWQgYWxsIHRoZSBidWZmZXJzLgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UKLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWJvb2wgb214X3ZkZWM6OnJlbGVhc2VfaW5wdXRfZG9uZSh2b2lkKQotewotICAgIGJvb2wgYlJldCA9IGZhbHNlOwotICAgIHVuc2lnbmVkIGk9MCxqPTA7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIlZhbHVlIG9mIG1faW5wX21lbV9wdHIgJXAiLG1faW5wX21lbV9wdHIpOwotICAgIGlmIChtX2lucF9tZW1fcHRyKSB7Ci0gICAgICAgIGZvciAoOyBqPGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50OyBqKyspIHsKLSAgICAgICAgICAgIGlmICggQklUTUFTS19QUkVTRU5UKCZtX2lucF9ibV9jb3VudCxqKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChqPT1kcnZfY3R4LmlwX2J1Zi5hY3R1YWxjb3VudCkgewotICAgICAgICAgICAgYlJldCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBiUmV0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGJSZXQ7Ci19Ci0KLWJvb2wgb214X3ZkZWM6OnJlbGVhc2Vfb3V0cHV0X2V4dHJhZGF0YV9kb25lKHZvaWQpIHsKLSAgICBib29sIGJSZXQgPSBmYWxzZTsKLSAgICB1bnNpZ25lZCBpPTAsaj0wLCBidWZmZXJfY291bnQ9MDsKLQotICAgIGJ1ZmZlcl9jb3VudCA9IG1fY2xpZW50X291dF9leHRyYWRhdGFfaW5mby5nZXRCdWZmZXJDb3VudCgpOwotICAgIERFQlVHX1BSSU5UX0xPVygiVmFsdWUgb2YgbV9jbGllbnRfb3V0cHV0X2V4dHJhZGF0YV9tZW1fcHRyICVwIGJ1ZmZlcl9jb3VudCAtICVkIiwKLSAgICAgICAgICAgIG1fY2xpZW50X291dHB1dF9leHRyYWRhdGFfbWVtX3B0ciwgYnVmZmVyX2NvdW50KTsKLQotICAgIGlmIChtX2NsaWVudF9vdXRwdXRfZXh0cmFkYXRhX21lbV9wdHIpIHsKLSAgICAgICAgZm9yICg7IGo8YnVmZmVyX2NvdW50OyBqKyspIHsKLSAgICAgICAgICAgIGlmICggQklUTUFTS19QUkVTRU5UKCZtX291dF9leHRyYWRhdGFfYm1fY291bnQsaikpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaiA9PSBidWZmZXJfY291bnQpIHsKLSAgICAgICAgICAgIGJSZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYlJldCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBiUmV0OwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92ZGVjOjpmaWxsX2J1ZmZlcl9kb25lKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqIGJ1ZmZlcikKLXsKLSAgICBWSURDX1RSQUNFX05BTUVfSElHSCgiRkJEIik7Ci0gICAgT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9QTUVNX0lORk8gKnBQTUVNSW5mbyA9IE5VTEw7Ci0gICAgaWYgKCFidWZmZXIgfHwgKGJ1ZmZlciAtIG1fb3V0X21lbV9wdHIpID49IChpbnQpZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIltGQkRdIEVSUk9SIGluIHB0ciglcCkiLCBidWZmZXIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0gZWxzZSBpZiAob3V0cHV0X2ZsdXNoX3Byb2dyZXNzKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiRkJEOiBCdWZmZXIgKCVwKSBmbHVzaGVkIiwgYnVmZmVyKTsKLSAgICAgICAgYnVmZmVyLT5uRmlsbGVkTGVuID0gMDsKLSAgICAgICAgYnVmZmVyLT5uVGltZVN0YW1wID0gMDsKLSAgICAgICAgYnVmZmVyLT5uRmxhZ3MgJj0gfk9NWF9CVUZGRVJGTEFHX0VYVFJBREFUQTsKLSAgICAgICAgYnVmZmVyLT5uRmxhZ3MgJj0gflFPTVhfVklERU9fQlVGRkVSRkxBR19FT1NFUTsKLSAgICAgICAgYnVmZmVyLT5uRmxhZ3MgJj0gfk9NWF9CVUZGRVJGTEFHX0RBVEFDT1JSVVBUOwotICAgIH0KLQotICAgIGlmIChtX2RlYnVnX2V4dHJhZGF0YSkgewotICAgICAgICBpZiAoYnVmZmVyLT5uRmxhZ3MgJiBRT01YX1ZJREVPX0JVRkZFUkZMQUdfRU9TRVEpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmlsbEJ1ZmZlckRvbmU6IEVuZCBPZiBTZXF1ZW5jZSBSZWNlaXZlZCIpOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19EQVRBQ09SUlVQVCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJGaWxsQnVmZmVyRG9uZTogT01YX0JVRkZFUkZMQUdfREFUQUNPUlJVUFQgUmVjZWl2ZWQiKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBERUJVR19QUklOVF9MT1coImZpbGxfYnVmZmVyX2RvbmU6IGJ1ZmhkciA9ICVwLCBidWZoZHItPnBCdWZmZXIgPSAlcCwgZmxhZ3M6IDB4JXgsIHRpbWVzdGFtcDogJWxsZCIsCi0gICAgICAgICAgICBidWZmZXIsIGJ1ZmZlci0+cEJ1ZmZlciwgYnVmZmVyLT5uRmxhZ3MsIGJ1ZmZlci0+blRpbWVTdGFtcCk7Ci0gICAgcGVuZGluZ19vdXRwdXRfYnVmZmVycyAtLTsKLSAgICBWSURDX1RSQUNFX0lOVF9MT1coIkZUQi1wZW5kaW5nIiwgcGVuZGluZ19vdXRwdXRfYnVmZmVycyk7Ci0KLSAgICBpZiAoYnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiT3V0cHV0IEVPUyBoYXMgYmVlbiByZWFjaGVkIik7Ci0gICAgICAgIGlmICghb3V0cHV0X2ZsdXNoX3Byb2dyZXNzKQotICAgICAgICAgICAgcG9zdF9ldmVudCgodW5zaWduZWQpTlVMTCwgKHVuc2lnbmVkKU5VTEwsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRU9TX0RPTkUpOwotCi0gICAgICAgIGlmIChwc291cmNlX2ZyYW1lKSB7Ci0gICAgICAgICAgICBtX2NiLkVtcHR5QnVmZmVyRG9uZSgmbV9jbXAsIG1fYXBwX2RhdGEsIHBzb3VyY2VfZnJhbWUpOwotICAgICAgICAgICAgcHNvdXJjZV9mcmFtZSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBkZXN0X2ZyYW1lKSB7Ci0gICAgICAgICAgICBwZGVzdF9mcmFtZS0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICBtX2lucHV0X2ZyZWVfcS5pbnNlcnRfZW50cnkoKHVuc2lnbmVkIGxvbmcpIHBkZXN0X2ZyYW1lLCh1bnNpZ25lZClOVUxMLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpTlVMTCk7Ci0gICAgICAgICAgICBwZGVzdF9mcmFtZSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBPVVRQVVRfRVhUUkFEQVRBX0xPRwotICAgIGlmIChvdXRwdXRFeHRyYWRhdGFGaWxlKSB7Ci0gICAgICAgIGludCBidWZfaW5kZXggPSBidWZmZXIgLSBtX291dF9tZW1fcHRyOwotICAgICAgICBPTVhfVTggKnBCdWZmZXIgPSAoT01YX1U4ICopKGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltidWZfaW5kZXhdLmJ1ZmZlcmFkZHIpOwotCi0gICAgICAgIE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpwX2V4dHJhID0gTlVMTDsKLSAgICAgICAgcF9leHRyYSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKQotICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKShwQnVmZmVyICsgYnVmZmVyLT5uT2Zmc2V0ICsgYnVmZmVyLT5uRmlsbGVkTGVuICsgMykmKH4zKSk7Ci0KLSAgICAgICAgd2hpbGUgKHBfZXh0cmEgJiYgKE9NWF9VOCopcF9leHRyYSA8IChwQnVmZmVyICsgYnVmZmVyLT5uQWxsb2NMZW4pICkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJXUklUSU5HIGV4dHJhZGF0YSwgc2l6ZT0lZCx0eXBlPSV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZXh0cmEtPm5TaXplLCBwX2V4dHJhLT5lVHlwZSk7Ci0gICAgICAgICAgICBmd3JpdGUgKHBfZXh0cmEsMSxwX2V4dHJhLT5uU2l6ZSxvdXRwdXRFeHRyYWRhdGFGaWxlKTsKLQotICAgICAgICAgICAgaWYgKHBfZXh0cmEtPmVUeXBlID09IE9NWF9FeHRyYURhdGFOb25lKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2V4dHJhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopICgoKE9NWF9VOCAqKSBwX2V4dHJhKSArIHBfZXh0cmEtPm5TaXplKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgLyogRm9yIHVzZSBidWZmZXIgd2UgbmVlZCB0byBjb3B5IHRoZSBkYXRhICovCi0gICAgaWYgKCFvdXRwdXRfZmx1c2hfcHJvZ3Jlc3MpIHsKLSAgICAgICAgLyogVGhpcyBpcyB0aGUgZXJyb3IgY2hlY2sgZm9yIG5vbi1yZWNvdmVyYWJsZSBlcnJyb3MgKi8KLSAgICAgICAgYm9vbCBpc19kdXBsaWNhdGVfdHNfdmFsaWQgPSB0cnVlOwotICAgICAgICBib29sIGlzX2ludGVybGFjZWQgPSAoZHJ2X2N0eC5pbnRlcmxhY2UgIT0gVkRFQ19JbnRlcmxhY2VGcmFtZVByb2dyZXNzaXZlKTsKLQotICAgICAgICBpZiAob3V0cHV0X2NhcGFiaWxpdHkgPT0gVjRMMl9QSVhfRk1UX01QRUc0IHx8Ci0gICAgICAgICAgICAgICAgb3V0cHV0X2NhcGFiaWxpdHkgPT0gVjRMMl9QSVhfRk1UX01QRUcyKQotICAgICAgICAgICAgaXNfZHVwbGljYXRlX3RzX3ZhbGlkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlci0+bkZpbGxlZExlbiA+IDApIHsKLSAgICAgICAgICAgIHRpbWVfc3RhbXBfZHRzLmdldF9uZXh0X3RpbWVzdGFtcChidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIGlzX2ludGVybGFjZWQgJiYgaXNfZHVwbGljYXRlX3RzX3ZhbGlkKTsKLSAgICAgICAgICAgIGlmIChtX2RlYnVnX3RpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgT01YX1RJQ0tTIGV4cGVjdGVkX3RzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbV90aW1lc3RhbXBfbGlzdC5wb3BfbWluX3RzKGV4cGVjdGVkX3RzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2ludGVybGFjZWQgJiYgaXNfZHVwbGljYXRlX3RzX3ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3RpbWVzdGFtcF9saXN0LnBvcF9taW5fdHMoZXhwZWN0ZWRfdHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiQ3VycmVudCB0aW1lc3RhbXAgKCVsbGQpLFBvcHBlZCBUSU1FU1RBTVAgKCVsbGQpIGZyb20gbGlzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5uVGltZVN0YW1wLCBleHBlY3RlZF90cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+blRpbWVTdGFtcCAhPSBleHBlY3RlZF90cykgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SIGluIG9teF92ZGVjOjphc3luY19tZXNzYWdlX3Byb2Nlc3MgdGltZXN0YW1wIENoZWNrIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgVklEQ19UUkFDRV9JTlRfTE9XKCJGQkQtVFMiLCBidWZmZXItPm5UaW1lU3RhbXAgLyAxMDAwKTsKLQotICAgIGlmIChtX2NiLkZpbGxCdWZmZXJEb25lKSB7Ci0gICAgICAgIGlmIChidWZmZXItPm5GaWxsZWRMZW4gPiAwKSB7Ci0gICAgICAgICAgICBpZiAoYXJiaXRyYXJ5X2J5dGVzKQotICAgICAgICAgICAgICAgIGFkanVzdF90aW1lc3RhbXAoYnVmZmVyLT5uVGltZVN0YW1wKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZXRfZnJhbWVfcmF0ZShidWZmZXItPm5UaW1lU3RhbXApOwotCi0gICAgICAgICAgICBwcm9jX2ZybXMrKzsKLSAgICAgICAgICAgIGlmIChwZXJmX2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBpZiAoMSA9PSBwcm9jX2ZybXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVjX3RpbWUuc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICBsYXRlbmN5ID0gZGVjX3RpbWUucHJvY2Vzc2luZ190aW1lX3VzKCkgLSBsYXRlbmN5OwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCI+Pj4gRkJEIE1ldHJpY3M6IExhdGVuY3koJS4yZiltUyIsIGxhdGVuY3kgLyAxZTMpOwotICAgICAgICAgICAgICAgICAgICBkZWNfdGltZS5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBmcHNfbWV0cmljcy5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgICAgICAgICAgICAgT01YX1U2NCBwcm9jX3RpbWUgPSAwOwotICAgICAgICAgICAgICAgICAgICBmcHNfbWV0cmljcy5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2NfdGltZSA9IGZwc19tZXRyaWNzLnByb2Nlc3NpbmdfdGltZV91cygpOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCI+Pj4gRkJEIE1ldHJpY3M6IHByb2NfZnJtcygldSkgcHJvY190aW1lKCUuMmYpUyBmcHMoJS4yZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcHJvY19mcm1zLCAoZmxvYXQpcHJvY190aW1lIC8gMWU2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkoMWU2ICogcHJvY19mcm1zKSAvIHByb2NfdGltZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgcHJldl90cyA9IExMT05HX01BWDsKLSAgICAgICAgICAgIHJzdF9wcmV2X3RzID0gdHJ1ZTsKLSAgICAgICAgICAgIHByb2NfZnJtcyA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwUE1FTUluZm8gPSAoT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9QTUVNX0lORk8gKikKLSAgICAgICAgICAgICgoT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9MSVNUICopCi0gICAgICAgICAgICAgYnVmZmVyLT5wUGxhdGZvcm1Qcml2YXRlKS0+ZW50cnlMaXN0LT5lbnRyeTsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJCZWZvcmUgRkJEIGNhbGxiYWNrIEFjY2Vzc2VkIFBtZW1pbmZvICVsdSIscFBNRU1JbmZvLT5wbWVtX2ZkKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmlsX2J1ZmZlcjsKLSAgICAgICAgaWxfYnVmZmVyID0gY2xpZW50X2J1ZmZlcnMuZ2V0X2lsX2J1Zl9oZHIoYnVmZmVyKTsKLSAgICAgICAgT01YX1UzMiBjdXJyZW50X2ZyYW1lcmF0ZSA9IChpbnQpKGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfbnVtZXJhdG9yIC8gZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19kZW5vbWluYXRvcik7Ci0KLSAgICAgICAgaWYgKGlsX2J1ZmZlciAmJiBtX2xhc3RfcmVuZGVyZWRfVFMgPj0gMCkgewotICAgICAgICAgICAgT01YX1RJQ0tTIHRzX2RlbHRhID0gKE9NWF9USUNLUylsbGFicyhpbF9idWZmZXItPm5UaW1lU3RhbXAgLSBtX2xhc3RfcmVuZGVyZWRfVFMpOwotCi0gICAgICAgICAgICAvLyBDdXJyZW50IGZyYW1lIGNhbiBiZSBzZW5kIGZvciByZW5kZXJpbmcgaWYKLSAgICAgICAgICAgIC8vIChhKSBjdXJyZW50IEZQUyBpcyA8PSAgNjAKLSAgICAgICAgICAgIC8vIChiKSBpcyB0aGUgbmV4dCBmcmFtZSBhZnRlciB0aGUgZnJhbWUgd2l0aCBUUyAwCi0gICAgICAgICAgICAvLyAoYykgaXMgdGhlIGZpcnN0IGZyYW1lIGFmdGVyIHNlZWsKLSAgICAgICAgICAgIC8vIChkKSB0aGUgZGVsdGEgVFMgYlx3IHR3byBjb25zZWN1dGl2ZSBmcmFtZXMgaXMgPiAxNiBtcwotICAgICAgICAgICAgLy8gKGUpIGl0cyBUUyBpcyBlcXVhbCB0byBwcmV2aW91cyBmcmFtZSBUUwotICAgICAgICAgICAgLy8gKGYpIGlmIG1hcmtlZCBFT1MKLQotICAgICAgICAgICAgaWYoY3VycmVudF9mcmFtZXJhdGUgPD0gNjAgfHwgbV9sYXN0X3JlbmRlcmVkX1RTID09IDAgfHwKLSAgICAgICAgICAgICAgIGlsX2J1ZmZlci0+blRpbWVTdGFtcCA9PSAwIHx8IHRzX2RlbHRhID49IDE2MDAwIHx8Ci0gICAgICAgICAgICAgICB0c19kZWx0YSA9PSAwIHx8IChpbF9idWZmZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKLSAgICAgICAgICAgICAgIG1fbGFzdF9yZW5kZXJlZF9UUyA9IGlsX2J1ZmZlci0+blRpbWVTdGFtcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAvL21hcmsgZm9yIGRyb3BpbmcKLSAgICAgICAgICAgICAgIGJ1ZmZlci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiIC0tICVzIEZyYW1lIC0tIGluZm86OiBmcHMoJWQpIGxhc3RSZW5kZXJUaW1lKCVsbGQpIGJ1ZmZlclRzKCVsbGQpIHRzX2RlbHRhKCVsbGQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bkZpbGxlZExlbj8gIlJlbmRlcmluZyI6IkRyb3BwaW5nIixjdXJyZW50X2ZyYW1lcmF0ZSxtX2xhc3RfcmVuZGVyZWRfVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbF9idWZmZXItPm5UaW1lU3RhbXAsdHNfZGVsdGEpOwotCi0gICAgICAgICAgICAvL2Fib3ZlIGNvZGUgbWFrZXMgc3VyZSB0aGF0IGRlbHRhIGJcdyB0d28gY29uc2VjdXRpdmUgZnJhbWVzIGlzIG5vdAotICAgICAgICAgICAgLy9ncmVhdGVyIHRoYW4gMTZtcywgc2xvdy1tbyBmZWF0dXJlLCBzbyBjYXAgZnBzIHRvIG1heCA2MAotICAgICAgICAgICAgaWYgKGN1cnJlbnRfZnJhbWVyYXRlID4gNjAgKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudF9mcmFtZXJhdGUgPSA2MDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBjdXJyZW50IGZyYW1lcmF0ZSB0byBncmFsbG9jIG1ldGEgZGF0YQotICAgICAgICBpZiAoKGJ1ZmZlci0+bkZpbGxlZExlbiA+IDApICYmIG1fZW5hYmxlX2FuZHJvaWRfbmF0aXZlX2J1ZmZlcnMgJiYgbV9vdXRfbWVtX3B0cikgewotICAgICAgICAgICAgLy8gSWYgdmFsaWQgZnBzIHdhcyByZWNlaXZlZCwgZGlyZWN0bHkgc2VuZCBpdCB0byBkaXNwbGF5IGZvciB0aGUgMXN0IGZiZC4KLSAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY2FsY3VsYXRlIGZwcyB1c2luZyBmYmQgdGltZXN0YW1wcwotICAgICAgICAgICAgZmxvYXQgcmVmcmVzaF9yYXRlID0gbV9mcHNfcHJldjsKLSAgICAgICAgICAgIGlmIChtX2Zwc19yZWNlaXZlZCkgewotICAgICAgICAgICAgICAgIGlmICgxID09IHByb2NfZnJtcykgewotICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3JhdGUgPSBtX2Zwc19yZWNlaXZlZCAvIChmbG9hdCkoMTw8MTYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgZHluYW1pYyByZWZyZXNoIHJhdGUgY2hhbmdlIGZlYXR1cmUgZW5hYmxlZCBvciBub3QKLSAgICAgICAgICAgICAgICBpZiAobV9kcmNfZW5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCBjb2Fyc2UgZnBzIHdoZW4gMiBmYmRzIHJlY2VpdmVkIGFuZAotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZnBzIGFnYWluIHdoZW4gMzAgZmJkcyByZWNlaXZlZCBhcyBpdCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBvbmUgc2V0IHdoZW4gb25seSAyIGZiZHMgcmVjZWl2ZWQuCi0gICAgICAgICAgICAgICAgICAgIGlmICgyID09IHByb2NfZnJtcyB8fCAzMCA9PSBwcm9jX2ZybXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX2Rlbm9taW5hdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaF9yYXRlID0gZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19udW1lcmF0b3IgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX2Rlbm9taW5hdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGFuZCBzZXQgcmVmcmVzaCByYXRlIGZvciBldmVyeSBmcmFtZSBmcm9tIHNlY29uZCBmcmFtZSBvbndhcmRzCi0gICAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgd2lsbCBhc3N1bWUgdGhlIGRlZmF1bHQgcmVmcmVzaCByYXRlIGZvciBmaXJzdCBmcmFtZSAod2hpY2ggaXMgNjAgZnBzKQotICAgICAgICAgICAgICAgICAgICBpZiAobV9mcHNfcHJldikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfZGVub21pbmF0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3JhdGUgPSBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX251bWVyYXRvciAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfZGVub21pbmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVmcmVzaF9yYXRlID4gNjApIHsKLSAgICAgICAgICAgICAgICByZWZyZXNoX3JhdGUgPSA2MDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZnJjIHNldCByZWZyZXNoX3JhdGUgJWYsIGZyYW1lICVkIiwgcmVmcmVzaF9yYXRlLCBwcm9jX2ZybXMpOwotICAgICAgICAgICAgT01YX1UzMiBidWZfaW5kZXggPSBidWZmZXIgLSBtX291dF9tZW1fcHRyOwotICAgICAgICAgICAgc2V0TWV0YURhdGEoKHByaXZhdGVfaGFuZGxlX3QgKiluYXRpdmVfYnVmZmVyW2J1Zl9pbmRleF0ucHJpdmF0ZWhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEVfUkVGUkVTSF9SQVRFLCAodm9pZCopJnJlZnJlc2hfcmF0ZSk7Ci0gICAgICAgICAgICBtX2Zwc19wcmV2ID0gcmVmcmVzaF9yYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJ1ZmZlci0+bkZpbGxlZExlbiAmJiBtX2VuYWJsZV9hbmRyb2lkX25hdGl2ZV9idWZmZXJzICYmIG1fb3V0X21lbV9wdHIpIHsKLSAgICAgICAgICAgIE9NWF9VMzIgYnVmX2luZGV4ID0gYnVmZmVyIC0gbV9vdXRfbWVtX3B0cjsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic3RlcmVvX291dHB1dF9tb2RlID0gJWQiLHN0ZXJlb19vdXRwdXRfbW9kZSk7Ci0gICAgICAgICAgICBzZXRNZXRhRGF0YSgocHJpdmF0ZV9oYW5kbGVfdCAqKW5hdGl2ZV9idWZmZXJbYnVmX2luZGV4XS5wcml2YXRlaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMzRF9GT1JNQVQsICh2b2lkKikmc3RlcmVvX291dHB1dF9tb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbF9idWZmZXIpIHsKLSAgICAgICAgICAgIGxvZ19vdXRwdXRfYnVmZmVycyhpbF9idWZmZXIpOwotICAgICAgICAgICAgaWYgKGR5bmFtaWNfYnVmX21vZGUpIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgblBvcnRJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgblBvcnRJbmRleCA9IGJ1ZmZlci0oKE9NWF9CVUZGRVJIRUFERVJUWVBFICopY2xpZW50X2J1ZmZlcnMuZ2V0X2lsX2J1Zl9oZHIoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSdyZSBwYXNzaW5nIGFyb3VuZCBoYW5kbGVzLCBhZGp1c3QgbkZpbGxlZExlbiBhbmQgbkFsbG9jTGVuCi0gICAgICAgICAgICAgICAgLy8gdG8gc2l6ZSBvZiB0aGUgaGFuZGxlLiBEbyBpdCBfYWZ0ZXJfIGxvZ19vdXRwdXRfYnVmZmVycyB3aGljaAotICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVzIHRoZSByZXNwZWN0aXZlIHNpemVzIHRvIGJlIGFjY3VyYXRlLgotCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5uQWxsb2NMZW4gPSBzaXplb2Yoc3RydWN0IFZpZGVvRGVjb2Rlck91dHB1dE1ldGFEYXRhKTsKLSAgICAgICAgICAgICAgICBidWZmZXItPm5GaWxsZWRMZW4gPSBidWZmZXItPm5GaWxsZWRMZW4gPwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBWaWRlb0RlY29kZXJPdXRwdXRNZXRhRGF0YSkgOiAwOwotCi0gICAgICAgICAgICAgICAgLy9DbGVhciBncmFwaGljIGJ1ZmZlciBoYW5kbGVzIGluIGR5bmFtaWMgbW9kZQotICAgICAgICAgICAgICAgIGlmIChuUG9ydEluZGV4IDwgZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQgJiYKLSAgICAgICAgICAgICAgICAgICAgblBvcnRJbmRleCA8IE1BWF9OVU1fSU5QVVRfT1VUUFVUX0JVRkZFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2J1ZmZlcltuUG9ydEluZGV4XS5wcml2YXRlaGFuZGxlID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2J1ZmZlcltuUG9ydEluZGV4XS5uYXRpdmVoYW5kbGUgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJbRkJEXUludmFsaWQgbmF0aXZlX2J1ZmZlciBpbmRleDogJWQiLCBuUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2NiLkZpbGxCdWZmZXJEb25lIChoQ29tcCxtX2FwcF9kYXRhLGlsX2J1ZmZlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSW52YWxpZCBidWZmZXIgYWRkcmVzcyBmcm9tIGdldF9pbF9idWZfaGRyIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiQWZ0ZXIgRmlsbCBCdWZmZXIgRG9uZSBjYWxsYmFjayAlbHUiLHBQTUVNSW5mby0+cG1lbV9mZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSNpZmRlZiBBREFQVElWRV9QTEFZQkFDS19TVVBQT1JURUQKLSAgICBpZiAobV9zbW9vdGhzdHJlYW1pbmdfbW9kZSAmJiBtX291dF9tZW1fcHRyKSB7Ci0gICAgICAgIE9NWF9VMzIgYnVmX2luZGV4ID0gYnVmZmVyIC0gbV9vdXRfbWVtX3B0cjsKLSAgICAgICAgQnVmZmVyRGltX3QgZGltOwotICAgICAgICBwcml2YXRlX2hhbmRsZV90ICpwcml2YXRlX2hhbmRsZSA9IE5VTEw7Ci0gICAgICAgIGRpbS5zbGljZVdpZHRoID0gZnJhbWVzaXplLm5XaWR0aDsKLSAgICAgICAgZGltLnNsaWNlSGVpZ2h0ID0gZnJhbWVzaXplLm5IZWlnaHQ7Ci0gICAgICAgIGlmIChidWZfaW5kZXggPCBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCAmJgotICAgICAgICAgICAgYnVmX2luZGV4IDwgTUFYX05VTV9JTlBVVF9PVVRQVVRfQlVGRkVSUyAmJgotICAgICAgICAgICAgbmF0aXZlX2J1ZmZlcltidWZfaW5kZXhdLnByaXZhdGVoYW5kbGUpCi0gICAgICAgICAgICBwcml2YXRlX2hhbmRsZSA9IG5hdGl2ZV9idWZmZXJbYnVmX2luZGV4XS5wcml2YXRlaGFuZGxlOwotICAgICAgICBpZiAocHJpdmF0ZV9oYW5kbGUpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0IG1ldGFkYXRhOiB1cGRhdGUgYnVmLWdlb21ldHJ5IHdpdGggc3RyaWRlICVkIHNsaWNlICVkIiwKLSAgICAgICAgICAgICAgICBkaW0uc2xpY2VXaWR0aCwgZGltLnNsaWNlSGVpZ2h0KTsKLSAgICAgICAgICAgIHNldE1ldGFEYXRhKHByaXZhdGVfaGFuZGxlLCBVUERBVEVfQlVGRkVSX0dFT01FVFJZLCAodm9pZCopJmRpbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92ZGVjOjplbXB0eV9idWZmZXJfZG9uZShPTVhfSEFORExFVFlQRSAgICAgICAgIGhDb21wLAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogYnVmZmVyKQotewotICAgIFZJRENfVFJBQ0VfTkFNRV9ISUdIKCJFQkQiKTsKLSAgICBpbnQgbkJ1ZmZlckluZGV4ID0gYnVmZmVyIC0gbV9pbnBfbWVtX3B0cjsKLQotICAgIGlmIChidWZmZXIgPT0gTlVMTCB8fCAobkJ1ZmZlckluZGV4ID49IChpbnQpZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJlbXB0eV9idWZmZXJfZG9uZTogRVJST1IgYnVmaGRyID0gJXAiLCBidWZmZXIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiZW1wdHlfYnVmZmVyX2RvbmU6IGJ1ZmhkciA9ICVwLCBidWZoZHItPnBCdWZmZXIgPSAlcCwgYnVmaGRyLT5uRmxhZ3MgPSAweCV4IiwKLSAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyLT5wQnVmZmVyLCBidWZmZXItPm5GbGFncyk7Ci0gICAgcGVuZGluZ19pbnB1dF9idWZmZXJzLS07Ci0gICAgVklEQ19UUkFDRV9JTlRfTE9XKCJFVEItcGVuZGluZyIsIHBlbmRpbmdfaW5wdXRfYnVmZmVycyk7Ci0KLSAgICBpZiAobV9jYi5FbXB0eUJ1ZmZlckRvbmUpIHsKLSAgICAgICAgYnVmZmVyLT5uRmlsbGVkTGVuID0gMDsKLSAgICAgICAgaWYgKGlucHV0X3VzZV9idWZmZXIgPT0gdHJ1ZSkgewotICAgICAgICAgICAgYnVmZmVyID0gJm1faW5wX2hlYXBfcHRyW2J1ZmZlci1tX2lucF9tZW1fcHRyXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJlc3RvcmUgdGhlIEZEIHRoYXQgd2Ugb3Zlci13cm90ZSBpbiBFVEIgKi8KLSAgICAgICAgaWYgKG1faW5wdXRfcGFzc19idWZmZXJfZmQpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+cEJ1ZmZlciA9IChPTVhfVTgqKSh1aW50cHRyX3QpZHJ2X2N0eC5wdHJfaW5wdXRidWZmZXJbbkJ1ZmZlckluZGV4XS5wbWVtX2ZkOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9jYi5FbXB0eUJ1ZmZlckRvbmUoaENvbXAgLG1fYXBwX2RhdGEsIGJ1ZmZlcik7Ci0gICAgfQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi1pbnQgb214X3ZkZWM6OmFzeW5jX21lc3NhZ2VfcHJvY2VzcyAodm9pZCAqY29udGV4dCwgdm9pZCogbWVzc2FnZSkKLXsKLSAgICBvbXhfdmRlYyogb214ID0gTlVMTDsKLSAgICBzdHJ1Y3QgdmRlY19tc2dpbmZvICp2ZGVjX21zZyA9IE5VTEw7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIG9teGhkciA9IE5VTEw7Ci0gICAgc3RydWN0IHY0bDJfYnVmZmVyICp2NGwyX2J1Zl9wdHIgPSBOVUxMOwotICAgIHN0cnVjdCB2NGwyX3BsYW5lICpwbGFuZSA9IE5VTEw7Ci0gICAgc3RydWN0IHZkZWNfb3V0cHV0X2ZyYW1laW5mbyAqb3V0cHV0X3Jlc3BidWYgPSBOVUxMOwotICAgIGludCByYz0xOwotICAgIGlmIChjb250ZXh0ID09IE5VTEwgfHwgbWVzc2FnZSA9PSBOVUxMKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGQVRBTCBFUlJPUiBpbiBvbXhfdmRlYzo6YXN5bmNfbWVzc2FnZV9wcm9jZXNzIE5VTEwgQ2hlY2siKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICB2ZGVjX21zZyA9IChzdHJ1Y3QgdmRlY19tc2dpbmZvICopbWVzc2FnZTsKLQotICAgIG9teCA9IHJlaW50ZXJwcmV0X2Nhc3Q8b214X3ZkZWMqPihjb250ZXh0KTsKLQotICAgIHN3aXRjaCAodmRlY19tc2ctPm1zZ2NvZGUpIHsKLQotICAgICAgICBjYXNlIFZERUNfTVNHX0VWVF9IV19FUlJPUjoKLSAgICAgICAgICAgIG9teC0+cG9zdF9ldmVudCAoKHVuc2lnbmVkKU5VTEwsIHZkZWNfbXNnLT5zdGF0dXNfY29kZSxcCi0gICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfSEFSRFdBUkVfRVJST1IpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBWREVDX01TR19FVlRfSFdfT1ZFUkxPQUQ6Ci0gICAgICAgICAgICBvbXgtPnBvc3RfZXZlbnQgKCh1bnNpZ25lZClOVUxMLCB2ZGVjX21zZy0+c3RhdHVzX2NvZGUsXAotICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0hBUkRXQVJFX09WRVJMT0FEKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVkRFQ19NU0dfRVZUX0hXX1VOU1VQUE9SVEVEOgotICAgICAgICAgICAgb214LT5wb3N0X2V2ZW50ICgodW5zaWduZWQpTlVMTCwgdmRlY19tc2ctPnN0YXR1c19jb2RlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9VTlNVUFBPUlRFRF9TRVRUSU5HKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVkRFQ19NU0dfUkVTUF9TVEFSVF9ET05FOgotICAgICAgICAgICAgb214LT5wb3N0X2V2ZW50ICgodW5zaWduZWQpTlVMTCwgdmRlY19tc2ctPnN0YXR1c19jb2RlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9TVEFSVF9ET05FKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVkRFQ19NU0dfUkVTUF9TVE9QX0RPTkU6Ci0gICAgICAgICAgICBvbXgtPnBvc3RfZXZlbnQgKCh1bnNpZ25lZClOVUxMLCB2ZGVjX21zZy0+c3RhdHVzX2NvZGUsXAotICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1NUT1BfRE9ORSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFZERUNfTVNHX1JFU1BfUkVTVU1FX0RPTkU6Ci0gICAgICAgICAgICBvbXgtPnBvc3RfZXZlbnQgKCh1bnNpZ25lZClOVUxMLCB2ZGVjX21zZy0+c3RhdHVzX2NvZGUsXAotICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1JFU1VNRV9ET05FKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVkRFQ19NU0dfUkVTUF9QQVVTRV9ET05FOgotICAgICAgICAgICAgb214LT5wb3N0X2V2ZW50ICgodW5zaWduZWQpTlVMTCwgdmRlY19tc2ctPnN0YXR1c19jb2RlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9QQVVTRV9ET05FKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVkRFQ19NU0dfUkVTUF9GTFVTSF9JTlBVVF9ET05FOgotICAgICAgICAgICAgb214LT5wb3N0X2V2ZW50ICgodW5zaWduZWQpTlVMTCwgdmRlY19tc2ctPnN0YXR1c19jb2RlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVF9JTlBVVF9GTFVTSCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWREVDX01TR19SRVNQX0ZMVVNIX09VVFBVVF9ET05FOgotICAgICAgICAgICAgb214LT5wb3N0X2V2ZW50ICgodW5zaWduZWQpTlVMTCwgdmRlY19tc2ctPnN0YXR1c19jb2RlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVF9PVVRQVVRfRkxVU0gpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVkRFQ19NU0dfUkVTUF9JTlBVVF9GTFVTSEVEOgotICAgICAgICBjYXNlIFZERUNfTVNHX1JFU1BfSU5QVVRfQlVGRkVSX0RPTkU6Ci0KLSAgICAgICAgICAgIC8qIG9teGhkciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSogKQotICAgICAgICAgICAgICAgdmRlY19tc2ctPm1zZ2RhdGEuaW5wdXRfZnJhbWVfY2xpZW50ZGF0YTsgKi8KLQotICAgICAgICAgICAgdjRsMl9idWZfcHRyID0gKHY0bDJfYnVmZmVyKil2ZGVjX21zZy0+bXNnZGF0YS5pbnB1dF9mcmFtZV9jbGllbnRkYXRhOwotICAgICAgICAgICAgaWYgKG9teC0+bV9pbnBfbWVtX3B0ciA9PSBOVUxMIHx8IHY0bDJfYnVmX3B0ciA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgdjRsMl9idWZfcHRyLT5pbmRleCA+PSBvbXgtPmRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgb214aGRyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB2ZGVjX21zZy0+c3RhdHVzX2NvZGUgPSBWREVDX1NfRUZBVEFMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbXhoZHIgPSBvbXgtPm1faW5wX21lbV9wdHIgKyB2NGwyX2J1Zl9wdHItPmluZGV4OwotCi0gICAgICAgICAgICBpZiAodjRsMl9idWZfcHRyLT5mbGFncyAmIFY0TDJfUUNPTV9CVUZfSU5QVVRfVU5TVVBQT1JURUQpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJVbnN1cHBvcnRlZCBpbnB1dCIpOwotICAgICAgICAgICAgICAgIG9teC0+cG9zdF9ldmVudCAoKHVuc2lnbmVkKU5VTEwsIHZkZWNfbXNnLT5zdGF0dXNfY29kZSxcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0hBUkRXQVJFX0VSUk9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2NGwyX2J1Zl9wdHItPmZsYWdzICYgVjRMMl9RQ09NX0JVRl9EQVRBX0NPUlJVUFQpIHsKLSAgICAgICAgICAgICAgICBvbXhoZHItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19EQVRBQ09SUlVQVDsKLSAgICAgICAgICAgICAgICB2ZGVjX21zZy0+c3RhdHVzX2NvZGUgPSBWREVDX1NfSU5QVVRfQklUU1RSRUFNX0VSUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvbXhoZHItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7Ci0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkRlY3JlbWVudCBjb2RlY19jb25maWcgYnVmZmVyIGNvdW50ZXIiKTsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19kZWMoJm9teC0+bV9xdWV1ZWRfY29kZWNfY29uZmlnX2NvdW50KTsKLSAgICAgICAgICAgICAgICBpZiAoKGFuZHJvaWRfYXRvbWljX2FkZCgwLCAmb214LT5tX3F1ZXVlZF9jb2RlY19jb25maWdfY291bnQpID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgIEJJVE1BU0tfUFJFU0VOVCgmb214LT5tX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX0ZMVVNIX0RFRkVSUkVEKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNlbSBwb3N0IGZvciBDT0RFQyBDT05GSUcgYnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgICAgIHNlbV9wb3N0KCZvbXgtPm1fc2FmZV9mbHVzaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHY0bDJfYnVmX3B0ci0+ZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FIHx8Ci0gICAgICAgICAgICAgICAgdjRsMl9idWZfcHRyLT5mbGFncyAmIFY0TDJfUUNPTV9CVUZfRkxBR19JRFJGUkFNRSkgewotICAgICAgICAgICAgICAgIG9teGhkci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9teC0+cG9zdF9ldmVudCAoKHVuc2lnbmVkIGxvbmcpb214aGRyLHZkZWNfbXNnLT5zdGF0dXNfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVkRFQ19NU0dfRVZUX0lORk9fRklFTERfRFJPUFBFRDoKLSAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcDsKLSAgICAgICAgICAgIHRpbWVzdGFtcCA9IChpbnQ2NF90ICopIG1hbGxvYyhzaXplb2YoaW50NjRfdCkpOwotICAgICAgICAgICAgaWYgKHRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgICp0aW1lc3RhbXAgPSB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUudGltZV9zdGFtcDsKLSAgICAgICAgICAgICAgICBvbXgtPnBvc3RfZXZlbnQgKCh1bnNpZ25lZCBsb25nKXRpbWVzdGFtcCwgdmRlY19tc2ctPnN0YXR1c19jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9JTkZPX0ZJRUxEX0RST1BQRUQpOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZpZWxkIGRyb3BwZWQgdGltZSBzdGFtcCBpcyAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLnRpbWVfc3RhbXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVkRFQ19NU0dfUkVTUF9PVVRQVVRfRkxVU0hFRDoKLSAgICAgICAgY2FzZSBWREVDX01TR19SRVNQX09VVFBVVF9CVUZGRVJfRE9ORToKLQotICAgICAgICAgICB2NGwyX2J1Zl9wdHIgPSAodjRsMl9idWZmZXIqKXZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5jbGllbnRfZGF0YTsKLSAgICAgICAgICAgaWYgKHY0bDJfYnVmX3B0ciA9PSBOVUxMIHx8IG9teC0+bV9vdXRfbWVtX3B0ciA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICB2NGwyX2J1Zl9wdHItPmluZGV4ID49IG9teC0+ZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpIHsKLSAgICAgICAgICAgICAgIG9teGhkciA9IE5VTEw7Ci0gICAgICAgICAgICAgICB2ZGVjX21zZy0+c3RhdHVzX2NvZGUgPSBWREVDX1NfRUZBVEFMOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgcGxhbmUgPSB2NGwyX2J1Zl9wdHItPm0ucGxhbmVzOwotICAgICAgICAgICBvbXhoZHIgPSBvbXgtPm1fb3V0X21lbV9wdHIgKyB2NGwyX2J1Zl9wdHItPmluZGV4OwotCi0gICAgICAgICAgIGlmIChvbXhoZHIgJiYgb214aGRyLT5wT3V0cHV0UG9ydFByaXZhdGUgJiYKLSAgICAgICAgICAgICAgICAgICAoKG9teGhkciAtIG9teC0+bV9vdXRfbWVtX3B0cikgPCAoaW50KW9teC0+ZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpICYmCi0gICAgICAgICAgICAgICAgICAgKCgoc3RydWN0IHZkZWNfb3V0cHV0X2ZyYW1laW5mbyAqKW9teGhkci0+cE91dHB1dFBvcnRQcml2YXRlCi0gICAgICAgICAgICAgICAgICAgICAtIG9teC0+ZHJ2X2N0eC5wdHJfcmVzcGJ1ZmZlcikgPCAoaW50KW9teC0+ZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpKSB7Ci0KLSAgICAgICAgICAgICAgIGlmICh2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUubGVuIDw9ICBvbXhoZHItPm5BbGxvY0xlbikgewotICAgICAgICAgICAgICAgICAgIG9teGhkci0+bkZpbGxlZExlbiA9IHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5sZW47Ci0gICAgICAgICAgICAgICAgICAgb214aGRyLT5uT2Zmc2V0ID0gdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICBvbXhoZHItPm5UaW1lU3RhbXAgPSB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUudGltZV9zdGFtcDsKLSAgICAgICAgICAgICAgICAgICBvbXhoZHItPm5GbGFncyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICBpZiAodjRsMl9idWZfcHRyLT5mbGFncyAmIFY0TDJfUUNPTV9CVUZfRkxBR19FT1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teGhkci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcmMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgaWYgKG9teGhkci0+bkZpbGxlZExlbikgewotICAgICAgICAgICAgICAgICAgICAgICBvbXhoZHItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBpZiAodjRsMl9idWZfcHRyLT5mbGFncyAmIFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUUgfHwgdjRsMl9idWZfcHRyLT5mbGFncyAmIFY0TDJfUUNPTV9CVUZfRkxBR19JRFJGUkFNRSkgewotICAgICAgICAgICAgICAgICAgICAgICBvbXhoZHItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19TWU5DRlJBTUU7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgb214aGRyLT5uRmxhZ3MgJj0gfk9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgaWYgKHY0bDJfYnVmX3B0ci0+ZmxhZ3MgJiBWNEwyX1FDT01fQlVGX0ZMQUdfRU9TRVEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgb214aGRyLT5uRmxhZ3MgfD0gUU9NWF9WSURFT19CVUZGRVJGTEFHX0VPU0VROwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBpZiAodjRsMl9idWZfcHRyLT5mbGFncyAmIFY0TDJfUUNPTV9CVUZfRkxBR19ERUNPREVPTkxZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIG9teGhkci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0RFQ09ERU9OTFk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGlmICh2NGwyX2J1Zl9wdHItPmZsYWdzICYgVjRMMl9RQ09NX0JVRl9GTEFHX1JFQURPTkxZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbXhoZHItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19SRUFET05MWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRl9CX0Q6IFJFQURPTkxZIEJVRkZFUiAtIFJFRkVSRU5DRSBXSVRIIEYvVyBmZCA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb214LT5kcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbdjRsMl9idWZfcHRyLT5pbmRleF0ucG1lbV9mZCk7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgaWYgKHY0bDJfYnVmX3B0ci0+ZmxhZ3MgJiBWNEwyX1FDT01fQlVGX0RBVEFfQ09SUlVQVCkgewotICAgICAgICAgICAgICAgICAgICAgICBvbXhoZHItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19EQVRBQ09SUlVQVDsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICBvdXRwdXRfcmVzcGJ1ZiA9IChzdHJ1Y3QgdmRlY19vdXRwdXRfZnJhbWVpbmZvICopXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teGhkci0+cE91dHB1dFBvcnRQcml2YXRlOwotICAgICAgICAgICAgICAgICAgIGlmICghb3V0cHV0X3Jlc3BidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJhc3luY19tZXNzYWdlX3Byb2Nlc3M6IGludmFsaWQgb3V0cHV0IGJ1ZiByZWNlaXZlZCIpOwotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBvdXRwdXRfcmVzcGJ1Zi0+bGVuID0gdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmxlbjsKLSAgICAgICAgICAgICAgICAgICBvdXRwdXRfcmVzcGJ1Zi0+b2Zmc2V0ID0gdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLm9mZnNldDsKLQotICAgICAgICAgICAgICAgICAgIGlmICh2NGwyX2J1Zl9wdHItPmZsYWdzICYgVjRMMl9CVUZfRkxBR19LRVlGUkFNRSkgewotICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcmVzcGJ1Zi0+cGljX3R5cGUgPSBQSUNUVVJFX1RZUEVfSTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgaWYgKHY0bDJfYnVmX3B0ci0+ZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX1BGUkFNRSkgewotICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcmVzcGJ1Zi0+cGljX3R5cGUgPSBQSUNUVVJFX1RZUEVfUDsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgaWYgKHY0bDJfYnVmX3B0ci0+ZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0JGUkFNRSkgewotICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcmVzcGJ1Zi0+cGljX3R5cGUgPSBQSUNUVVJFX1RZUEVfQjsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICBpZiAodmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmxlbikgewotICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9teC0+b3V0cHV0X2ZsdXNoX3Byb2dyZXNzICYmIChvbXhoZHItPm5GaWxsZWRMZW4gPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IGNvbG9yc3BhY2UgYWR2aXNlZCBieSBjbGllbnQsIHNpbmNlIHRoZSBiaXRzdHJlYW0gbWF5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZvaWQgb2YgY29sb3JzcGFjZS1pbmZvLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9teC0+bV9lbmFibGVfYW5kcm9pZF9uYXRpdmVfYnVmZmVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2VfdCBjb2xvcl9zcGFjZSA9IElUVV9SXzYwMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZWQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV0EgZm9yIFZQOC4gVnA4IGVuY29kZXIgZG9lcyBub3QgZW1iZWQgY29sb3ItaW5mbyAoeWV0ISkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbmNvZGluZyBSR0JBIHJlc3VsdHMgaW4gNjAxLUxSIGZvciBhbGwgcmVzb2x1dGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNvbmZsaWN0cyB3aXRoIHRoZSBjbGllbnQndCBkZWZhdWx0cyB3aGljaCBhcmUgYmFzZWQgb24gcmVzb2x1dGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgRWc6IDcyMHAgd2lsbCBiZSBlbmNvZGVkIGFzIDYwMS1MUi4gQ2xpZW50IHdpbGwgc2F5IDcwOS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlLWVuYWJsZSB0aGlzIGNvZGUgb25jZSB2cDggZW5jb2RlciBnZW5lcmF0ZXMgY29sb3ItaW5mbyBhbmQgaGVuY2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNvZGVyIHdpbGwgYmUgYWJsZSB0byBvdmVycmlkZSB3aXRoIHRoZSBjb3JyZWN0IHNvdXJjZSBjb2xvci4KLSNpZiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvbXgtPm1fY2xpZW50X2NvbG9yX3NwYWNlLnNBc3BlY3RzLm1QcmltYXJpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNjAxXzZfNjI1OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ2MDFfNl81MjU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3NwYWNlID0gb214LT5tX2NsaWVudF9jb2xvcl9zcGFjZS5zQXNwZWN0cy5tUmFuZ2UgPT0gQ29sb3JBc3BlY3RzOjpSYW5nZUZ1bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFVfUl82MDFfRlIgOiBJVFVfUl82MDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ3MDlfNToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3Jfc3BhY2UgPSBJVFVfUl83MDk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0TWV0YURhdGEgZm9yIENvbG9yIFNwYWNlIChjbGllbnQpID0gMHgleCAoNjAxPSV1IEZSPSV1IDcwOT0ldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3Jfc3BhY2UsIElUVV9SXzYwMSwgSVRVX1JfNjAxX0ZSLCBJVFVfUl83MDkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teC0+c2V0X2NvbG9yc3BhY2VfaW5faGFuZGxlKGNvbG9yX3NwYWNlLCBvbXhoZHIgLSBvbXgtPm1fb3V0X21lbV9wdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJQcm9jZXNzaW5nIGV4dHJhZGF0YSIpOwotICAgICAgICAgICAgICAgICAgICAgICBvbXgtPmhhbmRsZV9leHRyYWRhdGEob214aGRyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICBpZiAob214LT5tX2V4dHJhZGF0YV9pbmZvLm91dHB1dF9jcm9wX3VwZGF0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiUmVhZCBGQkQgY3JvcCBmcm9tIG91dHB1dCBleHRyYSBkYXRhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUuZnJhbWVzaXplLmxlZnQgPSBvbXgtPm1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfcmVjdC5uTGVmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5mcmFtZXNpemUudG9wID0gb214LT5tX2V4dHJhZGF0YV9pbmZvLm91dHB1dF9jcm9wX3JlY3QublRvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5mcmFtZXNpemUucmlnaHQgPSBvbXgtPm1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfcmVjdC5uV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUuZnJhbWVzaXplLmJvdHRvbSA9IG9teC0+bV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUucGljc2l6ZS5mcmFtZV93aWR0aCA9IG9teC0+bV9leHRyYWRhdGFfaW5mby5vdXRwdXRfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUucGljc2l6ZS5mcmFtZV9oZWlnaHQgPSBvbXgtPm1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSh2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUubWlzcmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teC0+bV9leHRyYWRhdGFfaW5mby5taXNyX2luZm8sIHNpemVvZih2ZGVjX21pc3JpbmZvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlJlYWQgRkJEIGNyb3AgZnJvbSB2NGwyIHJlc2VydmVkIGZpZWxkcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmZyYW1lc2l6ZS5sZWZ0ID0gcGxhbmVbMF0ucmVzZXJ2ZWRbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUuZnJhbWVzaXplLnRvcCA9IHBsYW5lWzBdLnJlc2VydmVkWzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmZyYW1lc2l6ZS5yaWdodCA9IHBsYW5lWzBdLnJlc2VydmVkWzJdICsgcGxhbmVbMF0ucmVzZXJ2ZWRbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUuZnJhbWVzaXplLmJvdHRvbSA9IHBsYW5lWzBdLnJlc2VydmVkWzNdICsgcGxhbmVbMF0ucmVzZXJ2ZWRbNV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUucGljc2l6ZS5mcmFtZV93aWR0aCA9IHBsYW5lWzBdLnJlc2VydmVkWzZdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLnBpY3NpemUuZnJhbWVfaGVpZ2h0ID0gcGxhbmVbMF0ucmVzZXJ2ZWRbN107Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlc2UgdmFsdWVzIGJhY2sgdG8gT01YIGludGVybmFsIHZhcmlhYmxlcyB0byBtYWtlIGJvdGggaGFuZGxpZ24gc2FtZSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teC0+bV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5MZWZ0ID0gdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmZyYW1lc2l6ZS5sZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgb214LT5tX2V4dHJhZGF0YV9pbmZvLm91dHB1dF9jcm9wX3JlY3QublRvcCA9IHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5mcmFtZXNpemUudG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgb214LT5tX2V4dHJhZGF0YV9pbmZvLm91dHB1dF9jcm9wX3JlY3QubldpZHRoID0gdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmZyYW1lc2l6ZS5yaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teC0+bV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5IZWlnaHQgPSB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUuZnJhbWVzaXplLmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teC0+bV9leHRyYWRhdGFfaW5mby5vdXRwdXRfd2lkdGggPSB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUucGljc2l6ZS5mcmFtZV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teC0+bV9leHRyYWRhdGFfaW5mby5vdXRwdXRfaGVpZ2h0ID0gdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLnBpY3NpemUuZnJhbWVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmJ1ZmZlcmFkZHIgPQotICAgICAgICAgICAgICAgICAgICAgICBvbXgtPmRydl9jdHgucHRyX291dHB1dGJ1ZmZlclt2NGwyX2J1Zl9wdHItPmluZGV4XS5idWZmZXJhZGRyOwotCi0gICAgICAgICAgICAgICAgICAgaWYgKHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5sZW4pCi0gICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmb214LT5kcnZfY3R4LmZyYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5mcmFtZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB2ZGVjX2ZyYW1lc2l6ZSkpOwotCi0gICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJbUmVzcEJ1ZkRvbmVdIEZkKCVkKSBCdWYoJXApIFRzKCVsbGQpIFBpY1R5cGUoJXUpIEZsYWdzICgweCV4KSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIgRmlsbExlbigldSkgQ3JvcDogTCgldSkgVCgldSkgUigldSkgQigldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb214LT5kcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbdjRsMl9idWZfcHRyLT5pbmRleF0ucG1lbV9mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teGhkciwgKGxvbmcgbG9uZyl2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUudGltZV9zdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5waWNfdHlwZSwgdjRsMl9idWZfcHRyLT5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5mcmFtZXNpemUubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5mcmFtZXNpemUudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmZyYW1lc2l6ZS5yaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5mcmFtZXNpemUuYm90dG9tKTsKLQotICAgICAgICAgICAgICAgICAgIC8qIFBvc3QgZXZlbnQgaWYgcmVzb2x1dGlvbiBPUiBjcm9wIGNoYW5nZWQgKi8KLSAgICAgICAgICAgICAgICAgICAvKiBmaWxsZWQgbGVuZ3RoIHdpbGwgYmUgY2hhbmdlZCBpZiByZXNvbHV0aW9uIGNoYW5nZWQgKi8KLSAgICAgICAgICAgICAgICAgICAvKiBDcm9wIHBhcmFtZXRlcnMgY2FuIGJlIGNoYW5nZWQgZXZlbiB3aXRob3V0IHJlc29sdXRpb24gY2hhbmdlICovCi0gICAgICAgICAgICAgICAgICAgaWYgKG9teGhkci0+bkZpbGxlZExlbgotICAgICAgICAgICAgICAgICAgICAgICAmJiAoKG9teC0+cHJldl9uX2ZpbGxlZF9sZW4gIT0gb214aGRyLT5uRmlsbGVkTGVuKQotICAgICAgICAgICAgICAgICAgICAgICB8fCAob214LT5kcnZfY3R4LmZyYW1lX3NpemUubGVmdCAhPSB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUuZnJhbWVzaXplLmxlZnQpCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IChvbXgtPmRydl9jdHguZnJhbWVfc2l6ZS50b3AgIT0gdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmZyYW1lc2l6ZS50b3ApCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IChvbXgtPmRydl9jdHguZnJhbWVfc2l6ZS5yaWdodCAhPSB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUuZnJhbWVzaXplLnJpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICB8fCAob214LT5kcnZfY3R4LmZyYW1lX3NpemUuYm90dG9tICE9IHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5mcmFtZXNpemUuYm90dG9tKQotICAgICAgICAgICAgICAgICAgICAgICB8fCAob214LT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGggIT0gdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLnBpY3NpemUuZnJhbWVfd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IChvbXgtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQgIT0gdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLnBpY3NpemUuZnJhbWVfaGVpZ2h0KSApKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiUGFyYW1ldGVycyBDaGFuZ2VkIEZyb206IExlbjogJXUsIFd4SDogJWR4JWQsIEw6ICV1LCBUOiAldSwgUjogJXUsIEI6ICV1IC0tPiBMZW46ICV1LCBXeEg6ICVkeCVkLCBMOiAldSwgVDogJXUsIFI6ICV1LCBCOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb214LT5wcmV2X25fZmlsbGVkX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXgtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXgtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb214LT5kcnZfY3R4LmZyYW1lX3NpemUubGVmdCwgb214LT5kcnZfY3R4LmZyYW1lX3NpemUudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teC0+ZHJ2X2N0eC5mcmFtZV9zaXplLnJpZ2h0LCBvbXgtPmRydl9jdHguZnJhbWVfc2l6ZS5ib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb214aGRyLT5uRmlsbGVkTGVuLCB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUucGljc2l6ZS5mcmFtZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUucGljc2l6ZS5mcmFtZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmZyYW1lc2l6ZS5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5mcmFtZXNpemUudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5mcmFtZXNpemUucmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmZyYW1lc2l6ZS5ib3R0b20pOwotCi0gICAgICAgICAgICAgICAgICAgICAgIG9teC0+ZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUucGljc2l6ZS5mcmFtZV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgb214LT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUucGljc2l6ZS5mcmFtZV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChvbXgtPmRydl9jdHgub3V0cHV0X2Zvcm1hdCA9PSBWREVDX1lVVl9GT1JNQVRfTlYxMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgb214LT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRU5VU19ZX1NUUklERShDT0xPUl9GTVRfTlYxMiwgb214LT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgb214LT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uc2Nhbl9saW5lcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVOVVNfWV9TQ0FOTElORVMoQ09MT1JfRk1UX05WMTIsIG9teC0+ZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob214LT5kcnZfY3R4Lm91dHB1dF9mb3JtYXQgPT0gVkRFQ19ZVVZfRk9STUFUX05WMTJfVUJXQykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgb214LT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRU5VU19ZX1NUUklERShDT0xPUl9GTVRfTlYxMl9VQldDLCBvbXgtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBvbXgtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5zY2FuX2xpbmVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRU5VU19ZX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBvbXgtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9teC0+ZHJ2X2N0eC5vdXRwdXRfZm9ybWF0ID09IFZERUNfWVVWX0ZPUk1BVF9OVjEyX1RQMTBfVUJXQykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgb214LT5kcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRU5VU19ZX1NUUklERShDT0xPUl9GTVRfTlYxMl9CUFAxMF9VQldDLCBvbXgtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBvbXgtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5zY2FuX2xpbmVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRU5VU19ZX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9CUFAxMF9VQldDLCBvbXgtPmRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgIG9teC0+cG9zdF9ldmVudChPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9QT1JUX1JFQ09ORklHKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICBpZiAob214aGRyLT5uRmlsbGVkTGVuKQotICAgICAgICAgICAgICAgICAgICAgICBvbXgtPnByZXZfbl9maWxsZWRfbGVuID0gb214aGRyLT5uRmlsbGVkTGVuOwotCi0gICAgICAgICAgICAgICAgICAgaWYgKG9teC0+b3V0cHV0X3VzZV9idWZmZXIgJiYgb214aGRyLT5wQnVmZmVyICYmCi0gICAgICAgICAgICAgICAgICAgICAgIHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5idWZmZXJhZGRyKQotICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkgKCBvbXhoZHItPnBCdWZmZXIsICh2b2lkICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKXZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5idWZmZXJhZGRyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLm9mZnNldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRlY19tc2ctPm1zZ2RhdGEub3V0cHV0X2ZyYW1lLmxlbik7Ci0gICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIGZpbGxlZCBsZW5ndGggPSAldSwgYnVmZmVyIHNpemUgPSAldSwgcHJldl9sZW5ndGggPSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvbXhoZHItPm5BbGxvY0xlbiwgb214LT5wcmV2X25fZmlsbGVkX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgb214aGRyLT5uRmlsbGVkTGVuID0gMDsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgb214LT5wb3N0X2V2ZW50ICgodW5zaWduZWQgbG9uZylvbXhoZHIsIHZkZWNfbXNnLT5zdGF0dXNfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRkJEKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmICh2ZGVjX21zZy0+bXNnZGF0YS5vdXRwdXRfZnJhbWUuZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgICAgICAgICBvbXgtPnBvc3RfZXZlbnQgKCh1bnNpZ25lZCBsb25nKU5VTEwsIHZkZWNfbXNnLT5zdGF0dXNfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRU9TX0RPTkUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvbXgtPnBvc3RfZXZlbnQgKCh1bnNpZ25lZCBpbnQpTlVMTCwgdmRlY19tc2ctPnN0YXR1c19jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9IQVJEV0FSRV9FUlJPUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWREVDX01TR19FVlRfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJQb3J0IHNldHRpbmdzIGNoYW5nZWQiKTsKLSAgICAgICAgICAgIG9teC0+bV9yZWNvbmZpZ193aWR0aCA9IHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5waWNzaXplLmZyYW1lX3dpZHRoOwotICAgICAgICAgICAgb214LT5tX3JlY29uZmlnX2hlaWdodCA9IHZkZWNfbXNnLT5tc2dkYXRhLm91dHB1dF9mcmFtZS5waWNzaXplLmZyYW1lX2hlaWdodDsKLSAgICAgICAgICAgIG9teC0+cG9zdF9ldmVudCAoT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfUE9SVF9SRUNPTkZJRyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLSNpZm5kZWYgVVNFX0lPTgotYm9vbCBvbXhfdmRlYzo6YWxpZ25fcG1lbV9idWZmZXJzKGludCBwbWVtX2ZkLCBPTVhfVTMyIGJ1ZmZlcl9zaXplLAotICAgICAgICBPTVhfVTMyIGFsaWdubWVudCkKLXsKLSAgICBzdHJ1Y3QgcG1lbV9hbGxvY2F0aW9uIGFsbG9jYXRpb247Ci0gICAgYWxsb2NhdGlvbi5zaXplID0gYnVmZmVyX3NpemU7Ci0gICAgYWxsb2NhdGlvbi5hbGlnbiA9IGNsaXAyKGFsaWdubWVudCk7Ci0gICAgaWYgKGFsbG9jYXRpb24uYWxpZ24gPCA0MDk2KSB7Ci0gICAgICAgIGFsbG9jYXRpb24uYWxpZ24gPSA0MDk2OwotICAgIH0KLSAgICBpZiAoaW9jdGwocG1lbV9mZCwgUE1FTV9BTExPQ0FURV9BTElHTkVELCAmYWxsb2NhdGlvbikgPCAwKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJBbGlnbWVudCgldSkgZmFpbGVkIHdpdGggcG1lbSBkcml2ZXIgU3ooJWx1KSIsCi0gICAgICAgICAgICAgICAgYWxsb2NhdGlvbi5hbGlnbiwgYWxsb2NhdGlvbi5zaXplKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZgotI2lmZGVmIFVTRV9JT04KLWludCBvbXhfdmRlYzo6YWxsb2NfbWFwX2lvbl9tZW1vcnkoT01YX1UzMiBidWZmZXJfc2l6ZSwKLSAgICAgICAgT01YX1UzMiBhbGlnbm1lbnQsIHN0cnVjdCBpb25fYWxsb2NhdGlvbl9kYXRhICphbGxvY19kYXRhLAotICAgICAgICBzdHJ1Y3QgaW9uX2ZkX2RhdGEgKmZkX2RhdGEsIGludCBmbGFnKQotewotICAgIGludCBmZCA9IC1FSU5WQUw7Ci0gICAgaW50IHJjID0gLUVJTlZBTDsKLSAgICBpbnQgaW9uX2Rldl9mbGFnOwotICAgIHN0cnVjdCB2ZGVjX2lvbiBpb25fYnVmX2luZm87Ci0gICAgaWYgKCFhbGxvY19kYXRhIHx8IGJ1ZmZlcl9zaXplIDw9IDAgfHwgIWZkX2RhdGEpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgYXJndW1lbnRzIHRvIGFsbG9jX21hcF9pb25fbWVtb3J5Iik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBpb25fZGV2X2ZsYWcgPSBPX1JET05MWTsKLSAgICBmZCA9IG9wZW4gKE1FTV9ERVZJQ0UsIGlvbl9kZXZfZmxhZyk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigib3BlbmluZyBpb24gZGV2aWNlIGZhaWxlZCB3aXRoIGZkID0gJWQiLCBmZCk7Ci0gICAgICAgIHJldHVybiBmZDsKLSAgICB9Ci0KLSAgICBhbGxvY19kYXRhLT5mbGFncyA9IGZsYWc7Ci0gICAgYWxsb2NfZGF0YS0+bGVuID0gYnVmZmVyX3NpemU7Ci0gICAgYWxsb2NfZGF0YS0+YWxpZ24gPSBjbGlwMihhbGlnbm1lbnQpOwotICAgIGlmIChhbGxvY19kYXRhLT5hbGlnbiA8IDQwOTYpIHsKLSAgICAgICAgYWxsb2NfZGF0YS0+YWxpZ24gPSA0MDk2OwotICAgIH0KLQotICAgIGFsbG9jX2RhdGEtPmhlYXBfaWRfbWFzayA9IElPTl9IRUFQKElPTl9JT01NVV9IRUFQX0lEKTsKLSAgICBpZiAoc2VjdXJlX21vZGUgJiYgKGFsbG9jX2RhdGEtPmZsYWdzICYgSU9OX1NFQ1VSRSkpIHsKLSAgICAgICAgYWxsb2NfZGF0YS0+aGVhcF9pZF9tYXNrID0gSU9OX0hFQVAoTUVNX0hFQVBfSUQpOwotICAgIH0KLQotICAgIC8qIFVzZSBzZWN1cmUgZGlzcGxheSBjbWEgaGVhcCBmb3Igb2J2aW91cyByZWFzb25zLiAqLwotICAgIGlmIChhbGxvY19kYXRhLT5mbGFncyAmIElPTl9GTEFHX0NQX0JJVFNUUkVBTSkgewotICAgICAgICBhbGxvY19kYXRhLT5oZWFwX2lkX21hc2sgfD0gSU9OX0hFQVAoSU9OX1NFQ1VSRV9ESVNQTEFZX0hFQVBfSUQpOwotICAgIH0KLQotICAgIHJjID0gaW9jdGwoZmQsSU9OX0lPQ19BTExPQyxhbGxvY19kYXRhKTsKLSAgICBpZiAocmMgfHwgIWFsbG9jX2RhdGEtPmhhbmRsZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSU9OIEFMTE9DIG1lbW9yeSBmYWlsZWQiKTsKLSAgICAgICAgYWxsb2NfZGF0YS0+aGFuZGxlID0gMDsKLSAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICBmZCA9IC1FTk9NRU07Ci0gICAgICAgIHJldHVybiBmZDsKLSAgICB9Ci0gICAgZmRfZGF0YS0+aGFuZGxlID0gYWxsb2NfZGF0YS0+aGFuZGxlOwotICAgIHJjID0gaW9jdGwoZmQsSU9OX0lPQ19NQVAsZmRfZGF0YSk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJT04gTUFQIGZhaWxlZCAiKTsKLSAgICAgICAgaW9uX2J1Zl9pbmZvLmlvbl9hbGxvY19kYXRhID0gKmFsbG9jX2RhdGE7Ci0gICAgICAgIGlvbl9idWZfaW5mby5pb25fZGV2aWNlX2ZkID0gZmQ7Ci0gICAgICAgIGlvbl9idWZfaW5mby5mZF9pb25fZGF0YSA9ICpmZF9kYXRhOwotICAgICAgICBmcmVlX2lvbl9tZW1vcnkoJmlvbl9idWZfaW5mbyk7Ci0gICAgICAgIGZkX2RhdGEtPmZkID0tMTsKLSAgICAgICAgZmQgPSAtRU5PTUVNOwotICAgIH0KLQotICAgIHJldHVybiBmZDsKLX0KLQotdm9pZCBvbXhfdmRlYzo6ZnJlZV9pb25fbWVtb3J5KHN0cnVjdCB2ZGVjX2lvbiAqYnVmX2lvbl9pbmZvKQotewotCi0gICAgaWYgKCFidWZfaW9uX2luZm8pIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIklPTjogZnJlZSBjYWxsZWQgd2l0aCBpbnZhbGlkIGZkL2FsbG9jZGF0YSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChpb2N0bChidWZfaW9uX2luZm8tPmlvbl9kZXZpY2VfZmQsSU9OX0lPQ19GUkVFLAotICAgICAgICAgICAgICAgICZidWZfaW9uX2luZm8tPmlvbl9hbGxvY19kYXRhLmhhbmRsZSkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIklPTjogZnJlZSBmYWlsZWQiICk7Ci0gICAgfQotICAgIGNsb3NlKGJ1Zl9pb25faW5mby0+aW9uX2RldmljZV9mZCk7Ci0gICAgYnVmX2lvbl9pbmZvLT5pb25fZGV2aWNlX2ZkID0gLTE7Ci0gICAgYnVmX2lvbl9pbmZvLT5pb25fYWxsb2NfZGF0YS5oYW5kbGUgPSAwOwotICAgIGJ1Zl9pb25faW5mby0+ZmRfaW9uX2RhdGEuZmQgPSAtMTsKLX0KLSNlbmRpZgotdm9pZCBvbXhfdmRlYzo6ZnJlZV9vdXRwdXRfYnVmZmVyX2hlYWRlcigpCi17Ci0gICAgREVCVUdfUFJJTlRfSElHSCgiQUxMIG91dHB1dCBidWZmZXJzIGFyZSBmcmVlZC9yZWxlYXNlZCIpOwotICAgIG91dHB1dF91c2VfYnVmZmVyID0gZmFsc2U7Ci0gICAgb3VwdXRfZWdsX2J1ZmZlcnMgPSBmYWxzZTsKLQotICAgIGlmIChtX291dF9tZW1fcHRyKSB7Ci0gICAgICAgIGZyZWUgKG1fb3V0X21lbV9wdHIpOwotICAgICAgICBtX291dF9tZW1fcHRyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobV9wbGF0Zm9ybV9saXN0KSB7Ci0gICAgICAgIGZyZWUobV9wbGF0Zm9ybV9saXN0KTsKLSAgICAgICAgbV9wbGF0Zm9ybV9saXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoZHJ2X2N0eC5wdHJfcmVzcGJ1ZmZlcikgewotICAgICAgICBmcmVlIChkcnZfY3R4LnB0cl9yZXNwYnVmZmVyKTsKLSAgICAgICAgZHJ2X2N0eC5wdHJfcmVzcGJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXIpIHsKLSAgICAgICAgZnJlZSAoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyKTsKLSAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyID0gTlVMTDsKLSAgICB9Ci0jaWZkZWYgVVNFX0lPTgotICAgIGlmIChkcnZfY3R4Lm9wX2J1Zl9pb25faW5mbykgewotICAgICAgICBERUJVR19QUklOVF9MT1coIkZyZWUgby9wIGlvbiBjb250ZXh0Iik7Ci0gICAgICAgIGZyZWUoZHJ2X2N0eC5vcF9idWZfaW9uX2luZm8pOwotICAgICAgICBkcnZfY3R4Lm9wX2J1Zl9pb25faW5mbyA9IE5VTEw7Ci0gICAgfQotI2VuZGlmCi0gICAgYnVmX3JlZl9yZW1vdmUoKTsKLX0KLQotdm9pZCBvbXhfdmRlYzo6ZnJlZV9pbnB1dF9idWZmZXJfaGVhZGVyKCkKLXsKLSAgICBpbnB1dF91c2VfYnVmZmVyID0gZmFsc2U7Ci0gICAgaWYgKGFyYml0cmFyeV9ieXRlcykgewotICAgICAgICBpZiAobV9pbnBfaGVhcF9wdHIpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZSBpbnB1dCBIZWFwIFBvaW50ZXIiKTsKLSAgICAgICAgICAgIGZyZWUgKG1faW5wX2hlYXBfcHRyKTsKLSAgICAgICAgICAgIG1faW5wX2hlYXBfcHRyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3BoZHJfcG1lbV9wdHIpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZSBpbnB1dCBwbWVtIGhlYWRlciBQb2ludGVyIik7Ci0gICAgICAgICAgICBmcmVlIChtX3BoZHJfcG1lbV9wdHIpOwotICAgICAgICAgICAgbV9waGRyX3BtZW1fcHRyID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9pbnBfbWVtX3B0cikgewotICAgICAgICBERUJVR19QUklOVF9MT1coIkZyZWUgaW5wdXQgcG1lbSBQb2ludGVyIGFyZWEiKTsKLSAgICAgICAgZnJlZSAobV9pbnBfbWVtX3B0cik7Ci0gICAgICAgIG1faW5wX21lbV9wdHIgPSBOVUxMOwotICAgIH0KLSAgICAvKiBXZSBqdXN0IGZyZWVkIGFsbCB0aGUgYnVmZmVyIGhlYWRlcnMsIGV2ZXJ5IHRoaW5nIGluIG1faW5wdXRfZnJlZV9xLAotICAgICAqIG1faW5wdXRfcGVuZGluZ19xLCBwZGVzdF9mcmFtZSwgYW5kIHBzb3VyY2VfZnJhbWUgaXMgbm93IGludmFsaWQgKi8KLSAgICB3aGlsZSAobV9pbnB1dF9mcmVlX3EubV9zaXplKSB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcDIsIGlkOwotICAgICAgICBtX2lucHV0X2ZyZWVfcS5wb3BfZW50cnkoJmFkZHJlc3MsICZwMiwgJmlkKTsKLSAgICB9Ci0gICAgd2hpbGUgKG1faW5wdXRfcGVuZGluZ19xLm1fc2l6ZSkgewotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHAyLCBpZDsKLSAgICAgICAgbV9pbnB1dF9wZW5kaW5nX3EucG9wX2VudHJ5KCZhZGRyZXNzLCAmcDIsICZpZCk7Ci0gICAgfQotICAgIHBkZXN0X2ZyYW1lID0gTlVMTDsKLSAgICBwc291cmNlX2ZyYW1lID0gTlVMTDsKLSAgICBpZiAoZHJ2X2N0eC5wdHJfaW5wdXRidWZmZXIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlIERyaXZlciBDb250ZXh0IHBvaW50ZXIiKTsKLSAgICAgICAgZnJlZSAoZHJ2X2N0eC5wdHJfaW5wdXRidWZmZXIpOwotICAgICAgICBkcnZfY3R4LnB0cl9pbnB1dGJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotI2lmZGVmIFVTRV9JT04KLSAgICBpZiAoZHJ2X2N0eC5pcF9idWZfaW9uX2luZm8pIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlIGlvbiBjb250ZXh0Iik7Ci0gICAgICAgIGZyZWUoZHJ2X2N0eC5pcF9idWZfaW9uX2luZm8pOwotICAgICAgICBkcnZfY3R4LmlwX2J1Zl9pb25faW5mbyA9IE5VTEw7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXZvaWQgb214X3ZkZWM6OmZyZWVfb3V0cHV0X2V4dHJhZGF0YV9idWZmZXJfaGVhZGVyKCkgewotICAgIGNsaWVudF9leHRyYWRhdGEgPSBmYWxzZTsKLSAgICBpZiAobV9jbGllbnRfb3V0cHV0X2V4dHJhZGF0YV9tZW1fcHRyKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZSBleHRyYWRhdGEgcG1lbSBQb2ludGVyIGFyZWEiKTsKLSAgICAgICAgZnJlZShtX2NsaWVudF9vdXRwdXRfZXh0cmFkYXRhX21lbV9wdHIpOwotICAgICAgICBtX2NsaWVudF9vdXRwdXRfZXh0cmFkYXRhX21lbV9wdHIgPSBOVUxMOwotICAgIH0KLX0KLQotaW50IG9teF92ZGVjOjpzdHJlYW1fb2ZmKE9NWF9VMzIgcG9ydCkKLXsKLSAgICBlbnVtIHY0bDJfYnVmX3R5cGUgYnR5cGU7Ci0gICAgaW50IHJjID0gMDsKLSAgICBlbnVtIHY0bDJfcG9ydHMgdjRsMl9wb3J0ID0gT1VUUFVUX1BPUlQ7Ci0KLSAgICBpZiAocG9ydCA9PSBPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYKSB7Ci0gICAgICAgIGJ0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICB2NGwyX3BvcnQgPSBPVVRQVVRfUE9SVDsKLSAgICB9IGVsc2UgaWYgKHBvcnQgPT0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgpIHsKLSAgICAgICAgYnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgICAgICB2NGwyX3BvcnQgPSBDQVBUVVJFX1BPUlQ7Ci0gICAgfSBlbHNlIGlmIChwb3J0ID09IE9NWF9BTEwpIHsKLSAgICAgICAgaW50IHJjX2lucHV0ID0gc3RyZWFtX29mZihPTVhfQ09SRV9JTlBVVF9QT1JUX0lOREVYKTsKLSAgICAgICAgaW50IHJjX291dHB1dCA9IHN0cmVhbV9vZmYoT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgpOwotCi0gICAgICAgIGlmICghcmNfaW5wdXQpCi0gICAgICAgICAgICByZXR1cm4gcmNfaW5wdXQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiByY19vdXRwdXQ7Ci0gICAgfQotCi0gICAgaWYgKCFzdHJlYW1pbmdbdjRsMl9wb3J0XSkgewotICAgICAgICAvLyBhbHJlYWR5IHN0cmVhbWVkIG9mZiwgd2FybiBhbmQgbW92ZSBvbgotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJXYXJuaW5nOiBBdHRlbXB0aW5nIHRvIHN0cmVhbSBvZmYgb24gJWQgcG9ydCwiCi0gICAgICAgICAgICAgICAgIiB3aGljaCBpcyBhbHJlYWR5IHN0cmVhbWVkIG9mZiIsIHY0bDJfcG9ydCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0hJR0goIlN0cmVhbWluZyBvZmYgJWQgcG9ydCIsIHY0bDJfcG9ydCk7Ci0KLSAgICByYyA9IGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU1RSRUFNT0ZGLCAmYnR5cGUpOwotICAgIGlmIChyYykgewotICAgICAgICAvKlRPRE86IEhvdyB0byBoYW5kbGUgdGhpcyBjYXNlICovCi0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gY2FsbCBzdHJlYW1vZmYgb24gJWQgUG9ydCIsIHY0bDJfcG9ydCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RyZWFtaW5nW3Y0bDJfcG9ydF0gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgb214X3ZkZWM6OmdldF9idWZmZXJfcmVxKHZkZWNfYWxsb2NhdG9ycHJvcGVydHkgKmJ1ZmZlcl9wcm9wKQotewotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgYnVmcmVxOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICB1bnNpZ25lZCBpbnQgYnVmX3NpemUgPSAwLCBleHRyYV9kYXRhX3NpemUgPSAwLCBkZWZhdWx0X2V4dHJhX2RhdGFfc2l6ZSA9IDA7Ci0gICAgdW5zaWduZWQgaW50IGZpbmFsX2V4dHJhX2RhdGFfc2l6ZSA9IDA7Ci0gICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBERUJVR19QUklOVF9MT1coIkdldEJ1ZlJlcSBJTjogQWN0Q250KCVkKSBTaXplKCV1KSIsCi0gICAgICAgICAgICBidWZmZXJfcHJvcC0+YWN0dWFsY291bnQsICh1bnNpZ25lZCBpbnQpYnVmZmVyX3Byb3AtPmJ1ZmZlcl9zaXplKTsKLSAgICBidWZyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICBidWZyZXEuY291bnQgPSAxOwotICAgIGlmIChidWZmZXJfcHJvcC0+YnVmZmVyX3R5cGUgPT0gVkRFQ19CVUZGRVJfVFlQRV9JTlBVVCkgewotICAgICAgICBidWZyZXEudHlwZT1WNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7Ci0gICAgICAgIGZtdC50eXBlID1WNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gb3V0cHV0X2NhcGFiaWxpdHk7Ci0gICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfT1VUUFVUOwotICAgIH0gZWxzZSBpZiAoYnVmZmVyX3Byb3AtPmJ1ZmZlcl90eXBlID09IFZERUNfQlVGRkVSX1RZUEVfT1VUUFVUKSB7Ci0gICAgICAgIGJ1ZnJlcS50eXBlPVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgICAgIGZtdC50eXBlID1WNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IGNhcHR1cmVfY2FwYWJpbGl0eTsKLSAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9DQVBUVVJFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotICAgIGNvbnRyb2wudmFsdWUgPSBidWZmZXJfcHJvcC0+bWluY291bnQ7Ci0gICAgaWYgKGVSZXQgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0dfQ1RSTCwgJmNvbnRyb2wpOwotICAgIH0KLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJSZXF1ZXN0aW5nIGJ1ZmZlciByZXF1aXJlbWVudHMgZmFpbGVkIik7Ci0gICAgICAgIC8qVE9ETzogSG93IHRvIGhhbmRsZSB0aGlzIGNhc2UgKi8KLSAgICAgICAgZVJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgcmV0dXJuIGVSZXQ7Ci0gICAgfQotICAgIGJ1ZmZlcl9wcm9wLT5hY3R1YWxjb3VudCA9IGJ1ZmZlcl9wcm9wLT5taW5jb3VudCA9IGNvbnRyb2wudmFsdWU7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkNvdW50ID0gJWQiLGJ1ZnJlcS5jb3VudCk7Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJHZXRCdWZSZXEgSU46IEFjdENudCglZCkgU2l6ZSgldSkiLAotICAgICAgICAgICAgYnVmZmVyX3Byb3AtPmFjdHVhbGNvdW50LCAodW5zaWduZWQgaW50KWJ1ZmZlcl9wcm9wLT5idWZmZXJfc2l6ZSk7Ci0KLSAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmZm10KTsKLQotICAgIGlmIChmbXQudHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQotICAgICAgICBkcnZfY3R4Lm51bV9wbGFuZXMgPSBmbXQuZm10LnBpeF9tcC5udW1fcGxhbmVzOwotICAgIERFQlVHX1BSSU5UX0hJR0goIkJ1ZmZlciBTaXplID0gJWQiLGZtdC5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UpOwotCi0gICAgaWYgKHJldCkgewotICAgICAgICAvKlRPRE86IEhvdyB0byBoYW5kbGUgdGhpcyBjYXNlICovCi0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJSZXF1ZXN0aW5nIGJ1ZmZlciByZXF1aXJlbWVudHMgZmFpbGVkIik7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGV4dHJhX2lkeCA9IDA7Ci0KLSAgICAgICAgZVJldCA9IGlzX3ZpZGVvX3Nlc3Npb25fc3VwcG9ydGVkKCk7Ci0gICAgICAgIGlmIChlUmV0KQotICAgICAgICAgICAgcmV0dXJuIGVSZXQ7Ci0KLSAgICAgICAgYnVmZmVyX3Byb3AtPmJ1ZmZlcl9zaXplID0gZm10LmZtdC5waXhfbXAucGxhbmVfZm10WzBdLnNpemVpbWFnZTsKLSAgICAgICAgYnVmX3NpemUgPSBidWZmZXJfcHJvcC0+YnVmZmVyX3NpemU7Ci0gICAgICAgIGV4dHJhX2lkeCA9IEVYVFJBREFUQV9JRFgoZHJ2X2N0eC5udW1fcGxhbmVzKTsKLSAgICAgICAgaWYgKGV4dHJhX2lkeCAmJiAoZXh0cmFfaWR4IDwgVklERU9fTUFYX1BMQU5FUykpIHsKLSAgICAgICAgICAgIGV4dHJhX2RhdGFfc2l6ZSA9ICBmbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbZXh0cmFfaWR4XS5zaXplaW1hZ2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXh0cmFfaWR4ID49IFZJREVPX01BWF9QTEFORVMpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFeHRyYWRhdGEgaW5kZXggaXMgbW9yZSB0aGFuIGFsbG93ZWQ6ICVkIiwgZXh0cmFfaWR4KTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0X2V4dHJhX2RhdGFfc2l6ZSA9IFZFTlVTX0VYVFJBREFUQV9TSVpFKAotICAgICAgICAgICAgICAgIGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoKTsKLSAgICAgICAgZmluYWxfZXh0cmFfZGF0YV9zaXplID0gZXh0cmFfZGF0YV9zaXplID4gZGVmYXVsdF9leHRyYV9kYXRhX3NpemUgPwotICAgICAgICAgICAgZXh0cmFfZGF0YV9zaXplIDogZGVmYXVsdF9leHRyYV9kYXRhX3NpemU7Ci0KLSAgICAgICAgZmluYWxfZXh0cmFfZGF0YV9zaXplID0gKGZpbmFsX2V4dHJhX2RhdGFfc2l6ZSArIGJ1ZmZlcl9wcm9wLT5hbGlnbm1lbnQgLSAxKSAmCi0gICAgICAgICAgICAofihidWZmZXJfcHJvcC0+YWxpZ25tZW50IC0gMSkpOwotCi0gICAgICAgIGRydl9jdHguZXh0cmFkYXRhX2luZm8uc2l6ZSA9IGJ1ZmZlcl9wcm9wLT5hY3R1YWxjb3VudCAqIGZpbmFsX2V4dHJhX2RhdGFfc2l6ZTsKLSAgICAgICAgZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5jb3VudCA9IGJ1ZmZlcl9wcm9wLT5hY3R1YWxjb3VudDsKLSAgICAgICAgZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZSA9IGZpbmFsX2V4dHJhX2RhdGFfc2l6ZTsKLSAgICAgICAgYnVmX3NpemUgPSAoYnVmX3NpemUgKyBidWZmZXJfcHJvcC0+YWxpZ25tZW50IC0gMSkmKH4oYnVmZmVyX3Byb3AtPmFsaWdubWVudCAtIDEpKTsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJHZXRCdWZSZXEgVVBEQVRFOiBBY3RDbnQoJWQpIFNpemUoJXUpIEJ1ZlNpemUoJWQpIiwKLSAgICAgICAgICAgICAgICBidWZmZXJfcHJvcC0+YWN0dWFsY291bnQsICh1bnNpZ25lZCBpbnQpYnVmZmVyX3Byb3AtPmJ1ZmZlcl9zaXplLCBidWZfc2l6ZSk7Ci0gICAgICAgIGlmIChleHRyYV9kYXRhX3NpemUpCi0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkdldEJ1ZlJlcSBVUERBVEU6IGV4dHJhZGF0YTogVG90YWxTaXplKCVkKSBCdWZmZXJTaXplKCVsdSkiLAotICAgICAgICAgICAgICAgIGRydl9jdHguZXh0cmFkYXRhX2luZm8uc2l6ZSwgZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKGluX3JlY29uZmlnKSAvLyBCdWZSZXEgd2lsbCBiZSBzZXQgdG8gZHJpdmVyIHdoZW4gcG9ydCBpcyBkaXNhYmxlZAotICAgICAgICAgICAgYnVmZmVyX3Byb3AtPmJ1ZmZlcl9zaXplID0gYnVmX3NpemU7Ci0gICAgICAgIGVsc2UgaWYgKGJ1Zl9zaXplICE9IGJ1ZmZlcl9wcm9wLT5idWZmZXJfc2l6ZSkgewotICAgICAgICAgICAgYnVmZmVyX3Byb3AtPmJ1ZmZlcl9zaXplID0gYnVmX3NpemU7Ci0gICAgICAgICAgICBlUmV0ID0gc2V0X2J1ZmZlcl9yZXEoYnVmZmVyX3Byb3ApOwotICAgICAgICB9Ci0gICAgfQotICAgIERFQlVHX1BSSU5UX0xPVygiR2V0QnVmUmVxIE9VVDogQWN0Q250KCVkKSBTaXplKCV1KSIsCi0gICAgICAgICAgICBidWZmZXJfcHJvcC0+YWN0dWFsY291bnQsICh1bnNpZ25lZCBpbnQpYnVmZmVyX3Byb3AtPmJ1ZmZlcl9zaXplKTsKLSAgICByZXR1cm4gZVJldDsKLX0KLQotT01YX0VSUk9SVFlQRSBvbXhfdmRlYzo6c2V0X2J1ZmZlcl9yZXEodmRlY19hbGxvY2F0b3Jwcm9wZXJ0eSAqYnVmZmVyX3Byb3ApCi17Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICB1bnNpZ25lZCBidWZfc2l6ZSA9IDA7Ci0gICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdCwgY19mbXQ7Ci0gICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgYnVmcmVxOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBERUJVR19QUklOVF9MT1coIlNldEJ1ZlJlcSBJTjogQWN0Q250KCVkKSBTaXplKCV1KSIsCi0gICAgICAgICAgICBidWZmZXJfcHJvcC0+YWN0dWFsY291bnQsICh1bnNpZ25lZCBpbnQpYnVmZmVyX3Byb3AtPmJ1ZmZlcl9zaXplKTsKLSAgICBidWZfc2l6ZSA9IChidWZmZXJfcHJvcC0+YnVmZmVyX3NpemUgKyBidWZmZXJfcHJvcC0+YWxpZ25tZW50IC0gMSkmKH4oYnVmZmVyX3Byb3AtPmFsaWdubWVudCAtIDEpKTsKLSAgICBpZiAoYnVmX3NpemUgIT0gYnVmZmVyX3Byb3AtPmJ1ZmZlcl9zaXplKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJCdWZmZXIgc2l6ZSBhbGlnbm1lbnQgZXJyb3I6IFJlcXVlc3RlZCgldSkgUmVxdWlyZWQoJWQpIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWJ1ZmZlcl9wcm9wLT5idWZmZXJfc2l6ZSwgYnVmX3NpemUpOwotICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1lbXNldCgmZm10LCAweDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQpKTsKLSAgICAgICAgbWVtc2V0KCZjX2ZtdCwgMHgwLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSk7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLmhlaWdodCA9IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQ7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoOwotICAgICAgICBmbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID0gYnVmX3NpemU7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlcl9wcm9wLT5idWZmZXJfdHlwZSA9PSBWREVDX0JVRkZFUl9UWVBFX0lOUFVUKSB7Ci0gICAgICAgICAgICBmbXQudHlwZSA9VjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBvdXRwdXRfY2FwYWJpbGl0eTsKLSAgICAgICAgICAgIHJldCA9IGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19GTVQsICZmbXQpOwotICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlcl9wcm9wLT5idWZmZXJfdHlwZSA9PSBWREVDX0JVRkZFUl9UWVBFX09VVFBVVCkgewotICAgICAgICAgICAgY19mbXQudHlwZSA9VjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICAgICAgICAgIGNfZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBjYXB0dXJlX2NhcGFiaWxpdHk7Ci0gICAgICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmY19mbXQpOwotICAgICAgICAgICAgY19mbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID0gYnVmX3NpemU7Ci0gICAgICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfRk1ULCAmY19mbXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgIC8qVE9ETzogSG93IHRvIGhhbmRsZSB0aGlzIGNhc2UgKi8KLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXR0aW5nIGJ1ZmZlciByZXF1aXJlbWVudHMgKGZvcm1hdCkgZmFpbGVkICVkIiwgcmV0KTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICAgICAgYnVmcmVxLmNvdW50ID0gYnVmZmVyX3Byb3AtPmFjdHVhbGNvdW50OwotICAgICAgICBpZiAoYnVmZmVyX3Byb3AtPmJ1ZmZlcl90eXBlID09IFZERUNfQlVGRkVSX1RZUEVfSU5QVVQpIHsKLSAgICAgICAgICAgIGJ1ZnJlcS50eXBlPVY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgICAgICAgfSBlbHNlIGlmIChidWZmZXJfcHJvcC0+YnVmZmVyX3R5cGUgPT0gVkRFQ19CVUZGRVJfVFlQRV9PVVRQVVQpIHsKLSAgICAgICAgICAgIGJ1ZnJlcS50eXBlPVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udHJvbC52YWx1ZSA9IGJ1ZmZlcl9wcm9wLT5taW5jb3VudDsKLSAgICAgICAgaWYgKGVSZXQgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgcmV0ID0gaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19HX0NUUkwsICZjb250cm9sKTsKLSAgICAgICAgICAgIGlmIChyZXQpCi0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlUmV0ID09IE9NWF9FcnJvck5vbmUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9wcm9wLT5hY3R1YWxjb3VudCA+PSAodWludDMyX3QpY29udHJvbC52YWx1ZSkgewotICAgICAgICAgICAgcmV0ID0gaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsVklESU9DX1JFUUJVRlMsICZidWZyZXEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldHRpbmcgYnVmZmVyIHJlcXVpcmVtZW50cyAocmVxYnVmcykgZmFpbGVkICVkIiwgcmV0KTsKLSAgICAgICAgICAgIC8qVE9ETzogSG93IHRvIGhhbmRsZSB0aGlzIGNhc2UgKi8KLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0gZWxzZSBpZiAoYnVmcmVxLmNvdW50IDwgYnVmZmVyX3Byb3AtPmFjdHVhbGNvdW50KSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRHJpdmVyIHJlZnVzZWQgdG8gY2hhbmdlIHRoZSBudW1iZXIgb2YgYnVmZmVycyIKLSAgICAgICAgICAgICAgICAgICAgIiBvbiB2NGwyIHBvcnQgJWQgdG8gJWQgKHByZWZlcnMgJWQpIiwgYnVmcmVxLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9wcm9wLT5hY3R1YWxjb3VudCwgYnVmcmVxLmNvdW50KTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWNsaWVudF9idWZmZXJzLnVwZGF0ZV9idWZmZXJfcmVxKCkpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU2V0dGluZyBjMkQgYnVmZmVyIHJlcXVpcmVtZW50cyBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlUmV0OwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92ZGVjOjp1cGRhdGVfcGljdHVyZV9yZXNvbHV0aW9uKCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIHJldHVybiBlUmV0OwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92ZGVjOjp1cGRhdGVfcG9ydGRlZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmbikKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7Ci0gICAgaWYgKCFwb3J0RGVmbikgewotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICBERUJVR19QUklOVF9MT1coIm9teF92ZGVjOjp1cGRhdGVfcG9ydGRlZiIpOwotICAgIHBvcnREZWZuLT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgcG9ydERlZm4tPm5TaXplID0gc2l6ZW9mKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpOwotICAgIHBvcnREZWZuLT5lRG9tYWluICAgID0gT01YX1BvcnREb21haW5WaWRlbzsKLSAgICBtZW1zZXQoJmZtdCwgMHgwLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSk7Ci0gICAgaWYgKDAgPT0gcG9ydERlZm4tPm5Qb3J0SW5kZXgpIHsKLSAgICAgICAgcG9ydERlZm4tPmVEaXIgPSAgT01YX0RpcklucHV0OwotICAgICAgICBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsID0gZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQ7Ci0gICAgICAgIHBvcnREZWZuLT5uQnVmZmVyQ291bnRNaW4gICAgPSBkcnZfY3R4LmlwX2J1Zi5taW5jb3VudDsKLSAgICAgICAgcG9ydERlZm4tPm5CdWZmZXJTaXplICAgICAgICA9IGRydl9jdHguaXBfYnVmLmJ1ZmZlcl9zaXplOwotICAgICAgICBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7Ci0gICAgICAgIHBvcnREZWZuLT5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gZUNvbXByZXNzaW9uRm9ybWF0OwotICAgICAgICAvL2ZvciBpbnB1dCBwb3J0LCBhbHdheXMgcmVwb3J0IHRoZSBmcHMgdmFsdWUgc2V0IGJ5IGNsaWVudCwKLSAgICAgICAgLy90byBkaXN0aW5ndWlzaCB3aGV0aGVyIGNsaWVudCBnb3QgdmFsaWQgZnBzIGZyb20gcGFyc2VyLgotICAgICAgICBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSBtX2Zwc19yZWNlaXZlZDsKLSAgICAgICAgcG9ydERlZm4tPmJFbmFibGVkICAgPSBtX2lucF9iRW5hYmxlZDsKLSAgICAgICAgcG9ydERlZm4tPmJQb3B1bGF0ZWQgPSBtX2lucF9iUG9wdWxhdGVkOwotCi0gICAgICAgIGZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IG91dHB1dF9jYXBhYmlsaXR5OwotICAgICAgICBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmZm10KTsKLSAgICB9IGVsc2UgaWYgKDEgPT0gcG9ydERlZm4tPm5Qb3J0SW5kZXgpIHsKLSAgICAgICAgdW5zaWduZWQgaW50IGJ1Zl9zaXplID0gMDsKLSAgICAgICAgaW50IHJldCA9IDA7Ci0gICAgICAgaWYgKCFpc19kb3duX3NjYWxhcl9lbmFibGVkKSB7Ci0gICAgICAgICAgIGZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmZm10KTsKLSAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBjYXB0dXJlX2NhcGFiaWxpdHk7Ci0gICAgICAgICAgIGZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICAgICAgICAgcmV0ID0gaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX0ZNVCwgJmZtdCk7Ci0gICAgICAgfQotCi0gICAgICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gY2FwdHVyZV9jYXBhYmlsaXR5OwotICAgICAgIHJldCA9IGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfR19GTVQsICZmbXQpOwotICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkdldCBSZXNvbHV0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySGFyZHdhcmU7Ci0gICAgICAgfQotICAgICAgIGRydl9jdHgub3BfYnVmLmJ1ZmZlcl9zaXplID0gZm10LmZtdC5waXhfbXAucGxhbmVfZm10WzBdLnNpemVpbWFnZTsKLSAgICAgICBpZiAoIWNsaWVudF9idWZmZXJzLnVwZGF0ZV9idWZmZXJfcmVxKCkpIHsKLSAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImNsaWVudF9idWZmZXJzLnVwZGF0ZV9idWZmZXJfcmVxIEZhaWxlZCIpOwotICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySGFyZHdhcmU7Ci0gICAgICAgfQotCi0gICAgICAgIGlmICghY2xpZW50X2J1ZmZlcnMuZ2V0X2J1ZmZlcl9yZXEoYnVmX3NpemUpKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigidXBkYXRlIGJ1ZmZlciByZXF1aXJlbWVudHMiKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JIYXJkd2FyZTsKLSAgICAgICAgfQotICAgICAgICBwb3J0RGVmbi0+bkJ1ZmZlclNpemUgPSBidWZfc2l6ZTsKLSAgICAgICAgcG9ydERlZm4tPmVEaXIgPSAgT01YX0Rpck91dHB1dDsKLSAgICAgICAgcG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCA9IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50OwotICAgICAgICBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50TWluICAgID0gZHJ2X2N0eC5vcF9idWYubWluY291bnQ7Ci0gICAgICAgIHBvcnREZWZuLT5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKLSAgICAgICAgaWYgKGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfZGVub21pbmF0b3IgPiAwKQotICAgICAgICAgICAgcG9ydERlZm4tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gKGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfbnVtZXJhdG9yIC8KLSAgICAgICAgICAgICAgICBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX2Rlbm9taW5hdG9yKSA8PCAxNjsgLy9RMTYgZm9ybWF0Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVycm9yOiBEaXZpZGUgYnkgemVybyIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgICAgICBwb3J0RGVmbi0+YkVuYWJsZWQgICA9IG1fb3V0X2JFbmFibGVkOwotICAgICAgICBwb3J0RGVmbi0+YlBvcHVsYXRlZCA9IG1fb3V0X2JQb3B1bGF0ZWQ7Ci0gICAgICAgIGlmICghY2xpZW50X2J1ZmZlcnMuZ2V0X2NvbG9yX2Zvcm1hdChwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFcnJvciBpbiBnZXR0aW5nIGNvbG9yIGZvcm1hdCIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckhhcmR3YXJlOwotICAgICAgICB9Ci0gICAgICAgIGZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBjYXB0dXJlX2NhcGFiaWxpdHk7Ci0gICAgfSBlbHNlIGlmIChPTVhfQ09SRV9PVVRQVVRfRVhUUkFEQVRBX0lOREVYID09IHBvcnREZWZuLT5uUG9ydEluZGV4KSB7Ci0gICAgICAgIHBvcnREZWZuLT5uQnVmZmVyU2l6ZSA9IG1fY2xpZW50X291dF9leHRyYWRhdGFfaW5mby5nZXRTaXplKCk7Ci0gICAgICAgIHBvcnREZWZuLT5uQnVmZmVyQ291bnRNaW4gPSBNSU5fTlVNX0lOUFVUX09VVFBVVF9FWFRSQURBVEFfQlVGRkVSUzsKLSAgICAgICAgcG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCA9IE1JTl9OVU1fSU5QVVRfT1VUUFVUX0VYVFJBREFUQV9CVUZGRVJTOwotICAgICAgICBwb3J0RGVmbi0+ZURpciA9ICBPTVhfRGlyT3V0cHV0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBvcnREZWZuLT5lRGlyID0gT01YX0Rpck1heDsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCIgZ2V0X3BhcmFtZXRlcjogQmFkIFBvcnQgaWR4ICVkIiwKLSAgICAgICAgICAgICAgICAoaW50KXBvcnREZWZuLT5uUG9ydEluZGV4KTsKLSAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICB9Ci0gICAgdXBkYXRlX3Jlc29sdXRpb24oZm10LmZtdC5waXhfbXAud2lkdGgsIGZtdC5mbXQucGl4X21wLmhlaWdodCwKLSAgICAgICAgZm10LmZtdC5waXhfbXAucGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZSwgZm10LmZtdC5waXhfbXAucGxhbmVfZm10WzBdLnJlc2VydmVkWzBdKTsKLQotICAgICAgICBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9ICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0OwotICAgICAgICBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICA9ICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGg7Ci0gICAgICAgIHBvcnREZWZuLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5zdHJpZGU7Ci0gICAgICAgIHBvcnREZWZuLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLnNjYW5fbGluZXM7Ci0KLSAgICBpZiAoKHBvcnREZWZuLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHx8Ci0gICAgICAgKHBvcnREZWZuLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSkgewotICAgICAgICAgICBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBBTElHTihkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGgsIDE2KTsKLSAgICAgICAgICAgcG9ydERlZm4tPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0OwotICAgIH0KLSAgICBERUJVR19QUklOVF9ISUdIKCJ1cGRhdGVfcG9ydGRlZigldSk6IFdpZHRoID0gJXUgSGVpZ2h0ID0gJXUgU3RyaWRlID0gJWQgIgotICAgICAgICAgICAgIlNsaWNlSGVpZ2h0ID0gJXUgZUNvbG9yRm9ybWF0ID0gJWQgbkJ1ZlNpemUgJXUgbkJ1ZkNudCAldSIsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KXBvcnREZWZuLT5uUG9ydEluZGV4LAotICAgICAgICAgICAgKHVuc2lnbmVkIGludClwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAotICAgICAgICAgICAgKHVuc2lnbmVkIGludClwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKLSAgICAgICAgICAgIChpbnQpcG9ydERlZm4tPmZvcm1hdC52aWRlby5uU3RyaWRlLAotICAgICAgICAgICAgKHVuc2lnbmVkIGludClwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcG9ydERlZm4tPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KXBvcnREZWZuLT5uQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0KLSAgICByZXR1cm4gZVJldDsKLX0KLQotT01YX0VSUk9SVFlQRSBvbXhfdmRlYzo6YWxsb2NhdGVfb3V0cHV0X2hlYWRlcnMoKQotewotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZkhkciA9IE5VTEw7Ci0gICAgdW5zaWduZWQgaSA9IDA7Ci0KLSAgICBpZiAoIW1fb3V0X21lbV9wdHIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiVXNlIG8vcCBidWZmZXIgY2FzZSAtIEhlYWRlciBMaXN0IGFsbG9jYXRpb24iKTsKLSAgICAgICAgaW50IG5CdWZIZHJTaXplICAgICAgICA9IDA7Ci0gICAgICAgIGludCBuUGxhdGZvcm1FbnRyeVNpemUgPSAwOwotICAgICAgICBpbnQgblBsYXRmb3JtTGlzdFNpemUgID0gMDsKLSAgICAgICAgaW50IG5QTUVNSW5mb1NpemUgPSAwOwotICAgICAgICBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0xJU1QgICAgICAqcFBsYXRmb3JtTGlzdDsKLSAgICAgICAgT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9FTlRSWSAgICAgKnBQbGF0Zm9ybUVudHJ5OwotICAgICAgICBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU1fSU5GTyAqcFBNRU1JbmZvOwotCi0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiU2V0dGluZyBGaXJzdCBPdXRwdXQgQnVmZmVyKCVkKSIsCi0gICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpOwotICAgICAgICBuQnVmSGRyU2l6ZSAgICAgICAgPSBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCAqCi0gICAgICAgICAgICBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpOwotCi0gICAgICAgIG5QTUVNSW5mb1NpemUgICAgICA9IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50ICoKLSAgICAgICAgICAgIHNpemVvZihPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU1fSU5GTyk7Ci0gICAgICAgIG5QbGF0Zm9ybUxpc3RTaXplICA9IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50ICoKLSAgICAgICAgICAgIHNpemVvZihPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0xJU1QpOwotICAgICAgICBuUGxhdGZvcm1FbnRyeVNpemUgPSBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCAqCi0gICAgICAgICAgICBzaXplb2YoT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9FTlRSWSk7Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJUb3RhbEJ1ZkhkciAlZCBCdWZIZHJTaXplICV1IFBNRU0gJWQgUEwgJWQiLG5CdWZIZHJTaXplLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSwKLSAgICAgICAgICAgICAgICBuUE1FTUluZm9TaXplLAotICAgICAgICAgICAgICAgIG5QbGF0Zm9ybUxpc3RTaXplKTsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJQRSAlZCBibVNpemUgJSAiIFBSSWQ2NCAsIG5QbGF0Zm9ybUVudHJ5U2l6ZSwKLSAgICAgICAgICAgICAgICBtX291dF9ibV9jb3VudCk7Ci0gICAgICAgIG1fb3V0X21lbV9wdHIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgICopY2FsbG9jKG5CdWZIZHJTaXplLDEpOwotICAgICAgICAvLyBBbGxvYyBtZW0gZm9yIHBsYXRmb3JtIHNwZWNpZmljIGluZm8KLSAgICAgICAgY2hhciAqcFB0cj1OVUxMOwotICAgICAgICBwUHRyID0gKGNoYXIqKSBjYWxsb2MoblBsYXRmb3JtTGlzdFNpemUgKyBuUGxhdGZvcm1FbnRyeVNpemUgKwotICAgICAgICAgICAgICAgIG5QTUVNSW5mb1NpemUsMSk7Ci0gICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlciA9IChzdHJ1Y3QgdmRlY19idWZmZXJwYXlsb2FkICopIFwKLSAgICAgICAgICAgICAgICAgICAgICAgY2FsbG9jIChzaXplb2Yoc3RydWN0IHZkZWNfYnVmZmVycGF5bG9hZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpOwotICAgICAgICBkcnZfY3R4LnB0cl9yZXNwYnVmZmVyID0gKHN0cnVjdCB2ZGVjX291dHB1dF9mcmFtZWluZm8gICopXAotICAgICAgICAgICAgICAgICAgICAgY2FsbG9jIChzaXplb2YgKHN0cnVjdCB2ZGVjX291dHB1dF9mcmFtZWluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCk7Ci0gICAgICAgIGlmICghZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyIHx8ICFkcnZfY3R4LnB0cl9yZXNwYnVmZmVyKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIGFsbG9jIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlciBvciBkcnZfY3R4LnB0cl9yZXNwYnVmZmVyIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0KLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgIGRydl9jdHgub3BfYnVmX2lvbl9pbmZvID0gKHN0cnVjdCB2ZGVjX2lvbiAqICkgXAotICAgICAgICAgICAgICAgICAgICAgIGNhbGxvYyAoc2l6ZW9mKHN0cnVjdCB2ZGVjX2lvbiksZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpOwotICAgICAgICBpZiAoIWRydl9jdHgub3BfYnVmX2lvbl9pbmZvKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIGFsbG9jIGRydl9jdHgub3BfYnVmX2lvbl9pbmZvIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKGR5bmFtaWNfYnVmX21vZGUpIHsKLSAgICAgICAgICAgIG91dF9keW5hbWljX2xpc3QgPSAoc3RydWN0IGR5bmFtaWNfYnVmX2xpc3QgKikgXAotICAgICAgICAgICAgICAgIGNhbGxvYyAoc2l6ZW9mKHN0cnVjdCBkeW5hbWljX2J1Zl9saXN0KSwgZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpOwotICAgICAgICAgICAgaWYgKG91dF9keW5hbWljX2xpc3QpIHsKLSAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgIG91dF9keW5hbWljX2xpc3RbaV0uZHVwX2ZkID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV9vdXRfbWVtX3B0ciAmJiBwUHRyICYmIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcgotICAgICAgICAgICAgICAgICYmIGRydl9jdHgucHRyX3Jlc3BidWZmZXIpIHsKLSAgICAgICAgICAgIGJ1ZkhkciAgICAgICAgICA9ICBtX291dF9tZW1fcHRyOwotICAgICAgICAgICAgbV9wbGF0Zm9ybV9saXN0ID0gKE9NWF9RQ09NX1BMQVRGT1JNX1BSSVZBVEVfTElTVCAqKShwUHRyKTsKLSAgICAgICAgICAgIG1fcGxhdGZvcm1fZW50cnk9IChPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX0VOVFJZICopCi0gICAgICAgICAgICAgICAgKCgoY2hhciAqKSBtX3BsYXRmb3JtX2xpc3QpICArIG5QbGF0Zm9ybUxpc3RTaXplKTsKLSAgICAgICAgICAgIG1fcG1lbV9pbmZvICAgICA9IChPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU1fSU5GTyAqKQotICAgICAgICAgICAgICAgICgoKGNoYXIgKikgbV9wbGF0Zm9ybV9lbnRyeSkgKyBuUGxhdGZvcm1FbnRyeVNpemUpOwotICAgICAgICAgICAgcFBsYXRmb3JtTGlzdCAgID0gbV9wbGF0Zm9ybV9saXN0OwotICAgICAgICAgICAgcFBsYXRmb3JtRW50cnkgID0gbV9wbGF0Zm9ybV9lbnRyeTsKLSAgICAgICAgICAgIHBQTUVNSW5mbyAgICAgICA9IG1fcG1lbV9pbmZvOwotCi0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk1lbW9yeSBBbGxvY2F0aW9uIFN1Y2NlZWRlZCBmb3IgT1VUIHBvcnQlcCIsbV9vdXRfbWVtX3B0cik7Ci0KLSAgICAgICAgICAgIC8vIFNldHR0aW5nIHRoZSBlbnRpcmUgc3RvcmFnZSBuaWNlbHkKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiYkhkciAlcCBPdXRNZW0gJXAgUEUgJXAiLGJ1ZkhkciwKLSAgICAgICAgICAgICAgICAgICAgbV9vdXRfbWVtX3B0cixwUGxhdGZvcm1FbnRyeSk7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIiBQbWVtIEluZm8gPSAlcCIscFBNRU1JbmZvKTsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBidWZIZHItPm5TaXplICAgICAgICAgICAgICA9IHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVmSGRyLT5uVmVyc2lvbi5uVmVyc2lvbiAgPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgdmFsdWVzIHdoZW4gd2UgZGV0ZXJtaW5lIHRoZSByaWdodCBIeFcgcGFyYW0KLSAgICAgICAgICAgICAgICBidWZIZHItPm5BbGxvY0xlbiAgICAgICAgICA9IDA7Ci0gICAgICAgICAgICAgICAgYnVmSGRyLT5uRmlsbGVkTGVuICAgICAgICAgPSAwOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+cEFwcFByaXZhdGUgICAgICAgID0gTlVMTDsKLSAgICAgICAgICAgICAgICBidWZIZHItPm5PdXRwdXRQb3J0SW5kZXggICA9IE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYOwotICAgICAgICAgICAgICAgIHBQbGF0Zm9ybUVudHJ5LT50eXBlICAgICAgID0gT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9QTUVNOwotICAgICAgICAgICAgICAgIHBQbGF0Zm9ybUVudHJ5LT5lbnRyeSAgICAgID0gcFBNRU1JbmZvOwotICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIFBsYXRmb3JtIExpc3QKLSAgICAgICAgICAgICAgICBwUGxhdGZvcm1MaXN0LT5uRW50cmllcyAgICA9IDE7Ci0gICAgICAgICAgICAgICAgcFBsYXRmb3JtTGlzdC0+ZW50cnlMaXN0ICAgPSBwUGxhdGZvcm1FbnRyeTsKLSAgICAgICAgICAgICAgICAvLyBLZWVwIHBCdWZmZXIgTlVMTCB0aWxsIHZkZWMgaXMgb3BlbmVkCi0gICAgICAgICAgICAgICAgYnVmSGRyLT5wQnVmZmVyICAgICAgICAgICAgPSBOVUxMOwotICAgICAgICAgICAgICAgIHBQTUVNSW5mby0+b2Zmc2V0ICAgICAgICAgID0gIDA7Ci0gICAgICAgICAgICAgICAgcFBNRU1JbmZvLT5wbWVtX2ZkID0gLTE7Ci0gICAgICAgICAgICAgICAgYnVmSGRyLT5wUGxhdGZvcm1Qcml2YXRlID0gcFBsYXRmb3JtTGlzdDsKLSAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV0ucG1lbV9mZCA9IC0xOwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zl9pb25faW5mb1tpXS5pb25fZGV2aWNlX2ZkID0tMTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIC8qQ3JlYXRlIGEgbWFwcGluZyBiZXR3ZWVuIGJ1ZmZlcnMqLwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+cE91dHB1dFBvcnRQcml2YXRlID0gJmRydl9jdHgucHRyX3Jlc3BidWZmZXJbaV07Ci0gICAgICAgICAgICAgICAgZHJ2X2N0eC5wdHJfcmVzcGJ1ZmZlcltpXS5jbGllbnRfZGF0YSA9ICh2b2lkICopIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbaV07Ci0gICAgICAgICAgICAgICAgLy8gTW92ZSB0aGUgYnVmZmVyIGFuZCBidWZmZXIgaGVhZGVyIHBvaW50ZXJzCi0gICAgICAgICAgICAgICAgYnVmSGRyKys7Ci0gICAgICAgICAgICAgICAgcFBNRU1JbmZvKys7Ci0gICAgICAgICAgICAgICAgcFBsYXRmb3JtRW50cnkrKzsKLSAgICAgICAgICAgICAgICBwUGxhdGZvcm1MaXN0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiT3V0cHV0IGJ1ZiBtZW0gYWxsb2MgZmFpbGVkWzB4JXBdWzB4JXBdIixcCi0gICAgICAgICAgICAgICAgICAgIG1fb3V0X21lbV9wdHIsIHBQdHIpOwotICAgICAgICAgICAgaWYgKG1fb3V0X21lbV9wdHIpIHsKLSAgICAgICAgICAgICAgICBmcmVlKG1fb3V0X21lbV9wdHIpOwotICAgICAgICAgICAgICAgIG1fb3V0X21lbV9wdHIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBQdHIpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBQdHIpOwotICAgICAgICAgICAgICAgIHBQdHIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcikgewotICAgICAgICAgICAgICAgIGZyZWUoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyKTsKLSAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRydl9jdHgucHRyX3Jlc3BidWZmZXIpIHsKLSAgICAgICAgICAgICAgICBmcmVlKGRydl9jdHgucHRyX3Jlc3BidWZmZXIpOwotICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX3Jlc3BidWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgIGlmIChkcnZfY3R4Lm9wX2J1Zl9pb25faW5mbykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZSBvL3AgaW9uIGNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICBmcmVlKGRydl9jdHgub3BfYnVmX2lvbl9pbmZvKTsKLSAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zl9pb25faW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGVSZXQgPSAgT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZVJldCA9ICBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgfQotICAgIHJldHVybiBlUmV0OwotfQotCi12b2lkIG9teF92ZGVjOjpjb21wbGV0ZV9wZW5kaW5nX2J1ZmZlcl9kb25lX2NicygpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBwMSwgcDIsIGlkZW50OwotICAgIG9teF9jbWRfcXVldWUgdG1wX3EsIHBlbmRpbmdfYmRfcTsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbG9jayk7Ci0gICAgLy8gcG9wIGFsbCBwZW5kaW5nIEdFTkVSQVRFIEZEQiBmcm9tIGZ0YiBxdWV1ZQotICAgIHdoaWxlIChtX2Z0Yl9xLm1fc2l6ZSkgewotICAgICAgICBtX2Z0Yl9xLnBvcF9lbnRyeSgmcDEsJnAyLCZpZGVudCk7Ci0gICAgICAgIGlmIChpZGVudCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZCRCkgewotICAgICAgICAgICAgcGVuZGluZ19iZF9xLmluc2VydF9lbnRyeShwMSxwMixpZGVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0bXBfcS5pbnNlcnRfZW50cnkocDEscDIsaWRlbnQpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vcmV0dXJuIGFsbCBub24gR0VORVJBVEUgRkRCIHRvIGZ0YiBxdWV1ZQotICAgIHdoaWxlICh0bXBfcS5tX3NpemUpIHsKLSAgICAgICAgdG1wX3EucG9wX2VudHJ5KCZwMSwmcDIsJmlkZW50KTsKLSAgICAgICAgbV9mdGJfcS5pbnNlcnRfZW50cnkocDEscDIsaWRlbnQpOwotICAgIH0KLSAgICAvLyBwb3AgYWxsIHBlbmRpbmcgR0VORVJBVEUgRURCIGZyb20gZXRiIHF1ZXVlCi0gICAgd2hpbGUgKG1fZXRiX3EubV9zaXplKSB7Ci0gICAgICAgIG1fZXRiX3EucG9wX2VudHJ5KCZwMSwmcDIsJmlkZW50KTsKLSAgICAgICAgaWYgKGlkZW50ID09IE9NWF9DT01QT05FTlRfR0VORVJBVEVfRUJEKSB7Ci0gICAgICAgICAgICBwZW5kaW5nX2JkX3EuaW5zZXJ0X2VudHJ5KHAxLHAyLGlkZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRtcF9xLmluc2VydF9lbnRyeShwMSxwMixpZGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy9yZXR1cm4gYWxsIG5vbiBHRU5FUkFURSBGREIgdG8gZXRiIHF1ZXVlCi0gICAgd2hpbGUgKHRtcF9xLm1fc2l6ZSkgewotICAgICAgICB0bXBfcS5wb3BfZW50cnkoJnAxLCZwMiwmaWRlbnQpOwotICAgICAgICBtX2V0Yl9xLmluc2VydF9lbnRyeShwMSxwMixpZGVudCk7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOwotICAgIC8vIHByb2Nlc3MgYWxsIHBlbmRpbmcgYnVmZmVyIGRvbmVzCi0gICAgd2hpbGUgKHBlbmRpbmdfYmRfcS5tX3NpemUpIHsKLSAgICAgICAgcGVuZGluZ19iZF9xLnBvcF9lbnRyeSgmcDEsJnAyLCZpZGVudCk7Ci0gICAgICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQ6Ci0gICAgICAgICAgICAgICAgaWYgKGVtcHR5X2J1ZmZlcl9kb25lKCZtX2NtcCwgKE9NWF9CVUZGRVJIRUFERVJUWVBFICopcDEpICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBlbXB0eV9idWZmZXJfZG9uZSgpIGZhaWxlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgb214X3JlcG9ydF9lcnJvciAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GQkQ6Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGxfYnVmZmVyX2RvbmUoJm1fY21wLCAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMSkgIT0gT01YX0Vycm9yTm9uZSApIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBmaWxsX2J1ZmZlcl9kb25lKCkgZmFpbGVkISIpOwotICAgICAgICAgICAgICAgICAgICBvbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBvbXhfdmRlYzo6c2V0X2ZyYW1lX3JhdGUoT01YX1M2NCBhY3RfdGltZXN0YW1wKQotewotICAgIE9NWF9VMzIgbmV3X2ZyYW1lX2ludGVydmFsID0gMDsKLSAgICBpZiAoVkFMSURfVFMoYWN0X3RpbWVzdGFtcCkgJiYgVkFMSURfVFMocHJldl90cykgJiYgYWN0X3RpbWVzdGFtcCAhPSBwcmV2X3RzCi0gICAgICAgICAgICAmJiBsbGFicyhhY3RfdGltZXN0YW1wIC0gcHJldl90cykgPiAyMDAwKSB7Ci0gICAgICAgIG5ld19mcmFtZV9pbnRlcnZhbCA9IGNsaWVudF9zZXRfZnBzID8gZnJtX2ludCA6IChhY3RfdGltZXN0YW1wIC0gcHJldl90cykgPiAwID8KLSAgICAgICAgICAgIGxsYWJzKGFjdF90aW1lc3RhbXAgLSBwcmV2X3RzKSA6IGxsYWJzKGFjdF90aW1lc3RhbXAgLSBwcmV2X3RzX2FjdHVhbCk7Ci0gICAgICAgIGlmIChuZXdfZnJhbWVfaW50ZXJ2YWwgIT0gZnJtX2ludCB8fCBmcm1faW50ID09IDApIHsKLSAgICAgICAgICAgIGZybV9pbnQgPSBuZXdfZnJhbWVfaW50ZXJ2YWw7Ci0gICAgICAgICAgICBpZiAoZnJtX2ludCkgewotICAgICAgICAgICAgICAgIGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfbnVtZXJhdG9yID0gMWU2OwotICAgICAgICAgICAgICAgIGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfZGVub21pbmF0b3IgPSBmcm1faW50OwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X2ZyYW1lX3JhdGU6IGZybV9pbnQoJXUpIGZwcyglZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClmcm1faW50LCBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX251bWVyYXRvciAvCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpZHJ2X2N0eC5mcmFtZV9yYXRlLmZwc19kZW5vbWluYXRvcik7Ci0gICAgICAgICAgICAgICAgLyogV2UgbmVlZCB0byByZXBvcnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIEZCRCBhbmQgdGhlIHByZXZpb3VzIEZCRAotICAgICAgICAgICAgICAgICAqIGJhY2sgdG8gdGhlIGRyaXZlciBmb3IgY2xvY2sgc2NhbGluZyBwdXJwb3Nlcy4gKi8KLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9vdXRwdXRwYXJtIG9wYXJtOwotICAgICAgICAgICAgICAgIC8qWFhYOiB3ZSdyZSBwcm92aWRpbmcgdGltaW5nIGluZm8gYXMgc2Vjb25kcyBwZXIgZnJhbWUgcmF0aGVyIHRoYW4gZnJhbWVzCi0gICAgICAgICAgICAgICAgICogcGVyIHNlY29uZC4qLwotICAgICAgICAgICAgICAgIG9wYXJtLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSBkcnZfY3R4LmZyYW1lX3JhdGUuZnBzX2Rlbm9taW5hdG9yOwotICAgICAgICAgICAgICAgIG9wYXJtLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IGRydl9jdHguZnJhbWVfcmF0ZS5mcHNfbnVtZXJhdG9yOwotCi0gICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSBzcGFybTsKLSAgICAgICAgICAgICAgICBzcGFybS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICAgICAgICAgIHNwYXJtLnBhcm0ub3V0cHV0ID0gb3Bhcm07Ci0gICAgICAgICAgICAgICAgaWYgKGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19QQVJNLCAmc3Bhcm0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJVbmFibGUgdG8gY29udmV5IGZwcyBpbmZvIHRvIGRyaXZlciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlIG1pZ2h0IGJlIGFmZmVjdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJldl90cyA9IGFjdF90aW1lc3RhbXA7Ci19Ci0KLXZvaWQgb214X3ZkZWM6OmFkanVzdF90aW1lc3RhbXAoT01YX1M2NCAmYWN0X3RpbWVzdGFtcCkKLXsKLSAgICBpZiAocnN0X3ByZXZfdHMgJiYgVkFMSURfVFMoYWN0X3RpbWVzdGFtcCkpIHsKLSAgICAgICAgcHJldl90cyA9IGFjdF90aW1lc3RhbXA7Ci0gICAgICAgIHByZXZfdHNfYWN0dWFsID0gYWN0X3RpbWVzdGFtcDsKLSAgICAgICAgcnN0X3ByZXZfdHMgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKFZBTElEX1RTKHByZXZfdHMpKSB7Ci0gICAgICAgIGJvb2wgY29kZWNfY29uZCA9IChkcnZfY3R4LnRpbWVzdGFtcF9hZGp1c3QpPwotICAgICAgICAgICAgKCFWQUxJRF9UUyhhY3RfdGltZXN0YW1wKSB8fCBhY3RfdGltZXN0YW1wIDwgcHJldl90c19hY3R1YWwgfHwgbGxhYnMoYWN0X3RpbWVzdGFtcCAtIHByZXZfdHNfYWN0dWFsKSA8PSAyMDAwKSA6Ci0gICAgICAgICAgICAoIVZBTElEX1RTKGFjdF90aW1lc3RhbXApIHx8IGFjdF90aW1lc3RhbXAgPD0gcHJldl90c19hY3R1YWwpOwotICAgICAgICAgICAgIHByZXZfdHNfYWN0dWFsID0gYWN0X3RpbWVzdGFtcDsgLy91bmFkanVzdGVkIHByZXZpb3VzIHRpbWVzdGFtcAotICAgICAgICBpZiAoZnJtX2ludCA+IDAgJiYgY29kZWNfY29uZCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJhZGp1c3RfdGltZXN0YW1wOiBvcmlnaW5hbCB0c1slbGxkXSIsIGFjdF90aW1lc3RhbXApOwotICAgICAgICAgICAgYWN0X3RpbWVzdGFtcCA9IHByZXZfdHMgKyBmcm1faW50OwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJhZGp1c3RfdGltZXN0YW1wOiBwcmVkaWN0ZWQgdHNbJWxsZF0iLCBhY3RfdGltZXN0YW1wKTsKLSAgICAgICAgICAgIHByZXZfdHMgPSBhY3RfdGltZXN0YW1wOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGRydl9jdHgucGljdHVyZV9vcmRlciA9PSBWREVDX09SREVSX0RJU1BMQVkgJiYgYWN0X3RpbWVzdGFtcCA8IHByZXZfdHMpIHsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aW1lc3RhbXBzIGNhbiBuZXZlciBzdGVwIGJhY2t3YXJkcyB3aGVuIGluIGRpc3BsYXkgb3JkZXIKLSAgICAgICAgICAgICAgICBhY3RfdGltZXN0YW1wID0gcHJldl90czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldF9mcmFtZV9yYXRlKGFjdF90aW1lc3RhbXApOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChmcm1faW50ID4gMCkgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHRoZSBmcmFtZSByYXRlIHdhcyBzZXQgYWxvbmcKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIHBvcnQgZGVmaW5pdGlvbiwgc3RhcnQgdHMgd2l0aCAwCi0gICAgICAgIGFjdF90aW1lc3RhbXAgPSBwcmV2X3RzID0gMDsgIC8vIGFuZCBjb3JyZWN0IGlmIGEgdmFsaWQgdHMgaXMgcmVjZWl2ZWQuCi0gICAgICAgIHJzdF9wcmV2X3RzID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLU9NWF9CVUZGRVJIRUFERVJUWVBFKiBvbXhfdmRlYzo6Z2V0X29teF9vdXRwdXRfYnVmZmVyX2hlYWRlcihpbnQgaW5kZXgpCi17Ci0gICAgcmV0dXJuIG1fb3V0X21lbV9wdHIgKyBpbmRleDsKLX0KLQotdm9pZCBvbXhfdmRlYzo6Y29udmVydF9jb2xvcl9zcGFjZV9pbmZvKE9NWF9VMzIgcHJpbWFyaWVzLCBPTVhfVTMyIHJhbmdlLAotICAgIE9NWF9VMzIgdHJhbnNmZXIsIE9NWF9VMzIgbWF0cml4LCBDb2xvclNwYWNlX3QgKmNvbG9yX3NwYWNlLCBDb2xvckFzcGVjdHMgKmFzcGVjdHMpCi17Ci0gICAgc3dpdGNoIChwcmltYXJpZXMpIHsKLSAgICAgICAgY2FzZSBNU01fVklEQ19CVDcwOV81OgotICAgICAgICAgICAgKmNvbG9yX3NwYWNlID0gSVRVX1JfNzA5OwotICAgICAgICAgICAgYXNwZWN0cy0+bVByaW1hcmllcyA9IENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ3MDlfNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1TTV9WSURDX0JUNDcwXzZfTToKLSAgICAgICAgICAgIGFzcGVjdHMtPm1QcmltYXJpZXMgPSBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNDcwXzZNOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNNX1ZJRENfQlQ2MDFfNl82MjU6Ci0gICAgICAgICAgICBhc3BlY3RzLT5tUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDYwMV82XzYyNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1TTV9WSURDX0JUNjAxXzZfNTI1OgotICAgICAgICAgICAgKmNvbG9yX3NwYWNlID0gcmFuZ2UgPyBJVFVfUl82MDFfRlIgOiBJVFVfUl82MDE7Ci0gICAgICAgICAgICBhc3BlY3RzLT5tUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDYwMV82XzUyNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1TTV9WSURDX0dFTkVSSUNfRklMTToKLSAgICAgICAgICAgIGFzcGVjdHMtPm1QcmltYXJpZXMgPSBDb2xvckFzcGVjdHM6OlByaW1hcmllc0dlbmVyaWNGaWxtOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNNX1ZJRENfQlQyMDIwOgotICAgICAgICAgICAgYXNwZWN0cy0+bVByaW1hcmllcyA9IENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQyMDIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNNX1ZJRENfVU5TUEVDSUZJRUQ6Ci0gICAgICAgICAgICAvL0NsaWVudCBkb2VzIG5vdCBleHBlY3QgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZCwgYnV0IHJhdGhlciB0aGUgc3VwcGxpZWQgZGVmYXVsdAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy9hc3BlY3RzLT5tUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNPdGhlcjsKLSAgICAgICAgICAgIGFzcGVjdHMtPm1QcmltYXJpZXMgPSBtX2NsaWVudF9jb2xvcl9zcGFjZS5zQXNwZWN0cy5tUHJpbWFyaWVzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgYXNwZWN0cy0+bVJhbmdlID0gcmFuZ2UgPyBDb2xvckFzcGVjdHM6OlJhbmdlRnVsbCA6IENvbG9yQXNwZWN0czo6UmFuZ2VMaW1pdGVkOwotCi0gICAgc3dpdGNoICh0cmFuc2ZlcikgewotICAgICAgICBjYXNlIE1TTV9WSURDX1RSQU5TRkVSX0JUNzA5XzU6Ci0gICAgICAgIGNhc2UgTVNNX1ZJRENfVFJBTlNGRVJfNjAxXzZfNTI1OiAvLyBjYXNlIE1TTV9WSURDX1RSQU5TRkVSXzYwMV82XzYyNToKLSAgICAgICAgICAgIGFzcGVjdHMtPm1UcmFuc2ZlciA9IENvbG9yQXNwZWN0czo6VHJhbnNmZXJTTVBURTE3ME07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNU01fVklEQ19UUkFOU0ZFUl9CVF80NzBfNl9NOgotICAgICAgICAgICAgYXNwZWN0cy0+bVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckdhbW1hMjI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNU01fVklEQ19UUkFOU0ZFUl9CVF80NzBfNl9CRzoKLSAgICAgICAgICAgIGFzcGVjdHMtPm1UcmFuc2ZlciA9IENvbG9yQXNwZWN0czo6VHJhbnNmZXJHYW1tYTI4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNNX1ZJRENfVFJBTlNGRVJfU01QVEVfMjQwTToKLSAgICAgICAgICAgIGFzcGVjdHMtPm1UcmFuc2ZlciA9IENvbG9yQXNwZWN0czo6VHJhbnNmZXJTTVBURTI0ME07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNU01fVklEQ19UUkFOU0ZFUl9MSU5FQVI6Ci0gICAgICAgICAgICBhc3BlY3RzLT5tVHJhbnNmZXIgPSBDb2xvckFzcGVjdHM6OlRyYW5zZmVyTGluZWFyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNNX1ZJRENfVFJBTlNGRVJfSUVDXzYxOTY2OgotICAgICAgICAgICAgYXNwZWN0cy0+bVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2Zlclh2WUNDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNNX1ZJRENfVFJBTlNGRVJfQlRfMTM2MToKLSAgICAgICAgICAgIGFzcGVjdHMtPm1UcmFuc2ZlciA9IENvbG9yQXNwZWN0czo6VHJhbnNmZXJCVDEzNjE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNU01fVklEQ19UUkFOU0ZFUl9TUkdCOgotICAgICAgICAgICAgYXNwZWN0cy0+bVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNSR0I7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vYXNwZWN0cy0+bVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2Zlck90aGVyOwotICAgICAgICAgICAgYXNwZWN0cy0+bVRyYW5zZmVyID0gbV9jbGllbnRfY29sb3Jfc3BhY2Uuc0FzcGVjdHMubVRyYW5zZmVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3dpdGNoIChtYXRyaXgpIHsKLSAgICAgICAgY2FzZSBNU01fVklEQ19NQVRSSVhfQlRfNzA5XzU6Ci0gICAgICAgICAgICBhc3BlY3RzLT5tTWF0cml4Q29lZmZzID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDcwOV81OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNNX1ZJRENfTUFUUklYX0ZDQ180NzoKLSAgICAgICAgICAgIGFzcGVjdHMtPm1NYXRyaXhDb2VmZnMgPSBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUNDcwXzZNOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNNX1ZJRENfTUFUUklYXzYwMV82XzYyNToKLSAgICAgICAgY2FzZSBNU01fVklEQ19NQVRSSVhfNjAxXzZfNTI1OgotICAgICAgICAgICAgYXNwZWN0cy0+bU1hdHJpeENvZWZmcyA9IENvbG9yQXNwZWN0czo6TWF0cml4QlQ2MDFfNjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1TTV9WSURDX01BVFJJWF9TTVBURV8yNDBNOgotICAgICAgICAgICAgYXNwZWN0cy0+bU1hdHJpeENvZWZmcyA9IENvbG9yQXNwZWN0czo6TWF0cml4U01QVEUyNDBNOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNNX1ZJRENfTUFUUklYX0JUXzIwMjA6Ci0gICAgICAgICAgICBhc3BlY3RzLT5tTWF0cml4Q29lZmZzID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDIwMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNU01fVklEQ19NQVRSSVhfQlRfMjAyMF9DT05TVDoKLSAgICAgICAgICAgIGFzcGVjdHMtPm1NYXRyaXhDb2VmZnMgPSBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUMjAyMENvbnN0YW50OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvL2FzcGVjdHMtPm1NYXRyaXhDb2VmZnMgPSBDb2xvckFzcGVjdHM6Ok1hdHJpeE90aGVyOwotICAgICAgICAgICAgYXNwZWN0cy0+bU1hdHJpeENvZWZmcyA9IG1fY2xpZW50X2NvbG9yX3NwYWNlLnNBc3BlY3RzLm1NYXRyaXhDb2VmZnM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgb214X3ZkZWM6OnByaW50X2RlYnVnX2NvbG9yX2FzcGVjdHMoQ29sb3JBc3BlY3RzICphc3BlY3RzLCBjb25zdCBjaGFyICpwcmVmaXgpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiJXMgOiBDb2xvciBhc3BlY3RzIDogUHJpbWFyaWVzID0gJWQgUmFuZ2UgPSAlZCBUcmFuc2ZlciA9ICVkIE1hdHJpeENvZWZmcyA9ICVkIiwKLSAgICAgICAgICAgICAgICBwcmVmaXgsIGFzcGVjdHMtPm1QcmltYXJpZXMsIGFzcGVjdHMtPm1SYW5nZSwgYXNwZWN0cy0+bVRyYW5zZmVyLCBhc3BlY3RzLT5tTWF0cml4Q29lZmZzKTsKLX0KLQotdm9pZCBvbXhfdmRlYzo6cHJlcGFyZV9jb2xvcl9hc3BlY3RzX21ldGFkYXRhKE9NWF9VMzIgcHJpbWFyaWVzLCBPTVhfVTMyIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgdHJhbnNmZXIsIE9NWF9VMzIgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yTWV0YURhdGEgKmNvbG9yX21kYXRhKQotewotCi0gICAgLyogQ29sb3JBc3BlY3RzIGluIHFkTWV0YURhdGEgKi8KLSAgICBjb2xvcl9tZGF0YS0+Y29sb3JQcmltYXJpZXMgPSAoZW51bSBDb2xvclByaW1hcmllcykgcHJpbWFyaWVzOwotICAgIGNvbG9yX21kYXRhLT5yYW5nZSA9IChlbnVtIENvbG9yUmFuZ2UpcmFuZ2U7Ci0gICAgY29sb3JfbWRhdGEtPnRyYW5zZmVyID0gKGVudW0gR2FtbWFUcmFuc2Zlcil0cmFuc2ZlcjsKLSAgICBjb2xvcl9tZGF0YS0+bWF0cml4Q29lZmZpY2llbnRzID0gKGVudW0gTWF0cml4Q29FZmZpY2llbnRzKW1hdHJpeDsKLX0KLQotYm9vbCBvbXhfdmRlYzo6aGFuZGxlX2NvbG9yX3NwYWNlX2luZm8odm9pZCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2VfdCAqY29sb3Jfc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvck1ldGFEYXRhICpjb2xvcl9tZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIHNldF9jb2xvcl9hc3BlY3RzX29ubHkpCi17Ci0gICAgQ29sb3JBc3BlY3RzIHRlbXBBc3BlY3RzOwotICAgIG1lbXNldCgmdGVtcEFzcGVjdHMsIDB4MCwgc2l6ZW9mKENvbG9yQXNwZWN0cykpOwotICAgIENvbG9yQXNwZWN0cyAqYXNwZWN0cyA9ICZ0ZW1wQXNwZWN0czsKLQotICAgIC8qIFNldCBkZWZhdWx0IENvbG9yQXNwZWN0cyAqLwotICAgIHByZXBhcmVfY29sb3JfYXNwZWN0c19tZXRhZGF0YShDb2xvclByaW1hcmllc19CVDYwMV82XzYyNSwgUmFuZ2VfRnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zlcl9TTVBURV8xNzBNLCBNYXRyaXhDb0VmZl9CVDYwMV82XzYyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9tZGF0YSk7Ci0KLSAgICBzd2l0Y2gob3V0cHV0X2NhcGFiaWxpdHkpIHsKLSAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTVBFRzI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IG1zbV92aWRjX21wZWcyX3NlcWRpc3BfcGF5bG9hZCAqc2VxZGlzcF9wYXlsb2FkOwotICAgICAgICAgICAgICAgIHNlcWRpc3BfcGF5bG9hZCA9IChzdHJ1Y3QgbXNtX3ZpZGNfbXBlZzJfc2VxZGlzcF9wYXlsb2FkICopZGF0YTsKLQotICAgICAgICAgICAgICAgIC8qIFJlZmVyIE1QRUcyIFNwZWMgQCBSZWMuIElTTy9JRUMgMTM4MTgtMiwgSVRVLVQgRHJhZnQgUmVjLiBILjI2MiB0bwotICAgICAgICAgICAgICAgICAqIHVuZGVyc3RhbmQgdGhpcyBjb2RlICovCi0KLSAgICAgICAgICAgICAgICBpZiAoc2VxZGlzcF9wYXlsb2FkICYmIHNlcWRpc3BfcGF5bG9hZC0+Y29sb3JfZGVzY3ApIHsKLQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0X2NvbG9yX3NwYWNlX2luZm8oc2VxZGlzcF9wYXlsb2FkLT5jb2xvcl9wcmltYXJpZXMsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxZGlzcF9wYXlsb2FkLT50cmFuc2Zlcl9jaGFyLCBzZXFkaXNwX3BheWxvYWQtPm1hdHJpeF9jb2VmZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3Jfc3BhY2UsYXNwZWN0cyk7Ci0gICAgICAgICAgICAgICAgICAgIG1fZGlzcF9ob3Jfc2l6ZSA9IHNlcWRpc3BfcGF5bG9hZC0+ZGlzcF93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgbV9kaXNwX3ZlcnRfc2l6ZSA9IHNlcWRpc3BfcGF5bG9hZC0+ZGlzcF9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9jb2xvcl9hc3BlY3RzX29ubHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBwcmVwYXJlX2NvbG9yX2FzcGVjdHNfbWV0YWRhdGEoc2VxZGlzcF9wYXlsb2FkLT5jb2xvcl9wcmltYXJpZXMsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxZGlzcF9wYXlsb2FkLT50cmFuc2Zlcl9jaGFyLCBzZXFkaXNwX3BheWxvYWQtPm1hdHJpeF9jb2VmZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfbWRhdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9IMjY0OgotICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9IRVZDOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cnVjdCBtc21fdmlkY192dWlfZGlzcGxheV9pbmZvX3BheWxvYWQgKmRpc3BsYXlfaW5mb19wYXlsb2FkOwotICAgICAgICAgICAgICAgIGRpc3BsYXlfaW5mb19wYXlsb2FkID0gKHN0cnVjdCBtc21fdmlkY192dWlfZGlzcGxheV9pbmZvX3BheWxvYWQqKWRhdGE7Ci0KLSAgICAgICAgICAgICAgICAvKiBSZWZlciBIMjY0IFNwZWMgQCBSZWMuIElUVS1UIEguMjY0ICgwMi8yMDE0KSB0byB1bmRlcnN0YW5kIHRoaXMgY29kZSAqLwotCi0gICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlfaW5mb19wYXlsb2FkLT52aWRlb19zaWduYWxfcHJlc2VudF9mbGFnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2luZm9fcGF5bG9hZC0+Y29sb3JfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRfY29sb3Jfc3BhY2VfaW5mbyhkaXNwbGF5X2luZm9fcGF5bG9hZC0+Y29sb3JfcHJpbWFyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfaW5mb19wYXlsb2FkLT52aWRlb19mdWxsX3JhbmdlX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9pbmZvX3BheWxvYWQtPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2luZm9fcGF5bG9hZC0+bWF0cml4X2NvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9zcGFjZSxhc3BlY3RzKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0X2NvbG9yX2FzcGVjdHNfb25seSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHByZXBhcmVfY29sb3JfYXNwZWN0c19tZXRhZGF0YShkaXNwbGF5X2luZm9fcGF5bG9hZC0+Y29sb3JfcHJpbWFyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9pbmZvX3BheWxvYWQtPnZpZGVvX2Z1bGxfcmFuZ2VfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfaW5mb19wYXlsb2FkLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2luZm9fcGF5bG9hZC0+bWF0cml4X2NvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX21kYXRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfVlA4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cnVjdCBtc21fdmlkY192cHhfY29sb3JzcGFjZV9wYXlsb2FkICp2cHhfY29sb3Jfc3BhY2VfcGF5bG9hZDsKLSAgICAgICAgICAgICAgICB2cHhfY29sb3Jfc3BhY2VfcGF5bG9hZCA9IChzdHJ1Y3QgbXNtX3ZpZGNfdnB4X2NvbG9yc3BhY2VfcGF5bG9hZCopZGF0YTsKLSAgICAgICAgICAgICAgICBzZXRfY29sb3JfYXNwZWN0c19vbmx5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgLyogUmVmZXIgVlA4IERhdGEgRm9ybWF0IGluIGxhdGVzdCBWUDggc3BlYyBhbmQgRGVjb2RpbmcgR3VpZGUgTm92ZW1iZXIgMjAxMQotICAgICAgICAgICAgICAgICAqIHRvIHVuZGVyc3RhbmQgdGhpcyBjb2RlICovCi0KLSAgICAgICAgICAgICAgICBpZiAodnB4X2NvbG9yX3NwYWNlX3BheWxvYWQtPmNvbG9yX3NwYWNlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgKmNvbG9yX3NwYWNlID0gSVRVX1JfNjAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJVbnN1cHBvcnRlZCBDb2xvciBzcGFjZSBmb3IgVlA4Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9WUDk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IG1zbV92aWRjX3ZweF9jb2xvcnNwYWNlX3BheWxvYWQgKnZweF9jb2xvcl9zcGFjZV9wYXlsb2FkOwotICAgICAgICAgICAgICAgIHZweF9jb2xvcl9zcGFjZV9wYXlsb2FkID0gKHN0cnVjdCBtc21fdmlkY192cHhfY29sb3JzcGFjZV9wYXlsb2FkKilkYXRhOwotICAgICAgICAgICAgICAgIHNldF9jb2xvcl9hc3BlY3RzX29ubHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAvKiBSZWZlciBWUDkgU3BlYyBAIFZQOSBCaXRzdHJlYW0gJiBEZWNvZGluZyBQcm9jZXNzIFNwZWNpZmljYXRpb24gLSB2MC42IDMxc3QgTWFyY2ggMjAxNgotICAgICAgICAgICAgICAgICAqIHRvIHVuZGVyc3RhbmQgdGhpcyBjb2RlICovCi0KLSAgICAgICAgICAgICAgICBzd2l0Y2godnB4X2NvbG9yX3NwYWNlX3BheWxvYWQtPmNvbG9yX3NwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfQ1NfQlRfNjAxOgotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bU1hdHJpeENvZWZmcyA9IENvbG9yQXNwZWN0czo6TWF0cml4QlQ2MDFfNjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdHMtPm1UcmFuc2ZlciA9IENvbG9yQXNwZWN0czo6VHJhbnNmZXJTTVBURTE3ME07Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLT5tUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDYwMV82XzYyNTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdHMtPm1SYW5nZSA9IG1fY2xpZW50X2NvbG9yX3NwYWNlLnNBc3BlY3RzLm1SYW5nZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TTV9WSURDX0NTX0JUXzcwOToKLSAgICAgICAgICAgICAgICAgICAgICAgICpjb2xvcl9zcGFjZSA9IElUVV9SXzcwOTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdHMtPm1NYXRyaXhDb2VmZnMgPSBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUNzA5XzU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLT5tVHJhbnNmZXIgPSBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU01QVEUxNzBNOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bVByaW1hcmllcyA9ICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNzA5XzU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLT5tUmFuZ2UgPSBtX2NsaWVudF9jb2xvcl9zcGFjZS5zQXNwZWN0cy5tUmFuZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19DU19TTVBURV8xNzA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLT5tTWF0cml4Q29lZmZzID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDcwOV81OwotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNNUFRFMTcwTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdHMtPm1QcmltYXJpZXMgPSBtX2NsaWVudF9jb2xvcl9zcGFjZS5zQXNwZWN0cy5tUHJpbWFyaWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bVJhbmdlID0gbV9jbGllbnRfY29sb3Jfc3BhY2Uuc0FzcGVjdHMubVJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfQ1NfU01QVEVfMjQwOgotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bU1hdHJpeENvZWZmcyA9IG1fY2xpZW50X2NvbG9yX3NwYWNlLnNBc3BlY3RzLm1NYXRyaXhDb2VmZnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLT5tVHJhbnNmZXIgPSBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU01QVEUyNDBNOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bVByaW1hcmllcyA9IG1fY2xpZW50X2NvbG9yX3NwYWNlLnNBc3BlY3RzLm1QcmltYXJpZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLT5tUmFuZ2UgPSBtX2NsaWVudF9jb2xvcl9zcGFjZS5zQXNwZWN0cy5tUmFuZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19DU19CVF8yMDIwOgotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bU1hdHJpeENvZWZmcyA9IENvbG9yQXNwZWN0czo6TWF0cml4QlQyMDIwOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjogVHJhbnNmZXJTTVBURTE3ME07Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLT5tUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDIwMjA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLT5tUmFuZ2UgPSBtX2NsaWVudF9jb2xvcl9zcGFjZS5zQXNwZWN0cy5tUmFuZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19DU19SRVNFUlZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdHMtPm1NYXRyaXhDb2VmZnMgPSBDb2xvckFzcGVjdHM6Ok1hdHJpeE90aGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2Zlck90aGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bVByaW1hcmllcyA9IENvbG9yQXNwZWN0czo6UHJpbWFyaWVzT3RoZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLT5tUmFuZ2UgPSBtX2NsaWVudF9jb2xvcl9zcGFjZS5zQXNwZWN0cy5tUmFuZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19DU19SR0I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLT5tTWF0cml4Q29lZmZzID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDcwOV81OwotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNNUFRFMTcwTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdHMtPm1QcmltYXJpZXMgPSBDb2xvckFzcGVjdHM6OlByaW1hcmllc090aGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy0+bVJhbmdlID0gbV9jbGllbnRfY29sb3Jfc3BhY2Uuc0FzcGVjdHMubVJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHByaW50X2RlYnVnX2NvbG9yX2FzcGVjdHMoYXNwZWN0cywgIkJpdHN0cmVhbSIpOwotCi0gICAgaWYgKG1faW50ZXJuYWxfY29sb3Jfc3BhY2Uuc0FzcGVjdHMubVByaW1hcmllcyAhPSBhc3BlY3RzLT5tUHJpbWFyaWVzIHx8Ci0gICAgICAgICAgICBtX2ludGVybmFsX2NvbG9yX3NwYWNlLnNBc3BlY3RzLm1UcmFuc2ZlciAhPSBhc3BlY3RzLT5tVHJhbnNmZXIgfHwKLSAgICAgICAgICAgIG1faW50ZXJuYWxfY29sb3Jfc3BhY2Uuc0FzcGVjdHMubU1hdHJpeENvZWZmcyAhPSBhc3BlY3RzLT5tTWF0cml4Q29lZmZzIHx8Ci0gICAgICAgICAgICBtX2ludGVybmFsX2NvbG9yX3NwYWNlLnNBc3BlY3RzLm1SYW5nZSAhPSBhc3BlY3RzLT5tUmFuZ2UpIHsKLSAgICAgICAgbWVtY3B5KCYobV9pbnRlcm5hbF9jb2xvcl9zcGFjZS5zQXNwZWN0cyksIGFzcGVjdHMsIHNpemVvZihDb2xvckFzcGVjdHMpKTsKLSAgICAgICAgbV9pbnRlcm5hbF9jb2xvcl9zcGFjZS5iRGF0YVNwYWNlQ2hhbmdlZCA9IE9NWF9UUlVFOwotCi0gICAgICAgIG1fY29sb3JfbWRhdGEuY29sb3JQcmltYXJpZXMgPSBjb2xvcl9tZGF0YS0+Y29sb3JQcmltYXJpZXM7Ci0gICAgICAgIG1fY29sb3JfbWRhdGEucmFuZ2UgPSBjb2xvcl9tZGF0YS0+cmFuZ2U7Ci0gICAgICAgIG1fY29sb3JfbWRhdGEudHJhbnNmZXIgPSBjb2xvcl9tZGF0YS0+dHJhbnNmZXI7Ci0gICAgICAgIG1fY29sb3JfbWRhdGEubWF0cml4Q29lZmZpY2llbnRzID0gY29sb3JfbWRhdGEtPm1hdHJpeENvZWZmaWNpZW50czsKLQotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJJbml0aWF0aW5nIFBPUlQgUmVjb25maWcgZHVlIHRvIENvbG9yIEFzcGVjdHMgQ2hhbmdlIik7Ci0gICAgICAgIHByaW50X2RlYnVnX2NvbG9yX2FzcGVjdHMoJihtX2ludGVybmFsX2NvbG9yX3NwYWNlLnNBc3BlY3RzKSwgIkludGVybmFsIik7Ci0gICAgICAgIHByaW50X2RlYnVnX2NvbG9yX2FzcGVjdHMoJihtX2NsaWVudF9jb2xvcl9zcGFjZS5zQXNwZWN0cyksICJDbGllbnQiKTsKLQotICAgICAgICBwb3N0X2V2ZW50KE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYLAotICAgICAgICAgICAgICAgIE9NWF9RVElJbmRleENvbmZpZ0Rlc2NyaWJlQ29sb3JBc3BlY3RzLAotICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfUE9SVF9SRUNPTkZJRyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgb214X3ZkZWM6OnNldF9jb2xvcnNwYWNlX2luX2hhbmRsZShDb2xvclNwYWNlX3QgY29sb3Jfc3BhY2UsIHVuc2lnbmVkIGludCBidWZfaW5kZXgpIHsKLSAgICBwcml2YXRlX2hhbmRsZV90ICpwcml2YXRlX2hhbmRsZSA9IE5VTEw7Ci0gICAgaWYgKGJ1Zl9pbmRleCA8IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50ICYmCi0gICAgICAgICAgICBidWZfaW5kZXggPCBNQVhfTlVNX0lOUFVUX09VVFBVVF9CVUZGRVJTICYmCi0gICAgICAgICAgICBuYXRpdmVfYnVmZmVyW2J1Zl9pbmRleF0ucHJpdmF0ZWhhbmRsZSkgewotICAgICAgICBwcml2YXRlX2hhbmRsZSA9IG5hdGl2ZV9idWZmZXJbYnVmX2luZGV4XS5wcml2YXRlaGFuZGxlOwotICAgIH0KLSAgICBpZiAocHJpdmF0ZV9oYW5kbGUpIHsKLSAgICAgICAgc2V0TWV0YURhdGEocHJpdmF0ZV9oYW5kbGUsIFVQREFURV9DT0xPUl9TUEFDRSwgKHZvaWQqKSZjb2xvcl9zcGFjZSk7Ci0gICAgfQotfQotCi12b2lkIG9teF92ZGVjOjpwcmludF9kZWJ1Z19oZHJfY29sb3JfaW5mbyhIRFJTdGF0aWNJbmZvICpoZHJfaW5mbywgY29uc3QgY2hhciAqcHJlZml4KQotewotICAgIGlmICghaGRyX2luZm8tPm1JRCkgewotICAgICAgICBERUJVR19QUklOVF9MT1coIiVzIDogSERSc3RhdGljaW5mbyBNREM6IG1SLnggPSAlZCBtUi55ID0gJWQiLCBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGRyX2luZm8tPnNUeXBlMS5tUi54LCBoZHJfaW5mby0+c1R5cGUxLm1SLnkpOwotICAgICAgICBERUJVR19QUklOVF9MT1coIiVzIDogSERSc3RhdGljaW5mbyBNREM6IG1HLnggPSAlZCBtRy55ID0gJWQiLCBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGRyX2luZm8tPnNUeXBlMS5tRy54LCBoZHJfaW5mby0+c1R5cGUxLm1HLnkpOwotICAgICAgICBERUJVR19QUklOVF9MT1coIiVzIDogSERSc3RhdGljaW5mbyBNREM6IG1CLnggPSAlZCBtQi55ID0gJWQiLCBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGRyX2luZm8tPnNUeXBlMS5tQi54LCBoZHJfaW5mby0+c1R5cGUxLm1CLnkpOwotICAgICAgICBERUJVR19QUklOVF9MT1coIiVzIDogSERSc3RhdGljaW5mbyBNREM6IG1XLnggPSAlZCBtVy55ID0gJWQiLCBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGRyX2luZm8tPnNUeXBlMS5tVy54LCBoZHJfaW5mby0+c1R5cGUxLm1XLnkpOwotICAgICAgICBERUJVR19QUklOVF9MT1coIiVzIDogSERSc3RhdGljaW5mbyBNREM6IG1heERpc3BMdW0gPSAlZCBtaW5EaXNwTHVtID0gJWQiLCBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGRyX2luZm8tPnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSwgaGRyX2luZm8tPnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSk7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiJXMgOiBIRFJzdGF0aWNpbmZvIENMTDogQ0xMID0gJWQgRkxMID0gJWQiLCBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBoZHJfaW5mby0+c1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCwgaGRyX2luZm8tPnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCk7Ci0gICAgfQotCi19Ci0KLXZvaWQgb214X3ZkZWM6OnByaW50X2RlYnVnX2hkcl9jb2xvcl9pbmZvX21kYXRhKENvbG9yTWV0YURhdGEqIGNvbG9yX21kYXRhKQotewotICAgIERFQlVHX1BSSU5UX0xPVygic2V0TWV0YURhdGEgQ09MT1JfTUVUQURBVEEgOiBjb2xvcl9wcmltYXJpZXMgPSAldSwgcmFuZ2UgPSAldSwgdHJhbnNmZXIgPSAldSwgbWF0cml4ID0gJXUiLAotICAgICAgICAgICAgICAgICAgICBjb2xvcl9tZGF0YS0+Y29sb3JQcmltYXJpZXMsIGNvbG9yX21kYXRhLT5yYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgY29sb3JfbWRhdGEtPnRyYW5zZmVyLCBjb2xvcl9tZGF0YS0+bWF0cml4Q29lZmZpY2llbnRzKTsKLQotICAgIGZvcih1aW50OF90IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgIGZvcih1aW50OF90IGogPSAwOyBqIDwgMjsgaisrKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldE1ldGFkYXRhIENPTE9SX01FVEFEQVRBIDogcmdiUHJpbWFyaWVzWyVkXVslZF0gPSAlZCIsIGksIGosIGNvbG9yX21kYXRhLT5tYXN0ZXJpbmdEaXNwbGF5SW5mby5wcmltYXJpZXMucmdiUHJpbWFyaWVzW2ldW2pdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygic2V0TWV0YWRhdGEgQ09MT1JfTUVUQURBVEEgOiB3aGl0ZXBvaW50WzBdID0gJWQgd2hpdGVwb2ludFsxXSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgY29sb3JfbWRhdGEtPm1hc3RlcmluZ0Rpc3BsYXlJbmZvLnByaW1hcmllcy53aGl0ZVBvaW50WzBdLAotICAgICAgICAgICAgICAgICAgICBjb2xvcl9tZGF0YS0+bWFzdGVyaW5nRGlzcGxheUluZm8ucHJpbWFyaWVzLndoaXRlUG9pbnRbMV0pOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJzZXRNZXRhZGF0YSBDT0xPUl9NRVRBREFUQSA6IG1heERpc3BMdW0gPSAlZCBtaW5EaXNwTHVtID0gJWQiLAotICAgICAgICAgICAgICAgICAgICBjb2xvcl9tZGF0YS0+bWFzdGVyaW5nRGlzcGxheUluZm8ubWF4RGlzcGxheUx1bWluYW5jZSwKLSAgICAgICAgICAgICAgICAgICAgY29sb3JfbWRhdGEtPm1hc3RlcmluZ0Rpc3BsYXlJbmZvLm1pbkRpc3BsYXlMdW1pbmFuY2UpOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJzZXRNZXRhZGF0YSBDT0xPUl9NRVRBREFUQSA6IG1heENMTCA9ICVkIG1heEZMTCA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgY29sb3JfbWRhdGEtPmNvbnRlbnRMaWdodExldmVsLm1heENvbnRlbnRMaWdodExldmVsLAotICAgICAgICAgICAgICAgICAgICBjb2xvcl9tZGF0YS0+Y29udGVudExpZ2h0TGV2ZWwubWluUGljQXZlcmFnZUxpZ2h0TGV2ZWwpOwotCi0KLX0KLQotYm9vbCBvbXhfdmRlYzo6aGFuZGxlX2NvbnRlbnRfbGlnaHRfbGV2ZWxfaW5mbyh2b2lkKiBkYXRhLCBDb250ZW50TGlnaHRMZXZlbCogbGlnaHRfbGV2ZWxfbWRhdGEpCi17Ci0gICAgc3RydWN0IG1zbV92aWRjX2NvbnRlbnRfbGlnaHRfbGV2ZWxfc2VpX3BheWxvYWQgKmxpZ2h0X2xldmVsX3BheWxvYWQgPQotICAgICAgICAobXNtX3ZpZGNfY29udGVudF9saWdodF9sZXZlbF9zZWlfcGF5bG9hZCopKGRhdGEpOwotCi0gICAgbGlnaHRfbGV2ZWxfbWRhdGEtPmxpZ2h0TGV2ZWxTRUlFbmFibGVkID0gdHJ1ZTsKLSAgICBsaWdodF9sZXZlbF9tZGF0YS0+bWF4Q29udGVudExpZ2h0TGV2ZWwgPSBsaWdodF9sZXZlbF9wYXlsb2FkLT5uTWF4Q29udGVudExpZ2h0OwotICAgIGxpZ2h0X2xldmVsX21kYXRhLT5taW5QaWNBdmVyYWdlTGlnaHRMZXZlbCA9IGxpZ2h0X2xldmVsX3BheWxvYWQtPm5NYXhQaWNBdmVyYWdlTGlnaHQ7Ci0KLSAgICBpZiAoKG1faW50ZXJuYWxfaGRyX2luZm8uc0luZm8uc1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCAhPSBsaWdodF9sZXZlbF9wYXlsb2FkLT5uTWF4Q29udGVudExpZ2h0KSB8fAotICAgICAgICAobV9pbnRlcm5hbF9oZHJfaW5mby5zSW5mby5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgIT0gbGlnaHRfbGV2ZWxfcGF5bG9hZC0+bk1heFBpY0F2ZXJhZ2VMaWdodCkpIHsKLSAgICAgICAgbV9pbnRlcm5hbF9oZHJfaW5mby5zSW5mby5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID0gbGlnaHRfbGV2ZWxfcGF5bG9hZC0+bk1heENvbnRlbnRMaWdodDsKLSAgICAgICAgbV9pbnRlcm5hbF9oZHJfaW5mby5zSW5mby5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBsaWdodF9sZXZlbF9wYXlsb2FkLT5uTWF4UGljQXZlcmFnZUxpZ2h0OwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIG9teF92ZGVjOjpoYW5kbGVfbWFzdGVyaW5nX2Rpc3BsYXlfY29sb3JfaW5mbyh2b2lkKiBkYXRhLCBNYXN0ZXJpbmdEaXNwbGF5KiBtYXN0ZXJpbmdfZGlzcGxheV9tZGF0YSkKLXsKLSAgICBzdHJ1Y3QgbXNtX3ZpZGNfbWFzdGVyaW5nX2Rpc3BsYXlfY29sb3VyX3NlaV9wYXlsb2FkICptYXN0ZXJpbmdfZGlzcGxheV9wYXlsb2FkID0KLSAgICAgICAgKG1zbV92aWRjX21hc3RlcmluZ19kaXNwbGF5X2NvbG91cl9zZWlfcGF5bG9hZCopKGRhdGEpOwotICAgIEhEUlN0YXRpY0luZm8qIGhkcl9pbmZvID0gJm1faW50ZXJuYWxfaGRyX2luZm8uc0luZm87Ci0gICAgYm9vbCBpbnRlcm5hbF9kaXNwX2NoYW5nZWRfZmxhZyA9IGZhbHNlOwotCi0gICAgbWFzdGVyaW5nX2Rpc3BsYXlfbWRhdGEtPmNvbG9yVm9sdW1lU0VJRW5hYmxlZCA9IHRydWU7Ci0gICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgIG1hc3RlcmluZ19kaXNwbGF5X21kYXRhLT5wcmltYXJpZXMucmdiUHJpbWFyaWVzW2ldWzBdID0gbWFzdGVyaW5nX2Rpc3BsYXlfcGF5bG9hZC0+bkRpc3BsYXlQcmltYXJpZXNYW2ldOwotICAgICAgICBtYXN0ZXJpbmdfZGlzcGxheV9tZGF0YS0+cHJpbWFyaWVzLnJnYlByaW1hcmllc1tpXVsxXSA9IG1hc3RlcmluZ19kaXNwbGF5X3BheWxvYWQtPm5EaXNwbGF5UHJpbWFyaWVzWVtpXTsKLSAgICB9Ci0gICAgbWFzdGVyaW5nX2Rpc3BsYXlfbWRhdGEtPnByaW1hcmllcy53aGl0ZVBvaW50WzBdID0gbWFzdGVyaW5nX2Rpc3BsYXlfcGF5bG9hZC0+bldoaXRlUG9pbnRYOwotICAgIG1hc3RlcmluZ19kaXNwbGF5X21kYXRhLT5wcmltYXJpZXMud2hpdGVQb2ludFsxXSA9IG1hc3RlcmluZ19kaXNwbGF5X3BheWxvYWQtPm5XaGl0ZVBvaW50WTsKLSAgICBtYXN0ZXJpbmdfZGlzcGxheV9tZGF0YS0+bWF4RGlzcGxheUx1bWluYW5jZSA9IG1hc3RlcmluZ19kaXNwbGF5X3BheWxvYWQtPm5NYXhEaXNwbGF5TWFzdGVyaW5nTHVtaW5hbmNlOwotICAgIG1hc3RlcmluZ19kaXNwbGF5X21kYXRhLT5taW5EaXNwbGF5THVtaW5hbmNlID0gbWFzdGVyaW5nX2Rpc3BsYXlfcGF5bG9hZC0+bk1pbkRpc3BsYXlNYXN0ZXJpbmdMdW1pbmFuY2U7Ci0KLSAgICBpbnRlcm5hbF9kaXNwX2NoYW5nZWRfZmxhZyB8PSAoaGRyX2luZm8tPnNUeXBlMS5tUi54ICE9IG1hc3RlcmluZ19kaXNwbGF5X3BheWxvYWQtPm5EaXNwbGF5UHJpbWFyaWVzWFswXSkgfHwKLSAgICAgICAgKGhkcl9pbmZvLT5zVHlwZTEubVIueSAhPSBtYXN0ZXJpbmdfZGlzcGxheV9wYXlsb2FkLT5uRGlzcGxheVByaW1hcmllc1lbMF0pOwotICAgIGludGVybmFsX2Rpc3BfY2hhbmdlZF9mbGFnIHw9IChoZHJfaW5mby0+c1R5cGUxLm1HLnggIT0gbWFzdGVyaW5nX2Rpc3BsYXlfcGF5bG9hZC0+bkRpc3BsYXlQcmltYXJpZXNYWzFdKSB8fAotICAgICAgICAoaGRyX2luZm8tPnNUeXBlMS5tRy55ICE9IG1hc3RlcmluZ19kaXNwbGF5X3BheWxvYWQtPm5EaXNwbGF5UHJpbWFyaWVzWVsxXSk7Ci0gICAgaW50ZXJuYWxfZGlzcF9jaGFuZ2VkX2ZsYWcgfD0gKGhkcl9pbmZvLT5zVHlwZTEubUIueCAhPSBtYXN0ZXJpbmdfZGlzcGxheV9wYXlsb2FkLT5uRGlzcGxheVByaW1hcmllc1hbMl0pIHx8Ci0gICAgICAgIChoZHJfaW5mby0+c1R5cGUxLm1CLnkgIT0gbWFzdGVyaW5nX2Rpc3BsYXlfcGF5bG9hZC0+bkRpc3BsYXlQcmltYXJpZXNZWzJdKTsKLQotICAgIGludGVybmFsX2Rpc3BfY2hhbmdlZF9mbGFnIHw9IChoZHJfaW5mby0+c1R5cGUxLm1XLnggIT0gbWFzdGVyaW5nX2Rpc3BsYXlfcGF5bG9hZC0+bldoaXRlUG9pbnRYKSB8fAotICAgICAgICAoaGRyX2luZm8tPnNUeXBlMS5tVy55ICE9IG1hc3RlcmluZ19kaXNwbGF5X3BheWxvYWQtPm5XaGl0ZVBvaW50WSk7Ci0KLSAgICAvKiBNYXhpbXVtIERpc3BsYXkgTHVtaW5hbmNlIGZyb20gdGhlIGJpdHN0cmVhbSBpcyBpbiAwLjAwMDEgY2QvbTIgd2hpbGUgdGhlIEhEUlN0YXRpY0luZm8gZXh0ZW5zaW9uCi0gICAgICAgcmVxdWlyZXMgaXQgaW4gY2QvbTIsIHNvIGRpdmlkaW5nIGJ5IDEwMDAwIGFuZCByb3VuZGluZyB0aGUgdmFsdWUgYWZ0ZXIgZGl2aXNpb24KLSAgICAqLwotICAgIHVpbnQxNl90IG1heF9kaXNwbGF5X2x1bWluYW5jZV9jZF9tMiA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGludD4oKG1hc3RlcmluZ19kaXNwbGF5X3BheWxvYWQtPm5NYXhEaXNwbGF5TWFzdGVyaW5nTHVtaW5hbmNlIC8gTFVNSU5BTkNFX0RJVl9GQUNUT1IpICsgMC41KTsKLSAgICBpbnRlcm5hbF9kaXNwX2NoYW5nZWRfZmxhZyB8PSAoaGRyX2luZm8tPnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSAhPSBtYXhfZGlzcGxheV9sdW1pbmFuY2VfY2RfbTIpIHx8Ci0gICAgICAgIChoZHJfaW5mby0+c1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlICE9IG1hc3RlcmluZ19kaXNwbGF5X3BheWxvYWQtPm5NaW5EaXNwbGF5TWFzdGVyaW5nTHVtaW5hbmNlKTsKLQotICAgIGlmIChpbnRlcm5hbF9kaXNwX2NoYW5nZWRfZmxhZykgewotICAgICAgICBoZHJfaW5mby0+c1R5cGUxLm1SLnggPSBtYXN0ZXJpbmdfZGlzcGxheV9wYXlsb2FkLT5uRGlzcGxheVByaW1hcmllc1hbMF07Ci0gICAgICAgIGhkcl9pbmZvLT5zVHlwZTEubVIueSA9IG1hc3RlcmluZ19kaXNwbGF5X3BheWxvYWQtPm5EaXNwbGF5UHJpbWFyaWVzWVswXTsKLSAgICAgICAgaGRyX2luZm8tPnNUeXBlMS5tRy54ID0gbWFzdGVyaW5nX2Rpc3BsYXlfcGF5bG9hZC0+bkRpc3BsYXlQcmltYXJpZXNYWzFdOwotICAgICAgICBoZHJfaW5mby0+c1R5cGUxLm1HLnkgPSBtYXN0ZXJpbmdfZGlzcGxheV9wYXlsb2FkLT5uRGlzcGxheVByaW1hcmllc1lbMV07Ci0gICAgICAgIGhkcl9pbmZvLT5zVHlwZTEubUIueCA9IG1hc3RlcmluZ19kaXNwbGF5X3BheWxvYWQtPm5EaXNwbGF5UHJpbWFyaWVzWFsyXTsKLSAgICAgICAgaGRyX2luZm8tPnNUeXBlMS5tQi55ID0gbWFzdGVyaW5nX2Rpc3BsYXlfcGF5bG9hZC0+bkRpc3BsYXlQcmltYXJpZXNZWzJdOwotICAgICAgICBoZHJfaW5mby0+c1R5cGUxLm1XLnggPSBtYXN0ZXJpbmdfZGlzcGxheV9wYXlsb2FkLT5uV2hpdGVQb2ludFg7Ci0gICAgICAgIGhkcl9pbmZvLT5zVHlwZTEubVcueSA9IG1hc3RlcmluZ19kaXNwbGF5X3BheWxvYWQtPm5XaGl0ZVBvaW50WTsKLQotICAgICAgICBoZHJfaW5mby0+c1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gbWF4X2Rpc3BsYXlfbHVtaW5hbmNlX2NkX20yOwotICAgICAgICBoZHJfaW5mby0+c1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gbWFzdGVyaW5nX2Rpc3BsYXlfcGF5bG9hZC0+bk1pbkRpc3BsYXlNYXN0ZXJpbmdMdW1pbmFuY2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIGludGVybmFsX2Rpc3BfY2hhbmdlZF9mbGFnOwotfQotCi12b2lkIG9teF92ZGVjOjpzZXRfY29sb3JtZXRhZGF0YV9pbl9oYW5kbGUoQ29sb3JNZXRhRGF0YSAqY29sb3JfbWRhdGEsIHVuc2lnbmVkIGludCBidWZfaW5kZXgpCi17Ci0gICAgcHJpdmF0ZV9oYW5kbGVfdCAqcHJpdmF0ZV9oYW5kbGUgPSBOVUxMOwotICAgIGlmIChidWZfaW5kZXggPCBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCAmJgotICAgICAgICBidWZfaW5kZXggPCBNQVhfTlVNX0lOUFVUX09VVFBVVF9CVUZGRVJTICYmCi0gICAgICAgIG5hdGl2ZV9idWZmZXJbYnVmX2luZGV4XS5wcml2YXRlaGFuZGxlKSB7Ci0gICAgICAgIHByaXZhdGVfaGFuZGxlID0gbmF0aXZlX2J1ZmZlcltidWZfaW5kZXhdLnByaXZhdGVoYW5kbGU7Ci0gICAgfQotICAgIGlmIChwcml2YXRlX2hhbmRsZSkgewotICAgICAgICBzZXRNZXRhRGF0YShwcml2YXRlX2hhbmRsZSwgQ09MT1JfTUVUQURBVEEsICh2b2lkKiljb2xvcl9tZGF0YSk7Ci0gICAgfQotfQotCi12b2lkIG9teF92ZGVjOjpoYW5kbGVfZXh0cmFkYXRhKE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1Zl9oZHIpCi17Ci0gICAgT01YX09USEVSX0VYVFJBREFUQVRZUEUgKnBfZXh0cmEgPSBOVUxMLCAqcF9zZWkgPSBOVUxMLCAqcF92dWkgPSBOVUxMLCAqcF9jbGllbnRfZXh0cmEgPSBOVUxMOwotICAgIE9NWF9VOCAqcEJ1ZmZlciA9IE5VTEw7Ci0gICAgT01YX1UzMiBudW1fY29uY2VhbF9NQiA9IDA7Ci0gICAgT01YX1RJQ0tTIHRpbWVfc3RhbXAgPSAwOwotICAgIE9NWF9VMzIgZnJhbWVfcmF0ZSA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyBjb25zdW1lZF9sZW4gPSAwOwotICAgIE9NWF9VMzIgbnVtX01CX2luX2ZyYW1lOwotICAgIE9NWF9VMzIgcmVjb3Zlcnlfc2VpX2ZsYWdzID0gMTsKLSAgICBpbnQgZW5hYmxlID0gT01YX0ludGVybGFjZUZyYW1lUHJvZ3Jlc3NpdmU7Ci0gICAgYm9vbCBpbnRlcm5hbF9oZHJfaW5mb19jaGFuZ2VkX2ZsYWcgPSBmYWxzZTsKLSAgICBib29sIGNvbG9yX2V2ZW50ID0gZmFsc2U7Ci0gICAgQ29sb3JNZXRhRGF0YSBjb2xvcl9tZGF0YTsKLSAgICBtZW1zZXQoJmNvbG9yX21kYXRhLCAweDAsIHNpemVvZihDb2xvck1ldGFEYXRhKSk7Ci0gICAgYm9vbCBzZXRfZGlzcF9jb2xvcl9hc3BlY3RzX29ubHkgPSBmYWxzZTsKLSAgICBDb2xvclNwYWNlX3QgY29sb3Jfc3BhY2UgPSBJVFVfUl82MDE7Ci0KLSAgICBpZiAob3V0cHV0X2ZsdXNoX3Byb2dyZXNzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpbnQgYnVmX2luZGV4ID0gcF9idWZfaGRyIC0gbV9vdXRfbWVtX3B0cjsKLSAgICBpZiAoYnVmX2luZGV4ID49IGRydl9jdHguZXh0cmFkYXRhX2luZm8uY291bnQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImhhbmRsZV9leHRyYWRhdGE6IGludmFsaWQgaW5kZXgoJWQpIG1heCglZCkiLAotICAgICAgICAgICAgICAgIGJ1Zl9pbmRleCwgZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5jb3VudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RydWN0IG1zbV92aWRjX3BhbnNjYW5fd2luZG93X3BheWxvYWQgKnBhbnNjYW5fcGF5bG9hZCA9IE5VTEw7Ci0KLSAgICBpZiAoZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2J1Zl9pbmRleF0uYnVmZmVyYWRkciA9PSBOVUxMKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJoYW5kbGVfZXh0cmFkYXRhOiBFcnJvcjogTWFwcGVkIG91dHB1dCBidWZmZXIgYWRkcmVzcyBpcyBOVUxMIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWRydl9jdHguZXh0cmFkYXRhX2luZm8udWFkZHIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiTlVMTCBkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLnVhZGRyIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFzZWN1cmVfbW9kZSAmJiAoZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZSA+IChwX2J1Zl9oZHItPm5BbGxvY0xlbiAtIHBfYnVmX2hkci0+bkZpbGxlZExlbikpICkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRXJyb3I6IEluc3VmZmljaWVudCBzaXplIGFsbG9jYXRlZCBmb3IgZXh0cmEtZGF0YSIpOwotICAgICAgICBwX2V4dHJhID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIXNlY3VyZV9tb2RlKSB7Ci0gICAgICAgIHBCdWZmZXIgPSAoT01YX1U4KiltbWFwKDAsIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltidWZfaW5kZXhdLmJ1ZmZlcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbYnVmX2luZGV4XS5wbWVtX2ZkLCAwKTsKLSAgICAgICAgaWYgKHBCdWZmZXIgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImhhbmRsZV9leHRyYWRhdGEgb3V0cHV0IGJ1ZmZlciBtbWFwIGZhaWxlZCAtIGVycm5vOiAlZCIsIGVycm5vKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwX2V4dHJhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopCi0gICAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcpKHBCdWZmZXIgKyBwX2J1Zl9oZHItPm5PZmZzZXQgKyBwX2J1Zl9oZHItPm5GaWxsZWRMZW4gKyAzKSYofjMpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcF9leHRyYSA9IG1fb3RoZXJfZXh0cmFkYXRhOwotCi0gICAgQXV0b1VubWFwIGF1dG91bm1hcChwQnVmZmVyLCBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbYnVmX2luZGV4XS5idWZmZXJfbGVuKTsKLSAgICBpZiAobV9jbGllbnRfb3V0cHV0X2V4dHJhZGF0YV9tZW1fcHRyICYmCi0gICAgICAgIG1fY2xpZW50X291dF9leHRyYWRhdGFfaW5mby5nZXRTaXplKCkgPj0gZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZSkgewotICAgICAgICBwX2NsaWVudF9leHRyYSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKSgobV9jbGllbnRfb3V0cHV0X2V4dHJhZGF0YV9tZW1fcHRyICsgYnVmX2luZGV4KS0+cEJ1ZmZlcik7Ci0gICAgfQotCi0gICAgY2hhciAqcF9leHRyYWRhdGEgPSBkcnZfY3R4LmV4dHJhZGF0YV9pbmZvLnVhZGRyICsgYnVmX2luZGV4ICogZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZTsKLQotICAgIGlmICghc2VjdXJlX21vZGUgJiYgKChPTVhfVTgqKXBfZXh0cmEgPiAocEJ1ZmZlciArIHBfYnVmX2hkci0+bkFsbG9jTGVuKSkpIHsKLSAgICAgICAgcF9leHRyYSA9IE5VTEw7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFcnJvcjogb3V0IG9mIGJvdW5kIG1lbW9yeSBhY2Nlc3MgYnkgcF9leHRyYSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfdXBkYXRlZCA9IE9NWF9GQUxTRTsKLSAgICBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZGF0YSA9IChzdHJ1Y3QgT01YX09USEVSX0VYVFJBREFUQVRZUEUgKilwX2V4dHJhZGF0YTsKLSAgICBpZiAoZGF0YSAmJiBwX2V4dHJhKSB7Ci0gICAgICAgIHdoaWxlICgoY29uc3VtZWRfbGVuIDwgZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZSkKLSAgICAgICAgICAgICAgICAmJiAoZGF0YS0+ZVR5cGUgIT0gKE9NWF9FWFRSQURBVEFUWVBFKU1TTV9WSURDX0VYVFJBREFUQV9OT05FKSkgewotICAgICAgICAgICAgaWYgKChjb25zdW1lZF9sZW4gKyBkYXRhLT5uU2l6ZSkgPiAodW5zaWduZWQpZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiSW52YWxpZCBleHRyYSBkYXRhIHNpemUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFzZWN1cmVfbW9kZSAmJiAoKE9NWF9VOCopcF9leHRyYSA+IChwQnVmZmVyICsgcF9idWZfaGRyLT5uQWxsb2NMZW4pKSkgewotICAgICAgICAgICAgICAgIHBfZXh0cmEgPSBOVUxMOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFcnJvcjogb3V0IG9mIGJvdW5kIG1lbW9yeSBhY2Nlc3MgYnkgcF9leHRyYSIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJoYW5kbGVfZXh0cmFkYXRhOiBlVHlwZSA9IDB4JXgiLCBkYXRhLT5lVHlwZSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKWRhdGEtPmVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19FWFRSQURBVEFfSU5URVJMQUNFX1ZJREVPOgotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXNtX3ZpZGNfaW50ZXJsYWNlX3BheWxvYWQgKnBheWxvYWQ7Ci0gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSAoc3RydWN0IG1zbV92aWRjX2ludGVybGFjZV9wYXlsb2FkICopKHZvaWQgKilkYXRhLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlID0gT01YX0ludGVybGFjZUZyYW1lUHJvZ3Jlc3NpdmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBheWxvYWQtPmZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfSU5URVJMQUNFX0ZSQU1FX1BST0dSRVNTSVZFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LmludGVybGFjZSA9IFZERUNfSW50ZXJsYWNlRnJhbWVQcm9ncmVzc2l2ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19JTlRFUkxBQ0VfSU5URVJMRUFWRV9GUkFNRV9UT1BGSUVMREZJUlNUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LmludGVybGFjZSA9IFZERUNfSW50ZXJsYWNlSW50ZXJsZWF2ZUZyYW1lVG9wRmllbGRGaXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlID0gT01YX0ludGVybGFjZUludGVybGVhdmVGcmFtZVRvcEZpZWxkRmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfSU5URVJMQUNFX0lOVEVSTEVBVkVfRlJBTUVfQk9UVE9NRklFTERGSVJTVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5pbnRlcmxhY2UgPSBWREVDX0ludGVybGFjZUludGVybGVhdmVGcmFtZUJvdHRvbUZpZWxkRmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSA9IE9NWF9JbnRlcmxhY2VJbnRlcmxlYXZlRnJhbWVCb3R0b21GaWVsZEZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TTV9WSURDX0lOVEVSTEFDRV9GUkFNRV9UT1BGSUVMREZJUlNUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4LmludGVybGFjZSA9IFZERUNfSW50ZXJsYWNlRnJhbWVUb3BGaWVsZEZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUgPSBPTVhfSW50ZXJsYWNlRnJhbWVUb3BGaWVsZEZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfSU5URVJMQUNFX0ZSQU1FX0JPVFRPTUZJRUxERklSU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHguaW50ZXJsYWNlID0gVkRFQ19JbnRlcmxhY2VGcmFtZUJvdHRvbUZpZWxkRmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSA9IE9NWF9JbnRlcmxhY2VGcmFtZUJvdHRvbUZpZWxkRmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZGVmYXVsdCBjYXNlIC0gc2V0IHRvIHByb2dyZXNzaXZlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHguaW50ZXJsYWNlID0gVkRFQ19JbnRlcmxhY2VGcmFtZVByb2dyZXNzaXZlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fZW5hYmxlX2FuZHJvaWRfbmF0aXZlX2J1ZmZlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0TWV0YURhdGEgSU5URVJMQUNFRCBmb3JtYXQ6JWQgZW5hYmxlOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLT5mb3JtYXQsIGVuYWJsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE1ldGFEYXRhKChwcml2YXRlX2hhbmRsZV90ICopbmF0aXZlX2J1ZmZlcltidWZfaW5kZXhdLnByaXZhdGVoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBfUEFSQU1fSU5URVJMQUNFRCwgKHZvaWQqKSZlbmFibGUpOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudF9leHRyYWRhdGEgJiBPTVhfSU5URVJMQUNFX0VYVFJBREFUQSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kX2ludGVybGFjZV9leHRyYWRhdGEocF9leHRyYSwgcGF5bG9hZC0+Zm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZXh0cmEgPSAoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKikgKCgoT01YX1U4ICopIHBfZXh0cmEpICsgQUxJR04ocF9leHRyYS0+blNpemUsIDQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2NsaWVudF9leHRyYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9pbnRlcmxhY2VfZXh0cmFkYXRhKHBfY2xpZW50X2V4dHJhLCBwYXlsb2FkLT5mb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2xpZW50X2V4dHJhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE9NWF9VOCAqKXBfY2xpZW50X2V4dHJhKSArIEFMSUdOKHBfY2xpZW50X2V4dHJhLT5uU2l6ZSwgNCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfRVhUUkFEQVRBX0ZSQU1FX1JBVEU6Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtc21fdmlkY19mcmFtZXJhdGVfcGF5bG9hZCAqZnJhbWVfcmF0ZV9wYXlsb2FkOwotICAgICAgICAgICAgICAgICAgICBmcmFtZV9yYXRlX3BheWxvYWQgPSAoc3RydWN0IG1zbV92aWRjX2ZyYW1lcmF0ZV9wYXlsb2FkICopKHZvaWQgKilkYXRhLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICBmcmFtZV9yYXRlID0gZnJhbWVfcmF0ZV9wYXlsb2FkLT5mcmFtZV9yYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TTV9WSURDX0VYVFJBREFUQV9USU1FU1RBTVA6Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtc21fdmlkY190c19wYXlsb2FkICp0aW1lX3N0YW1wX3BheWxvYWQ7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVfc3RhbXBfcGF5bG9hZCA9IChzdHJ1Y3QgbXNtX3ZpZGNfdHNfcGF5bG9hZCAqKSh2b2lkICopZGF0YS0+ZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgdGltZV9zdGFtcCA9IHRpbWVfc3RhbXBfcGF5bG9hZC0+dGltZXN0YW1wX2xvOwotICAgICAgICAgICAgICAgICAgICB0aW1lX3N0YW1wIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKXRpbWVfc3RhbXBfcGF5bG9hZC0+dGltZXN0YW1wX2hpIDw8IDMyKTsKLSAgICAgICAgICAgICAgICAgICAgcF9idWZfaGRyLT5uVGltZVN0YW1wID0gdGltZV9zdGFtcDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19FWFRSQURBVEFfTlVNX0NPTkNFQUxFRF9NQjoKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1zbV92aWRjX2NvbmNlYWxtYl9wYXlsb2FkICpjb25jZWFsX21iX3BheWxvYWQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmNlYWxfbWJfcGF5bG9hZCA9IChzdHJ1Y3QgbXNtX3ZpZGNfY29uY2VhbG1iX3BheWxvYWQgKikodm9pZCAqKWRhdGEtPmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIG51bV9NQl9pbl9mcmFtZSA9ICgoZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX3dpZHRoICsgMTUpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodCArIDE1KSkgPj4gODsKLSAgICAgICAgICAgICAgICAgICAgbnVtX2NvbmNlYWxfTUIgPSAoKG51bV9NQl9pbl9mcmFtZSA+IDApPyhjb25jZWFsX21iX3BheWxvYWQtPm51bV9tYnMgKiAxMDAgLyBudW1fTUJfaW5fZnJhbWUpIDogMCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfRVhUUkFEQVRBX0lOREVYOgotICAgICAgICAgICAgICAgICAgICBpbnQgKmV0eXBlOwotICAgICAgICAgICAgICAgICAgICBldHlwZSAgPSAoaW50ICopKHZvaWQgKilkYXRhLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXR5cGUgJiYgKmV0eXBlID09IE1TTV9WSURDX0VYVFJBREFUQV9BU1BFQ1RfUkFUSU8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtc21fdmlkY19hc3BlY3RfcmF0aW9fcGF5bG9hZCAqYXNwZWN0X3JhdGlvX3BheWxvYWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RfcmF0aW9fcGF5bG9hZCA9IChzdHJ1Y3QgbXNtX3ZpZGNfYXNwZWN0X3JhdGlvX3BheWxvYWQgKikoKytldHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNwZWN0X3JhdGlvX3BheWxvYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB2ZGVjX291dHB1dF9mcmFtZWluZm8gKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZfaGRyLT5wT3V0cHV0UG9ydFByaXZhdGUpLT5hc3BlY3RfcmF0aW9faW5mby5wYXJfd2lkdGggPSBhc3BlY3RfcmF0aW9fcGF5bG9hZC0+YXNwZWN0X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHZkZWNfb3V0cHV0X2ZyYW1laW5mbyAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9oZHItPnBPdXRwdXRQb3J0UHJpdmF0ZSktPmFzcGVjdF9yYXRpb19pbmZvLnBhcl9oZWlnaHQgPSBhc3BlY3RfcmF0aW9fcGF5bG9hZC0+YXNwZWN0X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldHlwZSAmJiAqZXR5cGUgPT0gTVNNX1ZJRENfRVhUUkFEQVRBX09VVFBVVF9DUk9QKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXNtX3ZpZGNfb3V0cHV0X2Nyb3BfcGF5bG9hZCAqb3V0cHV0X2Nyb3BfcGF5bG9hZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9jcm9wX3BheWxvYWQgPSAoc3RydWN0IG1zbV92aWRjX291dHB1dF9jcm9wX3BheWxvYWQgKikoKytldHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0X2Nyb3BfcGF5bG9hZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfcmVjdC5uTGVmdCA9IG91dHB1dF9jcm9wX3BheWxvYWQtPmxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5Ub3AgPSBvdXRwdXRfY3JvcF9wYXlsb2FkLT50b3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5XaWR0aCA9IG91dHB1dF9jcm9wX3BheWxvYWQtPmxlZnQgKyBvdXRwdXRfY3JvcF9wYXlsb2FkLT5kaXNwbGF5X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfcmVjdC5uSGVpZ2h0ID0gb3V0cHV0X2Nyb3BfcGF5bG9hZC0+dG9wICsgb3V0cHV0X2Nyb3BfcGF5bG9hZC0+ZGlzcGxheV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfd2lkdGggPSBvdXRwdXRfY3JvcF9wYXlsb2FkLT53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2V4dHJhZGF0YV9pbmZvLm91dHB1dF9oZWlnaHQgPSBvdXRwdXRfY3JvcF9wYXlsb2FkLT5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF91cGRhdGVkID0gT01YX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiTUlTUjA6ICV4ICV4ICV4ICV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfY3JvcF9wYXlsb2FkLT5taXNyX2luZm9bMF0ubWlzcl9kcGJfbHVtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Nyb3BfcGF5bG9hZC0+bWlzcl9pbmZvWzBdLm1pc3JfZHBiX2Nocm9tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Nyb3BfcGF5bG9hZC0+bWlzcl9pbmZvWzBdLm1pc3Jfb3BiX2x1bWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9jcm9wX3BheWxvYWQtPm1pc3JfaW5mb1swXS5taXNyX29wYl9jaHJvbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIk1JU1IxOiAleCAleCAleCAleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Nyb3BfcGF5bG9hZC0+bWlzcl9pbmZvWzFdLm1pc3JfZHBiX2x1bWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9jcm9wX3BheWxvYWQtPm1pc3JfaW5mb1sxXS5taXNyX2RwYl9jaHJvbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9jcm9wX3BheWxvYWQtPm1pc3JfaW5mb1sxXS5taXNyX29wYl9sdW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfY3JvcF9wYXlsb2FkLT5taXNyX2luZm9bMV0ubWlzcl9vcGJfY2hyb21hKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobV9leHRyYWRhdGFfaW5mby5taXNyX2luZm8sIG91dHB1dF9jcm9wX3BheWxvYWQtPm1pc3JfaW5mbywgMiAqIHNpemVvZihtc21fdmlkY19taXNyX2luZm8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50X2V4dHJhZGF0YSAmIE9NWF9PVVRQVVRDUk9QX0VYVFJBREFUQSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfb3V0cHV0Y3JvcF9leHRyYWRhdGEocF9leHRyYSwgb3V0cHV0X2Nyb3BfcGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZXh0cmEgPSAoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKikoKChPTVhfVTggKilwX2V4dHJhKSArIEFMSUdOKHBfZXh0cmEtPm5TaXplLCA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2NsaWVudF9leHRyYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kX291dHB1dGNyb3BfZXh0cmFkYXRhKHBfY2xpZW50X2V4dHJhLCBvdXRwdXRfY3JvcF9wYXlsb2FkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2xpZW50X2V4dHJhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopKCgoT01YX1U4ICopcF9jbGllbnRfZXh0cmEpICsgQUxJR04ocF9jbGllbnRfZXh0cmEtPm5TaXplLCA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigicF9leHRyYSAlcCBwX2NsaWVudF9leHRyYSAlcCBjbGllbnRfZXh0cmFkYXRhICV4ICV4ICIsIHBfZXh0cmEsIHBfY2xpZW50X2V4dHJhLCBjbGllbnRfZXh0cmFkYXRhLCBPTVhfT1VUUFVUQ1JPUF9FWFRSQURBVEEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TTV9WSURDX0VYVFJBREFUQV9SRUNPVkVSWV9QT0lOVF9TRUk6Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtc21fdmlkY19yZWNvdmVyeXNlaV9wYXlsb2FkICpyZWNvdmVyeV9zZWlfcGF5bG9hZDsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcnlfc2VpX3BheWxvYWQgPSAoc3RydWN0IG1zbV92aWRjX3JlY292ZXJ5c2VpX3BheWxvYWQgKikodm9pZCAqKWRhdGEtPmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIHJlY292ZXJ5X3NlaV9mbGFncyA9IHJlY292ZXJ5X3NlaV9wYXlsb2FkLT5mbGFnczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY292ZXJ5X3NlaV9mbGFncyAhPSBNU01fVklEQ19GUkFNRV9SRUNPTlNUUlVDVElPTl9DT1JSRUNUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9oZHItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19EQVRBQ09SUlVQVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmlsbEJ1ZmZlckRvbmU6IE9NWF9CVUZGRVJGTEFHX0RBVEFDT1JSVVBUIFJlY2VpdmVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfRVhUUkFEQVRBX1BBTlNDQU5fV0lORE9XOgotICAgICAgICAgICAgICAgICAgICBwYW5zY2FuX3BheWxvYWQgPSAoc3RydWN0IG1zbV92aWRjX3BhbnNjYW5fd2luZG93X3BheWxvYWQgKikodm9pZCAqKWRhdGEtPmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYW5zY2FuX3BheWxvYWQtPm51bV9wYW5zY2FuX3dpbmRvd3MgPiBNQVhfUEFOX1NDQU5fV0lORE9XUykgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlBhbnNjYW4gd2luZG93cyBhcmUgbW9yZSB0aGFuIHN1cHBvcnRlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiTWF4IHN1cHBvcnRlZCA9ICVkIEZXIHJldHVybmVkID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBTl9TQ0FOX1dJTkRPV1MsIHBhbnNjYW5fcGF5bG9hZC0+bnVtX3BhbnNjYW5fd2luZG93cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19FWFRSQURBVEFfTVBFRzJfU0VRRElTUDoKLSAgICAgICAgICAgICAgICBjYXNlIE1TTV9WSURDX0VYVFJBREFUQV9WVUlfRElTUExBWV9JTkZPOgotICAgICAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfRVhUUkFEQVRBX1ZQWF9DT0xPUlNQQUNFX0lORk86Ci0gICAgICAgICAgICAgICAgICAgIGNvbG9yX2V2ZW50ID0gaGFuZGxlX2NvbG9yX3NwYWNlX2luZm8oKHZvaWQgKilkYXRhLT5kYXRhLCAmY29sb3Jfc3BhY2UsICZjb2xvcl9tZGF0YSwgc2V0X2Rpc3BfY29sb3JfYXNwZWN0c19vbmx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19FWFRSQURBVEFfUzNEX0ZSQU1FX1BBQ0tJTkc6Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtc21fdmlkY19zM2RfZnJhbWVfcGFja2luZ19wYXlsb2FkICpzM2RfZnJhbWVfcGFja2luZ19wYXlsb2FkOwotICAgICAgICAgICAgICAgICAgICBzM2RfZnJhbWVfcGFja2luZ19wYXlsb2FkID0gKHN0cnVjdCBtc21fdmlkY19zM2RfZnJhbWVfcGFja2luZ19wYXlsb2FkICopKHZvaWQgKilkYXRhLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHMzZF9mcmFtZV9wYWNraW5nX3BheWxvYWQtPmZwYV90eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TTV9WSURDX0ZSQU1FUEFDS19TSURFX0JZX1NJREU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMzZF9mcmFtZV9wYWNraW5nX3BheWxvYWQtPmNvbnRlbnRfaW50ZXJwcnRhdGlvbl90eXBlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlb19vdXRwdXRfbW9kZSA9IEhBTF8zRF9TSURFX0JZX1NJREVfTF9SOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMzZF9mcmFtZV9wYWNraW5nX3BheWxvYWQtPmNvbnRlbnRfaW50ZXJwcnRhdGlvbl90eXBlID09IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlb19vdXRwdXRfbW9kZSA9IEhBTF8zRF9TSURFX0JZX1NJREVfUl9MOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiVW5zdXBwb3J0ZWQgc2lkZS1ieS1zaWRlIGZyYW1lcGFja2luZyB0eXBlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlb19vdXRwdXRfbW9kZSA9IEhBTF9OT18zRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TTV9WSURDX0ZSQU1FUEFDS19UT1BfQk9UVE9NOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlb19vdXRwdXRfbW9kZSA9IEhBTF8zRF9UT1BfQk9UVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiVW5zdXBwb3J0ZWQgZnJhbWVwYWNraW5nIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9fb3V0cHV0X21vZGUgPSBIQUxfTk9fM0Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRNZXRhRGF0YSBGUkFNRVBBQ0tJTkcgOiBmcGFfdHlwZSA9ICV1LCBjb250ZW50X2ludGVycHJ0YXRpb25fdHlwZSA9ICV1LCBzdGVyZW9fb3V0cHV0X21vZGU9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHMzZF9mcmFtZV9wYWNraW5nX3BheWxvYWQtPmZwYV90eXBlLCBzM2RfZnJhbWVfcGFja2luZ19wYXlsb2FkLT5jb250ZW50X2ludGVycHJ0YXRpb25fdHlwZSwgc3RlcmVvX291dHB1dF9tb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudF9leHRyYWRhdGEgJiBPTVhfRlJBTUVQQUNLX0VYVFJBREFUQSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kX2ZyYW1lcGFja19leHRyYWRhdGEocF9leHRyYSwgczNkX2ZyYW1lX3BhY2tpbmdfcGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2V4dHJhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopICgoKE9NWF9VOCAqKSBwX2V4dHJhKSArIEFMSUdOKHBfZXh0cmEtPm5TaXplLCA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9jbGllbnRfZXh0cmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfZnJhbWVwYWNrX2V4dHJhZGF0YShwX2NsaWVudF9leHRyYSwgczNkX2ZyYW1lX3BhY2tpbmdfcGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jbGllbnRfZXh0cmEgPSAoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKikgKCgoT01YX1U4ICopIHBfY2xpZW50X2V4dHJhKSArIEFMSUdOKHBfY2xpZW50X2V4dHJhLT5uU2l6ZSwgNCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfRVhUUkFEQVRBX0ZSQU1FX1FQOgotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXNtX3ZpZGNfZnJhbWVfcXBfcGF5bG9hZCAqcXBfcGF5bG9hZDsKLSAgICAgICAgICAgICAgICAgICAgcXBfcGF5bG9hZCA9IChzdHJ1Y3QgbXNtX3ZpZGNfZnJhbWVfcXBfcGF5bG9hZCopKHZvaWQgKilkYXRhLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50X2V4dHJhZGF0YSAmIE9NWF9RUF9FWFRSQURBVEEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9xcF9leHRyYWRhdGEocF9leHRyYSwgcXBfcGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2V4dHJhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopICgoKE9NWF9VOCAqKSBwX2V4dHJhKSArIEFMSUdOKHBfZXh0cmEtPm5TaXplLCA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9jbGllbnRfZXh0cmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfcXBfZXh0cmFkYXRhKHBfY2xpZW50X2V4dHJhLCBxcF9wYXlsb2FkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NsaWVudF9leHRyYSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKSAoKChPTVhfVTggKikgcF9jbGllbnRfZXh0cmEpICsgQUxJR04ocF9jbGllbnRfZXh0cmEtPm5TaXplLCA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19FWFRSQURBVEFfRlJBTUVfQklUU19JTkZPOgotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXNtX3ZpZGNfZnJhbWVfYml0c19pbmZvX3BheWxvYWQgKmJpdHNfaW5mb19wYXlsb2FkOwotICAgICAgICAgICAgICAgICAgICBiaXRzX2luZm9fcGF5bG9hZCA9IChzdHJ1Y3QgbXNtX3ZpZGNfZnJhbWVfYml0c19pbmZvX3BheWxvYWQqKSh2b2lkICopZGF0YS0+ZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudF9leHRyYWRhdGEgJiBPTVhfQklUU0lORk9fRVhUUkFEQVRBKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfYml0c2luZm9fZXh0cmFkYXRhKHBfZXh0cmEsIGJpdHNfaW5mb19wYXlsb2FkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZXh0cmEgPSAoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKikgKCgoT01YX1U4ICopIHBfZXh0cmEpICsgQUxJR04ocF9leHRyYS0+blNpemUsIDQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2NsaWVudF9leHRyYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9iaXRzaW5mb19leHRyYWRhdGEocF9jbGllbnRfZXh0cmEsIGJpdHNfaW5mb19wYXlsb2FkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NsaWVudF9leHRyYSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKSAoKChPTVhfVTggKikgcF9jbGllbnRfZXh0cmEpICsgQUxJR04ocF9jbGllbnRfZXh0cmEtPm5TaXplLCA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19FWFRSQURBVEFfU1RSRUFNX1VTRVJEQVRBOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50X2V4dHJhZGF0YSAmIE9NWF9FWFROVVNFUl9FWFRSQURBVEEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF91c2VyX2V4dHJhZGF0YShwX2V4dHJhLCBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZXh0cmEgPSAoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKikgKCgoT01YX1U4ICopIHBfZXh0cmEpICsgQUxJR04ocF9leHRyYS0+blNpemUsIDQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2NsaWVudF9leHRyYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF91c2VyX2V4dHJhZGF0YShwX2NsaWVudF9leHRyYSwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jbGllbnRfZXh0cmEgPSAoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKikgKCgoT01YX1U4ICopIHBfY2xpZW50X2V4dHJhKSArIEFMSUdOKHBfY2xpZW50X2V4dHJhLT5uU2l6ZSwgNCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfRVhUUkFEQVRBX1ZRWklQX1NFSToKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1zbV92aWRjX3ZxemlwX3NlaV9wYXlsb2FkICp2cXppcF9wYXlsb2FkOwotICAgICAgICAgICAgICAgICAgICB2cXppcF9wYXlsb2FkID0gKHN0cnVjdCBtc21fdmlkY192cXppcF9zZWlfcGF5bG9hZCopKHZvaWQgKilkYXRhLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50X2V4dHJhZGF0YSAmIE9NWF9WUVpJUFNFSV9FWFRSQURBVEEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmX2hkci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VYVFJBREFUQTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF92cXppcF9leHRyYWRhdGEocF9leHRyYSwgdnF6aXBfcGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2V4dHJhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopICgoKE9NWF9VOCAqKSBwX2V4dHJhKSArIEFMSUdOKHBfZXh0cmEtPm5TaXplLCA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9jbGllbnRfZXh0cmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfdnF6aXBfZXh0cmFkYXRhKHBfY2xpZW50X2V4dHJhLCB2cXppcF9wYXlsb2FkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NsaWVudF9leHRyYSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKSAoKChPTVhfVTggKikgcF9jbGllbnRfZXh0cmEpICsgQUxJR04ocF9jbGllbnRfZXh0cmEtPm5TaXplLCA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19FWFRSQURBVEFfQ09OVEVOVF9MSUdIVF9MRVZFTF9TRUk6Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfaGRyX2luZm9fY2hhbmdlZF9mbGFnIHw9IGhhbmRsZV9jb250ZW50X2xpZ2h0X2xldmVsX2luZm8oKHZvaWQqKWRhdGEtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoY29sb3JfbWRhdGEuY29udGVudExpZ2h0TGV2ZWwpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU01fVklEQ19FWFRSQURBVEFfTUFTVEVSSU5HX0RJU1BMQVlfQ09MT1VSX1NFSToKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfaGRyX2luZm9fY2hhbmdlZF9mbGFnIHw9IGhhbmRsZV9tYXN0ZXJpbmdfZGlzcGxheV9jb2xvcl9pbmZvKCh2b2lkKilkYXRhLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihjb2xvcl9tZGF0YS5tYXN0ZXJpbmdEaXNwbGF5SW5mbykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlVucmVjb2duaXplZCBleHRyYWRhdGEiKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byB1bnJlY29nbml6ZWRfZXh0cmFkYXRhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3VtZWRfbGVuICs9IGRhdGEtPm5TaXplOwotICAgICAgICAgICAgZGF0YSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKSgoY2hhciAqKWRhdGEgKyBkYXRhLT5uU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsaWVudF9leHRyYWRhdGEgJiBPTVhfRlJBTUVJTkZPX0VYVFJBREFUQSkgewotICAgICAgICAgICAgcF9idWZfaGRyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRVhUUkFEQVRBOwotICAgICAgICAgICAgYXBwZW5kX2ZyYW1lX2luZm9fZXh0cmFkYXRhKHBfZXh0cmEsCi0gICAgICAgICAgICAgICAgICAgIG51bV9jb25jZWFsX01CLCByZWNvdmVyeV9zZWlfZmxhZ3MsICgoc3RydWN0IHZkZWNfb3V0cHV0X2ZyYW1laW5mbyAqKXBfYnVmX2hkci0+cE91dHB1dFBvcnRQcml2YXRlKS0+cGljX3R5cGUsIGZyYW1lX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgIHRpbWVfc3RhbXAsIHBhbnNjYW5fcGF5bG9hZCwmKChzdHJ1Y3QgdmRlY19vdXRwdXRfZnJhbWVpbmZvICopCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9oZHItPnBPdXRwdXRQb3J0UHJpdmF0ZSktPmFzcGVjdF9yYXRpb19pbmZvKTsKLSAgICAgICAgICAgIHBfZXh0cmEgPSAoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKikgKCgoT01YX1U4ICopIHBfZXh0cmEpICsgQUxJR04ocF9leHRyYS0+blNpemUsIDQpKTsKLSAgICAgICAgICAgIGlmIChwX2NsaWVudF9leHRyYSkgewotICAgICAgICAgICAgICAgIGFwcGVuZF9mcmFtZV9pbmZvX2V4dHJhZGF0YShwX2NsaWVudF9leHRyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb25jZWFsX01CLCByZWNvdmVyeV9zZWlfZmxhZ3MsICgoc3RydWN0IHZkZWNfb3V0cHV0X2ZyYW1laW5mbyAqKXBfYnVmX2hkci0+cE91dHB1dFBvcnRQcml2YXRlKS0+cGljX3R5cGUsIGZyYW1lX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3N0YW1wLCBwYW5zY2FuX3BheWxvYWQsJigoc3RydWN0IHZkZWNfb3V0cHV0X2ZyYW1laW5mbyAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmX2hkci0+cE91dHB1dFBvcnRQcml2YXRlKS0+YXNwZWN0X3JhdGlvX2luZm8pOwotICAgICAgICAgICAgICAgIHBfY2xpZW50X2V4dHJhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopICgoKE9NWF9VOCAqKSBwX2NsaWVudF9leHRyYSkgKyBBTElHTihwX2NsaWVudF9leHRyYS0+blNpemUsIDQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpZW50X2V4dHJhZGF0YSAmIE9NWF9GUkFNRURJTUVOU0lPTl9FWFRSQURBVEEpIHsKLSAgICAgICAgICAgIGFwcGVuZF9mcmFtZV9kaW1lbnNpb25fZXh0cmFkYXRhKHBfZXh0cmEpOwotICAgICAgICAgICAgcF9leHRyYSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKSAoKChPTVhfVTggKikgcF9leHRyYSkgKyBBTElHTihwX2V4dHJhLT5uU2l6ZSwgNCkpOwotICAgICAgICAgICAgaWYgKHBfY2xpZW50X2V4dHJhKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kX2ZyYW1lX2RpbWVuc2lvbl9leHRyYWRhdGEocF9jbGllbnRfZXh0cmEpOwotICAgICAgICAgICAgICAgIHBfY2xpZW50X2V4dHJhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopICgoKE9NWF9VOCAqKSBwX2NsaWVudF9leHRyYSkgKyBBTElHTihwX2NsaWVudF9leHRyYS0+blNpemUsIDQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGludGVybmFsX2hkcl9pbmZvX2NoYW5nZWRfZmxhZykgewotICAgICAgICAgICAgcHJpbnRfZGVidWdfaGRyX2NvbG9yX2luZm8oJihtX2ludGVybmFsX2hkcl9pbmZvLnNJbmZvKSwgIkludGVybmFsIik7Ci0gICAgICAgICAgICBwcmludF9kZWJ1Z19oZHJfY29sb3JfaW5mbygmKG1fY2xpZW50X2hkcl9pbmZvLnNJbmZvKSwgIkNsaWVudCIpOwotICAgICAgICAgICAgbWVtY3B5KCZtX2NvbG9yX21kYXRhLCAmY29sb3JfbWRhdGEsIHNpemVvZihDb2xvck1ldGFEYXRhKSk7Ci0gICAgICAgICAgICBhdXRvX2xvY2sgbG9jayhtX2hkcl9pbmZvX2NsaWVudF9sb2NrKTsKLSAgICAgICAgICAgIG1fY2hhbmdlX2NsaWVudF9oZHJfaW5mbyA9IHRydWU7Ci0gICAgICAgICAgICBpZighY29sb3JfZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJJbml0aWF0aW5nIFBPUlQgUmVjb25maWcgZHVlIHRvIEhEUiBJbmZvIENoYW5nZSIpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUVRJSW5kZXhDb25maWdEZXNjcmliZUhEUkNvbG9ySW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfUE9SVF9SRUNPTkZJRyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV9lbmFibGVfYW5kcm9pZF9uYXRpdmVfYnVmZmVycykgewotICAgICAgICAgICAgaWYgKHNldF9kaXNwX2NvbG9yX2FzcGVjdHNfb25seSkgewotICAgICAgICAgICAgICAgIHByaW50X2RlYnVnX2hkcl9jb2xvcl9pbmZvX21kYXRhKCZtX2NvbG9yX21kYXRhKTsKLSAgICAgICAgICAgICAgICBzZXRfY29sb3JtZXRhZGF0YV9pbl9oYW5kbGUoJm1fY29sb3JfbWRhdGEsIGJ1Zl9pbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldE1ldGFEYXRhIGZvciBDb2xvciBTcGFjZSA9IDB4JXggKDYwMT0ldSBGUj0ldSA3MDk9JXUpIiwgY29sb3Jfc3BhY2UsIElUVV9SXzYwMSwgSVRVX1JfNjAxX0ZSLCBJVFVfUl83MDkpOwotICAgICAgICAgICAgICAgIHNldF9jb2xvcnNwYWNlX2luX2hhbmRsZShjb2xvcl9zcGFjZSwgYnVmX2luZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotdW5yZWNvZ25pemVkX2V4dHJhZGF0YToKLSAgICBpZiAoY2xpZW50X2V4dHJhZGF0YSAmJiBwX2V4dHJhKSB7Ci0gICAgICAgIHBfYnVmX2hkci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VYVFJBREFUQTsKLSAgICAgICAgYXBwZW5kX3Rlcm1pbmF0b3JfZXh0cmFkYXRhKHBfZXh0cmEpOwotICAgICAgICBpZiAocF9jbGllbnRfZXh0cmEpIHsKLSAgICAgICAgICAgIGFwcGVuZF90ZXJtaW5hdG9yX2V4dHJhZGF0YShwX2NsaWVudF9leHRyYSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHNlY3VyZV9tb2RlICYmIHBfZXh0cmFkYXRhICYmIG1fb3RoZXJfZXh0cmFkYXRhKSB7Ci0gICAgICAgIHN0cnVjdCB2ZGVjX291dHB1dF9mcmFtZWluZm8gICpwdHJfZXh0cmFkYXRhYnVmZiA9IE5VTEw7Ci0gICAgICAgIG1lbWNweShwX2V4dHJhZGF0YSwgbV9vdGhlcl9leHRyYWRhdGEsIGRydl9jdHguZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemUpOwotICAgICAgICBwdHJfZXh0cmFkYXRhYnVmZiA9IChzdHJ1Y3QgdmRlY19vdXRwdXRfZnJhbWVpbmZvICopcF9idWZfaGRyLT5wT3V0cHV0UG9ydFByaXZhdGU7Ci0gICAgICAgIHB0cl9leHRyYWRhdGFidWZmLT5tZXRhZGF0YV9pbmZvLm1ldGFidWZhZGRyID0gKHZvaWQgKilwX2V4dHJhZGF0YTsKLSAgICAgICAgcHRyX2V4dHJhZGF0YWJ1ZmYtPm1ldGFkYXRhX2luZm8uc2l6ZSA9IGRydl9jdHguZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemU7Ci0gICAgICAgIHB0cl9leHRyYWRhdGFidWZmLT5tZXRhZGF0YV9pbmZvLmZkID0gZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5pb24uZmRfaW9uX2RhdGEuZmQ7Ci0gICAgICAgIHB0cl9leHRyYWRhdGFidWZmLT5tZXRhZGF0YV9pbmZvLm9mZnNldCA9IGJ1Zl9pbmRleCAqIGRydl9jdHguZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemU7Ci0gICAgICAgIHB0cl9leHRyYWRhdGFidWZmLT5tZXRhZGF0YV9pbmZvLmJ1ZmZlcl9zaXplID0gZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5zaXplOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLU9NWF9FUlJPUlRZUEUgb214X3ZkZWM6OmVuYWJsZV9leHRyYWRhdGEoT01YX1U2NCByZXF1ZXN0ZWRfZXh0cmFkYXRhLAotICAgICAgICBib29sIGlzX2ludGVybmFsLCBib29sIGVuYWJsZSkKLXsKLSAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIGlmIChtX3N0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGVuYWJsZSBleHRyYWRhdGEgYWxsb3dlZCBpbiBMb2FkZWQgc3RhdGUgb25seSIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247Ci0gICAgfQotICAgIERFQlVHX1BSSU5UX0hJR0goIk5PVEU6IGVuYWJsZV9leHRyYWRhdGE6IGFjdHVhbFsldV0gcmVxdWVzdGVkWyV1XSBlbmFibGVbJWRdLCBpc19pbnRlcm5hbDogJWQiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGludCljbGllbnRfZXh0cmFkYXRhLCAodW5zaWduZWQgaW50KXJlcXVlc3RlZF9leHRyYWRhdGEsIGVuYWJsZSwgaXNfaW50ZXJuYWwpOwotCi0gICAgaWYgKCFpc19pbnRlcm5hbCkgewotICAgICAgICBpZiAoZW5hYmxlKQotICAgICAgICAgICAgY2xpZW50X2V4dHJhZGF0YSB8PSByZXF1ZXN0ZWRfZXh0cmFkYXRhOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjbGllbnRfZXh0cmFkYXRhID0gY2xpZW50X2V4dHJhZGF0YSAmIH5yZXF1ZXN0ZWRfZXh0cmFkYXRhOwotICAgIH0KLQotICAgIGlmIChlbmFibGUpIHsKLSAgICAgICAgaWYgKHJlcXVlc3RlZF9leHRyYWRhdGEgJiBPTVhfSU5URVJMQUNFX0VYVFJBREFUQSkgewotICAgICAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19FWFRSQURBVEE7Ci0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfRVhUUkFEQVRBX0lOVEVSTEFDRV9WSURFTzsKLSAgICAgICAgICAgIGlmIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIHNldCBpbnRlcmxhY2VkIGV4dHJhZGF0YS4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiIFF1YWxpdHkgb2YgaW50ZXJsYWNlZCBjbGlwcyBtaWdodCBiZSBpbXBhY3RlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVxdWVzdGVkX2V4dHJhZGF0YSAmIE9NWF9GUkFNRUlORk9fRVhUUkFEQVRBKSB7Ci0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0VYVFJBREFUQTsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfRlJBTUVfUkFURTsKLSAgICAgICAgICAgIGlmIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIHNldCBmcmFtZXJhdGUgZXh0cmFkYXRhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0VYVFJBREFUQTsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfTlVNX0NPTkNFQUxFRF9NQjsKLSAgICAgICAgICAgIGlmIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIHNldCBjb25jZWFsZWQgTUIgZXh0cmFkYXRhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0VYVFJBREFUQTsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfUkVDT1ZFUllfUE9JTlRfU0VJOwotICAgICAgICAgICAgaWYgKGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJGYWlsZWQgdG8gc2V0IHJlY292ZXJ5IHBvaW50IFNFSSBleHRyYWRhdGEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRVhUUkFEQVRBOwotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX0VYVFJBREFUQV9QQU5TQ0FOX1dJTkRPVzsKLSAgICAgICAgICAgIGlmIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIHNldCBwYW5zY2FuIGV4dHJhZGF0YSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19FWFRSQURBVEE7Ci0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfRVhUUkFEQVRBX0FTUEVDVF9SQVRJTzsKLSAgICAgICAgICAgIGlmIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIHNldCBwYW5zY2FuIGV4dHJhZGF0YSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG91dHB1dF9jYXBhYmlsaXR5ID09IFY0TDJfUElYX0ZNVF9NUEVHMikgewotICAgICAgICAgICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRVhUUkFEQVRBOwotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSAgVjRMMl9NUEVHX1ZJRENfRVhUUkFEQVRBX01QRUcyX1NFUURJU1A7Ci0gICAgICAgICAgICAgICAgaWYgKGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIHNldCBwYW5zY2FuIGV4dHJhZGF0YSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVxdWVzdGVkX2V4dHJhZGF0YSAmIE9NWF9USU1FSU5GT19FWFRSQURBVEEpIHsKLSAgICAgICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRVhUUkFEQVRBOwotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX0VYVFJBREFUQV9USU1FU1RBTVA7Ci0gICAgICAgICAgICBpZiAoaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZhaWxlZCB0byBzZXQgdGltZWluZm8gZXh0cmFkYXRhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzZWN1cmVfbW9kZSAmJiAocmVxdWVzdGVkX2V4dHJhZGF0YSAmIE9NWF9GUkFNRVBBQ0tfRVhUUkFEQVRBKSkgewotICAgICAgICAgICAgaWYgKG91dHB1dF9jYXBhYmlsaXR5ID09IFY0TDJfUElYX0ZNVF9IMjY0KSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiZW5hYmxlIE9NWF9GUkFNRVBBQ0tfRVhUUkFEQVRBIik7Ci0gICAgICAgICAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19FWFRSQURBVEE7Ci0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9ICBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfUzNEX0ZSQU1FX1BBQ0tJTkc7Ci0gICAgICAgICAgICAgICAgaWYgKGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIHNldCBTM0RfRlJBTUVfUEFDS0lORyBleHRyYWRhdGEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIk9NWF9GUkFNRVBBQ0tfRVhUUkFEQVRBIHN1cHBvcnRlZCBmb3IgSDI2NCBvbmx5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcXVlc3RlZF9leHRyYWRhdGEgJiBPTVhfUVBfRVhUUkFEQVRBKSB7Ci0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0VYVFJBREFUQTsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfRlJBTUVfUVA7Ci0gICAgICAgICAgICBpZiAoaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZhaWxlZCB0byBzZXQgUVAgZXh0cmFkYXRhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcXVlc3RlZF9leHRyYWRhdGEgJiBPTVhfQklUU0lORk9fRVhUUkFEQVRBKSB7Ci0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0VYVFJBREFUQTsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfRlJBTUVfQklUU19JTkZPOwotICAgICAgICAgICAgaWYgKGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJGYWlsZWQgdG8gc2V0IGZyYW1lIGJpdHMgaW5mbyBleHRyYWRhdGEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIXNlY3VyZV9tb2RlICYmIChyZXF1ZXN0ZWRfZXh0cmFkYXRhICYgT01YX0VYVE5VU0VSX0VYVFJBREFUQSkpIHsKLSAgICAgICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRVhUUkFEQVRBOwotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX0VYVFJBREFUQV9TVFJFQU1fVVNFUkRBVEE7Ci0gICAgICAgICAgICBpZiAoaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZhaWxlZCB0byBzZXQgc3RyZWFtIHVzZXJkYXRhIGV4dHJhZGF0YSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXF1ZXN0ZWRfZXh0cmFkYXRhICYgT01YX1ZRWklQU0VJX0VYVFJBREFUQSkgewotICAgICAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19FWFRSQURBVEE7Ci0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfRVhUUkFEQVRBX1ZRWklQX1NFSTsKLSAgICAgICAgICAgIGlmIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIHNldCBWUVppcCBTRUkgZXh0cmFkYXRhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0VYVFJBREFUQTsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfRlJBTUVfUVA7Ci0gICAgICAgICAgICBpZiAoaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZhaWxlZCB0byBzZXQgUVAgZXh0cmFkYXRhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcXVlc3RlZF9leHRyYWRhdGEgJiBPTVhfT1VUUFVUQ1JPUF9FWFRSQURBVEEpIHsKLSAgICAgICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRVhUUkFEQVRBOwotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX0VYVFJBREFUQV9PVVRQVVRfQ1JPUDsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRW5hYmxlIG91dHB1dCBjcm9wIGV4dHJhIGRhdGEiKTsKLSAgICAgICAgICAgIGlmIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIHNldCBvdXRwdXQgY3JvcCBleHRyYWRhdGEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVxdWVzdGVkX2V4dHJhZGF0YSAmIE9NWF9ESVNQTEFZX0lORk9fRVhUUkFEQVRBKSB7Ci0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0VYVFJBREFUQTsKLSAgICAgICAgICAgIHN3aXRjaChvdXRwdXRfY2FwYWJpbGl0eSkgewotICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX0gyNjQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfSEVWQzoKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9ICBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfVlVJX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX1ZQODoKLSAgICAgICAgICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9WUDk6Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfVlBYX0NPTE9SU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkRvbid0IHN1cHBvcnQgRGlzcCBpbmZvIGZvciB0aGlzIGNvZGVjIDogJXMiLCBkcnZfY3R4LmtpbmQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZhaWxlZCB0byBzZXQgRGlzcGxheSBpbmZvIGV4dHJhZGF0YSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXF1ZXN0ZWRfZXh0cmFkYXRhICYgT01YX0hEUl9DT0xPUl9JTkZPX0VYVFJBREFUQSkgewotICAgICAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19FWFRSQURBVEE7Ci0gICAgICAgICAgICBpZiAob3V0cHV0X2NhcGFiaWxpdHkgPT0gVjRMMl9QSVhfRk1UX0gyNjQgfHwKLSAgICAgICAgICAgICAgICBvdXRwdXRfY2FwYWJpbGl0eSA9PSBWNEwyX1BJWF9GTVRfSEVWQykgewotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfRElTUExBWV9DT0xPVVJfU0VJOwotICAgICAgICAgICAgICAgIGlmIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZhaWxlZCB0byBzZXQgRGlzcGxheSBDb2xvdXIgU0VJIGV4dHJhZGF0YSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfRVhUUkFEQVRBX0NPTlRFTlRfTElHSFRfTEVWRUxfU0VJOwotICAgICAgICAgICAgICAgIGlmIChpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZhaWxlZCB0byBzZXQgQ29udGVudCBMaWdodCBMZXZlbCBTRUkgZXh0cmFkYXRhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldCA9IGdldF9idWZmZXJfcmVxKCZkcnZfY3R4Lm9wX2J1Zik7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotT01YX1UzMiBvbXhfdmRlYzo6Y291bnRfTUJfaW5fZXh0cmFkYXRhKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpleHRyYSkKLXsKLSAgICBPTVhfVTMyIG51bV9NQiA9IDAsIGJ5dGVfY291bnQgPSAwLCBudW1fTUJfaW5fZnJhbWUgPSAwOwotICAgIE9NWF9VOCAqZGF0YV9wdHIgPSBleHRyYS0+ZGF0YSwgZGF0YSA9IDA7Ci0gICAgd2hpbGUgKGJ5dGVfY291bnQgPCBleHRyYS0+bkRhdGFTaXplKSB7Ci0gICAgICAgIGRhdGEgPSAqZGF0YV9wdHI7Ci0gICAgICAgIHdoaWxlIChkYXRhKSB7Ci0gICAgICAgICAgICBudW1fTUIgKz0gKGRhdGEmMHgwMSk7Ci0gICAgICAgICAgICBkYXRhID4+PSAxOwotICAgICAgICB9Ci0gICAgICAgIGRhdGFfcHRyKys7Ci0gICAgICAgIGJ5dGVfY291bnQrKzsKLSAgICB9Ci0gICAgbnVtX01CX2luX2ZyYW1lID0gKChkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGggKyAxNSkgKgotICAgICAgICAgICAgKGRydl9jdHgudmlkZW9fcmVzb2x1dGlvbi5mcmFtZV9oZWlnaHQgKyAxNSkpID4+IDg7Ci0gICAgcmV0dXJuICgobnVtX01CX2luX2ZyYW1lID4gMCk/KG51bV9NQiAqIDEwMCAvIG51bV9NQl9pbl9mcmFtZSkgOiAwKTsKLX0KLQotdm9pZCBvbXhfdmRlYzo6cHJpbnRfZGVidWdfZXh0cmFkYXRhKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpleHRyYSkKLXsKLSAgICBpZiAoIW1fZGVidWdfZXh0cmFkYXRhIHx8ICFleHRyYSkKLSAgICAgICAgcmV0dXJuOwotCi0KLSAgICBERUJVR19QUklOVF9ISUdIKAotICAgICAgICAgICAgIj09PT09PT09PT09PT09IEV4dHJhIERhdGEgPT09PT09PT09PT09PT1cbiIKLSAgICAgICAgICAgICIgICAgICAgICAgIFNpemU6ICV1XG4iCi0gICAgICAgICAgICAiICAgICAgICBWZXJzaW9uOiAldVxuIgotICAgICAgICAgICAgIiAgICAgIFBvcnRJbmRleDogJXVcbiIKLSAgICAgICAgICAgICIgICAgICAgICAgIFR5cGU6ICV4XG4iCi0gICAgICAgICAgICAiICAgICAgIERhdGFTaXplOiAldSIsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KWV4dHJhLT5uU2l6ZSwgKHVuc2lnbmVkIGludClleHRyYS0+blZlcnNpb24ublZlcnNpb24sCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KWV4dHJhLT5uUG9ydEluZGV4LCBleHRyYS0+ZVR5cGUsICh1bnNpZ25lZCBpbnQpZXh0cmEtPm5EYXRhU2l6ZSk7Ci0KLSAgICBpZiAoZXh0cmEtPmVUeXBlID09IChPTVhfRVhUUkFEQVRBVFlQRSlPTVhfRXh0cmFEYXRhSW50ZXJsYWNlRm9ybWF0KSB7Ci0gICAgICAgIE9NWF9TVFJFQU1JTlRFUkxBQ0VGT1JNQVQgKmludGZtdCA9IChPTVhfU1RSRUFNSU5URVJMQUNFRk9STUFUICopKHZvaWQgKilleHRyYS0+ZGF0YTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgKLSAgICAgICAgICAgICAgICAiLS0tLS0tIEludGVybGFjZSBGb3JtYXQgLS0tLS0tXG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBTaXplOiAldVxuIgotICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgVmVyc2lvbjogJXVcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICBQb3J0SW5kZXg6ICV1XG4iCi0gICAgICAgICAgICAgICAgIiBJcyBJbnRlcmxhY2UgRm9ybWF0OiAlZFxuIgotICAgICAgICAgICAgICAgICIgICBJbnRlcmxhY2UgRm9ybWF0czogJXVcbiIKLSAgICAgICAgICAgICAgICAiPT09PT09PT09PT0gRW5kIG9mIEludGVybGFjZSA9PT09PT09PT09PSIsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClpbnRmbXQtPm5TaXplLCAodW5zaWduZWQgaW50KWludGZtdC0+blZlcnNpb24ublZlcnNpb24sICh1bnNpZ25lZCBpbnQpaW50Zm10LT5uUG9ydEluZGV4LAotICAgICAgICAgICAgICAgIGludGZtdC0+YkludGVybGFjZUZvcm1hdCwgKHVuc2lnbmVkIGludClpbnRmbXQtPm5JbnRlcmxhY2VGb3JtYXRzKTsKLSAgICB9IGVsc2UgaWYgKGV4dHJhLT5lVHlwZSA9PSAoT01YX0VYVFJBREFUQVRZUEUpT01YX0V4dHJhRGF0YUZyYW1lSW5mbykgewotICAgICAgICBPTVhfUUNPTV9FWFRSQURBVEFfRlJBTUVJTkZPICpmbWluZm8gPSAoT01YX1FDT01fRVhUUkFEQVRBX0ZSQU1FSU5GTyAqKSh2b2lkICopZXh0cmEtPmRhdGE7Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgKLSAgICAgICAgICAgICAgICAiLS0tLS0tLS0gRnJhbWUgRm9ybWF0IC0tLS0tLS0tXG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgICBQaWN0dXJlIFR5cGU6ICVkXG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgSW50ZXJsYWNlIFR5cGU6ICVkXG4iCi0gICAgICAgICAgICAgICAgIiBQYW4gU2NhbiBUb3RhbCBGcmFtZSBOdW06ICV1XG4iCi0gICAgICAgICAgICAgICAgIiAgIENvbmNlYWxlZCBNYWNybyBCbG9ja3M6ICV1XG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgUmVjb3ZlcnkgU0VJIEZsYWc6ICV1XG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIGZyYW1lIHJhdGU6ICV1XG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIFRpbWUgU3RhbXA6ICVsbHVcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICBBc3BlY3QgUmF0aW8gWDogJXVcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICBBc3BlY3QgUmF0aW8gWTogJXUiLAotICAgICAgICAgICAgICAgIGZtaW5mby0+ZVBpY1R5cGUsCi0gICAgICAgICAgICAgICAgZm1pbmZvLT5pbnRlcmxhY2VUeXBlLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZm1pbmZvLT5wYW5TY2FuLm51bVdpbmRvd3MsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClmbWluZm8tPm5Db25jZWFsZWRNYWNyb2Jsb2NrcywKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWZtaW5mby0+blJlY292ZXJ5U2VpRmxhZywKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWZtaW5mby0+bkZyYW1lUmF0ZSwKLSAgICAgICAgICAgICAgICBmbWluZm8tPm5UaW1lU3RhbXAsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClmbWluZm8tPmFzcGVjdFJhdGlvLmFzcGVjdFJhdGlvWCwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWZtaW5mby0+YXNwZWN0UmF0aW8uYXNwZWN0UmF0aW9ZKTsKLQotICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBmbWluZm8tPnBhblNjYW4ubnVtV2luZG93czsgaSsrKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKAotICAgICAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgICAgICAgICAgICAgICAgICAiICAgICBQYW4gU2NhbiBGcmFtZSBOdW06ICV1XG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICBSZWN0YW5nbGUgeDogJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIFJlY3RhbmdsZSB5OiAlZFxuIgotICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBSZWN0YW5nbGUgZHg6ICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgIFJlY3RhbmdsZSBkeTogJWQiLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWksICh1bnNpZ25lZCBpbnQpZm1pbmZvLT5wYW5TY2FuLndpbmRvd1tpXS54LCAodW5zaWduZWQgaW50KWZtaW5mby0+cGFuU2Nhbi53aW5kb3dbaV0ueSwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClmbWluZm8tPnBhblNjYW4ud2luZG93W2ldLmR4LCAodW5zaWduZWQgaW50KWZtaW5mby0+cGFuU2Nhbi53aW5kb3dbaV0uZHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiPT09PT09PT09IEVuZCBvZiBGcmFtZSBGb3JtYXQgPT09PT09PT09PSIpOwotICAgIH0gZWxzZSBpZiAoZXh0cmEtPmVUeXBlID09IChPTVhfRVhUUkFEQVRBVFlQRSlPTVhfRXh0cmFEYXRhRnJhbWVQYWNraW5nQXJyYW5nZW1lbnQpIHsKLSAgICAgICAgT01YX1FDT01fRlJBTUVfUEFDS19BUlJBTkdFTUVOVCAqZnJhbWVwYWNrID0gKE9NWF9RQ09NX0ZSQU1FX1BBQ0tfQVJSQU5HRU1FTlQgKikodm9pZCAqKWV4dHJhLT5kYXRhOwotICAgICAgICBERUJVR19QUklOVF9ISUdIKAotICAgICAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0gRnJhbWVwYWNrIEZvcm1hdCAtLS0tLS0tLS0tXG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAldSBcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgY2FuY2VsX2ZsYWc6ICV1IFxuIgotICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJXUgXG4iCi0gICAgICAgICAgICAgICAgIiBxdWluY3VueF9zYW1wbGluZ19mbGFnRm9ybWF0OiAldSBcbiIKLSAgICAgICAgICAgICAgICAiICBjb250ZW50X2ludGVycHJldGF0aW9uX3R5cGU6ICV1IFxuIgotICAgICAgICAgICAgICAgICIgICAgICAgIHNwYXRpYWxfZmxpcHBpbmdfZmxhZzogJXUgXG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICBmcmFtZTBfZmxpcHBlZF9mbGFnOiAldSBcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgIGZpZWxkX3ZpZXdzX2ZsYWc6ICV1IFxuIgotICAgICAgICAgICAgICAgICIgY3VycmVudF9mcmFtZV9pc19mcmFtZTBfZmxhZzogJXUgXG4iCi0gICAgICAgICAgICAgICAgIiAgIGZyYW1lMF9zZWxmX2NvbnRhaW5lZF9mbGFnOiAldSBcbiIKLSAgICAgICAgICAgICAgICAiICAgZnJhbWUxX3NlbGZfY29udGFpbmVkX2ZsYWc6ICV1IFxuIgotICAgICAgICAgICAgICAgICIgICAgICAgZnJhbWUwX2dyaWRfcG9zaXRpb25feDogJXUgXG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICBmcmFtZTBfZ3JpZF9wb3NpdGlvbl95OiAldSBcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgIGZyYW1lMV9ncmlkX3Bvc2l0aW9uX3g6ICV1IFxuIgotICAgICAgICAgICAgICAgICIgICAgICAgZnJhbWUxX2dyaWRfcG9zaXRpb25feTogJXUgXG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICByZXNlcnZlZF9ieXRlOiAldSBcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgcmVwZXRpdGlvbl9wZXJpb2Q6ICV1IFxuIgotICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICBleHRlbnNpb25fZmxhZzogJXUgXG4iCi0gICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PSBFbmQgb2YgRnJhbWVwYWNrID09PT09PT09PT09IiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWZyYW1lcGFjay0+aWQsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClmcmFtZXBhY2stPmNhbmNlbF9mbGFnLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZnJhbWVwYWNrLT50eXBlLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZnJhbWVwYWNrLT5xdWluY3VueF9zYW1wbGluZ19mbGFnLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZnJhbWVwYWNrLT5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClmcmFtZXBhY2stPnNwYXRpYWxfZmxpcHBpbmdfZmxhZywKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWZyYW1lcGFjay0+ZnJhbWUwX2ZsaXBwZWRfZmxhZywKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWZyYW1lcGFjay0+ZmllbGRfdmlld3NfZmxhZywKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWZyYW1lcGFjay0+Y3VycmVudF9mcmFtZV9pc19mcmFtZTBfZmxhZywKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWZyYW1lcGFjay0+ZnJhbWUwX3NlbGZfY29udGFpbmVkX2ZsYWcsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClmcmFtZXBhY2stPmZyYW1lMV9zZWxmX2NvbnRhaW5lZF9mbGFnLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZnJhbWVwYWNrLT5mcmFtZTBfZ3JpZF9wb3NpdGlvbl94LAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZnJhbWVwYWNrLT5mcmFtZTBfZ3JpZF9wb3NpdGlvbl95LAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZnJhbWVwYWNrLT5mcmFtZTFfZ3JpZF9wb3NpdGlvbl94LAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZnJhbWVwYWNrLT5mcmFtZTFfZ3JpZF9wb3NpdGlvbl95LAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZnJhbWVwYWNrLT5yZXNlcnZlZF9ieXRlLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZnJhbWVwYWNrLT5yZXBldGl0aW9uX3BlcmlvZCwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWZyYW1lcGFjay0+ZXh0ZW5zaW9uX2ZsYWcpOwotICAgIH0gZWxzZSBpZiAoZXh0cmEtPmVUeXBlID09IChPTVhfRVhUUkFEQVRBVFlQRSlPTVhfRXh0cmFEYXRhUVApIHsKLSAgICAgICAgT01YX1FDT01fRVhUUkFEQVRBX1FQICogcXAgPSAoT01YX1FDT01fRVhUUkFEQVRBX1FQICopKHZvaWQgKilleHRyYS0+ZGF0YTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgKLSAgICAgICAgICAgICAgICAiLS0tLSBRUCAoRnJhbWUgcXVhbnRpemF0aW9uIHBhcmFtZXRlcikgLS0tLVxuIgotICAgICAgICAgICAgICAgICIgICAgRnJhbWUgUVA6ICV1IFxuIgotICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09IEVuZCBvZiBRUCA9PT09PT09PT09PT09PT09XG4iLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcXAtPm5RUCk7Ci0gICAgfSBlbHNlIGlmIChleHRyYS0+ZVR5cGUgPT0gKE9NWF9FWFRSQURBVEFUWVBFKU9NWF9FeHRyYURhdGFJbnB1dEJpdHNJbmZvKSB7Ci0gICAgICAgIE9NWF9RQ09NX0VYVFJBREFUQV9CSVRTX0lORk8gKiBiaXRzID0gKE9NWF9RQ09NX0VYVFJBREFUQV9CSVRTX0lORk8gKikodm9pZCAqKWV4dHJhLT5kYXRhOwotICAgICAgICBERUJVR19QUklOVF9ISUdIKAotICAgICAgICAgICAgICAgICItLS0tLS0tLS0gSW5wdXQgYml0cyBpbmZvcm1hdGlvbiAtLS0tLS0tLVxuIgotICAgICAgICAgICAgICAgICIgICAgSGVhZGVyIGJpdHM6ICV1IFxuIgotICAgICAgICAgICAgICAgICIgICAgIEZyYW1lIGJpdHM6ICV1IFxuIgotICAgICAgICAgICAgICAgICI9PT09PSBFbmQgb2YgSW5wdXQgYml0cyBpbmZvcm1hdGlvbiA9PT09PVxuIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWJpdHMtPmhlYWRlcl9iaXRzLCAodW5zaWduZWQgaW50KWJpdHMtPmZyYW1lX2JpdHMpOwotICAgIH0gZWxzZSBpZiAoZXh0cmEtPmVUeXBlID09IChPTVhfRVhUUkFEQVRBVFlQRSlPTVhfRXh0cmFEYXRhTVAyVXNlckRhdGEpIHsKLSAgICAgICAgT01YX1FDT01fRVhUUkFEQVRBX1VTRVJEQVRBICp1c2VyZGF0YSA9IChPTVhfUUNPTV9FWFRSQURBVEFfVVNFUkRBVEEgKikodm9pZCAqKWV4dHJhLT5kYXRhOwotICAgICAgICBPTVhfVTggKmRhdGFfcHRyID0gKE9NWF9VOCAqKXVzZXJkYXRhLT5kYXRhOwotICAgICAgICBPTVhfVTMyIHVzZXJkYXRhX3NpemUgPSBleHRyYS0+bkRhdGFTaXplIC0gc2l6ZW9mKHVzZXJkYXRhLT50eXBlKTsKLSAgICAgICAgT01YX1UzMiBpID0gMDsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgKLSAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0gIFVzZXJkYXRhICAtLS0tLS0tLS0tLS0tXG4iCi0gICAgICAgICAgICAgICAgIiAgICBTdHJlYW0gdXNlcmRhdGEgdHlwZTogJXVcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgIHVzZXJkYXRhIHNpemU6ICV1XG4iCi0gICAgICAgICAgICAgICAgIiAgICBTVFJFQU1fVVNFUkRBVEE6IiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXVzZXJkYXRhLT50eXBlLCAodW5zaWduZWQgaW50KXVzZXJkYXRhX3NpemUpOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1c2VyZGF0YV9zaXplOyBpKz00KSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIiAgICAgICAgJXggJXggJXggJXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wdHJbaV0sIGRhdGFfcHRyW2krMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3B0cltpKzJdLCBkYXRhX3B0cltpKzNdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goCi0gICAgICAgICAgICAgICAgIj09PT09PT09PT09IEVuZCBvZiBVc2VyZGF0YSA9PT09PT09PT09PSIpOwotICAgIH0gZWxzZSBpZiAoZXh0cmEtPmVUeXBlID09IChPTVhfRVhUUkFEQVRBVFlQRSlPTVhfRXh0cmFEYXRhVlFaaXBTRUkpIHsKLSAgICAgICAgT01YX1FDT01fRVhUUkFEQVRBX1ZRWklQU0VJICp2cSA9IChPTVhfUUNPTV9FWFRSQURBVEFfVlFaSVBTRUkgKikodm9pZCAqKWV4dHJhLT5kYXRhOwotICAgICAgICBERUJVR19QUklOVF9ISUdIKAotICAgICAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLSAgVlFaaXAgIC0tLS0tLS0tLS0tLS1cbiIKLSAgICAgICAgICAgICAgICAiICAgIFNpemU6ICV1XG4iLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpdnEtPm5TaXplKTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCggIj09PT09PT09PT09IEVuZCBvZiBWUVppcCA9PT09PT09PT09PSIpOwotICAgIH0gZWxzZSBpZiAoZXh0cmEtPmVUeXBlID09IChPTVhfRVhUUkFEQVRBVFlQRSlPTVhfRXh0cmFEYXRhT3V0cHV0Q3JvcEluZm8pIHsKLSAgICAgICAgT01YX1FDT01fT1VUUFVUX0NST1AgKm91dHB1dGNyb3BfaW5mbyA9IChPTVhfUUNPTV9PVVRQVVRfQ1JPUCopKHZvaWQgKilleHRyYS0+ZGF0YTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgKLSAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0gb3V0cHV0IGNyb3AgLS0tLS0tLS0tLVxuIgotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAldSBcbiIKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogJXUgXG4iCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIGRpc3BsYXlfd2lkdGg6ICV1IFxuIgotICAgICAgICAgICAgIiAgICAgICAgICAgICAgIGRpc3BsYXlfaGVpZ2h0OiAldSBcbiIKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJXUgXG4iCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICV1IFxuIgotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgZnJhbWVfbnVtOiAldSBcbiIKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICBiaXRfZGVwdGhfeTogJXUgXG4iCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgYml0X2RlcHRoX2M6ICV1IFxuIgotICAgICAgICAgICAgIiAgICAgdG9wIGZpZWxkOiBtaXNyX2RwYl9sdW1hOiAldSBcbiIKLSAgICAgICAgICAgICIgICB0b3AgZmllbGQ6IG1pc3JfZHBiX2Nocm9tYTogJXUgXG4iCi0gICAgICAgICAgICAiICAgICB0b3AgZmllbGQ6IG1pc3Jfb3BiX2x1bWE6ICV1IFxuIgotICAgICAgICAgICAgIiAgIHRvcCBmaWVsZDogbWlzcl9vcGJfY2hyb21hOiAldSBcbiIKLSAgICAgICAgICAgICIgIGJvdHRvbSBmaWVsZDogbWlzcl9kcGJfbHVtYTogJXUgXG4iCi0gICAgICAgICAgICAiYm90dG9tIGZpZWxkOiBtaXNyX2RwYl9jaHJvbWE6ICV1IFxuIgotICAgICAgICAgICAgIiAgYm90dG9tIGZpZWxkOiBtaXNyX29wYl9sdW1hOiAldSBcbiIKLSAgICAgICAgICAgICJib3R0b20gZmllbGQ6IG1pc3Jfb3BiX2Nocm9tYTogJXUgXG4iCi0gICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09IEVuZCBvZiBvdXRwdXQgY3JvcCA9PT09PT09PT09PSIsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KW91dHB1dGNyb3BfaW5mby0+bGVmdCwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpb3V0cHV0Y3JvcF9pbmZvLT50b3AsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KW91dHB1dGNyb3BfaW5mby0+ZGlzcGxheV93aWR0aCwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpb3V0cHV0Y3JvcF9pbmZvLT5kaXNwbGF5X2hlaWdodCwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpb3V0cHV0Y3JvcF9pbmZvLT53aWR0aCwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpb3V0cHV0Y3JvcF9pbmZvLT5oZWlnaHQsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KW91dHB1dGNyb3BfaW5mby0+ZnJhbWVfbnVtLAotICAgICAgICAgICAgKHVuc2lnbmVkIGludClvdXRwdXRjcm9wX2luZm8tPmJpdF9kZXB0aF95LAotICAgICAgICAgICAgKHVuc2lnbmVkIGludClvdXRwdXRjcm9wX2luZm8tPmJpdF9kZXB0aF9jLAotICAgICAgICAgICAgKHVuc2lnbmVkIGludClvdXRwdXRjcm9wX2luZm8tPm1pc3JfaW5mb1swXS5taXNyX2RwYl9sdW1hLAotICAgICAgICAgICAgKHVuc2lnbmVkIGludClvdXRwdXRjcm9wX2luZm8tPm1pc3JfaW5mb1swXS5taXNyX2RwYl9jaHJvbWEsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KW91dHB1dGNyb3BfaW5mby0+bWlzcl9pbmZvWzBdLm1pc3Jfb3BiX2x1bWEsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KW91dHB1dGNyb3BfaW5mby0+bWlzcl9pbmZvWzBdLm1pc3Jfb3BiX2Nocm9tYSwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpb3V0cHV0Y3JvcF9pbmZvLT5taXNyX2luZm9bMV0ubWlzcl9kcGJfbHVtYSwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpb3V0cHV0Y3JvcF9pbmZvLT5taXNyX2luZm9bMV0ubWlzcl9kcGJfY2hyb21hLAotICAgICAgICAgICAgKHVuc2lnbmVkIGludClvdXRwdXRjcm9wX2luZm8tPm1pc3JfaW5mb1sxXS5taXNyX29wYl9sdW1hLAotICAgICAgICAgICAgKHVuc2lnbmVkIGludClvdXRwdXRjcm9wX2luZm8tPm1pc3JfaW5mb1sxXS5taXNyX29wYl9jaHJvbWEpOwotICAgIH0gZWxzZSBpZiAoZXh0cmEtPmVUeXBlID09IE9NWF9FeHRyYURhdGFOb25lKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIj09PT09PT09PT0gRW5kIG9mIFRlcm1pbmF0b3IgPT09PT09PT09PT0iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9ISUdIKCI9PT09PT09IEVuZCBvZiBEcml2ZXIgRXh0cmFkYXRhID09PT09PT09Iik7Ci0gICAgfQotfQotCi12b2lkIG9teF92ZGVjOjphcHBlbmRfaW50ZXJsYWNlX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEsCi0gICAgICAgIE9NWF9VMzIgaW50ZXJsYWNlZF9mb3JtYXRfdHlwZSkKLXsKLSAgICBPTVhfU1RSRUFNSU5URVJMQUNFRk9STUFUICppbnRlcmxhY2VfZm9ybWF0OwotCi0gICAgaWYgKCEoY2xpZW50X2V4dHJhZGF0YSAmIE9NWF9JTlRFUkxBQ0VfRVhUUkFEQVRBKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghZXh0cmEpIHsKLSAgICAgICBERUJVR19QUklOVF9FUlJPUigiRXJyb3I6IGFwcGVuZF9pbnRlcmxhY2VfZXh0cmFkYXRhIC0gaW52YWxpZCBpbnB1dCIpOwotICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZXh0cmEtPm5TaXplID0gT01YX0lOVEVSTEFDRV9FWFRSQURBVEFfU0laRTsKLSAgICBleHRyYS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgIGV4dHJhLT5uUG9ydEluZGV4ID0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVg7Ci0gICAgZXh0cmEtPmVUeXBlID0gKE9NWF9FWFRSQURBVEFUWVBFKU9NWF9FeHRyYURhdGFJbnRlcmxhY2VGb3JtYXQ7Ci0gICAgZXh0cmEtPm5EYXRhU2l6ZSA9IHNpemVvZihPTVhfU1RSRUFNSU5URVJMQUNFRk9STUFUKTsKLSAgICBpbnRlcmxhY2VfZm9ybWF0ID0gKE9NWF9TVFJFQU1JTlRFUkxBQ0VGT1JNQVQgKikodm9pZCAqKWV4dHJhLT5kYXRhOwotICAgIGludGVybGFjZV9mb3JtYXQtPm5TaXplID0gc2l6ZW9mKE9NWF9TVFJFQU1JTlRFUkxBQ0VGT1JNQVQpOwotICAgIGludGVybGFjZV9mb3JtYXQtPm5WZXJzaW9uLm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICBpbnRlcmxhY2VfZm9ybWF0LT5uUG9ydEluZGV4ID0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVg7Ci0KLSAgICBpZiAoaW50ZXJsYWNlZF9mb3JtYXRfdHlwZSA9PSBNU01fVklEQ19JTlRFUkxBQ0VfRlJBTUVfUFJPR1JFU1NJVkUpIHsKLSAgICAgICAgaW50ZXJsYWNlX2Zvcm1hdC0+YkludGVybGFjZUZvcm1hdCA9IE9NWF9GQUxTRTsKLSAgICAgICAgaW50ZXJsYWNlX2Zvcm1hdC0+bkludGVybGFjZUZvcm1hdHMgPSBPTVhfSW50ZXJsYWNlRnJhbWVQcm9ncmVzc2l2ZTsKLSAgICAgICAgZHJ2X2N0eC5pbnRlcmxhY2UgPSBWREVDX0ludGVybGFjZUZyYW1lUHJvZ3Jlc3NpdmU7Ci0gICAgfSBlbHNlIGlmIChpbnRlcmxhY2VkX2Zvcm1hdF90eXBlID09IE1TTV9WSURDX0lOVEVSTEFDRV9JTlRFUkxFQVZFX0ZSQU1FX1RPUEZJRUxERklSU1QpIHsKLSAgICAgICAgaW50ZXJsYWNlX2Zvcm1hdC0+YkludGVybGFjZUZvcm1hdCA9IE9NWF9UUlVFOwotICAgICAgICBpbnRlcmxhY2VfZm9ybWF0LT5uSW50ZXJsYWNlRm9ybWF0cyA9IE9NWF9JbnRlcmxhY2VJbnRlcmxlYXZlRnJhbWVUb3BGaWVsZEZpcnN0OwotICAgICAgICBkcnZfY3R4LmludGVybGFjZSA9IFZERUNfSW50ZXJsYWNlSW50ZXJsZWF2ZUZyYW1lVG9wRmllbGRGaXJzdDsKLSAgICB9IGVsc2UgaWYgKGludGVybGFjZWRfZm9ybWF0X3R5cGUgPT0gTVNNX1ZJRENfSU5URVJMQUNFX0lOVEVSTEVBVkVfRlJBTUVfQk9UVE9NRklFTERGSVJTVCkgewotICAgICAgICBpbnRlcmxhY2VfZm9ybWF0LT5iSW50ZXJsYWNlRm9ybWF0ID0gT01YX1RSVUU7Ci0gICAgICAgIGludGVybGFjZV9mb3JtYXQtPm5JbnRlcmxhY2VGb3JtYXRzID0gT01YX0ludGVybGFjZUludGVybGVhdmVGcmFtZUJvdHRvbUZpZWxkRmlyc3Q7Ci0gICAgICAgIGRydl9jdHguaW50ZXJsYWNlID0gVkRFQ19JbnRlcmxhY2VJbnRlcmxlYXZlRnJhbWVCb3R0b21GaWVsZEZpcnN0OwotICAgIH0gZWxzZSBpZiAoaW50ZXJsYWNlZF9mb3JtYXRfdHlwZSA9PSBNU01fVklEQ19JTlRFUkxBQ0VfRlJBTUVfVE9QRklFTERGSVJTVCkgewotICAgICAgICBpbnRlcmxhY2VfZm9ybWF0LT5iSW50ZXJsYWNlRm9ybWF0ID0gT01YX1RSVUU7Ci0gICAgICAgIGludGVybGFjZV9mb3JtYXQtPm5JbnRlcmxhY2VGb3JtYXRzID0gT01YX0ludGVybGFjZUZyYW1lVG9wRmllbGRGaXJzdDsKLSAgICAgICAgZHJ2X2N0eC5pbnRlcmxhY2UgPSBWREVDX0ludGVybGFjZUZyYW1lVG9wRmllbGRGaXJzdDsKLSAgICB9IGVsc2UgaWYgKGludGVybGFjZWRfZm9ybWF0X3R5cGUgPT0gTVNNX1ZJRENfSU5URVJMQUNFX0ZSQU1FX0JPVFRPTUZJRUxERklSU1QpIHsKLSAgICAgICAgaW50ZXJsYWNlX2Zvcm1hdC0+YkludGVybGFjZUZvcm1hdCA9IE9NWF9UUlVFOwotICAgICAgICBpbnRlcmxhY2VfZm9ybWF0LT5uSW50ZXJsYWNlRm9ybWF0cyA9IE9NWF9JbnRlcmxhY2VGcmFtZUJvdHRvbUZpZWxkRmlyc3Q7Ci0gICAgICAgIGRydl9jdHguaW50ZXJsYWNlID0gVkRFQ19JbnRlcmxhY2VGcmFtZUJvdHRvbUZpZWxkRmlyc3Q7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy9kZWZhdWx0IGNhc2UgLSBzZXQgdG8gcHJvZ3Jlc3NpdmUKLSAgICAgICAgaW50ZXJsYWNlX2Zvcm1hdC0+YkludGVybGFjZUZvcm1hdCA9IE9NWF9GQUxTRTsKLSAgICAgICAgaW50ZXJsYWNlX2Zvcm1hdC0+bkludGVybGFjZUZvcm1hdHMgPSBPTVhfSW50ZXJsYWNlRnJhbWVQcm9ncmVzc2l2ZTsKLSAgICAgICAgZHJ2X2N0eC5pbnRlcmxhY2UgPSBWREVDX0ludGVybGFjZUZyYW1lUHJvZ3Jlc3NpdmU7Ci0gICAgfQotICAgIHByaW50X2RlYnVnX2V4dHJhZGF0YShleHRyYSk7Ci19Ci0KLXZvaWQgb214X3ZkZWM6OmFwcGVuZF9mcmFtZV9kaW1lbnNpb25fZXh0cmFkYXRhKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpleHRyYSkKLXsKLSAgICBPTVhfUUNPTV9FWFRSQURBVEFfRlJBTUVESU1FTlNJT04gKmZyYW1lX2RpbWVuc2lvbjsKLSAgICBpZiAoIShjbGllbnRfZXh0cmFkYXRhICYgT01YX0ZSQU1FRElNRU5TSU9OX0VYVFJBREFUQSkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBleHRyYS0+blNpemUgPSBPTVhfRlJBTUVESU1FTlNJT05fRVhUUkFEQVRBX1NJWkU7Ci0gICAgZXh0cmEtPm5WZXJzaW9uLm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICBleHRyYS0+blBvcnRJbmRleCA9IE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYOwotICAgIGV4dHJhLT5lVHlwZSA9IChPTVhfRVhUUkFEQVRBVFlQRSlPTVhfRXh0cmFEYXRhRnJhbWVEaW1lbnNpb247Ci0gICAgZXh0cmEtPm5EYXRhU2l6ZSA9IHNpemVvZihPTVhfUUNPTV9FWFRSQURBVEFfRlJBTUVESU1FTlNJT04pOwotICAgIGZyYW1lX2RpbWVuc2lvbiA9IChPTVhfUUNPTV9FWFRSQURBVEFfRlJBTUVESU1FTlNJT04gKikodm9pZCAqKWV4dHJhLT5kYXRhOwotICAgIGZyYW1lX2RpbWVuc2lvbi0+bkRlY1dpZHRoID0gcmVjdGFuZ2xlLm5MZWZ0OwotICAgIGZyYW1lX2RpbWVuc2lvbi0+bkRlY0hlaWdodCA9IHJlY3RhbmdsZS5uVG9wOwotICAgIGZyYW1lX2RpbWVuc2lvbi0+bkFjdHVhbFdpZHRoID0gcmVjdGFuZ2xlLm5XaWR0aDsKLSAgICBmcmFtZV9kaW1lbnNpb24tPm5BY3R1YWxIZWlnaHQgPSByZWN0YW5nbGUubkhlaWdodDsKLX0KLQotdm9pZCBvbXhfdmRlYzo6ZmlsbF9hc3BlY3RfcmF0aW9faW5mbygKLSAgICAgICAgc3RydWN0IHZkZWNfYXNwZWN0cmF0aW9pbmZvICphc3BlY3RfcmF0aW9faW5mbywKLSAgICAgICAgT01YX1FDT01fRVhUUkFEQVRBX0ZSQU1FSU5GTyAqZnJhbWVfaW5mbykKLXsKLSAgICBtX2V4dHJhZGF0YSA9IGZyYW1lX2luZm87Ci0gICAgbV9leHRyYWRhdGEtPmFzcGVjdFJhdGlvLmFzcGVjdFJhdGlvWCA9IGFzcGVjdF9yYXRpb19pbmZvLT5wYXJfd2lkdGg7Ci0gICAgbV9leHRyYWRhdGEtPmFzcGVjdFJhdGlvLmFzcGVjdFJhdGlvWSA9IGFzcGVjdF9yYXRpb19pbmZvLT5wYXJfaGVpZ2h0OwotICAgIERFQlVHX1BSSU5UX0xPVygiYXNwZWN0UmF0aW9YICV1IGFzcGVjdFJhdGlvWSAldSIsICh1bnNpZ25lZCBpbnQpbV9leHRyYWRhdGEtPmFzcGVjdFJhdGlvLmFzcGVjdFJhdGlvWCwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpbV9leHRyYWRhdGEtPmFzcGVjdFJhdGlvLmFzcGVjdFJhdGlvWSk7Ci19Ci0KLXZvaWQgb214X3ZkZWM6OmFwcGVuZF9mcmFtZV9pbmZvX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEsCi0gICAgICAgIE9NWF9VMzIgbnVtX2NvbmNlYWxfbWIsIE9NWF9VMzIgcmVjb3Zlcnlfc2VpX2ZsYWcsIE9NWF9VMzIgcGljdHVyZV90eXBlLCBPTVhfVTMyIGZyYW1lX3JhdGUsCi0gICAgICAgIE9NWF9USUNLUyB0aW1lX3N0YW1wLCBzdHJ1Y3QgbXNtX3ZpZGNfcGFuc2Nhbl93aW5kb3dfcGF5bG9hZCAqcGFuc2Nhbl9wYXlsb2FkLAotICAgICAgICBzdHJ1Y3QgdmRlY19hc3BlY3RyYXRpb2luZm8gKmFzcGVjdF9yYXRpb19pbmZvKQotewotICAgIE9NWF9RQ09NX0VYVFJBREFUQV9GUkFNRUlORk8gKmZyYW1lX2luZm8gPSBOVUxMOwotICAgIHN0cnVjdCBtc21fdmlkY19wYW5zY2FuX3dpbmRvdyAqcGFuc2Nhbl93aW5kb3c7Ci0gICAgaWYgKCEoY2xpZW50X2V4dHJhZGF0YSAmIE9NWF9GUkFNRUlORk9fRVhUUkFEQVRBKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGV4dHJhLT5uU2l6ZSA9IE9NWF9GUkFNRUlORk9fRVhUUkFEQVRBX1NJWkU7Ci0gICAgZXh0cmEtPm5WZXJzaW9uLm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICBleHRyYS0+blBvcnRJbmRleCA9IE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYOwotICAgIGV4dHJhLT5lVHlwZSA9IChPTVhfRVhUUkFEQVRBVFlQRSlPTVhfRXh0cmFEYXRhRnJhbWVJbmZvOwotICAgIGV4dHJhLT5uRGF0YVNpemUgPSBzaXplb2YoT01YX1FDT01fRVhUUkFEQVRBX0ZSQU1FSU5GTyk7Ci0gICAgZnJhbWVfaW5mbyA9IChPTVhfUUNPTV9FWFRSQURBVEFfRlJBTUVJTkZPICopKHZvaWQgKilleHRyYS0+ZGF0YTsKLSAgICBzd2l0Y2ggKHBpY3R1cmVfdHlwZSkgewotICAgICAgICBjYXNlIFBJQ1RVUkVfVFlQRV9JOgotICAgICAgICAgICAgZnJhbWVfaW5mby0+ZVBpY1R5cGUgPSBPTVhfVklERU9fUGljdHVyZVR5cGVJOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUElDVFVSRV9UWVBFX1A6Ci0gICAgICAgICAgICBmcmFtZV9pbmZvLT5lUGljVHlwZSA9IE9NWF9WSURFT19QaWN0dXJlVHlwZVA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQSUNUVVJFX1RZUEVfQjoKLSAgICAgICAgICAgIGZyYW1lX2luZm8tPmVQaWNUeXBlID0gT01YX1ZJREVPX1BpY3R1cmVUeXBlQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZnJhbWVfaW5mby0+ZVBpY1R5cGUgPSAoT01YX1ZJREVPX1BJQ1RVUkVUWVBFKTA7Ci0gICAgfQotICAgIGlmIChkcnZfY3R4LmludGVybGFjZSA9PSBWREVDX0ludGVybGFjZUludGVybGVhdmVGcmFtZVRvcEZpZWxkRmlyc3QpCi0gICAgICAgIGZyYW1lX2luZm8tPmludGVybGFjZVR5cGUgPSBPTVhfUUNPTV9JbnRlcmxhY2VJbnRlcmxlYXZlRnJhbWVUb3BGaWVsZEZpcnN0OwotICAgIGVsc2UgaWYgKGRydl9jdHguaW50ZXJsYWNlID09IFZERUNfSW50ZXJsYWNlSW50ZXJsZWF2ZUZyYW1lQm90dG9tRmllbGRGaXJzdCkKLSAgICAgICAgZnJhbWVfaW5mby0+aW50ZXJsYWNlVHlwZSA9IE9NWF9RQ09NX0ludGVybGFjZUludGVybGVhdmVGcmFtZUJvdHRvbUZpZWxkRmlyc3Q7Ci0gICAgZWxzZSBpZiAoZHJ2X2N0eC5pbnRlcmxhY2UgPT0gVkRFQ19JbnRlcmxhY2VGcmFtZVRvcEZpZWxkRmlyc3QpCi0gICAgICAgIGZyYW1lX2luZm8tPmludGVybGFjZVR5cGUgPSBPTVhfUUNPTV9JbnRlcmxhY2VGcmFtZVRvcEZpZWxkRmlyc3Q7Ci0gICAgZWxzZSBpZiAoZHJ2X2N0eC5pbnRlcmxhY2UgPT0gVkRFQ19JbnRlcmxhY2VGcmFtZUJvdHRvbUZpZWxkRmlyc3QpCi0gICAgICAgIGZyYW1lX2luZm8tPmludGVybGFjZVR5cGUgPSBPTVhfUUNPTV9JbnRlcmxhY2VGcmFtZUJvdHRvbUZpZWxkRmlyc3Q7Ci0gICAgZWxzZQotICAgICAgICBmcmFtZV9pbmZvLT5pbnRlcmxhY2VUeXBlID0gT01YX1FDT01fSW50ZXJsYWNlRnJhbWVQcm9ncmVzc2l2ZTsKLSAgICBtZW1zZXQoJmZyYW1lX2luZm8tPmFzcGVjdFJhdGlvLCAwLCBzaXplb2YoZnJhbWVfaW5mby0+YXNwZWN0UmF0aW8pKTsKLSAgICBmcmFtZV9pbmZvLT5uQ29uY2VhbGVkTWFjcm9ibG9ja3MgPSBudW1fY29uY2VhbF9tYjsKLSAgICBmcmFtZV9pbmZvLT5uUmVjb3ZlcnlTZWlGbGFnID0gcmVjb3Zlcnlfc2VpX2ZsYWc7Ci0gICAgZnJhbWVfaW5mby0+bkZyYW1lUmF0ZSA9IGZyYW1lX3JhdGU7Ci0gICAgZnJhbWVfaW5mby0+blRpbWVTdGFtcCA9IHRpbWVfc3RhbXA7Ci0gICAgZnJhbWVfaW5mby0+cGFuU2Nhbi5udW1XaW5kb3dzID0gMDsKLSAgICBpZiAob3V0cHV0X2NhcGFiaWxpdHkgPT0gVjRMMl9QSVhfRk1UX01QRUcyKSB7Ci0gICAgICAgIGlmIChtX2Rpc3BfaG9yX3NpemUgJiYgbV9kaXNwX3ZlcnRfc2l6ZSkgewotICAgICAgICAgICAgZnJhbWVfaW5mby0+ZGlzcGxheUFzcGVjdFJhdGlvLmRpc3BsYXlIb3Jpem9udGFsU2l6ZSA9IG1fZGlzcF9ob3Jfc2l6ZTsKLSAgICAgICAgICAgIGZyYW1lX2luZm8tPmRpc3BsYXlBc3BlY3RSYXRpby5kaXNwbGF5VmVydGljYWxTaXplID0gbV9kaXNwX3ZlcnRfc2l6ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZyYW1lX2luZm8tPmRpc3BsYXlBc3BlY3RSYXRpby5kaXNwbGF5SG9yaXpvbnRhbFNpemUgPSAwOwotICAgICAgICAgICAgZnJhbWVfaW5mby0+ZGlzcGxheUFzcGVjdFJhdGlvLmRpc3BsYXlWZXJ0aWNhbFNpemUgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBhbnNjYW5fcGF5bG9hZCkgewotICAgICAgICBmcmFtZV9pbmZvLT5wYW5TY2FuLm51bVdpbmRvd3MgPSBwYW5zY2FuX3BheWxvYWQtPm51bV9wYW5zY2FuX3dpbmRvd3M7Ci0gICAgICAgIHBhbnNjYW5fd2luZG93ID0gJnBhbnNjYW5fcGF5bG9hZC0+d25kWzBdOwotICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBmcmFtZV9pbmZvLT5wYW5TY2FuLm51bVdpbmRvd3M7IGkrKykgewotICAgICAgICAgICAgZnJhbWVfaW5mby0+cGFuU2Nhbi53aW5kb3dbaV0ueCA9IHBhbnNjYW5fd2luZG93LT5wYW5zY2FuX3dpbmRvd193aWR0aDsKLSAgICAgICAgICAgIGZyYW1lX2luZm8tPnBhblNjYW4ud2luZG93W2ldLnkgPSBwYW5zY2FuX3dpbmRvdy0+cGFuc2Nhbl93aW5kb3dfaGVpZ2h0OwotICAgICAgICAgICAgZnJhbWVfaW5mby0+cGFuU2Nhbi53aW5kb3dbaV0uZHggPSBwYW5zY2FuX3dpbmRvdy0+cGFuc2Nhbl93aWR0aF9vZmZzZXQ7Ci0gICAgICAgICAgICBmcmFtZV9pbmZvLT5wYW5TY2FuLndpbmRvd1tpXS5keSA9IHBhbnNjYW5fd2luZG93LT5wYW5zY2FuX2hlaWdodF9vZmZzZXQ7Ci0gICAgICAgICAgICBwYW5zY2FuX3dpbmRvdysrOwotICAgICAgICB9Ci0gICAgfQotICAgIGZpbGxfYXNwZWN0X3JhdGlvX2luZm8oYXNwZWN0X3JhdGlvX2luZm8sIGZyYW1lX2luZm8pOwotICAgIHByaW50X2RlYnVnX2V4dHJhZGF0YShleHRyYSk7Ci19Ci0KLXZvaWQgb214X3ZkZWM6OmFwcGVuZF9wb3J0ZGVmX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEpCi17Ci0gICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcG9ydERlZm4gPSBOVUxMOwotICAgIGV4dHJhLT5uU2l6ZSA9IE9NWF9QT1JUREVGX0VYVFJBREFUQV9TSVpFOwotICAgIGV4dHJhLT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgZXh0cmEtPm5Qb3J0SW5kZXggPSBPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWDsKLSAgICBleHRyYS0+ZVR5cGUgPSAoT01YX0VYVFJBREFUQVRZUEUpT01YX0V4dHJhRGF0YVBvcnREZWY7Ci0gICAgZXh0cmEtPm5EYXRhU2l6ZSA9IHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKTsKLSAgICBwb3J0RGVmbiA9IChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopKHZvaWQgKilleHRyYS0+ZGF0YTsKLSAgICAqcG9ydERlZm4gPSBtX3BvcnRfZGVmOwotICAgIERFQlVHX1BSSU5UX0xPVygiYXBwZW5kX3BvcnRkZWZfZXh0cmFkYXRhIGhlaWdodCA9ICV1IHdpZHRoID0gJXUgIgotICAgICAgICAgICAgInN0cmlkZSA9ICV1IHNsaWNlaGVpZ2h0ID0gJXUiLCh1bnNpZ25lZCBpbnQpcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KXBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KXBvcnREZWZuLT5mb3JtYXQudmlkZW8ublN0cmlkZSwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcG9ydERlZm4tPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQpOwotfQotCi12b2lkIG9teF92ZGVjOjphcHBlbmRfb3V0cHV0Y3JvcF9leHRyYWRhdGEoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKmV4dHJhLAotICAgICAgICBzdHJ1Y3QgbXNtX3ZpZGNfb3V0cHV0X2Nyb3BfcGF5bG9hZCAqb3V0cHV0X2Nyb3BfcGF5bG9hZCkgewotICAgIGV4dHJhLT5uU2l6ZSA9IE9NWF9PVVRQVVRDUk9QX0VYVFJBREFUQV9TSVpFOwotICAgIGV4dHJhLT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgZXh0cmEtPm5Qb3J0SW5kZXggPSBPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWDsKLSAgICBleHRyYS0+ZVR5cGUgPSAoT01YX0VYVFJBREFUQVRZUEUpT01YX0V4dHJhRGF0YU91dHB1dENyb3BJbmZvOwotICAgIGV4dHJhLT5uRGF0YVNpemUgPSBzaXplb2YoT01YX1FDT01fT1VUUFVUX0NST1ApOwotICAgIG1lbWNweShleHRyYS0+ZGF0YSwgb3V0cHV0X2Nyb3BfcGF5bG9hZCwgZXh0cmEtPm5EYXRhU2l6ZSk7Ci0KLSAgICBwcmludF9kZWJ1Z19leHRyYWRhdGEoZXh0cmEpOwotfQotCi12b2lkIG9teF92ZGVjOjphcHBlbmRfZnJhbWVwYWNrX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEsCi0gICAgICAgIHN0cnVjdCBtc21fdmlkY19zM2RfZnJhbWVfcGFja2luZ19wYXlsb2FkICpzM2RfZnJhbWVfcGFja2luZ19wYXlsb2FkKQotewotICAgIE9NWF9RQ09NX0ZSQU1FX1BBQ0tfQVJSQU5HRU1FTlQgKmZyYW1lcGFjazsKLSAgICBpZiAoMTggKiBzaXplb2YoT01YX1UzMikgIT0gc2l6ZW9mKHN0cnVjdCBtc21fdmlkY19zM2RfZnJhbWVfcGFja2luZ19wYXlsb2FkKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZnJhbWUgcGFja2luZyBzaXplIG1pc21hdGNoIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZXh0cmEtPm5TaXplID0gT01YX0ZSQU1FUEFDS19FWFRSQURBVEFfU0laRTsKLSAgICBleHRyYS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgIGV4dHJhLT5uUG9ydEluZGV4ID0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVg7Ci0gICAgZXh0cmEtPmVUeXBlID0gKE9NWF9FWFRSQURBVEFUWVBFKU9NWF9FeHRyYURhdGFGcmFtZVBhY2tpbmdBcnJhbmdlbWVudDsKLSAgICBleHRyYS0+bkRhdGFTaXplID0gc2l6ZW9mKE9NWF9RQ09NX0ZSQU1FX1BBQ0tfQVJSQU5HRU1FTlQpOwotICAgIGZyYW1lcGFjayA9IChPTVhfUUNPTV9GUkFNRV9QQUNLX0FSUkFOR0VNRU5UICopKHZvaWQgKilleHRyYS0+ZGF0YTsKLSAgICBmcmFtZXBhY2stPm5TaXplID0gc2l6ZW9mKE9NWF9RQ09NX0ZSQU1FX1BBQ0tfQVJSQU5HRU1FTlQpOwotICAgIGZyYW1lcGFjay0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgIGZyYW1lcGFjay0+blBvcnRJbmRleCA9IE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYOwotICAgIG1lbWNweSgmZnJhbWVwYWNrLT5pZCwgczNkX2ZyYW1lX3BhY2tpbmdfcGF5bG9hZCwKLSAgICAgICAgc2l6ZW9mKHN0cnVjdCBtc21fdmlkY19zM2RfZnJhbWVfcGFja2luZ19wYXlsb2FkKSk7Ci0gICAgbWVtY3B5KCZtX2ZyYW1lX3BhY2tfYXJyYW5nZW1lbnQsIGZyYW1lcGFjaywKLSAgICAgICAgc2l6ZW9mKE9NWF9RQ09NX0ZSQU1FX1BBQ0tfQVJSQU5HRU1FTlQpKTsKLSAgICBwcmludF9kZWJ1Z19leHRyYWRhdGEoZXh0cmEpOwotfQotCi12b2lkIG9teF92ZGVjOjphcHBlbmRfcXBfZXh0cmFkYXRhKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpleHRyYSwKLSAgICAgICAgICAgIHN0cnVjdCBtc21fdmlkY19mcmFtZV9xcF9wYXlsb2FkICpxcF9wYXlsb2FkKQotewotICAgIE9NWF9RQ09NX0VYVFJBREFUQV9RUCAqIHFwID0gTlVMTDsKLSAgICBpZiAoIXFwX3BheWxvYWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlFQIHBheWxvYWQgaXMgTlVMTCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGV4dHJhLT5uU2l6ZSA9IE9NWF9RUF9FWFRSQURBVEFfU0laRTsKLSAgICBleHRyYS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgIGV4dHJhLT5uUG9ydEluZGV4ID0gT01YX0NPUkVfT1VUUFVUX1BPUlRfSU5ERVg7Ci0gICAgZXh0cmEtPmVUeXBlID0gKE9NWF9FWFRSQURBVEFUWVBFKU9NWF9FeHRyYURhdGFRUDsKLSAgICBleHRyYS0+bkRhdGFTaXplID0gc2l6ZW9mKE9NWF9RQ09NX0VYVFJBREFUQV9RUCk7Ci0gICAgcXAgPSAoT01YX1FDT01fRVhUUkFEQVRBX1FQICopKHZvaWQgKilleHRyYS0+ZGF0YTsKLSAgICBxcC0+blFQID0gcXBfcGF5bG9hZC0+ZnJhbWVfcXA7Ci0gICAgcHJpbnRfZGVidWdfZXh0cmFkYXRhKGV4dHJhKTsKLX0KLQotdm9pZCBvbXhfdmRlYzo6YXBwZW5kX2JpdHNpbmZvX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEsCi0gICAgICAgICAgICBzdHJ1Y3QgbXNtX3ZpZGNfZnJhbWVfYml0c19pbmZvX3BheWxvYWQgKmJpdHNfcGF5bG9hZCkKLXsKLSAgICBPTVhfUUNPTV9FWFRSQURBVEFfQklUU19JTkZPICogYml0cyA9IE5VTEw7Ci0gICAgaWYgKCFiaXRzX3BheWxvYWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImJpdHMgaW5mbyBwYXlsb2FkIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBleHRyYS0+blNpemUgPSBPTVhfQklUU0lORk9fRVhUUkFEQVRBX1NJWkU7Ci0gICAgZXh0cmEtPm5WZXJzaW9uLm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICBleHRyYS0+blBvcnRJbmRleCA9IE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYOwotICAgIGV4dHJhLT5lVHlwZSA9IChPTVhfRVhUUkFEQVRBVFlQRSlPTVhfRXh0cmFEYXRhSW5wdXRCaXRzSW5mbzsKLSAgICBleHRyYS0+bkRhdGFTaXplID0gc2l6ZW9mKE9NWF9RQ09NX0VYVFJBREFUQV9CSVRTX0lORk8pOwotICAgIGJpdHMgPSAoT01YX1FDT01fRVhUUkFEQVRBX0JJVFNfSU5GTyopKHZvaWQgKilleHRyYS0+ZGF0YTsKLSAgICBiaXRzLT5mcmFtZV9iaXRzID0gYml0c19wYXlsb2FkLT5mcmFtZV9iaXRzOwotICAgIGJpdHMtPmhlYWRlcl9iaXRzID0gYml0c19wYXlsb2FkLT5oZWFkZXJfYml0czsKLSAgICBwcmludF9kZWJ1Z19leHRyYWRhdGEoZXh0cmEpOwotfQotCi12b2lkIG9teF92ZGVjOjphcHBlbmRfdXNlcl9leHRyYWRhdGEoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKmV4dHJhLAotICAgICAgICAgICAgT01YX09USEVSX0VYVFJBREFUQVRZUEUgKnBfdXNlcikKLXsKLSAgICBpbnQgdXNlcmRhdGFfc2l6ZSA9IDA7Ci0gICAgc3RydWN0IG1zbV92aWRjX3N0cmVhbV91c2VyZGF0YV9wYXlsb2FkICp1c2VyZGF0YV9wYXlsb2FkID0gTlVMTDsKLSAgICB1c2VyZGF0YV9wYXlsb2FkID0KLSAgICAgICAgKHN0cnVjdCBtc21fdmlkY19zdHJlYW1fdXNlcmRhdGFfcGF5bG9hZCAqKSh2b2lkICopcF91c2VyLT5kYXRhOwotICAgIHVzZXJkYXRhX3NpemUgPSBwX3VzZXItPm5EYXRhU2l6ZTsKLSAgICBleHRyYS0+blNpemUgPSBPTVhfVVNFUkRBVEFfRVhUUkFEQVRBX1NJWkUgKyB1c2VyZGF0YV9zaXplOwotICAgIGV4dHJhLT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgZXh0cmEtPm5Qb3J0SW5kZXggPSBPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWDsKLSAgICBleHRyYS0+ZVR5cGUgPSAoT01YX0VYVFJBREFUQVRZUEUpT01YX0V4dHJhRGF0YU1QMlVzZXJEYXRhOwotICAgIGV4dHJhLT5uRGF0YVNpemUgPSB1c2VyZGF0YV9zaXplOwotICAgIGlmIChleHRyYS0+bkRhdGFTaXplICYmIChwX3VzZXItPm5EYXRhU2l6ZSA+PSBleHRyYS0+bkRhdGFTaXplKSkKLSAgICAgICAgbWVtY3B5KGV4dHJhLT5kYXRhLCBwX3VzZXItPmRhdGEsIGV4dHJhLT5uRGF0YVNpemUpOwotICAgIHByaW50X2RlYnVnX2V4dHJhZGF0YShleHRyYSk7Ci19Ci0KLXZvaWQgb214X3ZkZWM6OmFwcGVuZF90ZXJtaW5hdG9yX2V4dHJhZGF0YShPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZXh0cmEpCi17Ci0gICAgaWYgKCFjbGllbnRfZXh0cmFkYXRhKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZXh0cmEtPm5TaXplID0gc2l6ZW9mKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFKTsKLSAgICBleHRyYS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgIGV4dHJhLT5lVHlwZSA9IE9NWF9FeHRyYURhdGFOb25lOwotICAgIGV4dHJhLT5uRGF0YVNpemUgPSAwOwotICAgIGV4dHJhLT5kYXRhWzBdID0gMDsKLQotICAgIHByaW50X2RlYnVnX2V4dHJhZGF0YShleHRyYSk7Ci19Ci0KLXZvaWQgb214X3ZkZWM6OmFwcGVuZF92cXppcF9leHRyYWRhdGEoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKmV4dHJhLAotICAgICAgICBzdHJ1Y3QgbXNtX3ZpZGNfdnF6aXBfc2VpX3BheWxvYWQgKnZxemlwX3BheWxvYWQpCi17Ci0gICAgT01YX1FDT01fRVhUUkFEQVRBX1ZRWklQU0VJICp2cSA9IE5VTEw7Ci0KLSAgICBleHRyYS0+blNpemUgPSBPTVhfVlFaSVBTRUlfRVhUUkFEQVRBX1NJWkUgKyB2cXppcF9wYXlsb2FkLT5zaXplOwotICAgIGV4dHJhLT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgZXh0cmEtPm5Qb3J0SW5kZXggPSBPTVhfQ09SRV9PVVRQVVRfUE9SVF9JTkRFWDsKLSAgICBleHRyYS0+ZVR5cGUgPSAoT01YX0VYVFJBREFUQVRZUEUpT01YX0V4dHJhRGF0YVZRWmlwU0VJOwotICAgIGV4dHJhLT5uRGF0YVNpemUgPSBzaXplb2YoT01YX1FDT01fRVhUUkFEQVRBX1ZRWklQU0VJKSArIHZxemlwX3BheWxvYWQtPnNpemU7Ci0KLSAgICB2cSA9IChPTVhfUUNPTV9FWFRSQURBVEFfVlFaSVBTRUkgKikodm9pZCAqKWV4dHJhLT5kYXRhOwotICAgIHZxLT5uU2l6ZSA9IHZxemlwX3BheWxvYWQtPnNpemU7Ci0gICAgbWVtY3B5KHZxLT5kYXRhLCB2cXppcF9wYXlsb2FkLT5kYXRhLCB2cXppcF9wYXlsb2FkLT5zaXplKTsKLQotICAgIHByaW50X2RlYnVnX2V4dHJhZGF0YShleHRyYSk7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgIG9teF92ZGVjOjphbGxvY2F0ZV9kZXNjX2J1ZmZlcihPTVhfVTMyIGluZGV4KQotewotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgaWYgKGluZGV4ID49IGRydl9jdHguaXBfYnVmLmFjdHVhbGNvdW50KSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjpEZXNjIEJ1ZmZlciBJbmRleCBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICB9Ci0gICAgaWYgKG1fZGVzY19idWZmZXJfcHRyID09IE5VTEwpIHsKLSAgICAgICAgbV9kZXNjX2J1ZmZlcl9wdHIgPSAoZGVzY19idWZmZXJfaGRyKikgXAotICAgICAgICAgICAgICAgICAgICBjYWxsb2MoIChzaXplb2YoZGVzY19idWZmZXJfaGRyKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQpOwotICAgICAgICBpZiAobV9kZXNjX2J1ZmZlcl9wdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIm1fZGVzY19idWZmZXJfcHRyIEFsbG9jYXRpb24gZmFpbGVkICIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fZGVzY19idWZmZXJfcHRyW2luZGV4XS5idWZfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jIChERVNDX0JVRkZFUl9TSVpFICogc2l6ZW9mKE9NWF9VOCkpOwotICAgIGlmIChtX2Rlc2NfYnVmZmVyX3B0cltpbmRleF0uYnVmX2FkZHIgPT0gTlVMTCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZGVzYyBidWZmZXIgQWxsb2NhdGlvbiBmYWlsZWQgIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLXZvaWQgb214X3ZkZWM6Omluc2VydF9kZW11eF9hZGRyX29mZnNldChPTVhfVTMyIGFkZHJlc3Nfb2Zmc2V0KQotewotICAgIERFQlVHX1BSSU5UX0xPVygiSW5zZXJ0aW5nIGFkZHJlc3Mgb2Zmc2V0ICgldSkgYXQgaWR4ICgldSkiLCAodW5zaWduZWQgaW50KWFkZHJlc3Nfb2Zmc2V0LCh1bnNpZ25lZCBpbnQpbV9kZW11eF9lbnRyaWVzKTsKLSAgICBpZiAobV9kZW11eF9lbnRyaWVzIDwgODE5MikgewotICAgICAgICBtX2RlbXV4X29mZnNldHNbbV9kZW11eF9lbnRyaWVzKytdID0gYWRkcmVzc19vZmZzZXQ7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotdm9pZCBvbXhfdmRlYzo6ZXh0cmFjdF9kZW11eF9hZGRyX29mZnNldHMoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1Zl9oZHIpCi17Ci0gICAgT01YX1UzMiBieXRlc190b19wYXJzZSA9IGJ1Zl9oZHItPm5GaWxsZWRMZW47Ci0gICAgT01YX1U4ICpidWYgPSBidWZfaGRyLT5wQnVmZmVyICsgYnVmX2hkci0+bk9mZnNldDsKLSAgICBPTVhfVTMyIGluZGV4ID0gMDsKLQotICAgIG1fZGVtdXhfZW50cmllcyA9IDA7Ci0KLSAgICB3aGlsZSAoaW5kZXggPCBieXRlc190b19wYXJzZSkgewotICAgICAgICBpZiAoICgoYnVmW2luZGV4XSA9PSAweDAwKSAmJiAoYnVmW2luZGV4KzFdID09IDB4MDApICYmCi0gICAgICAgICAgICAgICAgICAgIChidWZbaW5kZXgrMl0gPT0gMHgwMCkgJiYgKGJ1ZltpbmRleCszXSA9PSAweDAxKSkgfHwKLSAgICAgICAgICAgICAgICAoKGJ1ZltpbmRleF0gPT0gMHgwMCkgJiYgKGJ1ZltpbmRleCsxXSA9PSAweDAwKSAmJgotICAgICAgICAgICAgICAgICAoYnVmW2luZGV4KzJdID09IDB4MDEpKSApIHsKLSAgICAgICAgICAgIC8vRm91bmQgc3RhcnQgY29kZSwgaW5zZXJ0IGFkZHJlc3Mgb2Zmc2V0Ci0gICAgICAgICAgICBpbnNlcnRfZGVtdXhfYWRkcl9vZmZzZXQoaW5kZXgpOwotICAgICAgICAgICAgaWYgKGJ1ZltpbmRleCsyXSA9PSAweDAxKSAvLyAzIGJ5dGUgc3RhcnQgY29kZQotICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7Ci0gICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIC8vNCBieXRlIHN0YXJ0IGNvZGUKLSAgICAgICAgICAgICAgICBpbmRleCArPSA0OwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgfQotICAgIERFQlVHX1BSSU5UX0xPVygiRXh0cmFjdGVkICgldSkgZGVtdXggZW50cnkgb2Zmc2V0cyIsICh1bnNpZ25lZCBpbnQpbV9kZW11eF9lbnRyaWVzKTsKLSAgICByZXR1cm47Ci19Ci0KLU9NWF9FUlJPUlRZUEUgb214X3ZkZWM6OmhhbmRsZV9kZW11eF9kYXRhKE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2J1Zl9oZHIpCi17Ci0gICAgLy9maXggdGhpcywgaGFuZGxlIDMgYnl0ZSBzdGFydCBjb2RlLCB2YzEgdGVybWluYXRvciBlbnRyeQotICAgIE9NWF9VOCAqcF9kZW11eF9kYXRhID0gTlVMTDsKLSAgICBPTVhfVTMyIGRlc2NfZGF0YSA9IDA7Ci0gICAgT01YX1UzMiBzdGFydF9hZGRyID0gMDsKLSAgICBPTVhfVTMyIG5hbF9zaXplID0gMDsKLSAgICBPTVhfVTMyIHN1ZmZpeF9ieXRlID0gMDsKLSAgICBPTVhfVTMyIGRlbXV4X2luZGV4ID0gMDsKLSAgICBPTVhfVTMyIGJ1ZmZlcl9pbmRleCA9IDA7Ci0KLSAgICBpZiAobV9kZXNjX2J1ZmZlcl9wdHIgPT0gTlVMTCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigibV9kZXNjX2J1ZmZlcl9wdHIgaXMgTlVMTC4gQ2Fubm90IGFwcGVuZCBkZW11eCBlbnRyaWVzLiIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGJ1ZmZlcl9pbmRleCA9IHBfYnVmX2hkciAtICgoT01YX0JVRkZFUkhFQURFUlRZUEUgKiltX2lucF9tZW1fcHRyKTsKLSAgICBpZiAoYnVmZmVyX2luZGV4ID4gZHJ2X2N0eC5pcF9idWYuYWN0dWFsY291bnQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImhhbmRsZV9kZW11eF9kYXRhOkJ1ZmZlciBpbmRleCBpcyBpbmNvcnJlY3QgKCV1KSIsICh1bnNpZ25lZCBpbnQpYnVmZmVyX2luZGV4KTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBwX2RlbXV4X2RhdGEgPSAoT01YX1U4ICopIG1fZGVzY19idWZmZXJfcHRyW2J1ZmZlcl9pbmRleF0uYnVmX2FkZHI7Ci0KLSAgICBpZiAoICgoT01YX1U4KilwX2RlbXV4X2RhdGEgPT0gTlVMTCkgfHwKLSAgICAgICAgICAgICgobV9kZW11eF9lbnRyaWVzICogMTYpICsgMSkgPiBERVNDX0JVRkZFUl9TSVpFKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnN1ZmZpY2llbnQgYnVmZmVyLiBDYW5ub3QgYXBwZW5kIGRlbXV4IGVudHJpZXMuIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yICg7IGRlbXV4X2luZGV4IDwgbV9kZW11eF9lbnRyaWVzOyBkZW11eF9pbmRleCsrKSB7Ci0gICAgICAgICAgICBkZXNjX2RhdGEgPSAwOwotICAgICAgICAgICAgc3RhcnRfYWRkciA9IG1fZGVtdXhfb2Zmc2V0c1tkZW11eF9pbmRleF07Ci0gICAgICAgICAgICBpZiAocF9idWZfaGRyLT5wQnVmZmVyW21fZGVtdXhfb2Zmc2V0c1tkZW11eF9pbmRleF0gKyAyXSA9PSAweDAxKSB7Ci0gICAgICAgICAgICAgICAgc3VmZml4X2J5dGUgPSBwX2J1Zl9oZHItPnBCdWZmZXJbbV9kZW11eF9vZmZzZXRzW2RlbXV4X2luZGV4XSArIDNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdWZmaXhfYnl0ZSA9IHBfYnVmX2hkci0+cEJ1ZmZlclttX2RlbXV4X29mZnNldHNbZGVtdXhfaW5kZXhdICsgNF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVtdXhfaW5kZXggPCAobV9kZW11eF9lbnRyaWVzIC0gMSkpIHsKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZSA9IG1fZGVtdXhfb2Zmc2V0c1tkZW11eF9pbmRleCArIDFdIC0gbV9kZW11eF9vZmZzZXRzW2RlbXV4X2luZGV4XSAtIDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gcF9idWZfaGRyLT5uRmlsbGVkTGVuIC0gbV9kZW11eF9vZmZzZXRzW2RlbXV4X2luZGV4XSAtIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlN0YXJ0X2FkZHIoMHgleCksIHN1ZmZpeF9ieXRlKDB4JXgpLG5hbF9zaXplKCV1KSxkZW11eF9pbmRleCgldSkiLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXN0YXJ0X2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpc3VmZml4X2J5dGUsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpbmFsX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZGVtdXhfaW5kZXgpOwotICAgICAgICAgICAgZGVzY19kYXRhID0gKHN0YXJ0X2FkZHIgPj4gMykgPDwgMTsKLSAgICAgICAgICAgIGRlc2NfZGF0YSB8PSAoc3RhcnRfYWRkciAmIDcpIDw8IDIxOwotICAgICAgICAgICAgZGVzY19kYXRhIHw9IHN1ZmZpeF9ieXRlIDw8IDI0OwotCi0gICAgICAgICAgICBtZW1jcHkocF9kZW11eF9kYXRhLCAmZGVzY19kYXRhLCBzaXplb2YoT01YX1UzMikpOwotICAgICAgICAgICAgbWVtY3B5KHBfZGVtdXhfZGF0YSArIDQsICZuYWxfc2l6ZSwgc2l6ZW9mKE9NWF9VMzIpKTsKLSAgICAgICAgICAgIG1lbXNldChwX2RlbXV4X2RhdGEgKyA4LCAwLCBzaXplb2YoT01YX1UzMikpOwotICAgICAgICAgICAgbWVtc2V0KHBfZGVtdXhfZGF0YSArIDEyLCAwLCBzaXplb2YoT01YX1UzMikpOwotCi0gICAgICAgICAgICBwX2RlbXV4X2RhdGEgKz0gMTY7Ci0gICAgICAgIH0KLSAgICAgICAgLy9BZGQgemVybyB3b3JkIHRvIGluZGljYXRlIGVuZCBvZiBkZXNjcmlwdG9ycwotICAgICAgICBtZW1zZXQocF9kZW11eF9kYXRhLCAwLCBzaXplb2YoT01YX1UzMikpOwotCi0gICAgICAgIG1fZGVzY19idWZmZXJfcHRyW2J1ZmZlcl9pbmRleF0uZGVzY19kYXRhX3NpemUgPSAobV9kZW11eF9lbnRyaWVzICogMTYpICsgc2l6ZW9mKE9NWF9VMzIpOwotICAgICAgICBERUJVR19QUklOVF9MT1coImRlc2MgdGFibGUgZGF0YSBzaXplPSV1IiwgKHVuc2lnbmVkIGludCltX2Rlc2NfYnVmZmVyX3B0cltidWZmZXJfaW5kZXhdLmRlc2NfZGF0YV9zaXplKTsKLSAgICB9Ci0gICAgbWVtc2V0KG1fZGVtdXhfb2Zmc2V0cywgMCwgKCBzaXplb2YoT01YX1UzMikgKiA4MTkyKSApOwotICAgIG1fZGVtdXhfZW50cmllcyA9IDA7Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJEZW11eCB0YWJsZSBjb21wbGV0ZSEiKTsKLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLX0KLQotb214X3ZkZWM6OmFsbG9jYXRlX2NvbG9yX2NvbnZlcnRfYnVmOjphbGxvY2F0ZV9jb2xvcl9jb252ZXJ0X2J1ZigpCi17Ci0gICAgZW5hYmxlZCA9IGZhbHNlOwotICAgIG9teCA9IE5VTEw7Ci0gICAgaW5pdF9tZW1iZXJzKCk7Ci0gICAgQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0TWF4OwotICAgIGRlc3RfZm9ybWF0ID0gWUNiQ3I0MjBQOwotICAgIG1fYzJkX3dpZHRoID0gMDsKLSAgICBtX2MyZF9oZWlnaHQgPSAwOwotCi0gICAgbU1hcE91dHB1dDJEcml2ZXJDb2xvckZvcm1hdFtWREVDX1lVVl9GT1JNQVRfTlYxMl1bLTFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybTsKLSAgICBtTWFwT3V0cHV0MkRyaXZlckNvbG9yRm9ybWF0W1ZERUNfWVVWX0ZPUk1BVF9OVjEyXVtWREVDX0NPREVDVFlQRV9NVkNdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybU11bHRpVmlldzsKLSAgICBtTWFwT3V0cHV0MkRyaXZlckNvbG9yRm9ybWF0W1ZERUNfWVVWX0ZPUk1BVF9OVjEyX1VCV0NdWy0xXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm1Db21wcmVzc2VkOwotICAgIG1NYXBPdXRwdXQyRHJpdmVyQ29sb3JGb3JtYXRbVkRFQ19ZVVZfRk9STUFUX05WMTJfVFAxMF9VQldDXVstMV0gPQotICAgICAgICAgICAgICAgICAgICAgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtMTBiaXRDb21wcmVzc2VkOwotCi0gICAgbU1hcE91dHB1dDJDb252ZXJ0Lmluc2VydCggewotICAgICAgICAgICAge1ZERUNfWVVWX0ZPUk1BVF9OVjEyLCBOVjEyXzEyOG19LAotICAgICAgICAgICAge1ZERUNfWVVWX0ZPUk1BVF9OVjEyX1VCV0MsIE5WMTJfVUJXQ30sCi0gICAgICAgICAgICB7VkRFQ19ZVVZfRk9STUFUX05WMTJfVFAxMF9VQldDLCBOVjEyX1RQMTB9LAotICAgICAgICB9KTsKLX0KLQotdm9pZCBvbXhfdmRlYzo6YWxsb2NhdGVfY29sb3JfY29udmVydF9idWY6OnNldF92ZGVjX2NsaWVudCh2b2lkICpjbGllbnQpCi17Ci0gICAgb214ID0gcmVpbnRlcnByZXRfY2FzdDxvbXhfdmRlYyo+KGNsaWVudCk7Ci19Ci0KLXZvaWQgb214X3ZkZWM6OmFsbG9jYXRlX2NvbG9yX2NvbnZlcnRfYnVmOjppbml0X21lbWJlcnMoKQotewotICAgIGFsbG9jYXRlZF9jb3VudCA9IDA7Ci0gICAgYnVmZmVyX3NpemVfcmVxID0gMDsKLSAgICBidWZmZXJfYWxpZ25tZW50X3JlcSA9IDA7Ci0gICAgbV9jMmRfd2lkdGggPSBtX2MyZF9oZWlnaHQgPSAwOwotICAgIG1lbXNldChtX3BsYXRmb3JtX2xpc3RfY2xpZW50LDAsc2l6ZW9mKG1fcGxhdGZvcm1fbGlzdF9jbGllbnQpKTsKLSAgICBtZW1zZXQobV9wbGF0Zm9ybV9lbnRyeV9jbGllbnQsMCxzaXplb2YobV9wbGF0Zm9ybV9lbnRyeV9jbGllbnQpKTsKLSAgICBtZW1zZXQobV9wbWVtX2luZm9fY2xpZW50LDAsc2l6ZW9mKG1fcG1lbV9pbmZvX2NsaWVudCkpOwotICAgIG1lbXNldChtX291dF9tZW1fcHRyX2NsaWVudCwwLHNpemVvZihtX291dF9tZW1fcHRyX2NsaWVudCkpOwotI2lmZGVmIFVTRV9JT04KLSAgICBtZW1zZXQob3BfYnVmX2lvbl9pbmZvLDAsc2l6ZW9mKG1fcGxhdGZvcm1fZW50cnlfY2xpZW50KSk7Ci0jZW5kaWYKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT1VOVDsgaSsrKQotICAgICAgICBwbWVtX2ZkW2ldID0gLTE7Ci19Ci0KLWJvb2wgb214X3ZkZWM6OmFsbG9jYXRlX2NvbG9yX2NvbnZlcnRfYnVmOjp1cGRhdGVfYnVmZmVyX3JlcSgpCi17Ci0gICAgYm9vbCBzdGF0dXMgPSB0cnVlOwotICAgIHVuc2lnbmVkIGludCBzcmNfc2l6ZSA9IDAsIGRlc3RpbmF0aW9uX3NpemUgPSAwOwotICAgIHVuc2lnbmVkIGludCBoZWlnaHQsIHdpZHRoOwotICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7Ci0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZHJ2X2NvbG9yX2Zvcm1hdDsKLQotICAgIGlmICghb214KSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIGNsaWVudCBpbiBjb2xvciBjb252ZXJ0Iik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFlbmFibGVkKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIk5vIGNvbG9yIGNvbnZlcnNpb24gcmVxdWlyZWQiKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmb214LT5jX2xvY2spOwotCi0gICAgQ29sb3JTdWJNYXBwaW5nOjpjb25zdF9pdGVyYXRvcgotICAgICAgICBmb3VuZCA9ICBtTWFwT3V0cHV0MkNvbnZlcnQuZmluZChvbXgtPmRydl9jdHgub3V0cHV0X2Zvcm1hdCk7Ci0gICAgaWYgKGZvdW5kID09IG1NYXBPdXRwdXQyQ29udmVydC5lbmQoKSkgewotICAgICAgICBERUJVR19QUklOVF9ISUdIKCIlczogQ291bGQgbm90IGZpbmQgdGhlIGNvbG9yIGNvbnZlcnNpb24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICJtYXBwaW5nIGZvciAlI1guIFNldHRpbmcgdG8gZGVmYXVsdCBOVjEyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgb214LT5kcnZfY3R4Lm91dHB1dF9mb3JtYXQpOwotICAgICAgICBzcmNfZm9ybWF0ID0gTlYxMl8xMjhtOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNyY19mb3JtYXQgPSAoQ29sb3JDb252ZXJ0Rm9ybWF0KSBmb3VuZC0+c2Vjb25kOzsKLSAgICB9Ci0KLSAgICBtZW1zZXQoJmZtdCwgMHgwLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSk7Ci0gICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gb214LT5jYXB0dXJlX2NhcGFiaWxpdHk7Ci0gICAgaW9jdGwob214LT5kcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmZm10KTsKLSAgICB3aWR0aCA9IGZtdC5mbXQucGl4X21wLndpZHRoOwotICAgIGhlaWdodCA9ICBmbXQuZm10LnBpeF9tcC5oZWlnaHQ7Ci0KLSAgICBib29sIHJlc29sdXRpb25fdXBncmFkZSA9IChoZWlnaHQgPiBtX2MyZF9oZWlnaHQgfHwKLSAgICAgICAgICAgIHdpZHRoID4gbV9jMmRfd2lkdGgpOwotICAgIGJvb2wgaXNfaW50ZXJsYWNlZCA9IG9teC0+ZHJ2X2N0eC5pbnRlcmxhY2UgIT0gVkRFQ19JbnRlcmxhY2VGcmFtZVByb2dyZXNzaXZlOwotICAgIGlmIChyZXNvbHV0aW9uX3VwZ3JhZGUpIHsKLSAgICAgICAgLy8gcmVzb2x1dGlvbiB1cGdyYWRlZCA/IGVuc3VyZSB3ZSBhcmUgeWV0IHRvIGFsbG9jYXRlOwotICAgICAgICAvLyBmYWlsaW5nIHdoaWNoLCBjMmQgYnVmZmVycyB3aWxsIG5ldmVyIGJlIHJlYWxsb2NhdGVkIGFuZCBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuCi0gICAgICAgIGlmIChhbGxvY2F0ZWRfY291bnQgPiAwKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiQ2Fubm90IGNoYW5nZSBDMkQgYnVmZmVyIHJlcXVpcmVtZW50cyB3aXRoICVkIGFjdGl2ZSBhbGxvY2F0aW9ucyIsCi0gICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZF9jb3VudCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzdGF0dXMgIT0gZmFsc2UpIHsKLSAgICAgICAgaWYgKG9teC0+ZHJ2X2N0eC5vdXRwdXRfZm9ybWF0ICE9IFZERUNfWVVWX0ZPUk1BVF9OVjEyICYmCi0gICAgICAgICAgICBDb2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigidXBkYXRlX2J1ZmZlcl9yZXE6IFVuc3VwcG9ydGVkIGNvbG9yIGNvbnZlcnNpb24iKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ29sb3JTdWJNYXBwaW5nOjpjb25zdF9pdGVyYXRvcgotICAgICAgICAgICAgICAgIGZvdW5kID0gIG1NYXBPdXRwdXQyQ29udmVydC5maW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teC0+ZHJ2X2N0eC5vdXRwdXRfZm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChmb3VuZCA9PSBtTWFwT3V0cHV0MkNvbnZlcnQuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBzcmNfZm9ybWF0ID0gTlYxMl8xMjhtOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcmNfZm9ybWF0ID0gKENvbG9yQ29udmVydEZvcm1hdCkgZm91bmQtPnNlY29uZDs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0lORk8oIkMyRDogU2V0IFJlc29sdXRpb24sIEludGVybGFjZSglZCkgQ29udmVydGlvbiglI1ggLT4gJSNYKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzcmMoJWRYJWQpIGRlc3QoJWRYJWQpIiwgb214LT5kcnZfY3R4LmludGVybGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2Zvcm1hdCwgZGVzdF9mb3JtYXQsIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXgtPmRydl9jdHguaW50ZXJsYWNlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkRFQ19JbnRlcmxhY2VGcmFtZVByb2dyZXNzaXZlPyhoZWlnaHQrMSkvMiA6IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBjMmRjYy5zZXRSZXNvbHV0aW9uKHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXgtPmRydl9jdHguaW50ZXJsYWNlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZERUNfSW50ZXJsYWNlRnJhbWVQcm9ncmVzc2l2ZT8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlaWdodCsxKS8yIDogaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZm9ybWF0LCBkZXN0X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBzcmNfc2l6ZSA9IGMyZGNjLmdldEJ1ZmZTaXplKEMyRF9JTlBVVCk7Ci0gICAgICAgICAgICAgICAgZGVzdGluYXRpb25fc2l6ZSA9IGMyZGNjLmdldEJ1ZmZTaXplKEMyRF9PVVRQVVQpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFzcmNfc2l6ZSB8fCBzcmNfc2l6ZSA+IG9teC0+ZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUgfHwKLSAgICAgICAgICAgICAgICAgICAgIWRlc3RpbmF0aW9uX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTaXplIG1pc21hdGNoIGluIEMyRCBzcmNfc2l6ZSAlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRyaXZlciBzaXplICV1IGRlc3RpbmF0aW9uIHNpemUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2l6ZSwgKHVuc2lnbmVkIGludClvbXgtPmRydl9jdHgub3BfYnVmLmJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemVfcmVxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aGlzIGZhdGFsLiBEcml2ZXIgaXMgbm90IHN1cHBvc2VkIHRvIHF1b3RlIHNpemUKLSAgICAgICAgICAgICAgICAgICAgLy8gIHNtYWxsZXIgdGhhbiB3aGF0IEMyRCBuZWVkcyAhIQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplX3JlcSA9IGRlc3RpbmF0aW9uX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1fYzJkX2hlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgbV9jMmRfd2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm9teC0+Y19sb2NrKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1ib29sIG9teF92ZGVjOjphbGxvY2F0ZV9jb2xvcl9jb252ZXJ0X2J1Zjo6c2V0X2NvbG9yX2Zvcm1hdCgKLSAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZGVzdF9jb2xvcl9mb3JtYXQpCi17Ci0gICAgYm9vbCBzdGF0dXMgPSB0cnVlLCBkcnZfY29sb3Jmb3JtYXRfYzJkX2VuYWJsZSA9IGZhbHNlOwotICAgIGJvb2wgZGVzdF9jb2xvcl9mb3JtYXRfYzJkX2VuYWJsZSA9IGZhbHNlOwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGRydl9jb2xvcl9mb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOwotICAgIGlmICghb214KSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIGNsaWVudCBpbiBjb2xvciBjb252ZXJ0Iik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZvbXgtPmNfbG9jayk7Ci0gICAgc3RhdHVzID0gZ2V0X2NvbG9yX2Zvcm1hdCAoZHJ2X2NvbG9yX2Zvcm1hdCk7Ci0KLSAgICBkcnZfY29sb3Jmb3JtYXRfYzJkX2VuYWJsZSA9IChkcnZfY29sb3JfZm9ybWF0ICE9IGRlc3RfY29sb3JfZm9ybWF0KSAmJgotICAgICAgICAoZHJ2X2NvbG9yX2Zvcm1hdCAhPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpCi0gICAgICAgICAgICAgICAgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtTXVsdGlWaWV3KSAmJgotICAgICAgICAoZHJ2X2NvbG9yX2Zvcm1hdCAhPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpCi0gICAgICAgICAgICAgICAgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtMTBiaXRDb21wcmVzc2VkKTsKLQotICAgIGRlc3RfY29sb3JfZm9ybWF0X2MyZF9lbmFibGUgPSAoZGVzdF9jb2xvcl9mb3JtYXQgIT0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKQotICAgICAgICAgICAgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtQ29tcHJlc3NlZCkgJiYKLSAgICAgICAgICAgIChkZXN0X2NvbG9yX2Zvcm1hdCAhPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpCi0gICAgICAgICAgICAgICAgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtMTBiaXRDb21wcmVzc2VkKTsKLQotICAgIGlmIChzdGF0dXMgJiYgZHJ2X2NvbG9yZm9ybWF0X2MyZF9lbmFibGUgJiYgZGVzdF9jb2xvcl9mb3JtYXRfYzJkX2VuYWJsZSkgewotICAgICAgICBERUJVR19QUklOVF9MT1coIkVuYWJsaW5nIEMyRCIpOwotICAgICAgICBpZiAoZGVzdF9jb2xvcl9mb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciB8fAotICAgICAgICAgICAgZGVzdF9jb2xvcl9mb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgKSB7Ci0gICAgICAgICAgICBDb2xvckZvcm1hdCA9IGRlc3RfY29sb3JfZm9ybWF0OwotICAgICAgICAgICAgZGVzdF9mb3JtYXQgPSBkZXN0X2NvbG9yX2Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyPyBZQ2JDcjQyMFA6IFlDYkNyNDIwU1A7Ci0gICAgICAgICAgICBlbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJVbnN1cHBvcnRlZCBvdXRwdXQgY29sb3IgZm9ybWF0IGZvciBjMmQgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2NvbG9yX2Zvcm1hdCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVuYWJsZWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm9teC0+Y19sb2NrKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1PTVhfQlVGRkVSSEVBREVSVFlQRSogb214X3ZkZWM6OmFsbG9jYXRlX2NvbG9yX2NvbnZlcnRfYnVmOjpnZXRfaWxfYnVmX2hkcigpCi17Ci0gICAgaWYgKCFvbXgpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgcGFyYW0gZ2V0X2J1Zl9oZHIiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghZW5hYmxlZCkKLSAgICAgICAgcmV0dXJuIG9teC0+bV9vdXRfbWVtX3B0cjsKLSAgICByZXR1cm4gbV9vdXRfbWVtX3B0cl9jbGllbnQ7Ci19Ci0KLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogb214X3ZkZWM6OmFsbG9jYXRlX2NvbG9yX2NvbnZlcnRfYnVmOjpnZXRfaWxfYnVmX2hkcgotKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZhZGQpCi17Ci0gICAgaWYgKCFvbXgpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgcGFyYW0gZ2V0X2J1Zl9oZHIiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghZW5hYmxlZCkKLSAgICAgICAgcmV0dXJuIGJ1ZmFkZDsKLQotICAgIHVuc2lnbmVkIGluZGV4ID0gMDsKLSAgICBpbmRleCA9IGJ1ZmFkZCAtIG9teC0+bV9vdXRfbWVtX3B0cjsKLSAgICBpZiAoaW5kZXggPCBvbXgtPmRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50KSB7Ci0gICAgICAgIG1fb3V0X21lbV9wdHJfY2xpZW50W2luZGV4XS5uRmxhZ3MgPSAoYnVmYWRkLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpOwotICAgICAgICBtX291dF9tZW1fcHRyX2NsaWVudFtpbmRleF0ublRpbWVTdGFtcCA9IGJ1ZmFkZC0+blRpbWVTdGFtcDsKLSAgICAgICAgYm9vbCBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFvbXgtPmluX3JlY29uZmlnICYmICFvbXgtPm91dHB1dF9mbHVzaF9wcm9ncmVzcyAmJiBidWZhZGQtPm5GaWxsZWRMZW4pIHsKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmb214LT5jX2xvY2spOwotICAgICAgICAgICAgY2FjaGVfY2xlYW5fYnVmZmVyKGluZGV4KTsKLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfSU5GTygiQzJEOiBTdGFydCBjb2xvciBjb252ZXJ0aW9uIik7Ci0gICAgICAgICAgICBzdGF0dXMgPSBjMmRjYy5jb252ZXJ0QzJEKG9teC0+ZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW2luZGV4XS5wbWVtX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXgtPm1fb3V0X21lbV9wdHItPnBCdWZmZXIsIGJ1ZmFkZC0+cEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lbV9mZFtpbmRleF0sIHBtZW1fYmFzZWFkZHJlc3NbaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWVtX2Jhc2VhZGRyZXNzW2luZGV4XSk7Ci0KLSAgICAgICAgICAgIGlmICghc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCBjb2xvciBjb252ZXJzaW9uICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBtX291dF9tZW1fcHRyX2NsaWVudFtpbmRleF0ubkZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm9teC0+Y19sb2NrKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gJm1fb3V0X21lbV9wdHJfY2xpZW50W2luZGV4XTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICAgICAgYzJkY2MuZ2V0QnVmZkZpbGxlZExlbihDMkRfT1VUUFVULCBmaWxsZWRMZW4pOwotICAgICAgICAgICAgICAgIG1fb3V0X21lbV9wdHJfY2xpZW50W2luZGV4XS5uRmlsbGVkTGVuID0gZmlsbGVkTGVuOwotICAgICAgICAgICAgICAgIGNhY2hlX2NsZWFuX2ludmFsaWRhdGVfYnVmZmVyKGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZvbXgtPmNfbG9jayk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbV9vdXRfbWVtX3B0cl9jbGllbnRbaW5kZXhdLm5GaWxsZWRMZW4gPSAwOwotICAgICAgICByZXR1cm4gJm1fb3V0X21lbV9wdHJfY2xpZW50W2luZGV4XTsKLSAgICB9Ci0gICAgREVCVUdfUFJJTlRfRVJST1IoIkluZGV4IG1lc3NlZCB1cCBpbiB0aGUgZ2V0X2lsX2J1Zl9oZHIiKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBvbXhfdmRlYzo6YWxsb2NhdGVfY29sb3JfY29udmVydF9idWY6OmdldF9kcl9idWZfaGRyCi0oT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmFkZCkKLXsKLSAgICBpZiAoIW9teCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSW52YWxpZCBwYXJhbSBnZXRfYnVmX2hkciIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFlbmFibGVkKQotICAgICAgICByZXR1cm4gYnVmYWRkOwotICAgIHVuc2lnbmVkIGluZGV4ID0gMDsKLSAgICBpbmRleCA9IGJ1ZmFkZCAtIG1fb3V0X21lbV9wdHJfY2xpZW50OwotICAgIGlmIChpbmRleCA8IG9teC0+ZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpIHsKLSAgICAgICAgcmV0dXJuICZvbXgtPm1fb3V0X21lbV9wdHJbaW5kZXhdOwotICAgIH0KLSAgICBERUJVR19QUklOVF9FUlJPUigiSW5kZXggbWVzc2VkIHVwIGluIHRoZSBnZXRfZHJfYnVmX2hkciIpOwotICAgIHJldHVybiBOVUxMOwotfQotICAgIGJvb2wgb214X3ZkZWM6OmFsbG9jYXRlX2NvbG9yX2NvbnZlcnRfYnVmOjpnZXRfYnVmZmVyX3JlcQotKHVuc2lnbmVkIGludCAmYnVmZmVyX3NpemUpCi17Ci0gICAgYm9vbCBzdGF0dXMgPSB0cnVlOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmb214LT5jX2xvY2spOwotICAgIGlmICghZW5hYmxlZCkKLSAgICAgICAgYnVmZmVyX3NpemUgPSBvbXgtPmRydl9jdHgub3BfYnVmLmJ1ZmZlcl9zaXplOwotICAgIGVsc2UgewotICAgICAgICBidWZmZXJfc2l6ZSA9IGMyZGNjLmdldEJ1ZmZTaXplKEMyRF9PVVRQVVQpOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmb214LT5jX2xvY2spOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgb214X3ZkZWM6OmFsbG9jYXRlX2NvbG9yX2NvbnZlcnRfYnVmOjpzZXRfYnVmZmVyX3JlcSgKLSAgICAgICAgT01YX1UzMiBidWZmZXJfc2l6ZSwgT01YX1UzMiBhY3R1YWxfY291bnQpIHsKLSAgICBPTVhfVTMyIGV4cGVjdGVkU2l6ZSA9IGVuYWJsZWQgPyBidWZmZXJfc2l6ZV9yZXEgOiBvbXgtPmRydl9jdHgub3BfYnVmLmJ1ZmZlcl9zaXplOwotCi0gICAgaWYgKGJ1ZmZlcl9zaXplIDwgZXhwZWN0ZWRTaXplKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJPUCBSZXF1aXJlbWVudHM6IENsaWVudCBzaXplKCV1KSBpbnN1ZmZpY2llbnQgdi9zIHJlcXVlc3RlZCgldSkiLAotICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplLCBleHBlY3RlZFNpemUpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICBpZiAoYWN0dWFsX2NvdW50IDwgb214LT5kcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiT1AgUmVxdWlyZW1lbnRzOiBDbGllbnQgY291bnQoJXUpIGluc3VmZmljaWVudCB2L3MgcmVxdWVzdGVkKCV1KSIsCi0gICAgICAgICAgICAgICAgYWN0dWFsX2NvdW50LCBvbXgtPmRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50KTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAvLyBkaXNhbGxvdyBjaGFuZ2luZyBidWZmZXIgc2l6ZS9jb3VudCB3aGlsZSB3ZSBoYXZlIGFjdGl2ZSBhbGxvY2F0ZWQgYnVmZmVycwotICAgICAgICBpZiAoYWxsb2NhdGVkX2NvdW50ID4gMCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkNhbm5vdCBjaGFuZ2UgQzJEIGJ1ZmZlciBzaXplIGZyb20gJXUgdG8gJXUgd2l0aCAlZCBhY3RpdmUgYWxsb2NhdGlvbnMiLAotICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZV9yZXEsIGJ1ZmZlcl9zaXplLCBhbGxvY2F0ZWRfY291bnQpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlcl9zaXplX3JlcSA9IGJ1ZmZlcl9zaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChidWZmZXJfc2l6ZSA+IG9teC0+ZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUpIHsKLSAgICAgICAgICAgIG9teC0+ZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChhY3R1YWxfY291bnQgPiBvbXgtPmRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50KSB7Ci0gICAgICAgIG9teC0+ZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQgPSBhY3R1YWxfY291bnQ7Ci0gICAgfQotCi0gICAgb214LT5kcnZfY3R4LmV4dHJhZGF0YV9pbmZvLmNvdW50ID0gb214LT5kcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudDsKLSAgICBvbXgtPmRydl9jdHguZXh0cmFkYXRhX2luZm8uc2l6ZSA9IG9teC0+ZHJ2X2N0eC5leHRyYWRhdGFfaW5mby5jb3VudCAqCi0gICAgICAgICAgICBvbXgtPmRydl9jdHguZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemU7Ci0gICAgcmV0dXJuIG9teC0+c2V0X2J1ZmZlcl9yZXEoJihvbXgtPmRydl9jdHgub3BfYnVmKSk7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgb214X3ZkZWM6OmFsbG9jYXRlX2NvbG9yX2NvbnZlcnRfYnVmOjpmcmVlX291dHB1dF9idWZmZXIoCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZoZHIpCi17Ci0gICAgdW5zaWduZWQgaW50IGluZGV4ID0gMDsKLQotICAgIGlmICghZW5hYmxlZCkKLSAgICAgICAgcmV0dXJuIG9teC0+ZnJlZV9vdXRwdXRfYnVmZmVyKGJ1Zmhkcik7Ci0gICAgaWYgKGVuYWJsZWQgJiYgb214LT5pc19jb21wb25lbnRfc2VjdXJlKCkpCi0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIGlmICghYWxsb2NhdGVkX2NvdW50IHx8ICFidWZoZHIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkNvbG9yIGNvbnZlcnQgbm8gYnVmZmVyIHRvIGJlIGZyZWVkICVwIixidWZoZHIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICBpbmRleCA9IGJ1ZmhkciAtIG1fb3V0X21lbV9wdHJfY2xpZW50OwotICAgIGlmIChpbmRleCA+PSBvbXgtPmRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50KSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbmNvcnJlY3QgaW5kZXggY29sb3IgY29udmVydCBmcmVlX291dHB1dF9idWZmZXIiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgaWYgKHBtZW1fZmRbaW5kZXhdID49IDApIHsKLSAgICAgICAgbXVubWFwKHBtZW1fYmFzZWFkZHJlc3NbaW5kZXhdLCBidWZmZXJfc2l6ZV9yZXEpOwotICAgICAgICBjbG9zZShwbWVtX2ZkW2luZGV4XSk7Ci0gICAgfQotICAgIHBtZW1fZmRbaW5kZXhdID0gLTE7Ci0jaWZkZWYgVVNFX0lPTgotICAgIG9teC0+ZnJlZV9pb25fbWVtb3J5KCZvcF9idWZfaW9uX2luZm9baW5kZXhdKTsKLSNlbmRpZgotICAgIGlmIChhbGxvY2F0ZWRfY291bnQgPiAwKQotICAgICAgICBhbGxvY2F0ZWRfY291bnQtLTsKLSAgICBlbHNlCi0gICAgICAgIGFsbG9jYXRlZF9jb3VudCA9IDA7Ci0gICAgaWYgKCFhbGxvY2F0ZWRfY291bnQpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZvbXgtPmNfbG9jayk7Ci0gICAgICAgIGluaXRfbWVtYmVycygpOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmb214LT5jX2xvY2spOwotICAgIH0KLSAgICByZXR1cm4gb214LT5mcmVlX291dHB1dF9idWZmZXIoJm9teC0+bV9vdXRfbWVtX3B0cltpbmRleF0pOwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92ZGVjOjphbGxvY2F0ZV9jb2xvcl9jb252ZXJ0X2J1Zjo6YWxsb2NhdGVfYnVmZmVyc19jb2xvcl9jb252ZXJ0KE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlckhkcixPTVhfVTMyIHBvcnQsT01YX1BUUiBhcHBEYXRhLE9NWF9VMzIgYnl0ZXMpCi17Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICBpZiAoIWVuYWJsZWQpIHsKLSAgICAgICAgZVJldCA9IG9teC0+YWxsb2NhdGVfb3V0cHV0X2J1ZmZlcihoQ29tcCxidWZmZXJIZHIscG9ydCxhcHBEYXRhLGJ5dGVzKTsKLSAgICAgICAgcmV0dXJuIGVSZXQ7Ci0gICAgfQotICAgIGlmIChlbmFibGVkICYmIG9teC0+aXNfY29tcG9uZW50X3NlY3VyZSgpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJOb3RpbiBjb2xvciBjb252ZXJ0IG1vZGUgc2VjdXJlX21vZGUgJWQiLAotICAgICAgICAgICAgICAgIG9teC0+aXNfY29tcG9uZW50X3NlY3VyZSgpKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICB9Ci0gICAgaWYgKCFidWZmZXJIZHIgfHwgYnl0ZXMgPiBidWZmZXJfc2l6ZV9yZXEpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgcGFyYW1zIGFsbG9jYXRlX2J1ZmZlcnNfY29sb3JfY29udmVydCAlcCIsIGJ1ZmZlckhkcik7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJjb2xvcl9jb252ZXJ0IGJ1ZmZlcl9zaXplX3JlcSAldSBieXRlcyAldSIsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClidWZmZXJfc2l6ZV9yZXEsICh1bnNpZ25lZCBpbnQpYnl0ZXMpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICBpZiAoYWxsb2NhdGVkX2NvdW50ID49IG9teC0+ZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkFjdHVhbCBjb3VudCBlcnIgaW4gYWxsb2NhdGVfYnVmZmVyc19jb2xvcl9jb252ZXJ0Iik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgfQotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICp0ZW1wX2J1ZmZlckhkciA9IE5VTEw7Ci0gICAgZVJldCA9IG9teC0+YWxsb2NhdGVfb3V0cHV0X2J1ZmZlcihoQ29tcCwmdGVtcF9idWZmZXJIZHIsCi0gICAgICAgICAgICBwb3J0LGFwcERhdGEsb214LT5kcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSk7Ci0gICAgaWYgKGVSZXQgIT0gT01YX0Vycm9yTm9uZSB8fCAhdGVtcF9idWZmZXJIZHIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCBjb2xvcl9jb252ZXJ0Iik7Ci0gICAgICAgIHJldHVybiBlUmV0OwotICAgIH0KLSAgICBpZiAoKHRlbXBfYnVmZmVySGRyIC0gb214LT5tX291dF9tZW1fcHRyKSA+PQotICAgICAgICAgICAgKGludClvbXgtPmRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50KSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIGhlYWRlciBpbmRleCAlbGQiLAotICAgICAgICAgICAgICAgKGxvbmcgaW50KSh0ZW1wX2J1ZmZlckhkciAtIG9teC0+bV9vdXRfbWVtX3B0cikpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgIH0KLSAgICB1bnNpZ25lZCBpbnQgaSA9IGFsbG9jYXRlZF9jb3VudDsKLSNpZmRlZiBVU0VfSU9OCi0gICAgLy8gQWxsb2NhdGUgY29sb3ItY29udmVyc2lvbiBidWZmZXJzIGFzIGNhY2hlZCB0byBpbXByb3ZlIHNvZnR3YXJlLXJlYWRpbmcKLSAgICAvLyBwZXJmb3JtYW5jZSBvZiBZVVYgKHRodW1ibmFpbHMpLiBOT1RFOiBUaGVzZSBidWZmZXJzIHdpbGwgbmVlZCBhbiBleHBsaWNpdAotICAgIC8vIGNhY2hlIGludmFsaWRhdGlvbi4KLSAgICBvcF9idWZfaW9uX2luZm9baV0uaW9uX2RldmljZV9mZCA9IG9teC0+YWxsb2NfbWFwX2lvbl9tZW1vcnkoCi0gICAgICAgICAgICBidWZmZXJfc2l6ZV9yZXEsYnVmZmVyX2FsaWdubWVudF9yZXEsCi0gICAgICAgICAgICAmb3BfYnVmX2lvbl9pbmZvW2ldLmlvbl9hbGxvY19kYXRhLCZvcF9idWZfaW9uX2luZm9baV0uZmRfaW9uX2RhdGEsCi0gICAgICAgICAgICBJT05fRkxBR19DQUNIRUQpOwotICAgIHBtZW1fZmRbaV0gPSBvcF9idWZfaW9uX2luZm9baV0uZmRfaW9uX2RhdGEuZmQ7Ci0gICAgaWYgKG9wX2J1Zl9pb25faW5mb1tpXS5pb25fZGV2aWNlX2ZkIDwgMCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiYWxsb2NfbWFwX2lvbiBmYWlsZWQgaW4gY29sb3JfY29udmVydCIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgIH0KLSAgICBwbWVtX2Jhc2VhZGRyZXNzW2ldID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKE5VTEwsYnVmZmVyX3NpemVfcmVxLAotICAgICAgICAgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsTUFQX1NIQVJFRCxwbWVtX2ZkW2ldLDApOwotCi0gICAgaWYgKHBtZW1fYmFzZWFkZHJlc3NbaV0gPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiTU1BUCBmYWlsZWQgZm9yIFNpemUgJWQiLGJ1ZmZlcl9zaXplX3JlcSk7Ci0gICAgICAgIGNsb3NlKHBtZW1fZmRbaV0pOwotICAgICAgICBvbXgtPmZyZWVfaW9uX21lbW9yeSgmb3BfYnVmX2lvbl9pbmZvW2ldKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICB9Ci0jZW5kaWYKLSAgICBtX3BtZW1faW5mb19jbGllbnRbaV0ub2Zmc2V0ID0gMDsKLSAgICBtX3BsYXRmb3JtX2VudHJ5X2NsaWVudFtpXS5lbnRyeSA9ICh2b2lkICopJm1fcG1lbV9pbmZvX2NsaWVudFtpXTsKLSAgICBtX3BsYXRmb3JtX2VudHJ5X2NsaWVudFtpXS50eXBlID0gT01YX1FDT01fUExBVEZPUk1fUFJJVkFURV9QTUVNOwotICAgIG1fcGxhdGZvcm1fbGlzdF9jbGllbnRbaV0ubkVudHJpZXMgPSAxOwotICAgIG1fcGxhdGZvcm1fbGlzdF9jbGllbnRbaV0uZW50cnlMaXN0ID0gJm1fcGxhdGZvcm1fZW50cnlfY2xpZW50W2ldOwotICAgIG1fb3V0X21lbV9wdHJfY2xpZW50W2ldLnBPdXRwdXRQb3J0UHJpdmF0ZSA9IE5VTEw7Ci0gICAgbV9vdXRfbWVtX3B0cl9jbGllbnRbaV0ubkFsbG9jTGVuID0gYnVmZmVyX3NpemVfcmVxOwotICAgIG1fb3V0X21lbV9wdHJfY2xpZW50W2ldLm5GaWxsZWRMZW4gPSAwOwotICAgIG1fb3V0X21lbV9wdHJfY2xpZW50W2ldLm5GbGFncyA9IDA7Ci0gICAgbV9vdXRfbWVtX3B0cl9jbGllbnRbaV0ubk91dHB1dFBvcnRJbmRleCA9IE9NWF9DT1JFX09VVFBVVF9QT1JUX0lOREVYOwotICAgIG1fb3V0X21lbV9wdHJfY2xpZW50W2ldLm5TaXplID0gc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKTsKLSAgICBtX291dF9tZW1fcHRyX2NsaWVudFtpXS5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgbV9vdXRfbWVtX3B0cl9jbGllbnRbaV0ucFBsYXRmb3JtUHJpdmF0ZSA9ICZtX3BsYXRmb3JtX2xpc3RfY2xpZW50W2ldOwotICAgIG1fb3V0X21lbV9wdHJfY2xpZW50W2ldLnBCdWZmZXIgPSBwbWVtX2Jhc2VhZGRyZXNzW2ldOwotICAgIG1fb3V0X21lbV9wdHJfY2xpZW50W2ldLnBBcHBQcml2YXRlID0gYXBwRGF0YTsKLSAgICAqYnVmZmVySGRyID0gJm1fb3V0X21lbV9wdHJfY2xpZW50W2ldOwotICAgIERFQlVHX1BSSU5UX0hJR0goIklMIGNsaWVudCBidWZmZXIgaGVhZGVyICVwIiwgKmJ1ZmZlckhkcik7Ci0gICAgYWxsb2NhdGVkX2NvdW50Kys7Ci0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLWJvb2wgb214X3ZkZWM6OmlzX2NvbXBvbmVudF9zZWN1cmUoKQotewotICAgIHJldHVybiBzZWN1cmVfbW9kZTsKLX0KLQotYm9vbCBvbXhfdmRlYzo6YWxsb2NhdGVfY29sb3JfY29udmVydF9idWY6OmdldF9jb2xvcl9mb3JtYXQoT01YX0NPTE9SX0ZPUk1BVFRZUEUgJmRlc3RfY29sb3JfZm9ybWF0KQotewotICAgIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLSAgICBpZiAoIWVuYWJsZWQpIHsKLSAgICAgICAgZm9yIChhdXRvJiB4OiBtTWFwT3V0cHV0MkRyaXZlckNvbG9yRm9ybWF0KSB7Ci0gICAgICAgICAgICBEZWNDb2xvck1hcHBpbmc6OmNvbnN0X2l0ZXJhdG9yCi0gICAgICAgICAgICAgICAgZm91bmQgPSBtTWFwT3V0cHV0MkRyaXZlckNvbG9yRm9ybWF0LmZpbmQob214LT5kcnZfY3R4Lm91dHB1dF9mb3JtYXQpOwotICAgICAgICAgICAgaWYgKGZvdW5kID09IG1NYXBPdXRwdXQyRHJpdmVyQ29sb3JGb3JtYXQuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ29sb3JTdWJNYXBwaW5nOjpjb25zdF9pdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICBzdWJGb3VuZCA9IGZvdW5kLT5zZWNvbmQuZmluZChvbXgtPmRydl9jdHguZGVjb2Rlcl9mb3JtYXQpOwotICAgICAgICAgICAgICAgIGlmIChzdWJGb3VuZCA9PSBmb3VuZC0+c2Vjb25kLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfY29sb3JfZm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC5maW5kKC0xKS0+c2Vjb25kOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfY29sb3JfZm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKSBzdWJGb3VuZC0+c2Vjb25kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIHx8Ci0gICAgICAgICAgICBDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgewotICAgICAgICAgICAgZGVzdF9jb2xvcl9mb3JtYXQgPSBDb2xvckZvcm1hdDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotT01YX0VSUk9SVFlQRSBvbXhfdmRlYzo6YWxsb2NhdGVfY29sb3JfY29udmVydF9idWY6OmNhY2hlX29wcygKLSAgICAgICAgdW5zaWduZWQgaW50IGluZGV4LCB1bnNpZ25lZCBpbnQgY21kKQotewotICAgIGlmICghZW5hYmxlZCkgewotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoIW9teCB8fCBpbmRleCA+PSBvbXgtPmRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50KSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlczogSW52YWxpZCBwYXJhbSIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgaW9uX2ZsdXNoX2RhdGEgZmx1c2hfZGF0YTsKLSAgICBzdHJ1Y3QgaW9uX2N1c3RvbV9kYXRhIGN1c3RvbV9kYXRhOwotCi0gICAgbWVtc2V0KCZmbHVzaF9kYXRhLCAweDAsIHNpemVvZihmbHVzaF9kYXRhKSk7Ci0gICAgbWVtc2V0KCZjdXN0b21fZGF0YSwgMHgwLCBzaXplb2YoY3VzdG9tX2RhdGEpKTsKLQotICAgIGZsdXNoX2RhdGEudmFkZHIgPSBwbWVtX2Jhc2VhZGRyZXNzW2luZGV4XTsKLSAgICBmbHVzaF9kYXRhLmZkID0gb3BfYnVmX2lvbl9pbmZvW2luZGV4XS5mZF9pb25fZGF0YS5mZDsKLSAgICBmbHVzaF9kYXRhLmhhbmRsZSA9IG9wX2J1Zl9pb25faW5mb1tpbmRleF0uZmRfaW9uX2RhdGEuaGFuZGxlOwotICAgIGZsdXNoX2RhdGEubGVuZ3RoID0gYnVmZmVyX3NpemVfcmVxOwotICAgIGN1c3RvbV9kYXRhLmNtZCA9IGNtZDsKLSAgICBjdXN0b21fZGF0YS5hcmcgPSAodW5zaWduZWQgbG9uZykmZmx1c2hfZGF0YTsKLQotICAgIERFQlVHX1BSSU5UX0xPVygiQ2FjaGUgJXM6IGZkPSVkIGhhbmRsZT0lZCB2YT0lcCBzaXplPSVkIiwKLSAgICAgICAgICAgIChjbWQgPT0gSU9OX0lPQ19DTEVBTl9DQUNIRVMpID8gIkNsZWFuIiA6ICJJbnZhbGlkYXRlIiwKLSAgICAgICAgICAgIGZsdXNoX2RhdGEuZmQsIGZsdXNoX2RhdGEuaGFuZGxlLCBmbHVzaF9kYXRhLnZhZGRyLAotICAgICAgICAgICAgZmx1c2hfZGF0YS5sZW5ndGgpOwotICAgIGludCByZXQgPSBpb2N0bChvcF9idWZfaW9uX2luZm9baW5kZXhdLmlvbl9kZXZpY2VfZmQsIElPTl9JT0NfQ1VTVE9NLCAmY3VzdG9tX2RhdGEpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJDYWNoZSAlcyBmYWlsZWQ6ICVzXG4iLAotICAgICAgICAgICAgICAgIChjbWQgPT0gSU9OX0lPQ19DTEVBTl9DQUNIRVMpID8gIkNsZWFuIiA6ICJJbnZhbGlkYXRlIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgIH0KLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLX0KLQotdm9pZCBvbXhfdmRlYzo6YnVmX3JlZl9hZGQoaW50IG5Qb3J0SW5kZXgpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBpID0gMDsKLSAgICBib29sIGJ1Zl9wcmVzZW50ID0gZmFsc2U7Ci0gICAgbG9uZyBmZCA9IGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltuUG9ydEluZGV4XS5wbWVtX2ZkOwotICAgIE9NWF9VMzIgb2Zmc2V0ID0gZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW25Qb3J0SW5kZXhdLm9mZnNldDsKLQotICAgIGlmICghZHluYW1pY19idWZfbW9kZSB8fCAhb3V0X2R5bmFtaWNfbGlzdCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOwotICAgIGZvciAoaSA9IDA7IGkgPCBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudDsgaSsrKSB7Ci0gICAgICAgIC8vY2hlY2sgdGhlIGJ1ZmZlciBmZCwgb2Zmc2V0LCB1diBhZGRyIHdpdGggbGlzdCBjb250ZW50cwotICAgICAgICAvL0lmIHByZXNlbnQgaW5jcmVtZW50IHJlZmVyZW5jZS4KLSAgICAgICAgaWYgKChvdXRfZHluYW1pY19saXN0W2ldLmZkID09IGZkKSAmJgotICAgICAgICAgICAgKG91dF9keW5hbWljX2xpc3RbaV0ub2Zmc2V0ID09IG9mZnNldCkpIHsKLSAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiYnVmX3JlZl9hZGQ6IFtBTFJFQURZIFBSRVNFTlRdIGZkID0gJXUgcmVmX2NvdW50ID0gJXUiLAotICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClvdXRfZHluYW1pY19saXN0W2ldLmZkLCAodW5zaWduZWQgaW50KW91dF9keW5hbWljX2xpc3RbaV0ucmVmX2NvdW50KTsKLSAgICAgICAgICAgICAgIGlmICghc2VjdXJlX21vZGUpIHsKLSAgICAgICAgICAgICAgICAgICBkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbblBvcnRJbmRleF0uYnVmZmVyYWRkciA9IG91dF9keW5hbWljX2xpc3RbaV0uYnVmZmFkZHI7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBidWZfcHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWJ1Zl9wcmVzZW50KSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAvL3NlYXJjaCBmb3IgYSBlbnRyeSB0byBpbnNlcnQgZGV0YWlscyBvZiB0aGUgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgaWYgKG91dF9keW5hbWljX2xpc3RbaV0uZHVwX2ZkIDwgMCkgewotICAgICAgICAgICAgICAgIG91dF9keW5hbWljX2xpc3RbaV0uZmQgPSBmZDsKLSAgICAgICAgICAgICAgICBvdXRfZHluYW1pY19saXN0W2ldLm9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgICAgICAgICBvdXRfZHluYW1pY19saXN0W2ldLmR1cF9mZCA9IGR1cChmZCk7Ci0gICAgICAgICAgICAgICAgb3V0X2R5bmFtaWNfbGlzdFtpXS5yZWZfY291bnQrKzsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImJ1Zl9yZWZfYWRkOiBbQURERURdIGZkID0gJXUgcmVmX2NvdW50ID0gJXUiLAotICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClvdXRfZHluYW1pY19saXN0W2ldLmZkLCAodW5zaWduZWQgaW50KW91dF9keW5hbWljX2xpc3RbaV0ucmVmX2NvdW50KTsKLQotICAgICAgICAgICAgICAgIGlmICghc2VjdXJlX21vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW25Qb3J0SW5kZXhdLmJ1ZmZlcmFkZHIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfVTgqKW1tYXAoMCwgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW25Qb3J0SW5kZXhdLmJ1ZmZlcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltuUG9ydEluZGV4XS5wbWVtX2ZkLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgLy9tbWFwIHJldHVybnMgKHZvaWQgKiktMSBvbiBmYWlsdXJlIGFuZCBzZXRzIGVycm9yIGNvZGUgaW4gZXJybm8uCi0gICAgICAgICAgICAgICAgICAgIGlmIChkcnZfY3R4LnB0cl9vdXRwdXRidWZmZXJbblBvcnRJbmRleF0uYnVmZmVyYWRkciA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiYnVmX3JlZl9hZGQ6IG1tYXAgZmFpbGVkIC0gZXJybm86ICVkIiwgZXJybm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW25Qb3J0SW5kZXhdLmJ1ZmZlcmFkZHIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0X2R5bmFtaWNfbGlzdFtpXS5idWZmYWRkciA9IGRydl9jdHgucHRyX291dHB1dGJ1ZmZlcltuUG9ydEluZGV4XS5idWZmZXJhZGRyOwotICAgICAgICAgICAgICAgICAgICBvdXRfZHluYW1pY19saXN0W2ldLm1hcHBlZF9zaXplID0gZHJ2X2N0eC5wdHJfb3V0cHV0YnVmZmVyW25Qb3J0SW5kZXhdLmJ1ZmZlcl9sZW47Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygibW1hcDogJXAgJWxkIiwgb3V0X2R5bmFtaWNfbGlzdFtpXS5idWZmYWRkciwgb3V0X2R5bmFtaWNfbGlzdFtpXS5tYXBwZWRfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7Ci19Ci0KLXZvaWQgb214X3ZkZWM6OmJ1Zl9yZWZfcmVtb3ZlKCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIGkgPSAwOwotCi0gICAgaWYgKCFkeW5hbWljX2J1Zl9tb2RlIHx8ICFvdXRfZHluYW1pY19saXN0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbG9jayk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50OyBpKyspIHsKLSAgICAgICAgaWYgKCFzZWN1cmVfbW9kZSAmJiBvdXRfZHluYW1pY19saXN0W2ldLmJ1ZmZhZGRyICYmIG91dF9keW5hbWljX2xpc3RbaV0ubWFwcGVkX3NpemUpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygibXVubWFwOiAlcCAlbGQiLCBvdXRfZHluYW1pY19saXN0W2ldLmJ1ZmZhZGRyLCBvdXRfZHluYW1pY19saXN0W2ldLm1hcHBlZF9zaXplKTsKLSAgICAgICAgICAgIG11bm1hcChvdXRfZHluYW1pY19saXN0W2ldLmJ1ZmZhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2R5bmFtaWNfbGlzdFtpXS5tYXBwZWRfc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJidWZfcmVmX3JlbW92ZTogW1JFTU9WRURdIGZkID0gJXUgcmVmX2NvdW50ID0gJXUiLAotICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KW91dF9keW5hbWljX2xpc3RbaV0uZmQsICh1bnNpZ25lZCBpbnQpb3V0X2R5bmFtaWNfbGlzdFtpXS5yZWZfY291bnQpOwotICAgICAgICAgY2xvc2Uob3V0X2R5bmFtaWNfbGlzdFtpXS5kdXBfZmQpOwotICAgICAgICAgb3V0X2R5bmFtaWNfbGlzdFtpXS5kdXBfZmQgPSAtMTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7Ci0KLSAgICBpZiAob3V0X2R5bmFtaWNfbGlzdCkgewotICAgICAgICBmcmVlKG91dF9keW5hbWljX2xpc3QpOwotICAgICAgICBvdXRfZHluYW1pY19saXN0ID0gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgb214X3ZkZWM6OnNlbmRfY29kZWNfY29uZmlnKCkgewotICAgIGlmIChjb2RlY19jb25maWdfZmxhZykgewotICAgICAgICB1bnNpZ25lZCBsb25nIHAxID0gMDsgLy8gUGFyYW1ldGVyIC0gMQotICAgICAgICB1bnNpZ25lZCBsb25nIHAyID0gMDsgLy8gUGFyYW1ldGVyIC0gMgotICAgICAgICB1bnNpZ25lZCBsb25nIGlkZW50ID0gMDsKLSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOwotICAgICAgICBERUJVR19QUklOVF9MT1coIlxuIENoZWNrIFF1ZXVlIGZvciBjb2RlY19jb25maWcgYnVmZmVyIFxuIik7Ci0gICAgICAgIHdoaWxlIChtX2V0Yl9xLm1fc2l6ZSkgewotICAgICAgICAgICAgbV9ldGJfcS5wb3BfZW50cnkoJnAxLCZwMiwmaWRlbnQpOwotICAgICAgICAgICAgaWYgKGlkZW50ID09IE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVRCKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCgoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMiktPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eV90aGlzX2J1ZmZlcl9wcm94eSgoT01YX0hBTkRMRVRZUEUpcDEsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMikgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlxuIGVtcHR5X3RoaXNfYnVmZmVyX3Byb3h5IGZhaWx1cmUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teF9yZXBvcnRfZXJyb3IgKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2lucHV0X2J1ZmZlcnMrKzsKLSAgICAgICAgICAgICAgICAgICAgVklEQ19UUkFDRV9JTlRfTE9XKCJFVEItcGVuZGluZyIsIHBlbmRpbmdfaW5wdXRfYnVmZmVycyk7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiXG4gRmx1c2ggSW5wdXQgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVEIgJXAsIHBlbmRpbmdfaW5wdXRfYnVmZmVycyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9CVUZGRVJIRUFERVJUWVBFICopcDIsIHBlbmRpbmdfaW5wdXRfYnVmZmVycyk7Ci0gICAgICAgICAgICAgICAgICAgIGVtcHR5X2J1ZmZlcl9kb25lKCZtX2NtcCwoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpZGVudCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VCRCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiXG4gRmx1c2ggSW5wdXQgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQgJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9CVUZGRVJIRUFERVJUWVBFICopcDEpOwotICAgICAgICAgICAgICAgIGVtcHR5X2J1ZmZlcl9kb25lKCZtX2NtcCwoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7Ci0gICAgfQotfQotCi1PTVhfRVJST1JUWVBFIG9teF92ZGVjOjplbmFibGVfYWRhcHRpdmVfcGxheWJhY2sodW5zaWduZWQgbG9uZyBuTWF4RnJhbWVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG5NYXhGcmFtZUhlaWdodCkKLXsKLQotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyBtaW5fcmVzX2J1Zl9jb3VudCA9IDA7Ci0KLSAgICBlUmV0ID0gZW5hYmxlX3Ntb290aHN0cmVhbWluZygpOwotICAgIGlmIChlUmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gZW5hYmxlIEFkYXB0aXZlIFBsYXliYWNrIG9uIGRyaXZlciIpOwotICAgICAgICAgcmV0dXJuIGVSZXQ7Ci0gICAgIH0KLQotICAgICBERUJVR19QUklOVF9ISUdIKCJFbmFibGluZyBBZGFwdGl2ZSBwbGF5YmFjayBmb3IgJWx1IHggJWx1IiwKLSAgICAgICAgICAgICBuTWF4RnJhbWVXaWR0aCwKLSAgICAgICAgICAgICBuTWF4RnJhbWVIZWlnaHQpOwotICAgICBtX3Ntb290aHN0cmVhbWluZ19tb2RlID0gdHJ1ZTsKLSAgICAgbV9zbW9vdGhzdHJlYW1pbmdfd2lkdGggPSBuTWF4RnJhbWVXaWR0aDsKLSAgICAgbV9zbW9vdGhzdHJlYW1pbmdfaGVpZ2h0ID0gbk1heEZyYW1lSGVpZ2h0OwotCi0gICAgIC8vR2V0IHVwcGVyIGxpbWl0IGJ1ZmZlciBjb3VudCBmb3IgbWluIHN1cHBvcnRlZCByZXNvbHV0aW9uCi0gICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7Ci0gICAgIGZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICBmbXQuZm10LnBpeF9tcC5oZWlnaHQgPSBtX2RlY29kZXJfY2FwYWJpbGl0eS5taW5faGVpZ2h0OwotICAgICBmbXQuZm10LnBpeF9tcC53aWR0aCA9IG1fZGVjb2Rlcl9jYXBhYmlsaXR5Lm1pbl93aWR0aDsKLSAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBvdXRwdXRfY2FwYWJpbGl0eTsKLQotICAgICByZXQgPSBpb2N0bChkcnZfY3R4LnZpZGVvX2RyaXZlcl9mZCwgVklESU9DX1NfRk1ULCAmZm10KTsKLSAgICAgaWYgKHJldCkgewotICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldCBSZXNvbHV0aW9uIGZhaWxlZCBmb3IgSHhXID0gJXV4JXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWNvZGVyX2NhcGFiaWxpdHkubWluX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVjb2Rlcl9jYXBhYmlsaXR5Lm1pbl93aWR0aCk7Ci0gICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICB9Ci0KLSAgICAgZVJldCA9IGdldF9idWZmZXJfcmVxKCZkcnZfY3R4Lm9wX2J1Zik7Ci0gICAgIGlmIChlUmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJmYWlsZWQgdG8gZ2V0X2J1ZmZlcl9yZXEiKTsKLSAgICAgICAgIHJldHVybiBlUmV0OwotICAgICB9Ci0KLSAgICAgbWluX3Jlc19idWZfY291bnQgPSBkcnZfY3R4Lm9wX2J1Zi5taW5jb3VudDsKLSAgICAgREVCVUdfUFJJTlRfTE9XKCJlbmFibGUgYWRhcHRpdmUgLSB1cHBlciBsaW1pdCBidWZmZXIgY291bnQgPSAlbHUgZm9yIEh4VyAldXgldSIsCi0gICAgICAgICAgICAgICAgICAgICBtaW5fcmVzX2J1Zl9jb3VudCwgbV9kZWNvZGVyX2NhcGFiaWxpdHkubWluX2hlaWdodCwgbV9kZWNvZGVyX2NhcGFiaWxpdHkubWluX3dpZHRoKTsKLQotICAgICBtX2V4dHJhZGF0YV9pbmZvLm91dHB1dF9jcm9wX3JlY3QubkxlZnQgPSAwOwotICAgICBtX2V4dHJhZGF0YV9pbmZvLm91dHB1dF9jcm9wX3JlY3QublRvcCA9IDA7Ci0gICAgIG1fZXh0cmFkYXRhX2luZm8ub3V0cHV0X2Nyb3BfcmVjdC5uV2lkdGggPSBtX3Ntb290aHN0cmVhbWluZ193aWR0aDsKLSAgICAgbV9leHRyYWRhdGFfaW5mby5vdXRwdXRfY3JvcF9yZWN0Lm5IZWlnaHQgPSBtX3Ntb290aHN0cmVhbWluZ19oZWlnaHQ7Ci0KLSAgICAgdXBkYXRlX3Jlc29sdXRpb24obV9zbW9vdGhzdHJlYW1pbmdfd2lkdGgsIG1fc21vb3Roc3RyZWFtaW5nX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgbV9zbW9vdGhzdHJlYW1pbmdfd2lkdGgsIG1fc21vb3Roc3RyZWFtaW5nX2hlaWdodCk7Ci0gICAgIGVSZXQgPSBpc192aWRlb19zZXNzaW9uX3N1cHBvcnRlZCgpOwotICAgICBpZiAoZVJldCAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgICBERUJVR19QUklOVF9FUlJPUigidmlkZW8gc2Vzc2lvbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICByZXR1cm4gZVJldDsKLSAgICAgfQotCi0gICAgIC8vR2V0IHVwcGVyIGxpbWl0IGJ1ZmZlciBzaXplIGZvciBtYXggc21vb3RoIHN0cmVhbWluZyByZXNvbHV0aW9uIHNldAotICAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgICAgZm10LmZtdC5waXhfbXAuaGVpZ2h0ID0gZHJ2X2N0eC52aWRlb19yZXNvbHV0aW9uLmZyYW1lX2hlaWdodDsKLSAgICAgZm10LmZtdC5waXhfbXAud2lkdGggPSBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGg7Ci0gICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gb3V0cHV0X2NhcGFiaWxpdHk7Ci0gICAgIHJldCA9IGlvY3RsKGRydl9jdHgudmlkZW9fZHJpdmVyX2ZkLCBWSURJT0NfU19GTVQsICZmbXQpOwotICAgICBpZiAocmV0KSB7Ci0gICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU2V0IFJlc29sdXRpb24gZmFpbGVkIGZvciBhZGFwdGl2ZSBwbGF5YmFjayIpOwotICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgfQotCi0gICAgIGVSZXQgPSBnZXRfYnVmZmVyX3JlcSgmZHJ2X2N0eC5vcF9idWYpOwotICAgICBpZiAoZVJldCAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZmFpbGVkIHRvIGdldF9idWZmZXJfcmVxISEiKTsKLSAgICAgICAgIHJldHVybiBlUmV0OwotICAgICB9Ci0gICAgIERFQlVHX1BSSU5UX0xPVygiZW5hYmxlIGFkYXB0aXZlIC0gdXBwZXIgbGltaXQgYnVmZmVyIHNpemUgPSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWRydl9jdHgub3BfYnVmLmJ1ZmZlcl9zaXplKTsKLQotICAgICBkcnZfY3R4Lm9wX2J1Zi5taW5jb3VudCA9IG1pbl9yZXNfYnVmX2NvdW50OwotICAgICBkcnZfY3R4Lm9wX2J1Zi5hY3R1YWxjb3VudCA9IG1pbl9yZXNfYnVmX2NvdW50OwotICAgICBkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSA9IGRydl9jdHgub3BfYnVmLmJ1ZmZlcl9zaXplOwotICAgICBlUmV0ID0gc2V0X2J1ZmZlcl9yZXEoJmRydl9jdHgub3BfYnVmKTsKLSAgICAgaWYgKGVSZXQgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImZhaWxlZCB0byBzZXRfYnVmZmVyX3JlcSIpOwotICAgICAgICAgcmV0dXJuIGVSZXQ7Ci0gICAgIH0KLQotICAgICBlUmV0ID0gZ2V0X2J1ZmZlcl9yZXEoJmRydl9jdHgub3BfYnVmKTsKLSAgICAgaWYgKGVSZXQgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImZhaWxlZCB0byBnZXRfYnVmZmVyX3JlcSEhISIpOwotICAgICAgICAgcmV0dXJuIGVSZXQ7Ci0gICAgIH0KLSAgICAgREVCVUdfUFJJTlRfSElHSCgiYWRhcHRpdmUgcGxheWJhY2sgZW5hYmxlZCwgYnVmIGNvdW50ID0gJXUgYnVmc2l6ZSA9ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5taW5jb3VudCwgKHVuc2lnbmVkIGludClkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSk7Ci0gICAgIHJldHVybiBlUmV0OwotfQotCi0vL3N0YXRpYwotT01YX0VSUk9SVFlQRSBvbXhfdmRlYzo6ZGVzY3JpYmVDb2xvckZvcm1hdChPTVhfUFRSIHBQYXJhbSkgewotCi0jaWZuZGVmIEZMRVhZVVZfU1VQUE9SVEVECi0gICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSNlbHNlCi0KLSAgICBpZiAocFBhcmFtID09IE5VTEwpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImRlc2NyaWJlQ29sb3JGb3JtYXQ6IGludmFsaWQgcGFyYW1zIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyAqcGFyYW1zID0gKERlc2NyaWJlQ29sb3JGb3JtYXRQYXJhbXMqKXBQYXJhbTsKLQotICAgIE1lZGlhSW1hZ2UgKmltZyA9ICYocGFyYW1zLT5zTWVkaWFJbWFnZSk7Ci0gICAgc3dpdGNoKHBhcmFtcy0+ZUNvbG9yRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbWctPm1UeXBlID0gTWVkaWFJbWFnZTo6TUVESUFfSU1BR0VfVFlQRV9ZVVY7Ci0gICAgICAgICAgICBpbWctPm1OdW1QbGFuZXMgPSAzOwotICAgICAgICAgICAgLy8gbVdpZHRoIGFuZCBtSGVpZ2h0IHJlcHJlc2VudCB0aGUgVyB4IEggb2YgdGhlIGxhcmdlc3QgcGxhbmUKLSAgICAgICAgICAgIC8vIEluIG91ciBjYXNlLCB0aGlzIGhhcHBlbnMgdG8gYmUgdGhlIFN0cmlkZSB4IFNjYW5saW5lcyBvZiBZIHBsYW5lCi0gICAgICAgICAgICBpbWctPm1XaWR0aCA9IHBhcmFtcy0+bkZyYW1lV2lkdGg7Ci0gICAgICAgICAgICBpbWctPm1IZWlnaHQgPSBwYXJhbXMtPm5GcmFtZUhlaWdodDsKLSAgICAgICAgICAgIHNpemVfdCBwbGFuZVdpZHRoID0gVkVOVVNfWV9TVFJJREUoQ09MT1JfRk1UX05WMTIsIHBhcmFtcy0+bkZyYW1lV2lkdGgpOwotICAgICAgICAgICAgc2l6ZV90IHBsYW5lSGVpZ2h0ID0gVkVOVVNfWV9TQ0FOTElORVMoQ09MT1JfRk1UX05WMTIsIHBhcmFtcy0+bkZyYW1lSGVpZ2h0KTsKLSAgICAgICAgICAgIGltZy0+bUJpdERlcHRoID0gODsKLSAgICAgICAgICAgIC8vUGxhbmUgMCAoWSkKLSAgICAgICAgICAgIGltZy0+bVBsYW5lW01lZGlhSW1hZ2U6OlldLm1PZmZzZXQgPSAwOwotICAgICAgICAgICAgaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6WV0ubUNvbEluYyA9IDE7Ci0gICAgICAgICAgICBpbWctPm1QbGFuZVtNZWRpYUltYWdlOjpZXS5tUm93SW5jID0gcGxhbmVXaWR0aDsgLy9zYW1lIGFzIHN0cmlkZQotICAgICAgICAgICAgaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOwotICAgICAgICAgICAgaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6WV0ubVZlcnRTdWJzYW1wbGluZyA9IDE7Ci0gICAgICAgICAgICAvL1BsYW5lIDEgKFUpCi0gICAgICAgICAgICBpbWctPm1QbGFuZVtNZWRpYUltYWdlOjpVXS5tT2Zmc2V0ID0gcGxhbmVXaWR0aCAqIHBsYW5lSGVpZ2h0OwotICAgICAgICAgICAgaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6VV0ubUNvbEluYyA9IDI7ICAgICAgICAgICAvL2ludGVybGVhdmVkIFVWCi0gICAgICAgICAgICBpbWctPm1QbGFuZVtNZWRpYUltYWdlOjpVXS5tUm93SW5jID0KLSAgICAgICAgICAgICAgICAgICAgVkVOVVNfVVZfU1RSSURFKENPTE9SX0ZNVF9OVjEyLCBwYXJhbXMtPm5GcmFtZVdpZHRoKTsKLSAgICAgICAgICAgIGltZy0+bVBsYW5lW01lZGlhSW1hZ2U6OlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKLSAgICAgICAgICAgIGltZy0+bVBsYW5lW01lZGlhSW1hZ2U6OlVdLm1WZXJ0U3Vic2FtcGxpbmcgPSAyOwotICAgICAgICAgICAgLy9QbGFuZSAyIChWKQotICAgICAgICAgICAgaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6Vl0ubU9mZnNldCA9IHBsYW5lV2lkdGggKiBwbGFuZUhlaWdodCArIDE7Ci0gICAgICAgICAgICBpbWctPm1QbGFuZVtNZWRpYUltYWdlOjpWXS5tQ29sSW5jID0gMjsgICAgICAgICAgIC8vaW50ZXJsZWF2ZWQgVVYKLSAgICAgICAgICAgIGltZy0+bVBsYW5lW01lZGlhSW1hZ2U6OlZdLm1Sb3dJbmMgPQotICAgICAgICAgICAgICAgICAgICBWRU5VU19VVl9TVFJJREUoQ09MT1JfRk1UX05WMTIsIHBhcmFtcy0+bkZyYW1lV2lkdGgpOwotICAgICAgICAgICAgaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6Vl0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOwotICAgICAgICAgICAgaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTo6Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKLSAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgbm90IGRlc2NyaWJlIHRoZSBzdGFuZGFyZCBPTVggbGluZWFyIGZvcm1hdHMgYXMgdGhlc2UgYXJlCi0gICAgICAgICAgICAvLyB1bmRlcnN0b29kIGJ5IGNsaWVudC4gRmFpbCB0aGlzIGRlbGliZXJhdGVseSB0byBsZXQgY2xpZW50IGZpbGwtaW4KLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIFJlc3QgYWxsIGZvcm1hdHMgd2hpY2ggYXJlIG5vbi1saW5lYXIgY2Fubm90IGJlIGRlc2NyaWJlZAotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJjb2xvci1mb3JtYXQgJXggaXMgbm90IGZsZXhpYmxlIiwgcGFyYW1zLT5lQ29sb3JGb3JtYXQpOwotICAgICAgICAgICAgaW1nLT5tVHlwZSA9IE1lZGlhSW1hZ2U6Ok1FRElBX0lNQUdFX1RZUEVfVU5LTk9XTjsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH07Ci0KLSAgICBERUJVR19QUklOVF9MT1coIk5PVEU6IERlc2NyaWJlIGNvbG9yIGZvcm1hdCA6ICV4IiwgcGFyYW1zLT5lQ29sb3JGb3JtYXQpOwotICAgIERFQlVHX1BSSU5UX0xPVygiICBGcmFtZVdpZHRoIHggRnJhbWVIZWlnaHQgOiAlZCB4ICVkIiwgcGFyYW1zLT5uRnJhbWVXaWR0aCwgcGFyYW1zLT5uRnJhbWVIZWlnaHQpOwotICAgIERFQlVHX1BSSU5UX0xPVygiICBZV2lkdGggeCBZSGVpZ2h0IDogJWQgeCAlZCIsIGltZy0+bVdpZHRoLCBpbWctPm1IZWlnaHQpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5tTnVtUGxhbmVzOyArK2kpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCIgIFBsYW5lWyV6dV0gOiBvZmZzZXQ9JWQgLyB4U3RlcD0lZCAvIHlTdGVwID0gJWQiLAotICAgICAgICAgICAgICAgIGksIGltZy0+bVBsYW5lW2ldLm1PZmZzZXQsIGltZy0+bVBsYW5lW2ldLm1Db2xJbmMsIGltZy0+bVBsYW5lW2ldLm1Sb3dJbmMpOwotICAgIH0KLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSNlbmRpZiAvL0ZMRVhZVVZfU1VQUE9SVEVECi19Ci0KLXZvaWQgb214X3ZkZWM6OnByZWZldGNoTmV3QnVmZmVycygpIHsKLQotICAgIHN0cnVjdCB2NGwyX2RlY29kZXJfY21kIGRlYzsKLSAgICB1aW50MzJfdCBwcmVmZXRjaF9jb3VudDsKLSAgICB1aW50MzJfdCBwcmVmZXRjaF9zaXplOwotICAgIHVpbnQzMl90IHdhbnRfc2l6ZTsKLSAgICB1aW50MzJfdCBoYXZlX3NpemU7Ci0gICAgaW50IGNvbG9yX2ZtdCwgcmM7Ci0gICAgdWludDMyX3QgbmV3X2NhbGN1bGF0ZWRfc2l6ZTsKLSAgICB1aW50MzJfdCBuZXdfYnVmZmVyX3NpemU7Ci0gICAgdWludDMyX3QgbmV3X2J1ZmZlcl9jb3VudDsKLSAgICB1aW50MzJfdCBvbGRfYnVmZmVyX3NpemU7Ci0gICAgdWludDMyX3Qgb2xkX2J1ZmZlcl9jb3VudDsKLQotICAgIG1lbXNldCgodm9pZCAqKSZkZWMsIDAgLCBzaXplb2YoZGVjKSk7Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJPbGQgc2l6ZSA6ICV6dSwgY291bnQgOiAlZCwgd2lkdGggOiAldSwgaGVpZ2h0IDogJXVcbiIsCi0gICAgICAgICAgICBkcnZfY3R4Lm9wX2J1Zi5idWZmZXJfc2l6ZSwgZHJ2X2N0eC5vcF9idWYuYWN0dWFsY291bnQsCi0gICAgICAgICAgICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfd2lkdGgsCi0gICAgICAgICAgICBkcnZfY3R4LnZpZGVvX3Jlc29sdXRpb24uZnJhbWVfaGVpZ2h0KTsKLSAgICBkZWMuY21kID0gVjRMMl9ERUNfUUNPTV9DTURfUkVDT05GSUdfSElOVDsKLSAgICBpZiAoaW9jdGwoZHJ2X2N0eC52aWRlb19kcml2ZXJfZmQsIFZJRElPQ19ERUNPREVSX0NNRCwgJmRlYykpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkJ1ZmZlciBpbmZvIGNtZCBmYWlsZWQgOiAlZFxuIiwgZXJybm8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJvbSBkcml2ZXIsIG5ldyBzaXplIGlzICVkLCBjb3VudCBpcyAlZFxuIiwKLSAgICAgICAgICAgICAgICBkZWMucmF3LmRhdGFbMF0sIGRlYy5yYXcuZGF0YVsxXSk7Ci0gICAgfQotCi0gICAgc3dpdGNoICgoaW50KWRydl9jdHgub3V0cHV0X2Zvcm1hdCkgewotICAgIGNhc2UgVkRFQ19ZVVZfRk9STUFUX05WMTI6Ci0gICAgICAgIGNvbG9yX2ZtdCA9IENPTE9SX0ZNVF9OVjEyOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFZERUNfWVVWX0ZPUk1BVF9OVjEyX1VCV0M6Ci0gICAgICAgIGNvbG9yX2ZtdCA9IENPTE9SX0ZNVF9OVjEyX1VCV0M7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVkRFQ19ZVVZfRk9STUFUX05WMTJfVFAxMF9VQldDOgotICAgICAgICBjb2xvcl9mbXQgPSBDT0xPUl9GTVRfTlYxMl9CUFAxMF9VQldDOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBjb2xvcl9mbXQgPSAtMTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiQ29sb3IgZm9ybWF0IDogJXggbm90IHN1cHBvcnRlZCBmb3Igc2VjdXJlIG1lbW9yeSBwcmVmZXRjaGluZ1xuIiwgZHJ2X2N0eC5vdXRwdXRfZm9ybWF0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5ld19jYWxjdWxhdGVkX3NpemUgPSBWRU5VU19CVUZGRVJfU0laRShjb2xvcl9mbXQsIG1fcmVjb25maWdfd2lkdGgsIG1fcmVjb25maWdfaGVpZ2h0KTsKLSAgICBERUJVR19QUklOVF9MT1coIk5ldyBjYWxjdWxhdGVkIHNpemUgZm9yIHdpZHRoIDogJWQsIGhlaWdodCA6ICVkLCBpcyAlZFxuIiwKLSAgICAgICAgICAgIG1fcmVjb25maWdfd2lkdGgsIG1fcmVjb25maWdfaGVpZ2h0LCBuZXdfY2FsY3VsYXRlZF9zaXplKTsKLSAgICBuZXdfYnVmZmVyX3NpemUgPSAoZGVjLnJhdy5kYXRhWzBdID4gbmV3X2NhbGN1bGF0ZWRfc2l6ZSkgPyBkZWMucmF3LmRhdGFbMF0gOiBuZXdfY2FsY3VsYXRlZF9zaXplOwotICAgIG5ld19idWZmZXJfY291bnQgPSBkZWMucmF3LmRhdGFbMV07Ci0gICAgb2xkX2J1ZmZlcl9zaXplID0gZHJ2X2N0eC5vcF9idWYuYnVmZmVyX3NpemU7Ci0gICAgb2xkX2J1ZmZlcl9jb3VudCA9IGRydl9jdHgub3BfYnVmLmFjdHVhbGNvdW50OwotCi0gICAgbmV3X2J1ZmZlcl9jb3VudCA9IG9sZF9idWZmZXJfY291bnQgPiBuZXdfYnVmZmVyX2NvdW50ID8gb2xkX2J1ZmZlcl9jb3VudCA6IG5ld19idWZmZXJfY291bnQ7Ci0KLSAgICBwcmVmZXRjaF9jb3VudCA9IG5ld19idWZmZXJfY291bnQ7Ci0gICAgcHJlZmV0Y2hfc2l6ZSA9IG5ld19idWZmZXJfc2l6ZSAtIG9sZF9idWZmZXJfc2l6ZTsKLSAgICB3YW50X3NpemUgPSBuZXdfYnVmZmVyX3NpemUgKiBuZXdfYnVmZmVyX2NvdW50OwotICAgIGhhdmVfc2l6ZSA9IG9sZF9idWZmZXJfc2l6ZSAqIG9sZF9idWZmZXJfY291bnQ7Ci0KLSAgICBpZiAod2FudF9zaXplID4gaGF2ZV9zaXplKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiV2FudDogJWQsIGhhdmUgOiAlZFxuIiwgd2FudF9zaXplLCBoYXZlX3NpemUpOwotICAgICAgICBERUJVR19QUklOVF9MT1coInByZWZldGNoX2NvdW50OiAlZCwgcHJlZmV0Y2hfc2l6ZSA6ICVkXG4iLCBwcmVmZXRjaF9jb3VudCwgcHJlZmV0Y2hfc2l6ZSk7Ci0KLSAgICAgICAgaW50IGlvbl9mZCA9IG9wZW4oTUVNX0RFVklDRSwgT19SRE9OTFkpOwotICAgICAgICBpZiAoaW9uX2ZkIDwgMCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIklvbiBmZCBvcGVuIGZhaWxlZCA6ICVkXG4iLCBpb25fZmQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RydWN0IGlvbl9jdXN0b21fZGF0YSAqY3VzdG9tX2RhdGEgPSAoc3RydWN0IGlvbl9jdXN0b21fZGF0YSopIG1hbGxvYyhzaXplb2YoKmN1c3RvbV9kYXRhKSk7Ci0gICAgICAgIHN0cnVjdCBpb25fcHJlZmV0Y2hfZGF0YSAqcHJlZmV0Y2hfZGF0YSA9IChzdHJ1Y3QgaW9uX3ByZWZldGNoX2RhdGEqKSBtYWxsb2Moc2l6ZW9mKCpwcmVmZXRjaF9kYXRhKSk7Ci0gICAgICAgIHN0cnVjdCBpb25fcHJlZmV0Y2hfcmVnaW9ucyAqcmVnaW9ucyA9IChzdHJ1Y3QgaW9uX3ByZWZldGNoX3JlZ2lvbnMqKSBtYWxsb2Moc2l6ZW9mKCpyZWdpb25zKSk7Ci0gICAgICAgIHNpemVfdCAqc2l6ZXMgPSAoc2l6ZV90KikgbWFsbG9jKHNpemVvZihzaXplX3QpICogcHJlZmV0Y2hfY291bnQpOwotCi0gICAgICAgIGlmIChjdXN0b21fZGF0YSA9PSBOVUxMIHx8IHByZWZldGNoX2RhdGEgPT0gTlVMTCB8fCByZWdpb25zID09IE5VTEwgfHwgc2l6ZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInByZWZldGNoIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIGdvdG8gcHJlZmV0Y2hfZXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwcmVmZXRjaF9jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBzaXplc1tpXSA9IHByZWZldGNoX3NpemU7Ci0gICAgICAgIH0KLQotICAgICAgICByZWdpb25zWzBdLm5yX3NpemVzID0gcHJlZmV0Y2hfY291bnQ7Ci0gICAgICAgIHJlZ2lvbnNbMF0uc2l6ZXMgPSBzaXplczsKLSAgICAgICAgcmVnaW9uc1swXS52bWlkID0gSU9OX0ZMQUdfQ1BfUElYRUw7Ci0KLSAgICAgICAgcHJlZmV0Y2hfZGF0YS0+bnJfcmVnaW9ucyA9IDE7Ci0gICAgICAgIHByZWZldGNoX2RhdGEtPnJlZ2lvbnMgPSByZWdpb25zOwotICAgICAgICBwcmVmZXRjaF9kYXRhLT5oZWFwX2lkID0gSU9OX0hFQVAoSU9OX1NFQ1VSRV9IRUFQX0lEKTsKLQotICAgICAgICBjdXN0b21fZGF0YS0+Y21kID0gSU9OX0lPQ19QUkVGRVRDSDsKLSAgICAgICAgY3VzdG9tX2RhdGEtPmFyZyA9ICh1bnNpZ25lZCBsb25nIClwcmVmZXRjaF9kYXRhOwotCi0gICAgICAgIHJjID0gaW9jdGwoaW9uX2ZkLCBJT05fSU9DX0NVU1RPTSwgY3VzdG9tX2RhdGEpOwotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJDdXN0b20gcHJlZmV0Y2ggaW9jdGwgZmFpbGVkIHJjIDogJWQsIGVycm5vIDogJWRcbiIsIHJjLCBlcnJubyk7Ci0gICAgICAgIH0KLQotcHJlZmV0Y2hfZXhpdDoKLSAgICAgICAgY2xvc2UoaW9uX2ZkKTsKLSAgICAgICAgZnJlZShzaXplcyk7Ci0gICAgICAgIGZyZWUocmVnaW9ucyk7Ci0gICAgICAgIGZyZWUocHJlZmV0Y2hfZGF0YSk7Ci0gICAgICAgIGZyZWUoY3VzdG9tX2RhdGEpOwotICAgIH0KLX0KLQotCi12b2lkIHBlcmZfbWV0cmljczo6c3RhcnQoKQotewotICAgIGlmICghYWN0aXZlKSB7Ci0gICAgICAgIHN0YXJ0X3RpbWUgPSBnZXRfYWN0X3RpbWUoKTsKLSAgICAgICAgYWN0aXZlID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLXZvaWQgcGVyZl9tZXRyaWNzOjpzdG9wKCkKLXsKLSAgICBPTVhfVTY0IHN0b3BfdGltZSA9IGdldF9hY3RfdGltZSgpOwotICAgIGlmIChhY3RpdmUpIHsKLSAgICAgICAgcHJvY190aW1lICs9IChzdG9wX3RpbWUgLSBzdGFydF90aW1lKTsKLSAgICAgICAgYWN0aXZlID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIHBlcmZfbWV0cmljczo6ZW5kKE9NWF9VMzIgdW5pdHNfY250cikKLXsKLSAgICBzdG9wKCk7Ci0gICAgQUxPR1YoIi0tPiBQcm9jZXNzaW5nIHRpbWUgOiBbJS4yZl0gU2VjIiwgKGZsb2F0KXByb2NfdGltZSAvIDFlNik7Ci0gICAgaWYgKHVuaXRzX2NudHIpIHsKLSAgICAgICAgQUxPR1YoIi0tPiBBdnJnIHByb2MgdGltZSAgOiBbJS4yZl0gbVNlYyIsIHByb2NfdGltZSAvIChmbG9hdCkodW5pdHNfY250ciAqIDFlMykpOwotICAgIH0KLX0KLQotdm9pZCBwZXJmX21ldHJpY3M6OnJlc2V0KCkKLXsKLSAgICBzdGFydF90aW1lID0gMDsKLSAgICBwcm9jX3RpbWUgPSAwOwotICAgIGFjdGl2ZSA9IGZhbHNlOwotfQotCi1PTVhfVTY0IHBlcmZfbWV0cmljczo6Z2V0X2FjdF90aW1lKCkKLXsKLSAgICBzdHJ1Y3QgdGltZXZhbCBhY3RfdGltZSA9IHswLCAwfTsKLSAgICBnZXR0aW1lb2ZkYXkoJmFjdF90aW1lLCBOVUxMKTsKLSAgICByZXR1cm4gKGFjdF90aW1lLnR2X3VzZWMgKyBhY3RfdGltZS50dl9zZWMgKiAxZTYpOwotfQotCi1PTVhfVTY0IHBlcmZfbWV0cmljczo6cHJvY2Vzc2luZ190aW1lX3VzKCkKLXsKLSAgICByZXR1cm4gcHJvY190aW1lOwotfQotCi0KLS8vIE5vIGNvZGUgYmV5b25kIHRoaXMgIQotCi0vLyBpbmxpbmUgaW1wb3J0IG9mIHZlbmRvci1leHRlbnNpb25zIGltcGxlbWVudGF0aW9uCi0jaW5jbHVkZSAib214X3ZkZWNfZXh0ZW5zaW9ucy5ocHAiCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvc3JjL3RzX3BhcnNlci5jcHAgYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZkZWMvc3JjL3RzX3BhcnNlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOWExZjcuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZGVjL3NyYy90c19wYXJzZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMC0yMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yCi0gICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTi1JTkZSSU5HRU1FTlQgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAidHNfcGFyc2VyLmgiCi0jaW5jbHVkZSAidmlkY19kZWJ1Zy5oIgotCi0jZGVmaW5lIERFQlVHIERFQlVHX1BSSU5UX0VSUk9SCi0KLXZvaWQgb214X3RpbWVfc3RhbXBfcmVvcmRlcjo6c2V0X3RpbWVzdGFtcF9yZW9yZGVyX21vZGUoYm9vbCBtb2RlKQotewotICAgIGF1dG9fbG9jayBsKCZtX2xvY2spOwotICAgIHJlb3JkZXJfdHMgPSBtb2RlOwotfQotCi12b2lkIG9teF90aW1lX3N0YW1wX3Jlb3JkZXI6OmVuYWJsZV9kZWJ1Z19wcmludChib29sIGZsYWcpCi17Ci0gICAgYXV0b19sb2NrIGwoJm1fbG9jayk7Ci0gICAgcHJpbnRfZGVidWcgPSBmbGFnOwotfQotCi1vbXhfdGltZV9zdGFtcF9yZW9yZGVyOjp+b214X3RpbWVfc3RhbXBfcmVvcmRlcigpCi17Ci0gICAgZGVsZXRlX2xpc3QoKTsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fbG9jayk7Ci19Ci0KLW9teF90aW1lX3N0YW1wX3Jlb3JkZXI6Om9teF90aW1lX3N0YW1wX3Jlb3JkZXIoKQotewotICAgIHJlb3JkZXJfdHMgPSBmYWxzZTsKLSAgICBwaGVhZCA9IHBjdXJyZW50ID0gTlVMTDsKLSAgICBlcnJvciA9IGZhbHNlOwotICAgIHByaW50X2RlYnVnID0gZmFsc2U7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZtX2xvY2ssIE5VTEwpOwotfQotCi12b2lkIG9teF90aW1lX3N0YW1wX3Jlb3JkZXI6OmRlbGV0ZV9saXN0KCkKLXsKLSAgICB0aW1lX3N0YW1wX2xpc3QgKnB0ZW1wOwotCi0gICAgaWYgKCFwaGVhZCkgcmV0dXJuOwotCi0gICAgd2hpbGUgKHBoZWFkLT5uZXh0ICE9IHBoZWFkKSB7Ci0gICAgICAgIHB0ZW1wID0gcGhlYWQ7Ci0gICAgICAgIHBoZWFkID0gcGhlYWQtPm5leHQ7Ci0gICAgICAgIHBoZWFkLT5wcmV2ID0gcHRlbXAtPnByZXY7Ci0gICAgICAgIHB0ZW1wLT5wcmV2LT5uZXh0ID0gcGhlYWQ7Ci0gICAgICAgIGRlbGV0ZSBwdGVtcDsKLSAgICB9Ci0KLSAgICBkZWxldGUgcGhlYWQ7Ci0gICAgcGhlYWQgPSBOVUxMOwotfQotCi1ib29sIG9teF90aW1lX3N0YW1wX3Jlb3JkZXI6OmdldF9jdXJyZW50X2xpc3QoKQotewotICAgIGlmICghcGhlYWQpIHsKLSAgICAgICAgaWYgKCFhZGRfbmV3X2xpc3QoKSkgewotICAgICAgICAgICAgaGFuZGxlX2Vycm9yKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwY3VycmVudCA9IHBoZWFkLT5wcmV2OwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIG9teF90aW1lX3N0YW1wX3Jlb3JkZXI6OnVwZGF0ZV9oZWFkKCkKLXsKLSAgICB0aW1lX3N0YW1wX2xpc3QgKnB0ZW1wOwotCi0gICAgaWYgKCFwaGVhZCkgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHBoZWFkLT5uZXh0ICE9IHBoZWFkKSB7Ci0gICAgICAgIHB0ZW1wID0gcGhlYWQ7Ci0gICAgICAgIHBoZWFkID0gcHRlbXAtPm5leHQ7Ci0gICAgICAgIHBoZWFkLT5wcmV2ID0gcHRlbXAtPnByZXY7Ci0gICAgICAgIHB0ZW1wLT5wcmV2LT5uZXh0ID0gcGhlYWQ7Ci0gICAgICAgIGRlbGV0ZSBwdGVtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBvbXhfdGltZV9zdGFtcF9yZW9yZGVyOjphZGRfbmV3X2xpc3QoKQotewotICAgIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLSAgICB0aW1lX3N0YW1wX2xpc3QgKnB0ZW1wID0gTlVMTDsKLQotICAgIGlmICghcGhlYWQpIHsKLSAgICAgICAgcHRlbXAgPSBwaGVhZCA9IG5ldyB0aW1lX3N0YW1wX2xpc3Q7Ci0KLSAgICAgICAgaWYgKCFwaGVhZCkgewotICAgICAgICAgICAgaGFuZGxlX2Vycm9yKCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwaGVhZC0+cHJldiA9IHBoZWFkLT5uZXh0ID0gcGhlYWQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHRlbXAgPSBuZXcgdGltZV9zdGFtcF9saXN0OwotCi0gICAgICAgIGlmICghcHRlbXApIHsKLSAgICAgICAgICAgIGhhbmRsZV9lcnJvcigpOwotICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHRlbXAtPnByZXYgPSBwaGVhZC0+cHJldjsKLSAgICAgICAgcHRlbXAtPm5leHQgPSBwaGVhZDsKLSAgICAgICAgcGhlYWQtPnByZXYtPm5leHQgPSBwdGVtcDsKLSAgICAgICAgcGhlYWQtPnByZXYgPSBwdGVtcDsKLSAgICB9Ci0KLSAgICBwdGVtcC0+ZW50cmllc19maWxsZWQgPSAwOwotCi0gICAgZm9yIChpbnQgaT0wOyBpIDwgVElNRV9TWjsgaSsrKSB7Ci0gICAgICAgIHB0ZW1wLT5pbnB1dF90aW1lc3RhbXBzW2ldLmluX3VzZSA9IGZhbHNlOwotICAgICAgICBwdGVtcC0+aW5wdXRfdGltZXN0YW1wc1tpXS50aW1lc3RhbXBzID0gLTE7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotYm9vbCBvbXhfdGltZV9zdGFtcF9yZW9yZGVyOjppbnNlcnRfdGltZXN0YW1wKE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIpCi17Ci0gICAgYXV0b19sb2NrIGwoJm1fbG9jayk7Ci0gICAgT01YX1RJQ0tTICp0YWJsZV9lbnRyeSA9IE5VTEw7Ci0KLSAgICBpZiAoIXJlb3JkZXJfdHMgfHwgZXJyb3IgfHwgIWhlYWRlcikgewotICAgICAgICBpZiAoZXJyb3IgfHwgIWhlYWRlcikKLSAgICAgICAgICAgIERFQlVHKCJJbnZhbGlkIGNvbmRpdGlvbiBpbiBpbnNlcnRfdGltZXN0YW1wICVwIiwgaGVhZGVyKTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFnZXRfY3VycmVudF9saXN0KCkpIHsKLSAgICAgICAgaGFuZGxlX2Vycm9yKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAocGN1cnJlbnQtPmVudHJpZXNfZmlsbGVkID4gKFRJTUVfU1ogLSAxKSkgewotICAgICAgICBERUJVRygiVGFibGUgZnVsbCByZXR1cm4gZXJyb3IiKTsKLSAgICAgICAgaGFuZGxlX2Vycm9yKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoaGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoKGhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAmJiAhaGVhZGVyLT5uRmlsbGVkTGVuKSB7Ci0gICAgICAgIERFQlVHKCJFT1Mgd2l0aCB6ZXJvIGxlbmd0aCByZWNpZXZlZCIpOwotCi0gICAgICAgIGlmICghYWRkX25ld19saXN0KCkpIHsKLSAgICAgICAgICAgIGhhbmRsZV9lcnJvcigpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUSU1FX1NaICYmICF0YWJsZV9lbnRyeTsgaSsrKSB7Ci0gICAgICAgIGlmICghcGN1cnJlbnQtPmlucHV0X3RpbWVzdGFtcHNbaV0uaW5fdXNlKSB7Ci0gICAgICAgICAgICB0YWJsZV9lbnRyeSA9ICZwY3VycmVudC0+aW5wdXRfdGltZXN0YW1wc1tpXS50aW1lc3RhbXBzOwotICAgICAgICAgICAgcGN1cnJlbnQtPmlucHV0X3RpbWVzdGFtcHNbaV0uaW5fdXNlID0gdHJ1ZTsKLSAgICAgICAgICAgIHBjdXJyZW50LT5lbnRyaWVzX2ZpbGxlZCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCF0YWJsZV9lbnRyeSkgewotICAgICAgICBERUJVRygiQWxsIGVudHJpZXMgaW4gdXNlIik7Ci0gICAgICAgIGhhbmRsZV9lcnJvcigpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnRhYmxlX2VudHJ5ID0gaGVhZGVyLT5uVGltZVN0YW1wOwotCi0gICAgaWYgKHByaW50X2RlYnVnKQotICAgICAgICBERUJVRygiVGltZSBzdGFtcCBpbnNlcnRlZCAlbGxkIiwgaGVhZGVyLT5uVGltZVN0YW1wKTsKLQotICAgIGlmIChoZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICBpZiAoIWFkZF9uZXdfbGlzdCgpKSB7Ci0gICAgICAgICAgICBoYW5kbGVfZXJyb3IoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIG9teF90aW1lX3N0YW1wX3Jlb3JkZXI6OnJlbW92ZV90aW1lX3N0YW1wKE9NWF9USUNLUyB0cywgYm9vbCBpc19pbnRlcmxhY2VkID0gZmFsc2UpCi17Ci0gICAgYXV0b19sb2NrIGwoJm1fbG9jayk7Ci0gICAgdW5zaWduZWQgaW50IG51bV9lbnRfcmVtb3ZlID0gKGlzX2ludGVybGFjZWQpPzI6MTsKLQotICAgIGlmICghcmVvcmRlcl90cyB8fCBlcnJvcikgewotICAgICAgICBERUJVRygibm90IGluIGF2aSBtb2RlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIXBoZWFkIHx8ICFwaGVhZC0+ZW50cmllc19maWxsZWQpIHJldHVybiBmYWxzZTsKLQotICAgIGZvciAoaW50IGk9MDsgaSA8IFRJTUVfU1ogJiYgbnVtX2VudF9yZW1vdmU7IGkrKykgewotICAgICAgICBpZiAocGhlYWQtPmlucHV0X3RpbWVzdGFtcHNbaV0uaW5fdXNlICYmIHBoZWFkLT5pbnB1dF90aW1lc3RhbXBzW2ldLnRpbWVzdGFtcHMgPT0gdHMpIHsKLSAgICAgICAgICAgIHBoZWFkLT5pbnB1dF90aW1lc3RhbXBzW2ldLmluX3VzZSA9IGZhbHNlOwotICAgICAgICAgICAgcGhlYWQtPmVudHJpZXNfZmlsbGVkLS07Ci0gICAgICAgICAgICBudW1fZW50X3JlbW92ZS0tOwotCi0gICAgICAgICAgICBpZiAocHJpbnRfZGVidWcpCi0gICAgICAgICAgICAgICAgREVCVUcoIlJlbW92ZWQgVFMgJWxsZCIsIHRzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghcGhlYWQtPmVudHJpZXNfZmlsbGVkKSB7Ci0gICAgICAgIGlmICghdXBkYXRlX2hlYWQoKSkgewotICAgICAgICAgICAgaGFuZGxlX2Vycm9yKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBvbXhfdGltZV9zdGFtcF9yZW9yZGVyOjpmbHVzaF90aW1lc3RhbXAoKQotewotICAgIGF1dG9fbG9jayBsKCZtX2xvY2spOwotICAgIGRlbGV0ZV9saXN0KCk7Ci19Ci0KLWJvb2wgb214X3RpbWVfc3RhbXBfcmVvcmRlcjo6Z2V0X25leHRfdGltZXN0YW1wKE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsIGJvb2wgaXNfaW50ZXJsYWNlZCkKLXsKLSAgICBhdXRvX2xvY2sgbCgmbV9sb2NrKTsKLSAgICB0aW1lc3RhbXAgKmVsZW1lbnQgPSBOVUxMLCpkdXBsaWNhdGUgPSBOVUxMOwotICAgIGJvb2wgc3RhdHVzID0gZmFsc2U7Ci0KLSAgICBpZiAoIXJlb3JkZXJfdHMgfHwgZXJyb3IgfHwgIWhlYWRlcikgewotICAgICAgICBpZiAoZXJyb3IgfHwgIWhlYWRlcikKLSAgICAgICAgICAgIERFQlVHKCJJbnZhbGlkIGNvbmRpdGlvbiBpbiBpbnNlcnRfdGltZXN0YW1wICVwIiwgaGVhZGVyKTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFwaGVhZCB8fCAhcGhlYWQtPmVudHJpZXNfZmlsbGVkKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBmb3IgKGludCBpPTA7IGkgPCBUSU1FX1NaOyBpKyspIHsKLSAgICAgICAgaWYgKHBoZWFkLT5pbnB1dF90aW1lc3RhbXBzW2ldLmluX3VzZSkgewotICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKCFlbGVtZW50KQotICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAmcGhlYWQtPmlucHV0X3RpbWVzdGFtcHNbaV07Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC0+dGltZXN0YW1wcyA+IHBoZWFkLT5pbnB1dF90aW1lc3RhbXBzW2ldLnRpbWVzdGFtcHMpIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICZwaGVhZC0+aW5wdXRfdGltZXN0YW1wc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQtPnRpbWVzdGFtcHMgPT0gcGhlYWQtPmlucHV0X3RpbWVzdGFtcHNbaV0udGltZXN0YW1wcykKLSAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlID0gJnBoZWFkLT5pbnB1dF90aW1lc3RhbXBzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVsZW1lbnQpIHsKLSAgICAgICAgcGhlYWQtPmVudHJpZXNfZmlsbGVkLS07Ci0gICAgICAgIGhlYWRlci0+blRpbWVTdGFtcCA9IGVsZW1lbnQtPnRpbWVzdGFtcHM7Ci0KLSAgICAgICAgaWYgKHByaW50X2RlYnVnKQotICAgICAgICAgICAgREVCVUcoIkdldG5leHQgVGltZSBzdGFtcCAlbGxkIiwgaGVhZGVyLT5uVGltZVN0YW1wKTsKLQotICAgICAgICBlbGVtZW50LT5pbl91c2UgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoaXNfaW50ZXJsYWNlZCAmJiBkdXBsaWNhdGUpIHsKLSAgICAgICAgcGhlYWQtPmVudHJpZXNfZmlsbGVkLS07Ci0gICAgICAgIGR1cGxpY2F0ZS0+aW5fdXNlID0gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChpc19pbnRlcmxhY2VkICYmICFkdXBsaWNhdGUpIHsKLSAgICAgICAgZWxlbWVudCA9IE5VTEw7Ci0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgVElNRV9TWjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocGhlYWQtPmlucHV0X3RpbWVzdGFtcHNbaV0uaW5fdXNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50KQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gJnBoZWFkLT5pbnB1dF90aW1lc3RhbXBzW2ldOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQtPnRpbWVzdGFtcHMgPiBwaGVhZC0+aW5wdXRfdGltZXN0YW1wc1tpXS50aW1lc3RhbXBzKQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gJnBoZWFkLT5pbnB1dF90aW1lc3RhbXBzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHBoZWFkLT5lbnRyaWVzX2ZpbGxlZC0tOwotICAgICAgICAgICAgaGVhZGVyLT5uVGltZVN0YW1wID0gZWxlbWVudC0+dGltZXN0YW1wczsKLSAgICAgICAgICAgIGVsZW1lbnQtPmluX3VzZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFwaGVhZC0+ZW50cmllc19maWxsZWQpIHsKLSAgICAgICAgaWYgKCF1cGRhdGVfaGVhZCgpKSB7Ci0gICAgICAgICAgICBoYW5kbGVfZXJyb3IoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvQW5kcm9pZC5tayBiL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MzI2ZDFkLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAJCQkJQ29tbW9uIGRlZmluaXRvbnMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWxpYm1tLXZlbmMtZGVmIDo9IC1nIC1PMyAtRGxyaW50Zj1fZmZpeF9yCi1saWJtbS12ZW5jLWRlZiArPSAtRF9fYWxpZ249X19hbGlnbngKLWxpYm1tLXZlbmMtZGVmICs9IC1EX19hbGlnbnhcKHhcKT1fX2F0dHJpYnV0ZV9fXChcKF9fYWxpZ25lZF9fXCh4XClcKVwpCi1saWJtbS12ZW5jLWRlZiArPSAtRFRfQVJNCi1saWJtbS12ZW5jLWRlZiArPSAtRGlubGluZT1fX2lubGluZQotbGlibW0tdmVuYy1kZWYgKz0gLURfQU5EUk9JRF8KLWxpYm1tLXZlbmMtZGVmICs9IC1VRU5BQkxFX0RFQlVHX0xPVwotbGlibW0tdmVuYy1kZWYgKz0gLVVFTkFCTEVfREVCVUdfSElHSAotbGlibW0tdmVuYy1kZWYgKz0gLURFTkFCTEVfREVCVUdfRVJST1IKLWxpYm1tLXZlbmMtZGVmICs9IC1VSU5QVVRfQlVGRkVSX0xPRwotbGlibW0tdmVuYy1kZWYgKz0gLVVPVVRQVVRfQlVGRkVSX0xPRwotbGlibW0tdmVuYy1kZWYgKz0gLVVTSU5HTEVfRU5DT0RFUl9JTlNUQU5DRQotbGlibW0tdmVuYy1kZWYgKz0gLVdlcnJvcgotbGlibW0tdmVuYy1kZWYgKz0gLURfQU5EUk9JRF9JQ1NfCi0KLVRBUkdFVFNfVEhBVF9VU0VfRkxBR19NU004MjI2IDo9IG1zbTgyMjYgbXNtODkxNiBtc204OTA5Ci1UQVJHRVRTX1RIQVRfTkVFRF9TV19WRU5DX01QRUc0IDo9IG1zbTg5MDkgbXNtODkzNyBzZG04NDUKLVRBUkdFVFNfVEhBVF9ORUVEX1NXX1ZFTkNfSEVWQyA6PSBtc204OTkyCi1UQVJHRVRTX1RIQVRfU1VQUE9SVF9VQldDIDo9IG1zbTg5OTYgbXNtODk5OCBzZG04NDUKLVRBUkdFVFNfVEhBVF9TVVBQT1JUX1ZRWklQIDo9IG1zbTg5OTYgbXNtODk5OAotVEFSR0VUU19USEFUX1NVUFBPUlRfUFEgOj0gbXNtODk5NiBtc204OTk4IHNkbTY2MAotCi1pZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODYxMCkKLWxpYm1tLXZlbmMtZGVmICs9IC1EX01TTTg2MTBfCi1lbmRpZgotCi1pZmVxICgkKGNhbGwgaXMtYm9hcmQtcGxhdGZvcm0taW4tbGlzdCwgJChUQVJHRVRTX1RIQVRfU1VQUE9SVF9VQldDKSksdHJ1ZSkKLWxpYm1tLXZlbmMtZGVmICs9IC1EX1VCV0NfCi1lbmRpZgotCi1pZmVxICgkKGNhbGwgaXMtYm9hcmQtcGxhdGZvcm0taW4tbGlzdCwgJChUQVJHRVRTX1RIQVRfU1VQUE9SVF9WUVpJUCkpLHRydWUpCi1saWJtbS12ZW5jLWRlZiArPSAtRF9WUVpJUF8KLWVuZGlmCi0KLWlmZXEgKCQoY2FsbCBpcy1ib2FyZC1wbGF0Zm9ybS1pbi1saXN0LCAkKFRBUkdFVFNfVEhBVF9TVVBQT1JUX1BRKSksdHJ1ZSkKLWxpYm1tLXZlbmMtZGVmICs9IC1EX1BRXwotZW5kaWYKLQotaWZlcSAoJChjYWxsIGlzLWJvYXJkLXBsYXRmb3JtLWluLWxpc3QsICQoVEFSR0VUU19USEFUX1VTRV9GTEFHX01TTTgyMjYpKSx0cnVlKQotbGlibW0tdmVuYy1kZWYgKz0gLURfTVNNODIyNl8KLWVuZGlmCi0KLWlmZXEgKCQoVEFSR0VUX1VTRVNfSU9OKSx0cnVlKQotbGlibW0tdmVuYy1kZWYgKz0gLURVU0VfSU9OCi1lbmRpZgotCi1pZmVxICgkKFRBUkdFVF9VU0VTX01FRElBX0VYVEVOU0lPTlMpLHRydWUpCi1saWJtbS12ZW5jLWRlZiArPSAtRFVTRV9OQVRJVkVfSEFORExFX1NPVVJDRQotZW5kaWYKLQotaWZlcSAoJChjYWxsIGlzLWJvYXJkLXBsYXRmb3JtLWluLWxpc3QsICQoTUFTVEVSX1NJREVfQ1BfVEFSR0VUX0xJU1QpKSx0cnVlKQotbGlibW0tdmVuYy1kZWYgKz0gLURNQVNURVJfU0lERV9DUAotZW5kaWYKLQotbGlibW0tdmVuYy1kZWYgKz0gLURVU0VfQ0FNRVJBX01FVEFCVUZGRVJfVVRJTFMKLQotIyBDb21tb24gSW5jbHVkZXMKLWxpYm1tLXZlbmMtaW5jICAgICAgOj0gJChMT0NBTF9QQVRIKS9pbmMKLWxpYm1tLXZlbmMtaW5jICAgICAgKz0gJChUT1ApL2hhcmR3YXJlL3Fjb20vbWVkaWEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy9jb21tb24vaW5jCi1saWJtbS12ZW5jLWluYyAgICAgICs9IGhhcmR3YXJlL3Fjb20vbWVkaWEvc2RtODQ1L21tLWNvcmUvaW5jCi1saWJtbS12ZW5jLWluYyAgICAgICs9IGhhcmR3YXJlL3Fjb20vbWVkaWEvc2RtODQ1L2xpYnN0YWdlZnJpZ2h0aHcKLWxpYm1tLXZlbmMtaW5jICAgICAgKz0gJChUQVJHRVRfT1VUX0hFQURFUlMpL3Fjb20vZGlzcGxheQotbGlibW0tdmVuYy1pbmMgICAgICArPSAkKFRBUkdFVF9PVVRfSEVBREVSUykvYWRyZW5vCi1saWJtbS12ZW5jLWluYyAgICAgICs9IGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUKLWxpYm1tLXZlbmMtaW5jICAgICAgKz0gZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci1saWJtbS12ZW5jLWluYyAgICAgICs9IGhhcmR3YXJlL3Fjb20vbWVkaWEvc2RtODQ1L2xpYmMyZGNvbG9yY29udmVydAotbGlibW0tdmVuYy1pbmMgICAgICArPSAkKFRBUkdFVF9PVVRfSEVBREVSUykvbGlidnF6aXAKLWxpYm1tLXZlbmMtaW5jICAgICAgKz0gJChUQVJHRVRfT1VUX0hFQURFUlMpL2xpYmdwdXN0YXRzCi1saWJtbS12ZW5jLWluYyAgICAgICs9ICQoVEFSR0VUX09VVF9JTlRFUk1FRElBVEVTKS9LRVJORUxfT0JKL3Vzci9pbmNsdWRlCi1saWJtbS12ZW5jLWluYyAgICAgICs9IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvbmF0aXZlYmFzZS9pbmNsdWRlCi0KLSMgQ29tbW9uIERlcGVuZGVuY2llcwotbGlibW0tdmVuYy1hZGQtZGVwICA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvS0VSTkVMX09CSi91c3IKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgCQkJTWFrZSB0aGUgU2hhcmVkIGxpYnJhcnkgKGxpYk9teFZlbmMpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFICAgICAgICAgICAgICAgICAgICA6PSBsaWJPbXhWZW5jCi1MT0NBTF9NT0RVTEVfVEFHUyAgICAgICAgICAgICAgIDo9IG9wdGlvbmFsCi1MT0NBTF9WRU5ET1JfTU9EVUxFICAgICAgICAgICAgIDo9IHRydWUKLUxPQ0FMX0NGTEFHUyAgICAgICAgICAgICAgICAgICAgOj0gJChsaWJtbS12ZW5jLWRlZikKLUxPQ0FMX0NfSU5DTFVERVMgICAgICAgICAgICAgICAgOj0gJChsaWJtbS12ZW5jLWluYykKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTICAgOj0gJChsaWJtbS12ZW5jLWFkZC1kZXApCi0KLUxPQ0FMX1BSRUxJTktfTU9EVUxFICAgICAgOj0gZmFsc2UKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICAgOj0gbGlibG9nIGxpYmN1dGlscyBsaWJkbAotCi0jIGlmZXEgKCQoQk9BUkRfVVNFU19BRFJFTk8pLCB0cnVlKQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgICArPSBsaWJjMmRjb2xvcmNvbnZlcnQKLSMgZW5kaWYgIyAoJChCT0FSRF9VU0VTX0FEUkVOTyksIHRydWUpCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnFkTWV0YURhdGEKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgICAgOj0gbGliT214VmlkY0NvbW1vbgotCi1MT0NBTF9TUkNfRklMRVMgICA6PSBzcmMvb214X3ZpZGVvX2Jhc2UuY3BwCi1MT0NBTF9TUkNfRklMRVMgICArPSBzcmMvb214X3ZpZGVvX2VuY29kZXIuY3BwCi1MT0NBTF9TUkNfRklMRVMgICArPSBzcmMvdmlkZW9fZW5jb2Rlcl9kZXZpY2VfdjRsMi5jcHAKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1pZmVxICgkKGNhbGwgaXMtYm9hcmQtcGxhdGZvcm0taW4tbGlzdCwgJChUQVJHRVRTX1RIQVRfTkVFRF9TV19WRU5DX01QRUc0KSksdHJ1ZSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIAkJCU1ha2UgdGhlIFNoYXJlZCBsaWJyYXJ5IChsaWJPbXhTd1ZlbmNNcGVnNCkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1saWJtbS12ZW5jLWluYyAgICAgICs9ICQoVEFSR0VUX09VVF9IRUFERVJTKS9tbS12aWRlby9zd3ZlbmMKLQotTE9DQUxfTU9EVUxFICAgICAgICAgICAgICAgICAgICA6PSBsaWJPbXhTd1ZlbmNNcGVnNAotCi1MT0NBTF9NT0RVTEVfVEFHUyAgICAgICAgICAgICAgIDo9IG9wdGlvbmFsCi1MT0NBTF9WRU5ET1JfTU9EVUxFICAgICAgICAgICAgIDo9IHRydWUKLUxPQ0FMX0NGTEFHUyAgICAgICAgICAgICAgICAgICAgOj0gJChsaWJtbS12ZW5jLWRlZikKLUxPQ0FMX0NfSU5DTFVERVMgICAgICAgICAgICAgICAgOj0gJChsaWJtbS12ZW5jLWluYykKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTICAgOj0gJChsaWJtbS12ZW5jLWFkZC1kZXApCi0KLUxPQ0FMX1BSRUxJTktfTU9EVUxFICAgICAgOj0gZmFsc2UKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICAgOj0gbGlibG9nIGxpYmN1dGlscyBsaWJkbAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgICArPSBsaWJNcGVnNFN3RW5jb2RlcgotIyBpZmVxICgkKEJPQVJEX1VTRVNfQURSRU5PKSwgdHJ1ZSkKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICAgKz0gbGliYzJkY29sb3Jjb252ZXJ0Ci0jIGVuZGlmICMgKCQoQk9BUkRfVVNFU19BRFJFTk8pLCB0cnVlKQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyAgICA6PSBsaWJPbXhWaWRjQ29tbW9uCi0KLUxPQ0FMX1NSQ19GSUxFUyAgIDo9IHNyYy9vbXhfdmlkZW9fYmFzZS5jcHAKLUxPQ0FMX1NSQ19GSUxFUyAgICs9IHNyYy9vbXhfc3d2ZW5jX21wZWc0LmNwcAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi1lbmRpZgotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIAkJCQkJRU5ECi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL01ha2VmaWxlLmFtIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWQ1YzhmLi4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSNBTV9DRkxBR1MgPSAtV2FsbAotI0FNX0NGTEFHUyA9IC1XdW5kZWYKLSNBTV9DRkxBR1MgKz0gLVdzdHJpY3QtcHJvdG90eXBlcwotI0FNX0NGTEFHUyArPSAtV25vLXRyaWdyYXBocwotI0FNX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgotCi1BTV9DUFBGTEFHUyA9IC1EX19hbGlnbnhcKHhcKT1fX2F0dHJpYnV0ZV9fXChcKF9fYWxpZ25lZF9fXCh4XClcKVwpCi1BTV9DUFBGTEFHUyArPSAtRF9fYWxpZ249X19hbGlnbngKLUFNX0NQUEZMQUdTICs9IC1EaW5saW5lPV9faW5saW5lCi1BTV9DUFBGTEFHUyArPSAtRElNQUdFX0FQUFNfUFJPQwotQU1fQ1BQRkxBR1MgKz0gLURDREVDTAotQU1fQ1BQRkxBR1MgKz0gLURUX0FSTQotQU1fQ1BQRkxBR1MgKz0gLUROT19BUk1fQ0xaCi1BTV9DUFBGTEFHUyArPSAtRF9BTkRST0lEXwotQU1fQ1BQRkxBR1MgKz0gLVVFTkFCTEVfREVCVUdfTE9XCi1BTV9DUFBGTEFHUyArPSAtREVOQUJMRV9ERUJVR19ISUdICi1BTV9DUFBGTEFHUyArPSAtREVOQUJMRV9ERUJVR19FUlJPUgotQU1fQ1BQRkxBR1MgKz0gLVVJTlBVVF9CVUZGRVJfTE9HCi1BTV9DUFBGTEFHUyArPSAtVU9VVFBVVF9CVUZGRVJfTE9HCi1BTV9DUFBGTEFHUyArPSAtV2Vycm9yCi1BTV9DUFBGTEFHUyArPSAtRF9BTkRST0lEX0lDU18KLUFNX0NQUEZMQUdTICs9IC1EVVNFX0lPTgotI0FNX0NQUEZMQUdTICs9ICItaW5jbHVkZSBzdGRpbnQuaCIKLUFNX0NQUEZMQUdTICs9ICItRHN0cmxjcHk9Z19zdHJsY3B5IgotQU1fQ1BQRkxBR1MgKz0gIi1Ec3RybGNhdD1nX3N0cmxjYXQiCi1BTV9DUFBGTEFHUyArPSAiLXN0ZD1jKysxMSIKLUFNX0NQUEZMQUdTICs9IC1Xbm8tdW5kZWYKLUFNX0NQUEZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCi1BTV9DUFBGTEFHUyArPSAtZyAtTzMKLUFNX0NQUEZMQUdTICs9ICItREhBVkVfQU5EUk9JRF9PUyIKLUFNX0NQUEZMQUdTICs9ICItRFVTRV9DQU1FUkFfTUVUQUJVRkZFUl9VVElMUyIKLQotaWYgVVNFX0dMSUIKLUFNX0NQUEZMQUdTICs9IC1EX1VTRV9HTElCXwotZW5kaWYKLQotaWYgVEFSR0VUX01TTTg2MTAKLUFNX0NQUEZMQUdTICs9IC1EX01TTTg2MTBfCi1lbmRpZgotCi1pZiBUQVJHRVRTX1RIQVRfU1VQUE9SVF9QUQotQU1fQ1BQRkxBR1MgKz0gLURfUFFfCi1lbmRpZgotCi1pZiBUQVJHRVRTX1RIQVRfVVNFX0ZMQUdfTVNNODIyNgotQU1fQ1BQRkxBR1MgKz0gLURfTVNNODIyNl8KLWVuZGlmCi0KLWlmIFRBUkdFVF9VU0VTX01FRElBX0VYVEVOU0lPTlMKLUFNX0NQUEZMQUdTICs9IC1EVVNFX05BVElWRV9IQU5ETEVfU09VUkNFCi1lbmRpZgotCi1pZiBNQVNURVJfU0lERV9DUF9UQVJHRVRfTElTVAotQU1fQ1BQRkxBR1MgKz0gLURNQVNURVJfU0lERV9DUAotZW5kaWYKLQotQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL21tLXZpZGVvLXY0bDIvdmlkYy9jb21tb24vaW5jLwotQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL2luYy8KLUFNX0NQUEZMQUdTICs9IC1JJCh0b3Bfc3JjZGlyKS9saWJjMmRjb2xvcmNvbnZlcnQvCi1BTV9DUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvbW0tY29yZS9pbmMvCi1BTV9DUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvbW0tY29yZS9zcmMvY29tbW9uLwotQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL2xpYnN0YWdlZnJpZ2h0aHcvCi0KLXNvdXJjZXMgPSBzcmMvb214X3ZpZGVvX2Jhc2UuY3BwCi1zb3VyY2VzICs9IHNyYy9vbXhfdmlkZW9fZW5jb2Rlci5jcHAKLXNvdXJjZXMgKz0gc3JjL3ZpZGVvX2VuY29kZXJfZGV2aWNlX3Y0bDIuY3BwCi1zb3VyY2VzICs9ICQodG9wX3NyY2RpcikvbW0tdmlkZW8tdjRsMi92aWRjL2NvbW1vbi9zcmMvZXh0cmFfZGF0YV9oYW5kbGVyLmNwcAotc291cmNlcyArPSAkKHRvcF9zcmNkaXIpL21tLXZpZGVvLXY0bDIvdmlkYy9jb21tb24vc3JjL3ZpZGNfY29sb3JfY29udmVydGVyLmNwcAotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJPbXhWZW5jLmxhCi1saWJPbXhWZW5jX2xhX1NPVVJDRVMgPSAkKHNvdXJjZXMpCi1saWJPbXhWZW5jX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKEFNX0NQUEZMQUdTKSAtZlBJQwotI2xpYk9teFZlbmNfbGFfTERMSUJTID0gLi4vbGliYzJkMmNvbG9yY29udmVydC9saWJjMmRjb2xvcmNvbnZlcnQubGEKLSNsaWJPbXhWZW5jX2xhX0xJQkFERCAgPSAuLi8uLi8uLi9tbS1jb3JlL2xpYk9teENvcmUubGEKLWxpYk9teFZlbmNfbGFfTERGTEFHUyA9IC1sc3RkYysrIC1scHRocmVhZCAtbGxvZyAtbHV0aWxzIC1sYmluZGVyIC1sY3V0aWxzIC1sZ2xpYi0yLjAgLWxiYXNlIC1sZGwgLWxwdGhyZWFkIC1zaGFyZWQgLWxxZE1ldGFEYXRhCi0jICAtbGMyZDIgLWxndWkgLWxPbXhDb3JlIC1sZ3B1c3RhdHMgLWxkbCAtbHB0aHJlYWQKLWxpYk9teFZlbmNfbGFfTERGTEFHUyArPSAtdmVyc2lvbi1pbmZvIDAKZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9pbmMvb214X3N3dmVuY19tcGVnNC5oIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL2luYy9vbXhfc3d2ZW5jX21wZWc0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNjhjZTMuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL2luYy9vbXhfc3d2ZW5jX21wZWc0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi1XQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIF9fT01YX1ZFTkNfX0gKLSNkZWZpbmUgX19PTVhfVkVOQ19fSAotCi0jZGVmaW5lIFZFTl9FWFRSQURBVEFfU0xJQ0VJTkZPICAgICAweDEwMAotI2RlZmluZSBWRU5fRVhUUkFEQVRBX01CSU5GTyAgICAgICAgMHg0MDAKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgIm9teF92aWRlb19iYXNlLmgiCi0jaW5jbHVkZSAidmlkZW9fZW5jb2Rlcl9kZXZpY2VfdjRsMi5oIgotCi0jaW5jbHVkZSAic3d2ZW5jX2FwaS5oIgotI2luY2x1ZGUgInN3dmVuY190eXBlcy5oIgotCi1leHRlcm4gIkMiIHsKLSAgICBPTVhfQVBJIHZvaWQgKiBnZXRfb214X2NvbXBvbmVudF9mYWN0b3J5X2ZuKHZvaWQpOwotfQotCi1zdHJ1Y3Qgc3d2ZW5jX3ZpZGVvX2NhcGFiaWxpdHkgewotICAgIHVuc2lnbmVkIGludCBtaW5fd2lkdGg7Ci0gICAgdW5zaWduZWQgaW50IG1heF93aWR0aDsKLSAgICB1bnNpZ25lZCBpbnQgbWluX2hlaWdodDsKLSAgICB1bnNpZ25lZCBpbnQgbWF4X2hlaWdodDsKLX07Ci0KLQotY2xhc3Mgb214X3ZlbmM6IHB1YmxpYyBvbXhfdmlkZW8KLXsKLSAgICBwdWJsaWM6Ci0gICAgICAgIG9teF92ZW5jKCk7Ci0gICAgICAgIH5vbXhfdmVuYygpOwotICAgICAgICBPTVhfRVJST1JUWVBFIGNvbXBvbmVudF9pbml0KE9NWF9TVFJJTkcgcm9sZSk7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgc2V0X3BhcmFtZXRlcihPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFICBwYXJhbUluZGV4LAotICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgIHBhcmFtRGF0YSk7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgc2V0X2NvbmZpZyhPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFICBjb25maWdJbmRleCwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICBjb25maWdEYXRhKTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBjb21wb25lbnRfZGVpbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wKTsKLSAgICAgICAgYm9vbCBpc19zZWN1cmVfc2Vzc2lvbigpOwotICAgICAgICAvL09NWCBzdHJ1Y3V0cmVzCi0gICAgICAgIE9NWF9VMzIgbV9uVmVuY19mb3JtYXQ7Ci0KLSAgICAgICAgU1dWRU5DX0hBTkRMRSBtX2hTd1ZlbmM7Ci0gICAgICAgIFNXVkVOQ19DT0RFQyAgbV9jb2RlYzsKLSAgICAgICAgc3d2ZW5jX3ZpZGVvX2NhcGFiaWxpdHkgbV9jYXBhYmlsaXR5OwotICAgICAgICBib29sIG1fbWF4X2FsbG93ZWRfYml0cmF0ZV9jaGVjazsKLSAgICAgICAgYm9vbCBtX3N0b3BwZWQ7Ci0gICAgICAgIGJvb2wgc2V0X2Zvcm1hdDsKLQotICAgICAgICBpbnQgZGV2X2hhbmRsZV9vdXRwdXRfZXh0cmFkYXRhKHZvaWQgKiwgaW50KTsKLSAgICAgICAgaW50IGRldl9oYW5kbGVfaW5wdXRfZXh0cmFkYXRhKHZvaWQgKiwgaW50LCBpbnQpOwotICAgICAgICBib29sIGRldl9idWZmZXJfcmVhZHlfdG9fcXVldWUoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcik7Ci0gICAgICAgIHZvaWQgZGV2X3NldF9leHRyYWRhdGFfY29va2llKHZvaWQgKik7Ci0gICAgICAgIGludCBkZXZfc2V0X2Zvcm1hdChpbnQpOwotCi0gICAgICAgIHN0YXRpYyBTV1ZFTkNfU1RBVFVTIHN3dmVuY19lbXB0eV9idWZmZXJfZG9uZV9jYgotICAgICAgICAoCi0gICAgICAgICAgU1dWRU5DX0hBTkRMRSAgICBzd3ZlbmMsCi0gICAgICAgICAgU1dWRU5DX0lQQlVGRkVSICpwX2lwYnVmZmVyLAotICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcF9jbGllbnQKLSAgICAgICAgKTsKLSAgICAgICAgU1dWRU5DX1NUQVRVUyBzd3ZlbmNfZW1wdHlfYnVmZmVyX2RvbmUKLSAgICAgICAgKAotICAgICAgICAgIFNXVkVOQ19JUEJVRkZFUiAqcF9pcGJ1ZmZlcgotICAgICAgICApOwotICAgICAgICBzdGF0aWMgU1dWRU5DX1NUQVRVUyBzd3ZlbmNfZmlsbF9idWZmZXJfZG9uZV9jYgotICAgICAgICAoCi0gICAgICAgICAgICBTV1ZFTkNfSEFORExFICAgIHN3dmVuYywKLSAgICAgICAgICAgIFNXVkVOQ19PUEJVRkZFUiAqcF9vcGJ1ZmZlciwKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcF9jbGllbnQKLSAgICAgICAgKTsKLSAgICAgICAgc3RhdGljIFNXVkVOQ19TVEFUVVMgc3d2ZW5jX2hhbmRsZV9ldmVudF9jYgotICAgICAgICAoCi0gICAgICAgICAgICBTV1ZFTkNfSEFORExFIHN3dmVuYywKLSAgICAgICAgICAgIFNXVkVOQ19FVkVOVCAgZXZlbnQsCi0gICAgICAgICAgICB2b2lkICAgICAgICAgKnBfY2xpZW50Ci0gICAgICAgICk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB2ZW5jX2RlYnVnX2NhcCBtX2RlYnVnOwotICAgICAgICBib29sIG1fYlNlcUhkclJlcXVlc3RlZDsKLQotICAgICAgICBpbnQgIG1fcGlwZV9pbjsKLSAgICAgICAgaW50ICBtX3BpcGVfb3V0OwotICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFIG1fc1BhcmFtTVBFRzQ7Ci0gICAgICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSBtX3NQYXJhbUgyNjM7Ci0KLSAgICAgICAgT01YX1UzMiBkZXZfc3RvcCh2b2lkKTsKLSAgICAgICAgT01YX1UzMiBkZXZfcGF1c2Uodm9pZCk7Ci0gICAgICAgIE9NWF9VMzIgZGV2X3N0YXJ0KHZvaWQpOwotICAgICAgICBPTVhfVTMyIGRldl9mbHVzaCh1bnNpZ25lZCk7Ci0gICAgICAgIE9NWF9VMzIgZGV2X3Jlc3VtZSh2b2lkKTsKLSAgICAgICAgT01YX1UzMiBkZXZfc3RhcnRfZG9uZSh2b2lkKTsKLSAgICAgICAgT01YX1UzMiBkZXZfc2V0X21lc3NhZ2VfdGhyZWFkX2lkKHB0aHJlYWRfdCk7Ci0gICAgICAgIGJvb2wgZGV2X3VzZV9idWYoIHVuc2lnbmVkKTsKLSAgICAgICAgYm9vbCBkZXZfZnJlZV9idWYoIHZvaWQgKix1bnNpZ25lZCk7Ci0gICAgICAgIGJvb2wgZGV2X2VtcHR5X2J1Zih2b2lkICosIHZvaWQgKix1bnNpZ25lZCx1bnNpZ25lZCk7Ci0gICAgICAgIGJvb2wgZGV2X2ZpbGxfYnVmKHZvaWQgKiwgdm9pZCAqLHVuc2lnbmVkLHVuc2lnbmVkKTsKLSAgICAgICAgYm9vbCBkZXZfZ2V0X2J1Zl9yZXEoT01YX1UzMiAqLE9NWF9VMzIgKixPTVhfVTMyICosT01YX1UzMik7Ci0gICAgICAgIGJvb2wgZGV2X3NldF9idWZfcmVxKE9NWF9VMzIgY29uc3QgKixPTVhfVTMyIGNvbnN0ICosT01YX1UzMiBjb25zdCAqLE9NWF9VMzIpOwotICAgICAgICBib29sIGRldl9nZXRfc2VxX2hkcih2b2lkICosIHVuc2lnbmVkLCB1bnNpZ25lZCAqKTsKLSAgICAgICAgYm9vbCBkZXZfbG9hZGVkX3N0YXJ0KHZvaWQpOwotICAgICAgICBib29sIGRldl9sb2FkZWRfc3RvcCh2b2lkKTsKLSAgICAgICAgYm9vbCBkZXZfbG9hZGVkX3N0YXJ0X2RvbmUodm9pZCk7Ci0gICAgICAgIGJvb2wgZGV2X2xvYWRlZF9zdG9wX2RvbmUodm9pZCk7Ci0gICAgICAgIGJvb2wgZGV2X2dldF9jYXBhYmlsaXR5X2x0cmNvdW50KE9NWF9VMzIgKiwgT01YX1UzMiAqLCBPTVhfVTMyICopOwotICAgICAgICBib29sIGRldl9nZXRfdnVpX3RpbWluZ19pbmZvKE9NWF9VMzIgKik7Ci0gICAgICAgIGJvb2wgZGV2X2dldF92cXppcF9zZWlfaW5mbyhPTVhfVTMyICopOwotICAgICAgICBib29sIGRldl9nZXRfcGVha19iaXRyYXRlKE9NWF9VMzIgKik7Ci0gICAgICAgIGJvb2wgZGV2X2dldF9iYXRjaF9zaXplKE9NWF9VMzIgKik7Ci0gICAgICAgIGJvb2wgZGV2X2dldF90ZW1wb3JhbF9sYXllcl9jYXBzKE9NWF9VMzIgKiAvKm5NYXhMYXllcnMqLywKLSAgICAgICAgICAgICAgICAgICAgT01YX1UzMiAqIC8qbk1heEJMYXllcnMqLywKLSAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFICovKlN1cHBvcnRlZFBhdHRlcm4qLykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgZGV2X2lzX3ZpZGVvX3Nlc3Npb25fc3VwcG9ydGVkKE9NWF9VMzIgd2lkdGgsIE9NWF9VMzIgaGVpZ2h0KTsKLSAgICAgICAgYm9vbCBkZXZfY29sb3JfYWxpZ24oT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciwgT01YX1UzMiB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgaGVpZ2h0KTsKLSAgICAgICAgYm9vbCBkZXZfZ2V0X291dHB1dF9sb2dfZmxhZygpOwotICAgICAgICBpbnQgZGV2X291dHB1dF9sb2dfYnVmZmVycyhjb25zdCBjaGFyICpidWZmZXJfYWRkciwgaW50IGJ1ZmZlcl9sZW4pOwotICAgICAgICBpbnQgZGV2X2V4dHJhZGF0YV9sb2dfYnVmZmVycyhjaGFyICpidWZmZXIpOwotICAgICAgICBib29sIHN3dmVuY19jb2xvcl9hbGlnbihPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyLCBPTVhfVTMyIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyIGhlaWdodCk7Ci0KLSAgICAgICAgU1dWRU5DX1NUQVRVUyBzd3ZlbmNfc2V0X3JjX21vZGUoT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBlQ29udHJvbFJhdGUpOwotICAgICAgICBTV1ZFTkNfU1RBVFVTIHN3dmVuY19zZXRfcHJvZmlsZV9sZXZlbChPTVhfVTMyIGVQcm9maWxlLE9NWF9VMzIgZUxldmVsKTsKLSAgICAgICAgU1dWRU5DX1NUQVRVUyBzd3ZlbmNfc2V0X2ludHJhX3JlZnJlc2goT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEUgKkludHJhUmVmcmVzaCk7Ci0gICAgICAgIFNXVkVOQ19TVEFUVVMgc3d2ZW5jX3NldF9mcmFtZV9yYXRlKE9NWF9VMzIgbkZyYW1lUmF0ZSk7Ci0gICAgICAgIFNXVkVOQ19TVEFUVVMgc3d2ZW5jX3NldF9iaXRfcmF0ZShPTVhfVTMyIG5UYXJnZXRCaXRyYXRlKTsKLSAgICAgICAgU1dWRU5DX1NUQVRVUyBzd3ZlbmNfc2V0X2ludHJhX3BlcmlvZChPTVhfVTMyIG5QRnJhbWUsT01YX1UzMiBuQkZyYW1lKTsKLSAgICAgICAgU1dWRU5DX1NUQVRVUyBzd3ZlbmNfc2V0X2NvbG9yX2Zvcm1hdChPTVhfQ09MT1JfRk9STUFUVFlQRSk7Ci0gICAgICAgIFNXVkVOQ19TVEFUVVMgc3d2ZW5jX2dldF9idWZmZXJfcmVxCi0gICAgICAgICgKLSAgICAgICAgICAgT01YX1UzMiAqbWluX2J1ZmZfY291bnQsCi0gICAgICAgICAgIE9NWF9VMzIgKmFjdHVhbF9idWZmX2NvdW50LAotICAgICAgICAgICBPTVhfVTMyICpidWZmX3NpemUsCi0gICAgICAgICAgIE9NWF9VMzIgKmJ1ZmZfYWxpZ25tZW50LAotICAgICAgICAgICBPTVhfVTMyIHBvcnQKLSAgICAgICAgKTsKLSAgICAgICAgaW50IHN3dmVuY19pbnB1dF9sb2dfYnVmZmVycyhjb25zdCBjaGFyICpidWZmZXIsIGludCBidWZmZXJsZW4pOwotCi19OwotCi0jZW5kaWYgLy9fX09NWF9WRU5DX19ICmRpZmYgLS1naXQgYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvaW5jL29teF92aWRlb19iYXNlLmggYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvaW5jL29teF92aWRlb19iYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjVmNGMuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL2luYy9vbXhfdmlkZW9fYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzI4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLU9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLUlGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIF9fT01YX1ZJREVPX0JBU0VfSF9fCi0jZGVmaW5lIF9fT01YX1ZJREVPX0JBU0VfSF9fCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHAgZSBuIE0gQSBYICAgQ29tcG9uZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIEVuY29kZXIKLQotKi8vKiogQGZpbGUgY29teF92aWRlb19iYXNlLmgKLSAgVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGNsYXNzIGRlZmluaXRpb24gZm9yIG9wZW5NQVggZGVjb2RlciBjb21wb25lbnQuCi0KLSovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlIEZpbGVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpZmRlZiBfQU5EUk9JRF8KLSNpZmRlZiBfQU5EUk9JRF9JQ1NfCi0jaW5jbHVkZSAiUUNvbU9NWE1ldGFkYXRhLmgiCi0jZW5kaWYKLSNlbmRpZiAvLyBfQU5EUk9JRF8KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLSNpbmNsdWRlICJPTVhfQ29yZS5oIgotI2luY2x1ZGUgIk9NWF9RQ09NRXh0bnMuaCIKLSNpbmNsdWRlICJPTVhfU2t5cGVfVmlkZW9FeHRlbnNpb25zLmgiCi0jaW5jbHVkZSAiT01YX1ZpZGVvRXh0LmgiCi0jaW5jbHVkZSAiT01YX0luZGV4RXh0LmgiCi0jaW5jbHVkZSAicWNfb214X2NvbXBvbmVudC5oIgotI2luY2x1ZGUgIm9teF92aWRlb19jb21tb24uaCIKLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgIkMyRENvbG9yQ29udmVydGVyLmgiCi0jaW5jbHVkZSAidmlkY19kZWJ1Zy5oIgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJ2aWRjX3ZlbmRvcl9leHRlbnNpb25zLmgiCi0KLSN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIk9NWC1WRU5DIgotCi0jaWZkZWYgX0FORFJPSURfCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2VuZGlmIC8vIF9BTkRST0lEXwotCi0jaWZkZWYgVVNFX0lPTgotc3RhdGljIGNvbnN0IGNoYXIqIE1FTV9ERVZJQ0UgPSAiL2Rldi9pb24iOwotI2RlZmluZSBNRU1fSEVBUF9JRCBJT05fSU9NTVVfSEVBUF9JRAotI2Vsc2UKLSNlcnJvciBNRU1fREVWSUNFIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgotI2VuZGlmCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSBzcGVjaWZpYyBnbG9iYWxzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNkZWZpbmUgT01YX1NQRUNfVkVSU0lPTiAweDAwMDAwMTAxCi0jZGVmaW5lIE9NWF9JTklUX1NUUlVDVChfc18sIF9uYW1lXykgICAgICAgICAgICBcCi0gICAgbWVtc2V0KChfc18pLCAweDAsIHNpemVvZihfbmFtZV8pKTsgICAgICAgICAgXAotKF9zXyktPm5TaXplID0gc2l6ZW9mKF9uYW1lXyk7ICAgICAgICAgICAgICAgXAotKF9zXyktPm5WZXJzaW9uLm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgICAgICAgICAgTWFjcm9zCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNkZWZpbmUgUHJpbnRGcmFtZUhkcihidWZIZHIpIERFQlVHX1BSSU5UKCJidWZIZHIgJXggYnVmICV4IHNpemUgJWQgVFMgJWRcbiIsXAotICAgICAgICAodW5zaWduZWQpIGJ1ZkhkcixcCi0gICAgICAgICh1bnNpZ25lZCkoKE9NWF9CVUZGRVJIRUFERVJUWVBFICopYnVmSGRyKS0+cEJ1ZmZlcixcCi0gICAgICAgICh1bnNpZ25lZCkoKE9NWF9CVUZGRVJIRUFERVJUWVBFICopYnVmSGRyKS0+bkZpbGxlZExlbixcCi0gICAgICAgICh1bnNpZ25lZCkoKE9NWF9CVUZGRVJIRUFERVJUWVBFICopYnVmSGRyKS0+blRpbWVTdGFtcCkKLQotLy8gQml0TWFzayBNYW5hZ2VtZW50IGxvZ2ljCi0jZGVmaW5lIEJJVFNfUEVSX0lOREVYICAgICAgICA2NAotI2RlZmluZSBCSVRNQVNLX1NJWkUobUluZGV4KSAoKChtSW5kZXgpICsgQklUU19QRVJfSU5ERVggLSAxKS9CSVRTX1BFUl9JTkRFWCkKLSNkZWZpbmUgQklUTUFTS19PRkZTRVQobUluZGV4KSAoKG1JbmRleCkvQklUU19QRVJfSU5ERVgpCi0jZGVmaW5lIEJJVE1BU0tfRkxBRyhtSW5kZXgpICgodWludDY0X3QpMSA8PCAoKG1JbmRleCkgJSBCSVRTX1BFUl9JTkRFWCkpCi0jZGVmaW5lIEJJVE1BU0tfQ0xFQVIobUFycmF5LG1JbmRleCkgKG1BcnJheSlbQklUTUFTS19PRkZTRVQobUluZGV4KV0gXAotICAgICY9ICB+KEJJVE1BU0tfRkxBRyhtSW5kZXgpKQotI2RlZmluZSBCSVRNQVNLX1NFVChtQXJyYXksbUluZGV4KSAgKG1BcnJheSlbQklUTUFTS19PRkZTRVQobUluZGV4KV0gXAotICAgIHw9ICBCSVRNQVNLX0ZMQUcobUluZGV4KQotI2RlZmluZSBCSVRNQVNLX1BSRVNFTlQobUFycmF5LG1JbmRleCkgKChtQXJyYXkpW0JJVE1BU0tfT0ZGU0VUKG1JbmRleCldIFwKLSAgICAgICAgJiBCSVRNQVNLX0ZMQUcobUluZGV4KSkKLSNkZWZpbmUgQklUTUFTS19BQlNFTlQobUFycmF5LG1JbmRleCkgKCgobUFycmF5KVtCSVRNQVNLX09GRlNFVChtSW5kZXgpXSBcCi0gICAgICAgICAgICAmIEJJVE1BU0tfRkxBRyhtSW5kZXgpKSA9PSAweDApCi0jZGVmaW5lIEJJVE1BU0tfUFJFU0VOVChtQXJyYXksbUluZGV4KSAoKG1BcnJheSlbQklUTUFTS19PRkZTRVQobUluZGV4KV0gXAotICAgICAgICAmIEJJVE1BU0tfRkxBRyhtSW5kZXgpKQotI2RlZmluZSBCSVRNQVNLX0FCU0VOVChtQXJyYXksbUluZGV4KSAoKChtQXJyYXkpW0JJVE1BU0tfT0ZGU0VUKG1JbmRleCldIFwKLSAgICAgICAgICAgICYgQklUTUFTS19GTEFHKG1JbmRleCkpID09IDB4MCkKLQotLyoqIFNUQVRVUyBDT0RFUyovCi0vKiBCYXNlIHZhbHVlIGZvciBzdGF0dXMgY29kZXMgKi8KLSNkZWZpbmUgVkVOX1NfQkFTRQkweDAwMDAwMDAwCi0jZGVmaW5lIFZFTl9TX1NVQ0NFU1MJKFZFTl9TX0JBU0UpLyogU3VjY2VzcyAqLwotI2RlZmluZSBWRU5fU19FRkFJTAkoVkVOX1NfQkFTRSsxKS8qIEdlbmVyYWwgZmFpbHVyZSAqLwotCi0vKkFzeW5jaHJvbm91cyBtZXNzYWdlcyBmcm9tIGRyaXZlciovCi0jZGVmaW5lIFZFTl9NU0dfSU5ESUNBVElPTgkwCi0jZGVmaW5lIFZFTl9NU0dfSU5QVVRfQlVGRkVSX0RPTkUJMQotI2RlZmluZSBWRU5fTVNHX09VVFBVVF9CVUZGRVJfRE9ORQkyCi0jZGVmaW5lIFZFTl9NU0dfTkVFRF9PVVRQVVRfQlVGRkVSCTMKLSNkZWZpbmUgVkVOX01TR19GTFVTSF9JTlBVVF9ET05FCTQKLSNkZWZpbmUgVkVOX01TR19GTFVTSF9PVVBVVF9ET05FCTUKLSNkZWZpbmUgVkVOX01TR19TVEFSVAk2Ci0jZGVmaW5lIFZFTl9NU0dfU1RPUAk3Ci0jZGVmaW5lIFZFTl9NU0dfUEFVU0UJOAotI2RlZmluZSBWRU5fTVNHX1JFU1VNRQk5Ci0jZGVmaW5lIFZFTl9NU0dfTFRSVVNFX0ZBSUxFRAkgICAgMTAKLSNkZWZpbmUgVkVOX01TR19IV19PVkVSTE9BRAkxMQotI2RlZmluZSBWRU5fTVNHX01BWF9DTElFTlRTCTEyCi0KLSNkZWZpbmUgTUFYX05VTV9JTlBVVF9CVUZGRVJTIDY0Ci0jZGVmaW5lIE1BWF9OVU1fT1VUUFVUX0JVRkZFUlMgNjQKLQotI2lmZGVmIFVTRV9OQVRJVkVfSEFORExFX1NPVVJDRQotI2RlZmluZSBMRUdBQ1lfQ0FNX1NPVVJDRSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlCi0jZGVmaW5lIExFR0FDWV9DQU1fTUVUQURBVEFfVFlQRSBlbmNvZGVyX25hdGl2ZWhhbmRsZV9idWZmZXJfdHlwZQotI2Vsc2UKLSNkZWZpbmUgTEVHQUNZX0NBTV9TT1VSQ0Uga01ldGFkYXRhQnVmZmVyVHlwZUNhbWVyYVNvdXJjZQotI2RlZmluZSBMRUdBQ1lfQ0FNX01FVEFEQVRBX1RZUEUgZW5jb2Rlcl9tZWRpYV9idWZmZXJfdHlwZQotI2VuZGlmCi0KLXZvaWQqIG1lc3NhZ2VfdGhyZWFkX2VuYyh2b2lkICopOwotCi1lbnVtIG9teF92ZW5jX2V4dHJhZGF0YV90eXBlcyB7Ci0gICAgVkVOQ19FWFRSQURBVEFfU0xJQ0VJTkZPID0gMHgxMDAsCi0gICAgVkVOQ19FWFRSQURBVEFfTFRSSU5GTyA9IDB4MjAwLAotICAgIFZFTkNfRVhUUkFEQVRBX01CSU5GTyA9IDB4NDAwLAotICAgIFZFTkNfRVhUUkFEQVRBX0ZSQU1FRElNRU5TSU9OID0gMHgxMDAwMDAwLAotICAgIFZFTkNfRVhUUkFEQVRBX1lVVl9TVEFUUyA9IDB4ODAwLAotICAgIFZFTkNfRVhUUkFEQVRBX1ZRWklQID0gMHgwMjAwMDAwMCwKLSAgICBWRU5DX0VYVFJBREFUQV9ST0kgPSAweDA0MDAwMDAwLAotfTsKLQotc3RydWN0IG91dHB1dF9tZXRhYnVmZmVyIHsKLSAgICBPTVhfVTMyIHR5cGU7Ci0gICAgbmF0aXZlX2hhbmRsZV90ICpuaDsKLX07Ci0KLXN0cnVjdCB2ZW5jX2J1ZmZlcnsKLSB1bnNpZ25lZCBjaGFyICpwdHJidWZmZXI7Ci0gdW5zaWduZWQgbG9uZwlzejsKLSB1bnNpZ25lZCBsb25nCWxlbjsKLSB1bnNpZ25lZCBsb25nCW9mZnNldDsKLSBsb25nIGxvbmcJdGltZXN0YW1wOwotIHVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0gdm9pZAkqY2xpZW50ZGF0YTsKLX07Ci0KLXN0cnVjdCB2ZW5jX2J1ZmZlcnBheWxvYWR7Ci0JdW5zaWduZWQgY2hhciAqcGJ1ZmZlcjsKLQlzaXplX3QJc3o7Ci0JaW50CWZkOwotCXVuc2lnbmVkIGludAlvZmZzZXQ7Ci0JdW5zaWduZWQgaW50CW1hcGVkX3NpemU7Ci0JdW5zaWduZWQgbG9uZwlmaWxsZWRfbGVuOwotfTsKLQotc3RydWN0CXZlbmNfdm9wdGltaW5nY2ZnewotCXVuc2lnbmVkIGxvbmcJdm9wdGltZV9yZXNvbHV0aW9uOwotfTsKLQotc3RydWN0IHZlbmNfZnJhbWVyYXRlewotCXVuc2lnbmVkIGxvbmcJZnBzX2Rlbm9taW5hdG9yOwotCXVuc2lnbmVkIGxvbmcJZnBzX251bWVyYXRvcjsKLX07Ci0KLXN0cnVjdCB2ZW5jX2hlYWRlcmV4dGVuc2lvbnsKLQkgdW5zaWduZWQgbG9uZwloZWFkZXJfZXh0ZW5zaW9uOwotfTsKLQotc3RydWN0IHZlbmNfbXVsdGljbGljZWNmZ3sKLQl1bnNpZ25lZCBsb25nCW1zbGljZV9tb2RlOwotCXVuc2lnbmVkIGxvbmcJbXNsaWNlX3NpemU7Ci19OwotCi1zdHJ1Y3QgdmVuY19tc2d7Ci0JdW5zaWduZWQgbG9uZwlzdGF0dXNjb2RlOwotCXVuc2lnbmVkIGxvbmcJbXNnY29kZTsKLQlzdHJ1Y3QgdmVuY19idWZmZXIJYnVmOwotCXVuc2lnbmVkIGxvbmcJbXNnZGF0YV9zaXplOwotfTsKLQotLy8gT01YIHZpZGVvIGNsYXNzCi1jbGFzcyBvbXhfdmlkZW86IHB1YmxpYyBxY19vbXhfY29tcG9uZW50Ci17Ci0gICAgcHJvdGVjdGVkOgotI2lmZGVmIF9BTkRST0lEX0lDU18KLSAgICAgICAgYm9vbCBtZXRhX21vZGVfZW5hYmxlOwotICAgICAgICBib29sIGMyZF9vcGVuZWQ7Ci0gICAgICAgIExFR0FDWV9DQU1fTUVUQURBVEFfVFlQRSBtZXRhX2J1ZmZlcnNbTUFYX05VTV9JTlBVVF9CVUZGRVJTXTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm9wYXF1ZV9idWZmZXJfaGRyW01BWF9OVU1fSU5QVVRfQlVGRkVSU107Ci0gICAgICAgIGJvb2wgZ2V0X3N5bnRheGhkcl9lbmFibGU7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqcHNvdXJjZV9mcmFtZTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICpwZGVzdF9mcmFtZTsKLSAgICAgICAgYm9vbCBzZWN1cmVfc2Vzc2lvbjsKLSAgICAgICAgYm9vbCBoaWVyX2JfZW5hYmxlZDsKLSAgICAgICAgLy9pbnRlcm1lZGlhdGUgY29udmVyc2lvbiBidWZmZXIgcXVldWVkIHRvIGVuY29kZXIgaW4gY2FzZSBvZiBpbnZhbGlkIEVPUyBpbnB1dAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKm1FbXB0eUVvc0J1ZmZlcjsKLQotICAgICAgICBDMkRDb2xvckNvbnZlcnRlciBjMmRjYzsKLSNlbmRpZgotICAgIHB1YmxpYzoKLQotICAgICAgICBib29sIG1Vc2VQcm94eUNvbG9yRm9ybWF0OwotICAgICAgICAvL1JHQiBvciBub24tbmF0aXZlIGlucHV0LCBhbmQgd2UgaGF2ZSBwcmUtYWxsb2NhdGVkIGNvbnZlcnNpb24gYnVmZmVycwotICAgICAgICBib29sIG1Vc2VzQ29sb3JDb252ZXJzaW9uOwotCi0gICAgICAgIG9teF92aWRlbygpOyAgLy8gY29uc3RydWN0b3IKLSAgICAgICAgdmlydHVhbCB+b214X3ZpZGVvKCk7ICAvLyBkZXN0cnVjdG9yCi0KLSAgICAgICAgLy8gdmlydHVhbCBpbnQgYXN5bmNfbWVzc2FnZV9wcm9jZXNzICh2b2lkICpjb250ZXh0LCB2b2lkKiBtZXNzYWdlKTsKLSAgICAgICAgdm9pZCBwcm9jZXNzX2V2ZW50X2NiKHZvaWQgKmN0eHQpOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgYWxsb2NhdGVfYnVmZmVyKAotICAgICAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVySGRyLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgcG9ydCwKLSAgICAgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCi0gICAgICAgICAgICAgICAgT01YX1UzMiBieXRlcwotICAgICAgICAgICAgICAgICk7Ci0KLQotICAgICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgY29tcG9uZW50X2RlaW5pdChPTVhfSEFORExFVFlQRSBoQ29tcCk9IDA7Ci0KLSAgICAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGNvbXBvbmVudF9pbml0KE9NWF9TVFJJTkcgcm9sZSk9IDA7Ci0KLSAgICAgICAgdmlydHVhbCBPTVhfVTMyIGRldl9zdG9wKHZvaWQpID0gMDsKLSAgICAgICAgdmlydHVhbCBPTVhfVTMyIGRldl9wYXVzZSh2b2lkKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgT01YX1UzMiBkZXZfc3RhcnQodm9pZCkgPSAwOwotICAgICAgICB2aXJ0dWFsIE9NWF9VMzIgZGV2X2ZsdXNoKHVuc2lnbmVkKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgT01YX1UzMiBkZXZfcmVzdW1lKHZvaWQpID0gMDsKLSAgICAgICAgdmlydHVhbCBPTVhfVTMyIGRldl9zdGFydF9kb25lKHZvaWQpID0gMDsKLSAgICAgICAgdmlydHVhbCBPTVhfVTMyIGRldl9zZXRfbWVzc2FnZV90aHJlYWRfaWQocHRocmVhZF90KSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBkZXZfdXNlX2J1Zih1bnNpZ25lZCkgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgZGV2X2ZyZWVfYnVmKHZvaWQgKix1bnNpZ25lZCkgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgZGV2X2VtcHR5X2J1Zih2b2lkICosIHZvaWQgKix1bnNpZ25lZCx1bnNpZ25lZCkgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgZGV2X2ZpbGxfYnVmKHZvaWQgKmJ1ZmZlciwgdm9pZCAqLHVuc2lnbmVkLHVuc2lnbmVkKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBkZXZfZ2V0X2J1Zl9yZXEoT01YX1UzMiAqLE9NWF9VMzIgKixPTVhfVTMyICosT01YX1UzMikgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgZGV2X2dldF9zZXFfaGRyKHZvaWQgKiwgdW5zaWduZWQsIHVuc2lnbmVkICopID0gMDsKLSAgICAgICAgdmlydHVhbCBib29sIGRldl9sb2FkZWRfc3RhcnQodm9pZCkgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgZGV2X2xvYWRlZF9zdG9wKHZvaWQpID0gMDsKLSAgICAgICAgdmlydHVhbCBib29sIGRldl9sb2FkZWRfc3RhcnRfZG9uZSh2b2lkKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBkZXZfbG9hZGVkX3N0b3BfZG9uZSh2b2lkKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBpc19zZWN1cmVfc2Vzc2lvbih2b2lkKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgaW50IGRldl9oYW5kbGVfb3V0cHV0X2V4dHJhZGF0YSh2b2lkKiwgaW50KSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgaW50IGRldl9zZXRfZm9ybWF0KGludCkgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgZGV2X2lzX3ZpZGVvX3Nlc3Npb25fc3VwcG9ydGVkKE9NWF9VMzIgd2lkdGgsIE9NWF9VMzIgaGVpZ2h0KSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBkZXZfZ2V0X2NhcGFiaWxpdHlfbHRyY291bnQoT01YX1UzMiAqLCBPTVhfVTMyICosIE9NWF9VMzIgKikgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgZGV2X2dldF92dWlfdGltaW5nX2luZm8oT01YX1UzMiAqKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBkZXZfZ2V0X3ZxemlwX3NlaV9pbmZvKE9NWF9VMzIgKikgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgZGV2X2dldF9wZWFrX2JpdHJhdGUoT01YX1UzMiAqKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBkZXZfZ2V0X2JhdGNoX3NpemUoT01YX1UzMiAqKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBkZXZfYnVmZmVyX3JlYWR5X3RvX3F1ZXVlKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpID0gMDsKLSAgICAgICAgdmlydHVhbCBib29sIGRldl9nZXRfdGVtcG9yYWxfbGF5ZXJfY2FwcyhPTVhfVTMyICogLypuTWF4TGF5ZXJzKi8sCi0gICAgICAgICAgICAgICAgT01YX1UzMiAqIC8qbk1heEJMYXllcnMqLywgT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFICovKlN1cHBvcnRlZFBhdHRlcm4qLykgPSAwOwotI2lmZGVmIF9BTkRST0lEX0lDU18KLSAgICAgICAgdm9pZCBvbXhfcmVsZWFzZV9tZXRhX2J1ZmZlcihPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKTsKLSNlbmRpZgotICAgICAgICB2aXJ0dWFsIGJvb2wgZGV2X2NvbG9yX2FsaWduKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIsIE9NWF9VMzIgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyIGhlaWdodCkgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgZGV2X2dldF9vdXRwdXRfbG9nX2ZsYWcoKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgaW50IGRldl9vdXRwdXRfbG9nX2J1ZmZlcnMoY29uc3QgY2hhciAqYnVmZmVyX2FkZHIsIGludCBidWZmZXJfbGVuKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgaW50IGRldl9leHRyYWRhdGFfbG9nX2J1ZmZlcnMoY2hhciAqYnVmZmVyX2FkZHIpID0gMDsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBjb21wb25lbnRfcm9sZV9lbnVtKAotICAgICAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9VOCAqcm9sZSwKLSAgICAgICAgICAgICAgICBPTVhfVTMyIGluZGV4Ci0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICBPTVhfRVJST1JUWVBFIGNvbXBvbmVudF90dW5uZWxfcmVxdWVzdCgKLSAgICAgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfVTMyIHBvcnQsCi0gICAgICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgIHBlZXJDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgT01YX1UzMiBwZWVyUG9ydCwKLSAgICAgICAgICAgICAgICBPTVhfVFVOTkVMU0VUVVBUWVBFICp0dW5uZWxTZXR1cAotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBlbXB0eV90aGlzX2J1ZmZlcigKLSAgICAgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyCi0gICAgICAgICAgICAgICAgKTsKLQotCi0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBmaWxsX3RoaXNfYnVmZmVyKAotICAgICAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIKLSAgICAgICAgICAgICAgICApOwotCi0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBmcmVlX2J1ZmZlcigKLSAgICAgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfVTMyIHBvcnQsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcgotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBnZXRfY29tcG9uZW50X3ZlcnNpb24oCi0gICAgICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX1NUUklORyBjb21wb25lbnROYW1lLAotICAgICAgICAgICAgICAgIE9NWF9WRVJTSU9OVFlQRSAqY29tcG9uZW50VmVyc2lvbiwKLSAgICAgICAgICAgICAgICBPTVhfVkVSU0lPTlRZUEUgKnNwZWNWZXJzaW9uLAotICAgICAgICAgICAgICAgIE9NWF9VVUlEVFlQRSAqY29tcG9uZW50VVVJRAotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBnZXRfY29uZmlnKAotICAgICAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgY29uZmlnSW5kZXgsCi0gICAgICAgICAgICAgICAgT01YX1BUUiBjb25maWdEYXRhCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICBPTVhfRVJST1JUWVBFIGdldF9leHRlbnNpb25faW5kZXgoCi0gICAgICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX1NUUklORyBwYXJhbU5hbWUsCi0gICAgICAgICAgICAgICAgT01YX0lOREVYVFlQRSAqaW5kZXhUeXBlCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICBPTVhfRVJST1JUWVBFIGdldF9wYXJhbWV0ZXIoT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0lOREVYVFlQRSAgcGFyYW1JbmRleCwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICBwYXJhbURhdGEpOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgZ2V0X3N0YXRlKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9TVEFURVRZUEUgKnN0YXRlKTsKLQotCi0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBzZW5kX2NvbW1hbmQoT01YX0hBTkRMRVRZUEUgIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQsCi0gICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgIHBhcmFtMSwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgY21kRGF0YSk7Ci0KLQotICAgICAgICBPTVhfRVJST1JUWVBFIHNldF9jYWxsYmFja3MoT01YX0hBTkRMRVRZUEUgICBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgICBhcHBEYXRhKTsKLQotICAgICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0X2NvbmZpZyhPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFICBjb25maWdJbmRleCwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICBjb25maWdEYXRhKSA9IDA7Ci0KLSAgICAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldF9wYXJhbWV0ZXIoT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0lOREVYVFlQRSAgcGFyYW1JbmRleCwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICBwYXJhbURhdGEpID0wOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgdXNlX2J1ZmZlcihPTVhfSEFORExFVFlQRSAgICAgIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVySGRyLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICBieXRlcywKLSAgICAgICAgICAgICAgICBPTVhfVTggICAgICAgICAgICAgICAqYnVmZmVyKTsKLQotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgdXNlX0VHTF9pbWFnZShPTVhfSEFORExFVFlQRSAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZHIsCi0gICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgIGVnbEltYWdlKTsKLQotICAgICAgICBTaWduYWwgc2lnbmFsOwotICAgICAgICBwdGhyZWFkX3QgbXNnX3RocmVhZF9pZDsKLSAgICAgICAgcHRocmVhZF90IGFzeW5jX3RocmVhZF9pZDsKLSAgICAgICAgYm9vbCBhc3luY190aHJlYWRfY3JlYXRlZDsKLSAgICAgICAgYm9vbCBtc2dfdGhyZWFkX2NyZWF0ZWQ7Ci0gICAgICAgIHZvbGF0aWxlIGJvb2wgbXNnX3RocmVhZF9zdG9wOwotCi0gICAgICAgIE9NWF9VOCBtX25raW5kWzEyOF07Ci0KLQotICAgICAgICAvL2ludCAqaW5wdXRfcG1lbV9mZDsKLSAgICAgICAgLy9pbnQgKm91dHB1dF9wbWVtX2ZkOwotICAgICAgICBzdHJ1Y3QgcG1lbSAqbV9wSW5wdXRfcG1lbTsKLSAgICAgICAgc3RydWN0IHBtZW0gKm1fcE91dHB1dF9wbWVtOwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgc3RydWN0IHZlbmNfaW9uICptX3BJbnB1dF9pb247Ci0gICAgICAgIHN0cnVjdCB2ZW5jX2lvbiAqbV9wT3V0cHV0X2lvbjsKLSNlbmRpZgotCi0KLQotICAgIHB1YmxpYzoKLSAgICAgICAgLy8gQml0IFBvc2l0aW9ucwotICAgICAgICBlbnVtIGZsYWdzX2JpdF9wb3NpdGlvbnMgewotICAgICAgICAgICAgLy8gRGVmZXIgdHJhbnNpdGlvbiB0byBJRExFCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0lETEVfUEVORElORyAgICAgICAgICAgID0weDEsCi0gICAgICAgICAgICAvLyBEZWZlciB0cmFuc2l0aW9uIHRvIExPQURJTkcKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfTE9BRElOR19QRU5ESU5HICAgICAgICAgPTB4MiwKLSAgICAgICAgICAgIC8vIEZpcnN0ICBCdWZmZXIgUGVuZGluZwotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9GSVJTVF9CVUZGRVJfUEVORElORyAgICA9MHgzLAotICAgICAgICAgICAgLy8gU2Vjb25kIEJ1ZmZlciBQZW5kaW5nCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX1NFQ09ORF9CVUZGRVJfUEVORElORyAgID0weDQsCi0gICAgICAgICAgICAvLyBEZWZlciB0cmFuc2l0aW9uIHRvIEVuYWJsZQotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9JTlBVVF9FTkFCTEVfUEVORElORyAgICA9MHg1LAotICAgICAgICAgICAgLy8gRGVmZXIgdHJhbnNpdGlvbiB0byBFbmFibGUKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfT1VUUFVUX0VOQUJMRV9QRU5ESU5HICAgPTB4NiwKLSAgICAgICAgICAgIC8vIERlZmVyIHRyYW5zaXRpb24gdG8gRGlzYWJsZQotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9JTlBVVF9ESVNBQkxFX1BFTkRJTkcgICA9MHg3LAotICAgICAgICAgICAgLy8gRGVmZXIgdHJhbnNpdGlvbiB0byBEaXNhYmxlCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX09VVFBVVF9ESVNBQkxFX1BFTkRJTkcgID0weDgsCi0gICAgICAgICAgICAvL2RlZmVyIGZsdXNoIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9PVVRQVVRfRkxVU0hfUEVORElORyAgICA9MHg5LAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9JTlBVVF9GTFVTSF9QRU5ESU5HICAgID0weEEsCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX1BBVVNFX1BFTkRJTkcgICAgICAgICAgPTB4QiwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfRVhFQ1VURV9QRU5ESU5HICAgICAgICA9MHhDLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9MT0FERURfU1RBUlRfUEVORElORyA9IDB4RCwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfTE9BREVEX1NUT1BfUEVORElORyA9IDB4RiwKLQotICAgICAgICB9OwotCi0gICAgICAgIC8vIERlZmVycmVkIGNhbGxiYWNrIGlkZW50aWZpZXJzCi0gICAgICAgIGVudW0gewotICAgICAgICAgICAgLy9FdmVudCBDYWxsYmFja3MgZnJvbSB0aGUgdmVuYyBjb21wb25lbnQgdGhyZWFkIGNvbnRleHQKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQgICAgICAgPSAweDEsCi0gICAgICAgICAgICAvL0J1ZmZlciBEb25lIGNhbGxiYWNrcyBmcm9tIHRoZSB2ZW5jIGNvbXBvbmVudCB0aHJlYWQgY29udGV4dAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9CVUZGRVJfRE9ORSA9IDB4MiwKLSAgICAgICAgICAgIC8vRnJhbWUgRG9uZSBjYWxsYmFja3MgZnJvbSB0aGUgdmVuYyBjb21wb25lbnQgdGhyZWFkIGNvbnRleHQKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRlJBTUVfRE9ORSAgPSAweDMsCi0gICAgICAgICAgICAvL0J1ZmZlciBEb25lIGNhbGxiYWNrcyBmcm9tIHRoZSB2ZW5jIGNvbXBvbmVudCB0aHJlYWQgY29udGV4dAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GVEIgICAgICAgICA9IDB4NCwKLSAgICAgICAgICAgIC8vRnJhbWUgRG9uZSBjYWxsYmFja3MgZnJvbSB0aGUgdmVuYyBjb21wb25lbnQgdGhyZWFkIGNvbnRleHQKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVRCICAgICAgICAgPSAweDUsCi0gICAgICAgICAgICAvL0NvbW1hbmQKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfQ09NTUFORCAgICAgPSAweDYsCi0gICAgICAgICAgICAvL1B1c2gtUGVuZGluZyBCdWZmZXJzCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX1BVU0hfUEVORElOR19CVUZTICAgID0gMHg3LAotICAgICAgICAgICAgLy8gRW1wdHkgQnVmZmVyIERvbmUgY2FsbGJhY2tzCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VCRCAgICAgICAgID0gMHg4LAotICAgICAgICAgICAgLy9GbHVzaCBFdmVudCBDYWxsYmFja3MgZnJvbSB0aGUgdmVuYyBjb21wb25lbnQgdGhyZWFkIGNvbnRleHQKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlRfRkxVU0ggICAgICAgPSAweDksCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UX0lOUFVUX0ZMVVNIID0gMHgwQSwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlRfT1VUUFVUX0ZMVVNIID0gMHgwQiwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRkJEID0gMHhjLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9TVEFSVF9ET05FID0gMHhELAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9QQVVTRV9ET05FID0gMHhFLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9SRVNVTUVfRE9ORSA9IDB4RiwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfU1RPUF9ET05FID0gMHgxMCwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfSEFSRFdBUkVfRVJST1IgPSAweDExLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9MVFJVU0VfRkFJTEVEID0gMHgxMiwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVRCX09QUSA9IDB4MTMsCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1VOU1VQUE9SVEVEX1NFVFRJTkcgPSAweDE0LAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9IQVJEV0FSRV9PVkVSTE9BRCA9IDB4MTUsCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0NMT1NFX01TRyA9IDB4MTYKLSAgICAgICAgfTsKLQotICAgICAgICBzdHJ1Y3Qgb214X2V2ZW50IHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcGFyYW0xOwotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBwYXJhbTI7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsb25nIGlkOwotICAgICAgICB9OwotCi0gICAgICAgIHN0cnVjdCBvbXhfY21kX3F1ZXVlIHsKLSAgICAgICAgICAgIG9teF9ldmVudCBtX3FbT01YX0NPUkVfQ09OVFJPTF9DTURRX1NJWkVdOwotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBtX3JlYWQ7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsb25nIG1fd3JpdGU7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsb25nIG1fc2l6ZTsKLQotICAgICAgICAgICAgb214X2NtZF9xdWV1ZSgpOwotICAgICAgICAgICAgfm9teF9jbWRfcXVldWUoKTsKLSAgICAgICAgICAgIGJvb2wgaW5zZXJ0X2VudHJ5KHVuc2lnbmVkIGxvbmcgcDEsIHVuc2lnbmVkIGxvbmcgcDIsIHVuc2lnbmVkIGxvbmcgaWQpOwotICAgICAgICAgICAgYm9vbCBwb3BfZW50cnkodW5zaWduZWQgbG9uZyAqcDEsdW5zaWduZWQgbG9uZyAqcDIsIHVuc2lnbmVkIGxvbmcgKmlkKTsKLSAgICAgICAgICAgIC8vIGdldCBtc2d0eXBlIG9mIHRoZSBmaXJzdCBlbGUgZnJvbSB0aGUgcXVldWUKLSAgICAgICAgICAgIHVuc2lnbmVkIGdldF9xX21zZ190eXBlKCk7Ci0KLSAgICAgICAgfTsKLQotICAgICAgICBib29sIGFsbG9jYXRlX2RvbmUodm9pZCk7Ci0gICAgICAgIGJvb2wgYWxsb2NhdGVfaW5wdXRfZG9uZSh2b2lkKTsKLSAgICAgICAgYm9vbCBhbGxvY2F0ZV9vdXRwdXRfZG9uZSh2b2lkKTsKLQotICAgICAgICBPTVhfRVJST1JUWVBFIGZyZWVfaW5wdXRfYnVmZmVyKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXJIZHIpOwotICAgICAgICBPTVhfRVJST1JUWVBFIGZyZWVfb3V0cHV0X2J1ZmZlcihPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVySGRyKTsKLQotICAgICAgICBPTVhfRVJST1JUWVBFIGFsbG9jYXRlX2lucHV0X2J1ZmZlcihPTVhfSEFORExFVFlQRSAgICAgICBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlckhkciwKLSAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgYnl0ZXMpOwotI2lmZGVmIF9BTkRST0lEX0lDU18KLSAgICAgICAgT01YX0VSUk9SVFlQRSBhbGxvY2F0ZV9pbnB1dF9tZXRhX2J1ZmZlcihPTVhfSEFORExFVFlQRSAgICAgICBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlckhkciwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgIGJ5dGVzKTsKLSNlbmRpZgotICAgICAgICBPTVhfRVJST1JUWVBFIGFsbG9jYXRlX291dHB1dF9idWZmZXIoT01YX0hBTkRMRVRZUEUgICAgICAgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZHIsCi0gICAgICAgICAgICAgICAgT01YX1UzMiBwb3J0LE9NWF9QVFIgYXBwRGF0YSwKLSAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICBieXRlcyk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSB1c2VfaW5wdXRfYnVmZmVyKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqKmJ1ZmZlckhkciwKLSAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgYnl0ZXMsCi0gICAgICAgICAgICAgICAgT01YX1U4ICAgICAgICAgICAgICAgICpidWZmZXIpOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgdXNlX291dHB1dF9idWZmZXIoT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICAqKmJ1ZmZlckhkciwKLSAgICAgICAgICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgYnl0ZXMsCi0gICAgICAgICAgICAgICAgT01YX1U4ICAgICAgICAgICAgICAgICAqYnVmZmVyKTsKLQotICAgICAgICBib29sIGV4ZWN1dGVfb214X2ZsdXNoKE9NWF9VMzIpOwotICAgICAgICBib29sIGV4ZWN1dGVfb3V0cHV0X2ZsdXNoKHZvaWQpOwotICAgICAgICBib29sIGV4ZWN1dGVfaW5wdXRfZmx1c2godm9pZCk7Ci0gICAgICAgIGJvb2wgZXhlY3V0ZV9mbHVzaF9hbGwodm9pZCk7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgZW1wdHlfYnVmZmVyX2RvbmUoT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKiBidWZmZXIpOwotCi0gICAgICAgIE9NWF9FUlJPUlRZUEUgZmlsbF9idWZmZXJfZG9uZShPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqIGJ1ZmZlcik7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgZW1wdHlfdGhpc19idWZmZXJfcHJveHkoT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcik7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgZW1wdHlfdGhpc19idWZmZXJfb3BhcXVlKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpOwotICAgICAgICBPTVhfRVJST1JUWVBFIHB1c2hfaW5wdXRfYnVmZmVyKE9NWF9IQU5ETEVUWVBFIGhDb21wKTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBjb252ZXJ0X3F1ZXVlX2J1ZmZlcihPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgcG1lbSAmSW5wdXRfcG1lbV9pbmZvLHVuc2lnbmVkIGxvbmcgJmluZGV4KTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBxdWV1ZV9tZXRhX2J1ZmZlcihPTVhfSEFORExFVFlQRSBoQ29tcCk7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgcHVzaF9lbXB0eV9lb3NfYnVmZmVyKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpOwotICAgICAgICBPTVhfRVJST1JUWVBFIGZpbGxfdGhpc19idWZmZXJfcHJveHkoT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcik7Ci0gICAgICAgIGJvb2wgcmVsZWFzZV9kb25lKCk7Ci0KLSAgICAgICAgYm9vbCByZWxlYXNlX291dHB1dF9kb25lKCk7Ci0gICAgICAgIGJvb2wgcmVsZWFzZV9pbnB1dF9kb25lKCk7Ci0KLSAgICAgICAgT01YX0VSUk9SVFlQRSBzZW5kX2NvbW1hbmRfcHJveHkoT01YX0hBTkRMRVRZUEUgIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQsCi0gICAgICAgICAgICAgICAgT01YX1UzMiAgICAgICAgIHBhcmFtMSwKLSAgICAgICAgICAgICAgICBPTVhfUFRSICAgICAgICAgY21kRGF0YSk7Ci0gICAgICAgIGJvb2wgcG9zdF9ldmVudCggdW5zaWduZWQgbG9uZyBwMSwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHAyLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaWQKLSAgICAgICAgICAgICAgICAgICApOwotICAgICAgICBPTVhfRVJST1JUWVBFIGdldF9zdXBwb3J0ZWRfcHJvZmlsZV9sZXZlbChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcHJvZmlsZUxldmVsVHlwZSk7Ci0gICAgICAgIGlubGluZSB2b2lkIG9teF9yZXBvcnRfZXJyb3IgKCkgewotICAgICAgICAgICAgaWYgKG1fcENhbGxiYWNrcy5FdmVudEhhbmRsZXIgJiYgIW1fZXJyb3JfcHJvcG9nYXRlZCAmJiBtX3N0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgewotICAgICAgICAgICAgICAgIG1fZXJyb3JfcHJvcG9nYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBzZW5kIE9NWF9FcnJvckhhcmR3YXJlIHRvIENsaWVudCIpOwotICAgICAgICAgICAgICAgIG1fcENhbGxiYWNrcy5FdmVudEhhbmRsZXIoJm1fY21wLG1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JIYXJkd2FyZSwwLE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIHZvaWQgb214X3JlcG9ydF9od19vdmVybG9hZCAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobV9wQ2FsbGJhY2tzLkV2ZW50SGFuZGxlciAmJiAhbV9lcnJvcl9wcm9wb2dhdGVkICYmIG1fc3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSB7Ci0gICAgICAgICAgICAgICAgbV9lcnJvcl9wcm9wb2dhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHNlbmQgT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzIHRvIENsaWVudCIpOwotICAgICAgICAgICAgICAgIG1fcENhbGxiYWNrcy5FdmVudEhhbmRsZXIoJm1fY21wLCBtX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgMCwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgdm9pZCBvbXhfcmVwb3J0X3Vuc3VwcG9ydGVkX3NldHRpbmcgKCkgewotICAgICAgICAgICAgaWYgKG1fcENhbGxiYWNrcy5FdmVudEhhbmRsZXIgJiYgIW1fZXJyb3JfcHJvcG9nYXRlZCAmJiBtX3N0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgewotICAgICAgICAgICAgICAgIG1fZXJyb3JfcHJvcG9nYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbV9wQ2FsbGJhY2tzLkV2ZW50SGFuZGxlcigmbV9jbXAsbV9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEVycm9yLE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywwLE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjb21wbGV0ZV9wZW5kaW5nX2J1ZmZlcl9kb25lX2NicygpOwotICAgICAgICBib29sIGlzX2NvbnZfbmVlZGVkKGludCwgaW50KTsKLSAgICAgICAgdm9pZCBwcmludF9kZWJ1Z19jb2xvcl9hc3BlY3RzKENvbG9yQXNwZWN0cyAqYXNwZWN0cywgY29uc3QgY2hhciAqcHJlZml4KTsKLQotICAgICAgICBPTVhfRVJST1JUWVBFIGdldF92ZW5kb3JfZXh0ZW5zaW9uX2NvbmZpZygKLSAgICAgICAgICAgICAgICBPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX0VYVEVOU0lPTlRZUEUgKmV4dCk7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgc2V0X3ZlbmRvcl9leHRlbnNpb25fY29uZmlnKAotICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0KTsKLSAgICAgICAgdm9pZCBpbml0X3ZlbmRvcl9leHRlbnNpb25zKFZlbmRvckV4dGVuc2lvblN0b3JlJik7Ci0gICAgICAgIC8vIEV4dGVuc2lvbnMtc3RvcmUgaXMgaW1tdXRhYmxlIGFmdGVyIGluaXRpYWxpemF0aW9uIChpLmUgY2Fubm90IGFkZC9yZW1vdmUvY2hhbmdlCi0gICAgICAgIC8vICBleHRlbnNpb25zIG9uY2UgYWRkZWQgISkKLSAgICAgICAgY29uc3QgVmVuZG9yRXh0ZW5zaW9uU3RvcmUgbVZlbmRvckV4dGVuc2lvblN0b3JlOwotCi0jaWZkZWYgVVNFX0lPTgotICAgICAgICBpbnQgYWxsb2NfbWFwX2lvbl9tZW1vcnkoaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW9uX2FsbG9jYXRpb25fZGF0YSAqYWxsb2NfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpb25fZmRfZGF0YSAqZmRfZGF0YSxpbnQgZmxhZyk7Ci0gICAgICAgIHZvaWQgZnJlZV9pb25fbWVtb3J5KHN0cnVjdCB2ZW5jX2lvbiAqYnVmX2lvbl9pbmZvKTsKLSNlbmRpZgotCi0gICAgICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAvLyoqKioqKioqKioqKioqKioqKipNRU1CRVIgVkFSSUFCTEVTICoqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgcHRocmVhZF9tdXRleF90ICAgICAgIG1fbG9jazsKLSAgICAgICAgc2VtX3QgICAgICAgICAgICAgICAgIG1fY21kX2xvY2s7Ci0gICAgICAgIGJvb2wgICAgICAgICAgICAgIG1fZXJyb3JfcHJvcG9nYXRlZDsKLQotICAgICAgICAvL3NlbSB0byBoYW5kbGUgdGhlIG1pbmltdW0gcHJvY2VzaW5nIG9mIGNvbW1hbmRzCi0KLQotICAgICAgICAvLyBjb21wcmVzc2lvbiBmb3JtYXQKLSAgICAgICAgLy9PTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7Ci0gICAgICAgIC8vIE9NWCBTdGF0ZQotICAgICAgICBPTVhfU1RBVEVUWVBFIG1fc3RhdGU7Ci0gICAgICAgIC8vIEFwcGxpY2F0aW9uIGRhdGEKLSAgICAgICAgT01YX1BUUiBtX2FwcF9kYXRhOwotICAgICAgICBPTVhfQk9PTCBtX3VzZV9pbnB1dF9wbWVtOwotICAgICAgICBPTVhfQk9PTCBtX3VzZV9vdXRwdXRfcG1lbTsKLSAgICAgICAgLy8gQXBwbGljYXRpb24gY2FsbGJhY2tzCi0gICAgICAgIE9NWF9DQUxMQkFDS1RZUEUgbV9wQ2FsbGJhY2tzOwotICAgICAgICBPTVhfUE9SVF9QQVJBTV9UWVBFIG1fc1BvcnRQYXJhbTsKLSAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgbV9zUGFyYW1Qcm9maWxlTGV2ZWw7Ci0gICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSBtX3NJblBvcnRGb3JtYXQ7Ci0gICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSBtX3NPdXRQb3J0Rm9ybWF0OwotICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIG1fc0luUG9ydERlZjsKLSAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBtX3NPdXRQb3J0RGVmOwotICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSBtX3NQYXJhbUFWQzsKLSAgICAgICAgT01YX1ZJREVPX1BBUkFNX1ZQOFRZUEUgbV9zUGFyYW1WUDg7Ci0gICAgICAgIE9NWF9WSURFT19QQVJBTV9IRVZDVFlQRSBtX3NQYXJhbUhFVkM7Ci0gICAgICAgIE9NWF9QT1JUX1BBUkFNX1RZUEUgbV9zUG9ydFBhcmFtX2ltZzsKLSAgICAgICAgT01YX1BPUlRfUEFSQU1fVFlQRSBtX3NQb3J0UGFyYW1fYXVkaW87Ci0gICAgICAgIE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgbV9zQ29uZmlnQml0cmF0ZTsKLSAgICAgICAgT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFIG1fc0NvbmZpZ0ZyYW1lcmF0ZTsKLSAgICAgICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFIG1fc1BhcmFtQml0cmF0ZTsKLSAgICAgICAgT01YX1BSSU9SSVRZTUdNVFRZUEUgbV9zUHJpb3JpdHlNZ210OwotICAgICAgICBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFIG1fc0luQnVmU3VwcGxpZXI7Ci0gICAgICAgIE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgbV9zT3V0QnVmU3VwcGxpZXI7Ci0gICAgICAgIE9NWF9DT05GSUdfUk9UQVRJT05UWVBFIG1fc0NvbmZpZ0ZyYW1lUm90YXRpb247Ci0gICAgICAgIE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRSBtX3NDb25maWdJbnRyYVJlZnJlc2hWT1A7Ci0gICAgICAgIE9NWF9VMzIgbV9RUFNldDsKLSAgICAgICAgT01YX1ZJREVPX1BBUkFNX1FVQU5USVpBVElPTlRZUEUgbV9zU2Vzc2lvblF1YW50aXphdGlvbjsKLSAgICAgICAgT01YX1FDT01fVklERU9fUEFSQU1fSVBCX1FQUkFOR0VUWVBFIG1fc1Nlc3Npb25RUFJhbmdlOwotICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDU0xJQ0VGTU8gbV9zQVZDU2xpY2VGTU87Ci0gICAgICAgIFFPTVhfVklERU9fSU5UUkFQRVJJT0RUWVBFIG1fc0ludHJhcGVyaW9kOwotICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSBtX3NFcnJvckNvcnJlY3Rpb247Ci0gICAgICAgIE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFIG1fc0ludHJhUmVmcmVzaDsKLSAgICAgICAgUU9NWF9WSURFT19QQVJBTV9MVFJNT0RFX1RZUEUgbV9zUGFyYW1MVFJNb2RlOwotICAgICAgICBRT01YX1ZJREVPX1BBUkFNX0xUUkNPVU5UX1RZUEUgbV9zUGFyYW1MVFJDb3VudDsKLSAgICAgICAgUU9NWF9WSURFT19DT05GSUdfTFRSUEVSSU9EX1RZUEUgbV9zQ29uZmlnTFRSUGVyaW9kOwotICAgICAgICBRT01YX1ZJREVPX0NPTkZJR19MVFJVU0VfVFlQRSBtX3NDb25maWdMVFJVc2U7Ci0gICAgICAgIE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0QgbV9zQ29uZmlnQVZDSURSUGVyaW9kOwotICAgICAgICBPTVhfVklERU9fQ09ORklHX0RFSU5URVJMQUNFIG1fc0NvbmZpZ0RlaW50ZXJsYWNlOwotICAgICAgICBPTVhfVklERU9fVlA4UkVGRVJFTkNFRlJBTUVUWVBFIG1fc0NvbmZpZ1ZwOFJlZmVyZW5jZUZyYW1lOwotICAgICAgICBRT01YX1ZJREVPX0hJRVJBUkNISUNBTExBWUVSUyBtX3NIaWVyTGF5ZXJzOwotICAgICAgICBRT01YX0VYVE5JTkRFWF9WSURFT19ISUVSX1BfTEFZRVJTIG1fc0hQbGF5ZXJzOwotICAgICAgICBPTVhfU0tZUEVfVklERU9fQ09ORklHX0JBU0VMQVlFUlBJRCBtX3NCYXNlTGF5ZXJJRDsKLSAgICAgICAgT01YX1NLWVBFX1ZJREVPX1BBUkFNX0RSSVZFUlZFUiBtX3NEcml2ZXJWZXI7Ci0gICAgICAgIE9NWF9RQ09NX1ZJREVPX0NPTkZJR19RUCBtX3NDb25maWdRUDsKLSAgICAgICAgUU9NWF9FWFROSU5ERVhfVklERU9fVkVOQ19TQVIgbV9zU2FyOwotICAgICAgICBRT01YX1ZJREVPX0gyNjRFTlRST1BZQ09ESU5HVFlQRSBtX3NQYXJhbUVudHJvcHk7Ci0gICAgICAgIFByZXBlbmRTUFNQUFNUb0lEUkZyYW1lc1BhcmFtcyBtX3NQcmVwZW5kU1BTUFBTOwotICAgICAgICBzdHJ1Y3QgdGltZXN0YW1wX2luZm8gewotICAgICAgICAgICAgT01YX1U2NCBtX1RpbWVTdGFtcDsKLSAgICAgICAgICAgIGJvb2wgaXNfYnVmZmVyX3BlbmRpbmc7Ci0gICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcGVuZGluZ19idWZmZXI7Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X3QgbV9sb2NrOwotICAgICAgICB9IHRpbWVzdGFtcDsKLSAgICAgICAgT01YX1UzMiBtX3NFeHRyYURhdGE7Ci0gICAgICAgIE9NWF9VMzIgbV9pbnB1dF9tc2dfaWQ7Ci0gICAgICAgIE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9JTlRSQVJFRlJFU0hUWVBFIG1fc0NvbmZpZ0ludHJhUmVmcmVzaDsKLSAgICAgICAgT01YX1FUSV9WSURFT19DT05GSUdfQkxVUklORk8gICAgICAgbV9ibHVySW5mbzsKLSAgICAgICAgRGVzY3JpYmVDb2xvckFzcGVjdHNQYXJhbXMgbV9zQ29uZmlnQ29sb3JBc3BlY3RzOwotICAgICAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSBtX3NQYXJhbVRlbXBvcmFsTGF5ZXJzOwotICAgICAgICBPTVhfVklERU9fQ09ORklHX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1RZUEUgbV9zQ29uZmlnVGVtcG9yYWxMYXllcnM7Ci0gICAgICAgIFFPTVhfRU5BQkxFVFlQRSBtX3NQYXJhbUFWVGltZXJUaW1lc3RhbXBNb2RlOyAgIC8vIHVzZSBWVC10aW1lc3RhbXBzIGluIGdyYWxsb2MtaGFuZGxlCi0KLSAgICAgICAgLy8gZmlsbCB0aGlzIGJ1ZmZlciBxdWV1ZQotICAgICAgICBvbXhfY21kX3F1ZXVlIG1fZnRiX3E7Ci0gICAgICAgIC8vIENvbW1hbmQgUSBmb3IgcmVzdCBvZiB0aGUgZXZlbnRzCi0gICAgICAgIG9teF9jbWRfcXVldWUgbV9jbWRfcTsKLSAgICAgICAgb214X2NtZF9xdWV1ZSBtX2V0Yl9xOwotICAgICAgICAvLyBJbnB1dCBtZW1vcnkgcG9pbnRlcgotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqbV9pbnBfbWVtX3B0cjsKLSAgICAgICAgLy8gT3V0cHV0IG1lbW9yeSBwb2ludGVyCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICptX291dF9tZW1fcHRyOwotICAgICAgICBvbXhfY21kX3F1ZXVlIG1fb3BxX21ldGFfcTsKLSAgICAgICAgb214X2NtZF9xdWV1ZSBtX29wcV9wbWVtX3E7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFIG1ldGFfYnVmZmVyX2hkcltNQVhfTlVNX0lOUFVUX0JVRkZFUlNdOwotCi0gICAgICAgIGJvb2wgaW5wdXRfZmx1c2hfcHJvZ3Jlc3M7Ci0gICAgICAgIGJvb2wgb3V0cHV0X2ZsdXNoX3Byb2dyZXNzOwotICAgICAgICBib29sIGlucHV0X3VzZV9idWZmZXI7Ci0gICAgICAgIGJvb2wgb3V0cHV0X3VzZV9idWZmZXI7Ci0gICAgICAgIGludCBwZW5kaW5nX2lucHV0X2J1ZmZlcnM7Ci0gICAgICAgIGludCBwZW5kaW5nX291dHB1dF9idWZmZXJzOwotCi0gICAgICAgIGJvb2wgYWxsb2NhdGVfbmF0aXZlX2hhbmRsZTsKLQotICAgICAgICB1aW50NjRfdCBtX291dF9ibV9jb3VudDsKLSAgICAgICAgdWludDY0X3QgbV9pbnBfYm1fY291bnQ7Ci0gICAgICAgIHVpbnQ2NF90IG1fZmxhZ3M7Ci0gICAgICAgIHVpbnQ2NF90IG1fZXRiX2NvdW50OwotICAgICAgICB1aW50NjRfdCBtX2ZiZF9jb3VudDsKLSAgICAgICAgT01YX1RJQ0tTIG1fZXRiX3RpbWVzdGFtcDsKLSAgICAgICAgLy8gdG8ga25vdyB3aGV0aGVyIEV2ZW50IFBvcnQgU2V0dGluZ3MgY2hhbmdlIGhhcyBiZWVuIHRyaWdnZXJlZCBvciBub3QuCi0gICAgICAgIGJvb2wgbV9ldmVudF9wb3J0X3NldHRpbmdzX3NlbnQ7Ci0gICAgICAgIE9NWF9VOCAgICAgICAgICAgICAgICBtX2NSb2xlW09NWF9NQVhfU1RSSU5HTkFNRV9TSVpFXTsKLSAgICAgICAgYm9vbCBod19vdmVybG9hZDsKLSAgICAgICAgc2l6ZV90IG1fZ3JhcGhpY2J1ZmZlcl9zaXplOwotICAgICAgICBjaGFyIG1fcGxhdGZvcm1bT01YX01BWF9TVFJJTkdOQU1FX1NJWkVdOwotfTsKLQotI2VuZGlmIC8vIF9fT01YX1ZJREVPX0JBU0VfSF9fCmRpZmYgLS1naXQgYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvaW5jL29teF92aWRlb19jb21tb24uaCBiL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9pbmMvb214X3ZpZGVvX2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDkyZmE3Li4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9pbmMvb214X3ZpZGVvX2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yCi0gICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTi1JTkZSSU5HRU1FTlQgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgX19PTVhfVklERU9fQ09NTU9OX0hfXwotI2RlZmluZSBfX09NWF9WSURFT19DT01NT05fSF9fCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlIEZpbGVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotI2luY2x1ZGU8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBVU0VfSU9OCi0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotI2VuZGlmCi0KLSNpZmRlZiBfQU5EUk9JRF8KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2Vsc2UKLSNkZWZpbmUgUFJPUEVSVFlfVkFMVUVfTUFYIDkyCi0jZW5kaWYKLQotI2RlZmluZSBPTVhfVklERU9fREVDX05VTV9JTlBVVF9CVUZGRVJTICAgMgotI2RlZmluZSBPTVhfVklERU9fREVDX05VTV9PVVRQVVRfQlVGRkVSUyAgMgotCi0jaWZkZWYgRkVBVFVSRV9RVFZfV1ZHQV9FTkFCTEUKLSNkZWZpbmUgT01YX1ZJREVPX0RFQ19JTlBVVF9CVUZGRVJfU0laRSAgICgyNTYqMTAyNCkKLSNlbHNlCi0jZGVmaW5lIE9NWF9WSURFT19ERUNfSU5QVVRfQlVGRkVSX1NJWkUgICAoMTI4KjEwMjQpCi0jZW5kaWYKLQotI2RlZmluZSBPTVhfQ09SRV9DT05UUk9MX0NNRFFfU0laRSAgIDEwMAotI2RlZmluZSBPTVhfQ09SRV9RQ0lGX0hFSUdIVCAgICAgICAgIDE0NAotI2RlZmluZSBPTVhfQ09SRV9RQ0lGX1dJRFRIICAgICAgICAgIDE3NgotI2RlZmluZSBPTVhfQ09SRV9WR0FfSEVJR0hUICAgICAgICAgIDQ4MAotI2RlZmluZSBPTVhfQ09SRV9WR0FfV0lEVEggICAgICAgICAgIDY0MAotI2RlZmluZSBPTVhfQ09SRV9XVkdBX0hFSUdIVCAgICAgICAgIDQ4MAotI2RlZmluZSBPTVhfQ09SRV9XVkdBX1dJRFRIICAgICAgICAgIDgwMAotI2RlZmluZSBPTVhfQ09SRV9GV1ZHQV9IRUlHSFQgICAgICAgIDQ4MAotI2RlZmluZSBPTVhfQ09SRV9GV1ZHQV9XSURUSCAgICAgICAgIDg2NAotI2RlZmluZSBPTVhfQ09SRV83MjBQX1dJRFRIICAgICAgICAgIDEyODAKLSNkZWZpbmUgT01YX0NPUkVfNzIwUF9IRUlHSFQgICAgICAgICAgNzIwCi0jZGVmaW5lIE9NWF9DT1JFXzEwODBQX1dJRFRIICAgICAgICAgMTkyMAotI2RlZmluZSBPTVhfQ09SRV8xMDgwUF9IRUlHSFQgICAgICAgIDEwODAKLSNkZWZpbmUgT01YX0NPUkVfNEtVSERfV0lEVEggICAgICAgICAzODQwCi0jZGVmaW5lIE9NWF9DT1JFXzRLVUhEX0hFSUdIVCAgICAgICAgMjE2MAotI2RlZmluZSBPTVhfQ09SRV80S0RDSV9XSURUSCAgICAgICAgIDQwOTYKLSNkZWZpbmUgT01YX0NPUkVfNEtEQ0lfSEVJR0hUICAgICAgICAyMTYwCi0KLWVudW0gUG9ydEluZGV4VHlwZSB7Ci0gICAgUE9SVF9JTkRFWF9JTiA9IDAsCi0gICAgUE9SVF9JTkRFWF9PVVQgPSAxLAotICAgIFBPUlRfSU5ERVhfQk9USCA9IC0xLAotICAgIFBPUlRfSU5ERVhfTk9ORSA9IC0yCi19OwotCi1zdHJ1Y3QgcG1lbSB7Ci0gICAgdm9pZCAqYnVmZmVyOwotICAgIGludCBmZDsKLSAgICB1bnNpZ25lZCBvZmZzZXQ7Ci0gICAgdW5zaWduZWQgc2l6ZTsKLX07Ci0KLXN0cnVjdCB2ZW5jX2RlYnVnX2NhcCB7Ci0gICAgYm9vbCBpbl9idWZmZXJfbG9nOwotICAgIGJvb2wgb3V0X2J1ZmZlcl9sb2c7Ci0gICAgYm9vbCBleHRyYWRhdGFfbG9nOwotICAgIGNoYXIgaW5maWxlX25hbWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBjaGFyIG91dGZpbGVfbmFtZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGNoYXIgZXh0cmFkYXRhZmlsZV9uYW1lW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgY2hhciBsb2dfbG9jW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgRklMRSAqaW5maWxlOwotICAgIEZJTEUgKm91dGZpbGU7Ci0gICAgRklMRSAqZXh0cmFkYXRhZmlsZTsKLX07Ci0jaWZkZWYgVVNFX0lPTgotc3RydWN0IHZlbmNfaW9uIHsKLSAgICBpbnQgaW9uX2RldmljZV9mZDsKLSAgICBzdHJ1Y3QgaW9uX2ZkX2RhdGEgZmRfaW9uX2RhdGE7Ci0gICAgc3RydWN0IGlvbl9hbGxvY2F0aW9uX2RhdGEgaW9uX2FsbG9jX2RhdGE7Ci19OwotCi0jZW5kaWYKLSNlbmRpZiAvLyBfX09NWF9WSURFT19DT01NT05fSF9fCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9pbmMvb214X3ZpZGVvX2VuY29kZXIuaCBiL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9pbmMvb214X3ZpZGVvX2VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxOWMwMC4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvaW5jL29teF92aWRlb19lbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi1XQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIF9fT01YX1ZFTkNfX0gKLSNkZWZpbmUgX19PTVhfVkVOQ19fSAotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAib214X3ZpZGVvX2Jhc2UuaCIKLSNpbmNsdWRlICJ2aWRlb19lbmNvZGVyX2RldmljZV92NGwyLmgiCi0KLWV4dGVybiAiQyIgewotICAgIE9NWF9BUEkgdm9pZCAqIGdldF9vbXhfY29tcG9uZW50X2ZhY3RvcnlfZm4odm9pZCk7Ci19Ci0KLWNsYXNzIG9teF92ZW5jOiBwdWJsaWMgb214X3ZpZGVvCi17Ci0gICAgcHVibGljOgotICAgICAgICBvbXhfdmVuYygpOyAvL2NvbnN0cnVjdG9yCi0gICAgICAgIH5vbXhfdmVuYygpOyAvL2RlcwotICAgICAgICBzdGF0aWMgaW50IGFzeW5jX21lc3NhZ2VfcHJvY2VzcyAodm9pZCAqY29udGV4dCwgdm9pZCogbWVzc2FnZSk7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgY29tcG9uZW50X2luaXQoT01YX1NUUklORyByb2xlKTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBzZXRfcGFyYW1ldGVyKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgIHBhcmFtSW5kZXgsCi0gICAgICAgICAgICAgICAgT01YX1BUUiAgICAgICAgcGFyYW1EYXRhKTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBzZXRfY29uZmlnKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgIGNvbmZpZ0luZGV4LAotICAgICAgICAgICAgICAgIE9NWF9QVFIgICAgICAgIGNvbmZpZ0RhdGEpOwotICAgICAgICBPTVhfRVJST1JUWVBFIGNvbXBvbmVudF9kZWluaXQoT01YX0hBTkRMRVRZUEUgaENvbXApOwotICAgICAgICBib29sIGlzX3NlY3VyZV9zZXNzaW9uKCk7Ci0gICAgICAgIC8vT01YIHN0cnVjdXRyZXMKLSAgICAgICAgT01YX1UzMiBtX25WZW5jX2Zvcm1hdDsKLSAgICAgICAgY2xhc3MgdmVuY19kZXYgKmhhbmRsZTsKLSAgICAgICAgaW50IGRldl9oYW5kbGVfb3V0cHV0X2V4dHJhZGF0YSh2b2lkICosIGludCk7Ci0gICAgICAgIGludCBkZXZfc2V0X2Zvcm1hdChpbnQpOwotICAgIHByaXZhdGU6Ci0gICAgICAgIE9NWF9VMzIgZGV2X3N0b3Aodm9pZCk7Ci0gICAgICAgIE9NWF9VMzIgZGV2X3BhdXNlKHZvaWQpOwotICAgICAgICBPTVhfVTMyIGRldl9zdGFydCh2b2lkKTsKLSAgICAgICAgT01YX1UzMiBkZXZfZmx1c2godW5zaWduZWQpOwotICAgICAgICBPTVhfVTMyIGRldl9yZXN1bWUodm9pZCk7Ci0gICAgICAgIE9NWF9VMzIgZGV2X3N0YXJ0X2RvbmUodm9pZCk7Ci0gICAgICAgIE9NWF9VMzIgZGV2X3NldF9tZXNzYWdlX3RocmVhZF9pZChwdGhyZWFkX3QpOwotICAgICAgICBib29sIGRldl91c2VfYnVmKHVuc2lnbmVkKTsKLSAgICAgICAgYm9vbCBkZXZfZnJlZV9idWYoIHZvaWQgKix1bnNpZ25lZCk7Ci0gICAgICAgIGJvb2wgZGV2X2VtcHR5X2J1Zih2b2lkICosIHZvaWQgKix1bnNpZ25lZCx1bnNpZ25lZCk7Ci0gICAgICAgIGJvb2wgZGV2X2ZpbGxfYnVmKHZvaWQgKiwgdm9pZCAqLHVuc2lnbmVkLHVuc2lnbmVkKTsKLSAgICAgICAgYm9vbCBkZXZfYnVmZmVyX3JlYWR5X3RvX3F1ZXVlKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpOwotICAgICAgICBib29sIGRldl9nZXRfYnVmX3JlcShPTVhfVTMyICosT01YX1UzMiAqLE9NWF9VMzIgKixPTVhfVTMyKTsKLSAgICAgICAgYm9vbCBkZXZfc2V0X2J1Zl9yZXEoT01YX1UzMiAqLE9NWF9VMzIgKixPTVhfVTMyICosT01YX1UzMik7Ci0gICAgICAgIGJvb2wgdXBkYXRlX3Byb2ZpbGVfbGV2ZWwoKTsKLSAgICAgICAgYm9vbCBkZXZfZ2V0X3NlcV9oZHIodm9pZCAqLCB1bnNpZ25lZCwgdW5zaWduZWQgKik7Ci0gICAgICAgIGJvb2wgZGV2X2xvYWRlZF9zdGFydCh2b2lkKTsKLSAgICAgICAgYm9vbCBkZXZfbG9hZGVkX3N0b3Aodm9pZCk7Ci0gICAgICAgIGJvb2wgZGV2X2xvYWRlZF9zdGFydF9kb25lKHZvaWQpOwotICAgICAgICBib29sIGRldl9sb2FkZWRfc3RvcF9kb25lKHZvaWQpOwotICAgICAgICBib29sIGRldl9nZXRfY2FwYWJpbGl0eV9sdHJjb3VudChPTVhfVTMyICosIE9NWF9VMzIgKiwgT01YX1UzMiAqKTsKLSAgICAgICAgYm9vbCBkZXZfZ2V0X3Z1aV90aW1pbmdfaW5mbyhPTVhfVTMyICopOwotICAgICAgICBib29sIGRldl9nZXRfdnF6aXBfc2VpX2luZm8oT01YX1UzMiAqKTsKLSAgICAgICAgYm9vbCBkZXZfZ2V0X3BlYWtfYml0cmF0ZShPTVhfVTMyICopOwotICAgICAgICBib29sIGRldl9nZXRfYmF0Y2hfc2l6ZShPTVhfVTMyICopOwotICAgICAgICBib29sIGRldl9nZXRfdGVtcG9yYWxfbGF5ZXJfY2FwcyhPTVhfVTMyICogLypuTWF4TGF5ZXJzKi8sCi0gICAgICAgICAgICAgICAgT01YX1UzMiAqIC8qbk1heEJMYXllcnMqLywgT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFICovKlN1cHBvcnRlZFBhdHRlcm4qLyk7Ci0gICAgICAgIGJvb2wgZGV2X2lzX3ZpZGVvX3Nlc3Npb25fc3VwcG9ydGVkKE9NWF9VMzIgd2lkdGgsIE9NWF9VMzIgaGVpZ2h0KTsKLSAgICAgICAgYm9vbCBkZXZfY29sb3JfYWxpZ24oT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciwgT01YX1UzMiB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgaGVpZ2h0KTsKLSAgICAgICAgYm9vbCBkZXZfZ2V0X291dHB1dF9sb2dfZmxhZygpOwotICAgICAgICBpbnQgZGV2X291dHB1dF9sb2dfYnVmZmVycyhjb25zdCBjaGFyICpidWZmZXJfYWRkciwgaW50IGJ1ZmZlcl9sZW4pOwotICAgICAgICBpbnQgZGV2X2V4dHJhZGF0YV9sb2dfYnVmZmVycyhjaGFyICpidWZmZXIpOwotfTsKLQotI2lmZGVmIF9VQldDXwotICAgICNkZWZpbmUgUU9NWF9ERUZBVUxUX0NPTE9SX0ZNVCAgICBRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm1Db21wcmVzc2VkCi0gICAgI2RlZmluZSBWNEwyX0RFRkFVTFRfT1VUUFVUX0NPTE9SX0ZNVCAgIFY0TDJfUElYX0ZNVF9OVjEyX1VCV0MKLSNlbHNlCi0gICAgI2RlZmluZSBRT01YX0RFRkFVTFRfQ09MT1JfRk1UICAgIFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybQotICAgICNkZWZpbmUgVjRMMl9ERUZBVUxUX09VVFBVVF9DT0xPUl9GTVQgICBWNEwyX1BJWF9GTVRfTlYxMgotI2VuZGlmCi0jZW5kaWYgLy9fX09NWF9WRU5DX19ICmRpZmYgLS1naXQgYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvaW5jL3F1ZXVlLmggYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvaW5jL3F1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjUzZGEuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL2luYy9xdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIDIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgUVVFVUVfSAotI2RlZmluZSBRVUVVRV9ICi0KLSNpbmNsdWRlPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBNZXNzYWdlIFF1ZXVlIHN0cnVjdHVyZSAqLwotc3RydWN0IHZpZGVvX21zZ3EgewotICAgIC8qIENvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgKi8KLSAgICB1bnNpZ25lZCBpbnQgY21kOwotCi0gICAgdW5zaWduZWQgaW50IHN0YXR1czsKLQotICAgIC8qIENsaWVudC1zcGVjaWZpYyBkYXRhICovCi0gICAgdm9pZCAqY2xpZW50ZGF0YTsKLX07Ci0KLQotLyogVGhyZWFkICYgTWVzc2FnZSBRdWV1ZSBpbmZvcm1hdGlvbiAqLwotc3RydWN0IHZpZGVvX3F1ZXVlX2NvbnRleHQgewotICAgIC8qIE1lc3NhZ2UgUXVldWUgcmVsYXRlZCBtZW1iZXJzICovCi0gICAgcHRocmVhZF9tdXRleF90ICBtdXRleDsKLSAgICBzZW1fdCBzZW1fbWVzc2FnZTsKLSAgICBpbnQgY29tbWFuZHFfc2l6ZTsKLSAgICBpbnQgZGF0YXFfc2l6ZTsKLSAgICBzdHJ1Y3QgdmlkZW9fbXNncSAqcHRyX2RhdGFxOwotICAgIHN0cnVjdCB2aWRlb19tc2dxICpwdHJfY21kcTsKLSAgICBpbnQgd3JpdGVfZGF0YXEgOwotICAgIGludCByZWFkX2RhdGFxOwotICAgIGludCB3cml0ZV9jb21xIDsKLSAgICBpbnQgcmVhZF9jb21xIDsKLQotfTsKLQotaW50IGNoZWNrX2lmX3F1ZXVlX2VtcHR5ICggdW5zaWduZWQgaW50IHF1ZXVldG9jaGVjayx2b2lkKiBxdWV1ZWNvbnRleHQgKTsKLQotc3RydWN0IHZpZGVvX21zZ3EgKiBxdWV1ZV9nZXRfY21kICggdm9pZCogcXVldWVjb250ZXh0ICk7Ci0KLQotCi1pbnQgcXVldWVfcG9zdF9jbWRxICggdm9pZCAqcXVldWVjb250ZXh0LAotICAgICAgICBzdHJ1Y3QgdmlkZW9fbXNncSAqcG9zdF9tc2cKLSAgICAgICAgKTsKLQotaW50IHF1ZXVlX3Bvc3RfZGF0YXEgKCB2b2lkICpxdWV1ZWNvbnRleHQsCi0gICAgICAgIHN0cnVjdCB2aWRlb19tc2dxICpwb3N0X21zZwotICAgICAgICApOwotCi0jZW5kaWYgLyogUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL2luYy92aWRlb19lbmNvZGVyX2RldmljZV92NGwyLmggYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvaW5jL3ZpZGVvX2VuY29kZXJfZGV2aWNlX3Y0bDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwZmQ4MS4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvaW5jL3ZpZGVvX2VuY29kZXJfZGV2aWNlX3Y0bDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLVdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi1BUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi1CRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi1CVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi1PUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi1JRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgX19PTVhfVkVOQ19ERVZfXwotI2RlZmluZSBfX09NWF9WRU5DX0RFVl9fCi0KLSNpbmNsdWRlICJPTVhfVHlwZXMuaCIKLSNpbmNsdWRlICJPTVhfQ29yZS5oIgotI2luY2x1ZGUgIk9NWF9WaWRlb0V4dC5oIgotI2luY2x1ZGUgIlFDb21PTVhNZXRhZGF0YS5oIgotI2luY2x1ZGUgIk9NWF9RQ09NRXh0bnMuaCIKLSNpbmNsdWRlICJxY19vbXhfY29tcG9uZW50LmgiCi0jaWZkZWYgX1ZRWklQXwotI2luY2x1ZGUgIlZRWmlwLmgiCi0jZW5kaWYKLQotI2lmZGVmIF9QUV8KLSNpbmNsdWRlICJncHVzdGF0cy5oIgotI2VuZGlmCi0jaW5jbHVkZSAib214X3ZpZGVvX2NvbW1vbi5oIgotI2luY2x1ZGUgIm9teF92aWRlb19iYXNlLmgiCi0jaW5jbHVkZSAib214X3ZpZGVvX2VuY29kZXIuaCIKLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fdmlkYy5oPgotI2luY2x1ZGUgPHBvbGwuaD4KLSNpbmNsdWRlIDxsaXN0PgotCi0jZGVmaW5lIFRJTUVPVVQgNSo2MCoxMDAwCi0jZGVmaW5lIEJJVChudW0pICgxIDw8IChudW0pKQotI2RlZmluZSBNQVhfSFlCX0hJRVJQX0xBWUVSUyA2Ci0jZGVmaW5lIE1BWF9BVkNfSFBfTEFZRVJTICg0KQotI2RlZmluZSBNQVhfVjRMMl9CVUZTIDY0IC8vVkIyX01BWF9GUkFNRQotI2RlZmluZSBFTkFCTEVfSV9RUCAweDEKLSNkZWZpbmUgRU5BQkxFX1BfUVAgMHgyCi0jZGVmaW5lIEVOQUJMRV9CX1FQIDB4NAotCi1lbnVtIGhpZXJfdHlwZSB7Ci0gICAgSElFUl9OT05FID0gMHgwLAotICAgIEhJRVJfUCA9IDB4MSwKLSAgICBISUVSX0IgPSAweDIsCi0gICAgSElFUl9QX0hZQlJJRCA9IDB4MywKLX07Ci0KLXN0cnVjdCBtc21fdmVuY19zd2l0Y2ggewotICAgIHVuc2lnbmVkIGNoYXIgICAgc3RhdHVzOwotfTsKLQotc3RydWN0IG1zbV92ZW5jX2FsbG9jYXRvcnByb3BlcnR5IHsKLSAgICB1bnNpZ25lZCBsb25nICAgICBtaW5jb3VudDsKLSAgICB1bnNpZ25lZCBsb25nICAgICBhY3R1YWxjb3VudDsKLSAgICB1bnNpZ25lZCBsb25nICAgICBkYXRhc2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nICAgICBzdWZmaXhzaXplOwotICAgIHVuc2lnbmVkIGxvbmcgICAgIGFsaWdubWVudDsKLSAgICB1bnNpZ25lZCBsb25nICAgICBidWZwb29saWQ7Ci19OwotCi1zdHJ1Y3QgbXNtX3ZlbmNfYmFzZWNmZyB7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBpbnB1dF93aWR0aDsKLSAgICB1bnNpZ25lZCBsb25nICAgIGlucHV0X2hlaWdodDsKLSAgICB1bnNpZ25lZCBsb25nICAgIGR2c193aWR0aDsKLSAgICB1bnNpZ25lZCBsb25nICAgIGR2c19oZWlnaHQ7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBjb2RlY3R5cGU7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBmcHNfbnVtOwotICAgIHVuc2lnbmVkIGxvbmcgICAgZnBzX2RlbjsKLSAgICB1bnNpZ25lZCBsb25nICAgIHRhcmdldGJpdHJhdGU7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBpbnB1dGZvcm1hdDsKLX07Ci0KLXN0cnVjdCBtc21fdmVuY19wcm9maWxlIHsKLSAgICB1bnNpZ25lZCBsb25nICAgIHByb2ZpbGU7Ci19Owotc3RydWN0IG1zbV92ZW5jX3Byb2ZpbGVsZXZlbCB7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBsZXZlbDsKLX07Ci0KLXN0cnVjdCBtc21fdmVuY19zZXNzaW9ucXAgewotICAgIHVuc2lnbmVkIGxvbmcgICAgaWZyYW1lcXA7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBwZnJhbWVxcDsKLSAgICB1bnNpZ25lZCBsb25nICAgIGJmcmFtZXFwOwotICAgIHVuc2lnbmVkIGxvbmcgICAgZW5hYmxlcXA7Ci19OwotCi1zdHJ1Y3QgbXNtX3ZlbmNfaXBiX3FwcmFuZ2UgewotICAgIHVuc2lnbmVkIGxvbmcgICAgbWF4X2lfcXA7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBtaW5faV9xcDsKLSAgICB1bnNpZ25lZCBsb25nICAgIG1heF9wX3FwOwotICAgIHVuc2lnbmVkIGxvbmcgICAgbWluX3BfcXA7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBtYXhfYl9xcDsKLSAgICB1bnNpZ25lZCBsb25nICAgIG1pbl9iX3FwOwotfTsKLQotc3RydWN0IG1zbV92ZW5jX2ludHJhcGVyaW9kIHsKLSAgICB1bnNpZ25lZCBsb25nICAgIG51bV9wZnJhbWVzOwotICAgIHVuc2lnbmVkIGxvbmcgICAgbnVtX2JmcmFtZXM7Ci19Owotc3RydWN0IG1zbV92ZW5jX3NlcWhlYWRlciB7Ci0gICAgdW5zaWduZWQgY2hhciAqaGRyYnVmcHRyOwotICAgIHVuc2lnbmVkIGxvbmcgICAgYnVmc2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nICAgIGhkcmxlbjsKLX07Ci0KLXN0cnVjdCBtc21fdmVuY19jYXBhYmlsaXR5IHsKLSAgICB1bnNpZ25lZCBsb25nICAgIGNvZGVjX3R5cGVzOwotICAgIHVuc2lnbmVkIGxvbmcgICAgbWF4ZnJhbWVfd2lkdGg7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBtYXhmcmFtZV9oZWlnaHQ7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBtYXh0YXJnZXRfYml0cmF0ZTsKLSAgICB1bnNpZ25lZCBsb25nICAgIG1heGZyYW1lX3JhdGU7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBpbnB1dF9mb3JtYXRzOwotICAgIHVuc2lnbmVkIGNoYXIgICAgZHZzOwotfTsKLQotc3RydWN0IG1zbV92ZW5jX2VudHJvcHljZmcgewotICAgIHVuc2lnbmVkIGxvbmdlbnRyb3B5c2VsOwotICAgIHVuc2lnbmVkIGxvbmcgICAgY2FiYWNtb2RlbDsKLX07Ci0KLXN0cnVjdCBtc21fdmVuY19kYmNmZyB7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBkYl9tb2RlOwotICAgIHVuc2lnbmVkIGxvbmcgICAgc2xpY2VhbHBoYV9vZmZzZXQ7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBzbGljZWJldGFfb2Zmc2V0OwotfTsKLQotc3RydWN0IG1zbV92ZW5jX2ludHJhcmVmcmVzaCB7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBpcm1vZGU7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBtYmNvdW50OwotfTsKLQotc3RydWN0IG1zbV92ZW5jX211bHRpY2xpY2VjZmcgewotICAgIHVuc2lnbmVkIGxvbmcgICAgbXNsaWNlX21vZGU7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBtc2xpY2Vfc2l6ZTsKLX07Ci0KLXN0cnVjdCBtc21fdmVuY19idWZmZXJmbHVzaCB7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBmbHVzaF9tb2RlOwotfTsKLQotc3RydWN0IG1zbV92ZW5jX3JhdGVjdHJsY2ZnIHsKLSAgICB1bnNpZ25lZCBsb25nICAgIHJjbW9kZTsKLX07Ci0KLXN0cnVjdCAgICBtc21fdmVuY192b3B0aW1pbmdjZmcgewotICAgIHVuc2lnbmVkIGxvbmcgICAgdm9wdGltZV9yZXNvbHV0aW9uOwotfTsKLXN0cnVjdCBtc21fdmVuY19mcmFtZXJhdGUgewotICAgIHVuc2lnbmVkIGxvbmcgICAgZnBzX2Rlbm9taW5hdG9yOwotICAgIHVuc2lnbmVkIGxvbmcgICAgZnBzX251bWVyYXRvcjsKLX07Ci0KLXN0cnVjdCBtc21fdmVuY190YXJnZXRiaXRyYXRlIHsKLSAgICB1bnNpZ25lZCBsb25nICAgIHRhcmdldF9iaXRyYXRlOwotfTsKLQotCi1zdHJ1Y3QgbXNtX3ZlbmNfcm90YXRpb24gewotICAgIHVuc2lnbmVkIGxvbmcgICAgcm90YXRpb247Ci19OwotCi1zdHJ1Y3QgbXNtX3ZlbmNfdGltZW91dCB7Ci0gICAgdW5zaWduZWQgbG9uZyAgICBtaWxsaXNlYzsKLX07Ci0KLXN0cnVjdCBtc21fdmVuY19oZWFkZXJleHRlbnNpb24gewotICAgIHVuc2lnbmVkIGxvbmcgICAgaGVhZGVyX2V4dGVuc2lvbjsKLX07Ci0KLXN0cnVjdCBtc21fdmVuY192aWRlb19jYXBhYmlsaXR5IHsKLSAgICB1bnNpZ25lZCBpbnQgbWluX3dpZHRoOwotICAgIHVuc2lnbmVkIGludCBtYXhfd2lkdGg7Ci0gICAgdW5zaWduZWQgaW50IG1pbl9oZWlnaHQ7Ci0gICAgdW5zaWduZWQgaW50IG1heF9oZWlnaHQ7Ci19OwotCi1zdHJ1Y3QgbXNtX3ZlbmNfaWRycGVyaW9kIHsKLSAgICB1bnNpZ25lZCBsb25nIGlkcnBlcmlvZDsKLX07Ci0KLXN0cnVjdCBtc21fdmVuY19zbGljZV9kZWxpdmVyeSB7Ci0gICAgdW5zaWduZWQgbG9uZyBlbmFibGU7Ci19OwotCi1zdHJ1Y3QgbXNtX3ZlbmNfbHRyaW5mbyB7Ci0gICAgdW5zaWduZWQgaW50IGVuYWJsZWQ7Ci0gICAgdW5zaWduZWQgaW50IGNvdW50OwotfTsKLQotc3RydWN0IG1zbV92ZW5jX3Z1aV90aW1pbmdfaW5mbyB7Ci0gICAgdW5zaWduZWQgaW50IGVuYWJsZWQ7Ci19OwotCi1zdHJ1Y3QgbXNtX3ZlbmNfdnF6aXBfc2VpX2luZm8gewotICAgIHVuc2lnbmVkIGludCBlbmFibGVkOwotfTsKLQotc3RydWN0IG1zbV92ZW5jX3BlYWtfYml0cmF0ZSB7Ci0gICAgdW5zaWduZWQgaW50IHBlYWtiaXRyYXRlOwotfTsKLQotc3RydWN0IG1zbV92ZW5jX3ZweF9lcnJvcl9yZXNpbGllbmNlIHsKLSAgICB1bnNpZ25lZCBpbnQgZW5hYmxlOwotfTsKLQotc3RydWN0IG1zbV92ZW5jX3ByaW9yaXR5IHsKLSAgICBPTVhfVTMyIHByaW9yaXR5OwotfTsKLQotc3RydWN0IG1zbV92ZW5jX2NvbG9yX3NwYWNlIHsKLSAgICBPTVhfVTMyIHByaW1hcmllczsKLSAgICBPTVhfVTMyIHJhbmdlOwotICAgIE9NWF9VMzIgbWF0cml4X2NvZWZmczsKLSAgICBPTVhfVTMyIHRyYW5zZmVyX2NoYXJzOwotfTsKLQotc3RydWN0IG1zbV92ZW5jX3RlbXBvcmFsX2xheWVycyB7Ci0gICAgZW51bSBoaWVyX3R5cGUgaGllcl9tb2RlOwotICAgIE9NWF9VMzIgbk1heExheWVyczsKLSAgICBPTVhfVTMyIG5NYXhCTGF5ZXJzOwotICAgIE9NWF9VMzIgblBMYXllcnM7Ci0gICAgT01YX1UzMiBuQkxheWVyczsKLSAgICBPTVhfQk9PTCBiSXNCaXRyYXRlUmF0aW9WYWxpZDsKLSAgICAvLyBjdW11bGF0aXZlIHJhdGlvOiBlZyBbMjUsIDUwLCA3NSwgMTAwXSBtZWFucyBbTDA9MjUlLCBMMT0yNSUsIEwyPTI1JSwgTDM9MjUlXQotICAgIE9NWF9VMzIgblRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bT01YX1ZJREVPX0FORFJPSURfTUFYVEVNUE9SQUxMQVlFUlNdOwotICAgIC8vIExheWVyd2lzZSByYXRpbzogZWcgW0wwPTI1JSwgTDE9MjUlLCBMMj0yNSUsIEwzPTI1JV0KLSAgICBPTVhfVTMyIG5UZW1wb3JhbExheWVyQml0cmF0ZUZyYWN0aW9uW09NWF9WSURFT19BTkRST0lEX01BWFRFTVBPUkFMTEFZRVJTXTsKLSAgICBPTVhfVTMyIG5LZXlGcmFtZUludGVydmFsOwotICAgIE9NWF9VMzIgbk1pblF1YW50aXplcjsKLSAgICBPTVhfVTMyIG5NYXhRdWFudGl6ZXI7Ci19OwotCi1lbnVtIHY0bDJfcG9ydHMgewotICAgIENBUFRVUkVfUE9SVCwKLSAgICBPVVRQVVRfUE9SVCwKLSAgICBNQVhfUE9SVAotfTsKLQotc3RydWN0IGV4dHJhZGF0YV9idWZmZXJfaW5mbyB7Ci0gICAgdW5zaWduZWQgbG9uZyBidWZmZXJfc2l6ZTsKLSAgICBjaGFyKiB1YWRkcjsKLSAgICBpbnQgY291bnQ7Ci0gICAgaW50IHNpemU7Ci0gICAgT01YX0JPT0wgYWxsb2NhdGVkOwotICAgIGVudW0gdjRsMl9wb3J0cyBwb3J0X2luZGV4OwotI2lmZGVmIFVTRV9JT04KLSAgICBzdHJ1Y3QgdmVuY19pb24gaW9uOwotICAgIHVuc2lnbmVkIGludCBtX2lvbl9kZXY7Ci0jZW5kaWYKLSAgICBib29sIHZxemlwX3NlaV9mb3VuZDsKLX07Ci0KLXN0cnVjdCBzdGF0aXN0aWNzIHsKLSAgICBzdHJ1Y3QgdGltZXZhbCBwcmV2X3R2OwotICAgIGludCBwcmV2X2ZiZDsKLSAgICBpbnQgYnl0ZXNfZ2VuZXJhdGVkOwotfTsKLQotZW51bSByY19tb2RlcyB7Ci0gICAgUkNfVkJSX1ZGUiA9IEJJVCgwKSwKLSAgICBSQ19WQlJfQ0ZSID0gQklUKDEpLAotICAgIFJDX0NCUl9WRlIgPSBCSVQoMiksCi0gICAgUkNfQ0JSX0NGUiA9IEJJVCgzKSwKLSAgICBSQ19NQlJfQ0ZSID0gQklUKDQpLAotICAgIFJDX01CUl9WRlIgPSBCSVQoNSksCi0gICAgUkNfQUxMID0gKFJDX1ZCUl9WRlIgfCBSQ19WQlJfQ0ZSCi0gICAgICAgIHwgUkNfQ0JSX1ZGUiB8IFJDX0NCUl9DRlIgfCBSQ19NQlJfQ0ZSIHwgUkNfTUJSX1ZGUikKLX07Ci0KLWNsYXNzIHZlbmNfZGV2Ci17Ci0gICAgcHVibGljOgotICAgICAgICB2ZW5jX2RldihjbGFzcyBvbXhfdmVuYyAqdmVuY19jbGFzcyk7IC8vY29uc3RydWN0b3IKLSAgICAgICAgfnZlbmNfZGV2KCk7IC8vZGVzCi0KLSAgICAgICAgc3RhdGljIHZvaWQqIGFzeW5jX3ZlbmNfbWVzc2FnZV90aHJlYWQgKHZvaWQgKik7Ci0gICAgICAgIGJvb2wgdmVuY19vcGVuKE9NWF9VMzIpOwotICAgICAgICB2b2lkIHZlbmNfY2xvc2UoKTsKLSAgICAgICAgdW5zaWduZWQgdmVuY19zdG9wKHZvaWQpOwotICAgICAgICB1bnNpZ25lZCB2ZW5jX3BhdXNlKHZvaWQpOwotICAgICAgICB1bnNpZ25lZCB2ZW5jX3N0YXJ0KHZvaWQpOwotICAgICAgICB1bnNpZ25lZCB2ZW5jX2ZsdXNoKHVuc2lnbmVkKTsKLSNpZmRlZiBfQU5EUk9JRF9JQ1NfCi0gICAgICAgIGJvb2wgdmVuY19zZXRfbWV0YV9tb2RlKGJvb2wpOwotI2VuZGlmCi0gICAgICAgIHVuc2lnbmVkIHZlbmNfcmVzdW1lKHZvaWQpOwotICAgICAgICB1bnNpZ25lZCB2ZW5jX3N0YXJ0X2RvbmUodm9pZCk7Ci0gICAgICAgIHVuc2lnbmVkIHZlbmNfc3RvcF9kb25lKHZvaWQpOwotICAgICAgICB1bnNpZ25lZCB2ZW5jX3NldF9tZXNzYWdlX3RocmVhZF9pZChwdGhyZWFkX3QpOwotICAgICAgICBib29sIGFsbG9jYXRlX2V4dHJhZGF0YSh1bnNpZ25lZCk7Ci0gICAgICAgIGJvb2wgdmVuY19mcmVlX2J1Zih2b2lkKiwgdW5zaWduZWQpOwotICAgICAgICBib29sIHZlbmNfZW1wdHlfYnVmKHZvaWQgKiwgdm9pZCAqLHVuc2lnbmVkLHVuc2lnbmVkKTsKLSAgICAgICAgYm9vbCB2ZW5jX2ZpbGxfYnVmKHZvaWQgKiwgdm9pZCAqLHVuc2lnbmVkLHVuc2lnbmVkKTsKLSAgICAgICAgYm9vbCB2ZW5jX2dldF9idWZfcmVxKE9NWF9VMzIgKixPTVhfVTMyICosCi0gICAgICAgICAgICAgICAgT01YX1UzMiAqLE9NWF9VMzIpOwotICAgICAgICBib29sIHZlbmNfc2V0X2J1Zl9yZXEoT01YX1UzMiAqLE9NWF9VMzIgKiwKLSAgICAgICAgICAgICAgICBPTVhfVTMyICosT01YX1UzMik7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfcGFyYW0odm9pZCAqLE9NWF9JTkRFWFRZUEUpOwotICAgICAgICBib29sIHZlbmNfc2V0X2NvbmZpZyh2b2lkICpjb25maWdEYXRhLCBPTVhfSU5ERVhUWVBFIGluZGV4KTsKLSAgICAgICAgYm9vbCB2ZW5jX2gyNjRfdHJhbnNmb3JtXzh4OChPTVhfQk9PTCBlbmFibGUpOwotICAgICAgICBib29sIHZlbmNfZ2V0X3Byb2ZpbGVfbGV2ZWwoT01YX1UzMiAqZVByb2ZpbGUsT01YX1UzMiAqZUxldmVsKTsKLSAgICAgICAgYm9vbCB2ZW5jX2dldF9zZXFfaGRyKHZvaWQgKiwgdW5zaWduZWQsIHVuc2lnbmVkICopOwotICAgICAgICBib29sIHZlbmNfZ2V0X2RpbWVuc2lvbnMoT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9VMzIgKncsIE9NWF9VMzIgKmgpOwotICAgICAgICBib29sIHZlbmNfbG9hZGVkX3N0YXJ0KHZvaWQpOwotICAgICAgICBib29sIHZlbmNfbG9hZGVkX3N0b3Aodm9pZCk7Ci0gICAgICAgIGJvb2wgdmVuY19sb2FkZWRfc3RhcnRfZG9uZSh2b2lkKTsKLSAgICAgICAgYm9vbCB2ZW5jX2xvYWRlZF9zdG9wX2RvbmUodm9pZCk7Ci0gICAgICAgIGJvb2wgdmVuY19pc192aWRlb19zZXNzaW9uX3N1cHBvcnRlZCh1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCk7Ci0gICAgICAgIGJvb2wgdmVuY19jb2xvcl9hbGlnbihPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyLCBPTVhfVTMyIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiBoZWlnaHQpOwotICAgICAgICBib29sIHZlbmNfZ2V0X3Z1aV90aW1pbmdfaW5mbyhPTVhfVTMyICplbmFibGVkKTsKLSAgICAgICAgYm9vbCB2ZW5jX2dldF92cXppcF9zZWlfaW5mbyhPTVhfVTMyICplbmFibGVkKTsKLSAgICAgICAgYm9vbCB2ZW5jX2dldF9wZWFrX2JpdHJhdGUoT01YX1UzMiAqcGVha2JpdHJhdGUpOwotICAgICAgICBib29sIHZlbmNfZ2V0X2JhdGNoX3NpemUoT01YX1UzMiAqc2l6ZSk7Ci0gICAgICAgIGJvb2wgdmVuY19nZXRfdGVtcG9yYWxfbGF5ZXJfY2FwcyhPTVhfVTMyICogLypuTWF4TGF5ZXJzKi8sCi0gICAgICAgICAgICAgICAgT01YX1UzMiAqIC8qbk1heEJMYXllcnMqLywgT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFICovKlN1cHBvcnRlZFBhdHRlcm4qLyk7Ci0gICAgICAgIGJvb2wgdmVuY19jaGVja19mb3JfaHlicmlkX2hwKE9NWF9WSURFT19BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdQQVRURVJOVFlQRSBlUGF0dGVybik7Ci0gICAgICAgIGJvb2wgdmVuY19jaGVja19mb3JfaGllcnAoT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFIGVQYXR0ZXJuKTsKLSAgICAgICAgYm9vbCB2ZW5jX2dldF9vdXRwdXRfbG9nX2ZsYWcoKTsKLSAgICAgICAgaW50IHZlbmNfb3V0cHV0X2xvZ19idWZmZXJzKGNvbnN0IGNoYXIgKmJ1ZmZlcl9hZGRyLCBpbnQgYnVmZmVyX2xlbik7Ci0gICAgICAgIGludCB2ZW5jX2lucHV0X2xvZ19idWZmZXJzKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIsIGludCBmZCwgaW50IHBsYW5lX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW5wdXRmb3JtYXQpOwotICAgICAgICBpbnQgdmVuY19leHRyYWRhdGFfbG9nX2J1ZmZlcnMoY2hhciAqYnVmZmVyX2FkZHIpOwotICAgICAgICBib29sIHZlbmNfc2V0X2JpdHJhdGVfdHlwZShPTVhfVTMyIHR5cGUpOwotCi0jaWZkZWYgX1ZRWklQXwotICAgICAgICBjbGFzcyB2ZW5jX2Rldl92cXppcAotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgdmVuY19kZXZfdnF6aXAoKTsKLSAgICAgICAgICAgICAgICB+dmVuY19kZXZfdnF6aXAoKTsKLSAgICAgICAgICAgICAgICBib29sIGluaXQoKTsKLSAgICAgICAgICAgICAgICB2b2lkIGRlaW5pdCgpOwotICAgICAgICAgICAgICAgIHN0cnVjdCBWUVppcENvbmZpZyBwQ29uZmlnOwotICAgICAgICAgICAgICAgIGludCB0ZW1wU0VJWzMwMF07Ci0gICAgICAgICAgICAgICAgaW50IGZpbGxfc3RhdHNfZGF0YSh2b2lkKiBwQnVmLCB2b2lkICpwU3RhdHMpOwotICAgICAgICAgICAgICAgIHR5cGVkZWYgdm9pZCAoKnZxemlwX2RlaW5pdF90KSh2b2lkKik7Ci0gICAgICAgICAgICAgICAgdHlwZWRlZiB2b2lkKiAoKnZxemlwX2luaXRfdCkodm9pZCk7Ci0gICAgICAgICAgICAgICAgdHlwZWRlZiBWUVppcFN0YXR1cyAoKnZxemlwX2NvbXB1dGVfc3RhdHNfdCkodm9pZCogY29uc3QgLCBjb25zdCB2b2lkICogY29uc3QgLCBjb25zdCBWUVppcENvbmZpZyogLFZRWmlwU3RhdHMqKTsKLSAgICAgICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90IGxvY2s7Ci0gICAgICAgICAgICAgICAgdm9pZCAqbUxpYkhhbmRsZTsKLSAgICAgICAgICAgICAgICB2b2lkICptVlFaSVBIYW5kbGU7Ci0gICAgICAgICAgICAgICAgdnF6aXBfaW5pdF90IG1WUVpJUEluaXQ7Ci0gICAgICAgICAgICAgICAgdnF6aXBfZGVpbml0X3QgbVZRWklQRGVJbml0OwotICAgICAgICAgICAgICAgIHZxemlwX2NvbXB1dGVfc3RhdHNfdCBtVlFaSVBDb21wdXRlU3RhdHM7Ci0gICAgICAgIH07Ci0gICAgICAgIHZlbmNfZGV2X3ZxemlwIHZxemlwOwotI2VuZGlmCi0KLSNpZmRlZiBfUFFfCi0gICAgICAgIGNsYXNzIHZlbmNfZGV2X3BxCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICB2ZW5jX2Rldl9wcSgpOwotICAgICAgICAgICAgICAgIH52ZW5jX2Rldl9wcSgpOwotICAgICAgICAgICAgICAgIGJvb2wgaXNfcHFfZW5hYmxlZDsKLSAgICAgICAgICAgICAgICBib29sIGlzX3BxX2ZvcmNlX2Rpc2FibGU7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc19ZVVZfZm9ybWF0X3VuY2VydGFpbjsKLSAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QgbG9jazsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgZXh0cmFkYXRhX2J1ZmZlcl9pbmZvIHJvaV9leHRyYWRhdGFfaW5mbzsKLSAgICAgICAgICAgICAgICBib29sIGluaXQodW5zaWduZWQgbG9uZyk7Ci0gICAgICAgICAgICAgICAgdm9pZCBkZWluaXQoKTsKLSAgICAgICAgICAgICAgICB2b2lkIGdldF9jYXBzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGNvbmZpZ3VyZSh1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc19wcV9oYW5kbGVfdmFsaWQoKTsKLSAgICAgICAgICAgICAgICBib29sIGlzX2NvbG9yX2Zvcm1hdF9zdXBwb3J0ZWQodW5zaWduZWQgbG9uZyk7Ci0gICAgICAgICAgICAgICAgYm9vbCByZWluaXQodW5zaWduZWQgbG9uZyk7Ci0gICAgICAgICAgICAgICAgc3RydWN0IGdwdV9zdGF0c19saWJfaW5wdXRfY29uZmlnIHBDb25maWc7Ci0gICAgICAgICAgICAgICAgaW50IGZpbGxfcHFfc3RhdHMoc3RydWN0IHY0bDJfYnVmZmVyIGJ1ZiwgdW5zaWduZWQgaW50IGRhdGFfb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBncHVfc3RhdHNfbGliX2NhcHNfdCBjYXBzOwotICAgICAgICAgICAgICAgIHR5cGVkZWYgZ3B1X3N0YXRzX2xpYl9vcF9zdGF0dXMgKCpncHVfc3RhdHNfbGliX2luaXRfdCkodm9pZCoqLCBlbnVtIHBlcmZfaGludCBncHVfaGludCwgZW51bSBjb2xvcl9jb21wcmVzc2lvbl9mb3JtYXQgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICB0eXBlZGVmIGdwdV9zdGF0c19saWJfb3Bfc3RhdHVzICgqZ3B1X3N0YXRzX2xpYl9kZWluaXRfdCkodm9pZCopOwotICAgICAgICAgICAgICAgIHR5cGVkZWYgZ3B1X3N0YXRzX2xpYl9vcF9zdGF0dXMgKCpncHVfc3RhdHNfbGliX2dldF9jYXBzX3QpKHZvaWQqIGhhbmRsZSwgZ3B1X3N0YXRzX2xpYl9jYXBzX3QgKmNhcHMpOwotICAgICAgICAgICAgICAgIHR5cGVkZWYgZ3B1X3N0YXRzX2xpYl9vcF9zdGF0dXMgKCpncHVfc3RhdHNfbGliX2NvbmZpZ3VyZV90KSh2b2lkKiBoYW5kbGUsIGdwdV9zdGF0c19saWJfaW5wdXRfY29uZmlnICppbnB1dF90KTsKLSAgICAgICAgICAgICAgICB0eXBlZGVmIGdwdV9zdGF0c19saWJfb3Bfc3RhdHVzICgqZ3B1X3N0YXRzX2xpYl9maWxsX2RhdGFfdCkodm9pZCAqaGFuZGxlLCBncHVfc3RhdHNfbGliX2J1ZmZlcl9wYXJhbXNfdCAqeXV2X2lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgZ3B1X3N0YXRzX2xpYl9idWZmZXJfcGFyYW1zX3QgKnJvaV9pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdwdV9zdGF0c19saWJfYnVmZmVyX3BhcmFtc190ICpzdGF0c19vdXRwdXQsIHZvaWQgKmFkZHIsIHZvaWQgKnVzZXJfZGF0YSk7Ci0gICAgICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgICAgIHZvaWQgKm1MaWJIYW5kbGU7Ci0gICAgICAgICAgICAgICAgdm9pZCAqbVBRSGFuZGxlOwotICAgICAgICAgICAgICAgIGdwdV9zdGF0c19saWJfaW5pdF90IG1QUUluaXQ7Ci0gICAgICAgICAgICAgICAgZ3B1X3N0YXRzX2xpYl9nZXRfY2Fwc190IG1QUUdldENhcHM7Ci0gICAgICAgICAgICAgICAgZ3B1X3N0YXRzX2xpYl9jb25maWd1cmVfdCBtUFFDb25maWd1cmU7Ci0gICAgICAgICAgICAgICAgZ3B1X3N0YXRzX2xpYl9kZWluaXRfdCBtUFFEZUluaXQ7Ci0gICAgICAgICAgICAgICAgZ3B1X3N0YXRzX2xpYl9maWxsX2RhdGFfdCBtUFFDb21wdXRlU3RhdHM7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb25maWd1cmVkX2Zvcm1hdDsKLSAgICAgICAgfTsKLSAgICAgICAgdmVuY19kZXZfcHEgbV9wcTsKLSAgICAgICAgYm9vbCB2ZW5jX2NoZWNrX2Zvcl9wcSh2b2lkKTsKLSAgICAgICAgdm9pZCB2ZW5jX2NvbmZpZ3VyZV9wcSh2b2lkKTsKLSAgICAgICAgdm9pZCB2ZW5jX3RyeV9lbmFibGVfcHEodm9pZCk7Ci0jZW5kaWYKLSAgICAgICAgc3RydWN0IHZlbmNfZGVidWdfY2FwIG1fZGVidWc7Ci0gICAgICAgIE9NWF9VMzIgbV9uRHJpdmVyX2ZkOwotICAgICAgICBpbnQgbV9wb2xsX2VmZDsKLSAgICAgICAgaW50IG51bV9pbnB1dF9wbGFuZXMsIG51bV9vdXRwdXRfcGxhbmVzOwotICAgICAgICBpbnQgZXRiLCBlYmQsIGZ0YiwgZmJkOwotICAgICAgICBzdHJ1Y3QgcmVjb25fYnVmZmVyIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHZpcnR1YWxfYWRkcmVzczsKLSAgICAgICAgICAgIGludCBwbWVtX2ZkOwotICAgICAgICAgICAgaW50IHNpemU7Ci0gICAgICAgICAgICBpbnQgYWxpZ25tZW50OwotICAgICAgICAgICAgaW50IG9mZnNldDsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgICAgICBpbnQgaW9uX2RldmljZV9mZDsKLSAgICAgICAgICAgIHN0cnVjdCBpb25fYWxsb2NhdGlvbl9kYXRhIGFsbG9jX2RhdGE7Ci0gICAgICAgICAgICBzdHJ1Y3QgaW9uX2ZkX2RhdGEgaW9uX2FsbG9jX2ZkOwotI2VuZGlmCi0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IHN0b3BwZWQ7Ci0gICAgICAgIGludCByZXN1bWVfaW5fc3RvcHBlZDsKLSAgICAgICAgYm9vbCBtX21heF9hbGxvd2VkX2JpdHJhdGVfY2hlY2s7Ci0gICAgICAgIHB0aHJlYWRfdCBtX3RpZDsKLSAgICAgICAgYm9vbCBhc3luY190aHJlYWRfY3JlYXRlZDsKLSAgICAgICAgYm9vbCBhc3luY190aHJlYWRfZm9yY2Vfc3RvcDsKLSAgICAgICAgY2xhc3Mgb214X3ZlbmMgKnZlbmNfaGFuZGxlOwotICAgICAgICBPTVhfRVJST1JUWVBFIGFsbG9jYXRlX2V4dHJhZGF0YShzdHJ1Y3QgZXh0cmFkYXRhX2J1ZmZlcl9pbmZvICpleHRyYWRhdGFfaW5mbywgaW50IGZsYWdzKTsKLSAgICAgICAgdm9pZCBmcmVlX2V4dHJhZGF0YV9hbGwoKTsKLSAgICAgICAgdm9pZCBmcmVlX2V4dHJhZGF0YShzdHJ1Y3QgZXh0cmFkYXRhX2J1ZmZlcl9pbmZvICpleHRyYWRhdGFfaW5mbyk7Ci0gICAgICAgIGludCBhcHBlbmRfbWJpX2V4dHJhZGF0YSh2b2lkICosIHN0cnVjdCBtc21fdmlkY19leHRyYWRhdGFfaGVhZGVyKik7Ci0gICAgICAgIGJvb2wgaGFuZGxlX291dHB1dF9leHRyYWRhdGEodm9pZCAqLCBpbnQpOwotICAgICAgICBib29sIGhhbmRsZV9pbnB1dF9leHRyYWRhdGEoc3RydWN0IHY0bDJfYnVmZmVyKTsKLSAgICAgICAgaW50IHZlbmNfc2V0X2Zvcm1hdChpbnQpOwotICAgICAgICBib29sIGRlaW50ZXJsYWNlX2VuYWJsZWQ7Ci0gICAgICAgIGJvb2wgaHdfb3ZlcmxvYWQ7Ci0gICAgICAgIGJvb2wgaXNfZ3JhbGxvY19zb3VyY2VfdWJ3YzsKLSAgICAgICAgYm9vbCBpc19jYW1lcmFfc291cmNlX3Vid2M7Ci0gICAgICAgIGJvb2wgaXNfY3NjX2VuYWJsZWQ7Ci0gICAgICAgIE9NWF9VMzIgZmRfbGlzdFs2NF07Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvZGVjOwotICAgICAgICBzdHJ1Y3QgbXNtX3ZlbmNfYmFzZWNmZyAgICAgICAgICAgICBtX3NWZW5jX2NmZzsKLSAgICAgICAgc3RydWN0IG1zbV92ZW5jX3JvdGF0aW9uICAgICAgICAgICAgbV9yb3RhdGlvbjsKLSAgICAgICAgc3RydWN0IG1zbV92ZW5jX3JhdGVjdHJsY2ZnICAgICAgICAgcmF0ZV9jdHJsOwotICAgICAgICBzdHJ1Y3QgbXNtX3ZlbmNfdGFyZ2V0Yml0cmF0ZSAgICAgICBiaXRyYXRlOwotICAgICAgICBzdHJ1Y3QgbXNtX3ZlbmNfaW50cmFwZXJpb2QgICAgICAgICBpbnRyYV9wZXJpb2Q7Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY19wcm9maWxlICAgICAgICAgICAgIGNvZGVjX3Byb2ZpbGU7Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY19wcm9maWxlbGV2ZWwgICAgICAgIHByb2ZpbGVfbGV2ZWw7Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY19zd2l0Y2ggICAgICAgICAgICAgIHNldF9wYXJhbTsKLSAgICAgICAgc3RydWN0IG1zbV92ZW5jX3ZvcHRpbWluZ2NmZyAgICAgICAgdGltZV9pbmM7Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY19hbGxvY2F0b3Jwcm9wZXJ0eSAgIG1fc0lucHV0X2J1ZmZfcHJvcGVydHk7Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY19hbGxvY2F0b3Jwcm9wZXJ0eSAgIG1fc091dHB1dF9idWZmX3Byb3BlcnR5OwotICAgICAgICBzdHJ1Y3QgbXNtX3ZlbmNfc2Vzc2lvbnFwICAgICAgICAgICBzZXNzaW9uX3FwOwotICAgICAgICBzdHJ1Y3QgbXNtX3ZlbmNfaXBiX3FwcmFuZ2UgICAgICAgICBzZXNzaW9uX2lwYl9xcF92YWx1ZXM7Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY19tdWx0aWNsaWNlY2ZnICAgICAgIG11bHRpc2xpY2U7Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY19lbnRyb3B5Y2ZnICAgICAgICAgIGVudHJvcHk7Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY19kYmNmZyAgICAgICAgICAgICAgIGRia2ZpbHRlcjsKLSAgICAgICAgc3RydWN0IG1zbV92ZW5jX2ludHJhcmVmcmVzaCAgICAgICAgaW50cmFfcmVmcmVzaDsKLSAgICAgICAgc3RydWN0IG1zbV92ZW5jX2hlYWRlcmV4dGVuc2lvbiAgICAgaGVjOwotICAgICAgICBzdHJ1Y3QgbXNtX3ZlbmNfdm9wdGltaW5nY2ZnICAgICAgICB2b3B0aW1lY2ZnOwotICAgICAgICBzdHJ1Y3QgbXNtX3ZlbmNfdmlkZW9fY2FwYWJpbGl0eSAgICBjYXBhYmlsaXR5OwotICAgICAgICBzdHJ1Y3QgbXNtX3ZlbmNfaWRycGVyaW9kICAgICAgICAgICBpZHJwZXJpb2Q7Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY19zbGljZV9kZWxpdmVyeSAgICAgIHNsaWNlX21vZGU7Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY192dWlfdGltaW5nX2luZm8gICAgIHZ1aV90aW1pbmdfaW5mbzsKLSAgICAgICAgc3RydWN0IG1zbV92ZW5jX3ZxemlwX3NlaV9pbmZvICAgICAgdnF6aXBfc2VpX2luZm87Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY19wZWFrX2JpdHJhdGUgICAgICAgIHBlYWtfYml0cmF0ZTsKLSAgICAgICAgc3RydWN0IG1zbV92ZW5jX2x0cmluZm8gICAgICAgICAgICAgbHRyaW5mbzsKLSAgICAgICAgc3RydWN0IG1zbV92ZW5jX3ZweF9lcnJvcl9yZXNpbGllbmNlIHZweF9lcnJfcmVzaWxpZW5jZTsKLSAgICAgICAgc3RydWN0IG1zbV92ZW5jX3ByaW9yaXR5ICAgICAgICAgICAgc2Vzc19wcmlvcml0eTsKLSAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW5nX3JhdGU7Ci0gICAgICAgIHN0cnVjdCBtc21fdmVuY19jb2xvcl9zcGFjZSAgICAgICAgIGNvbG9yX3NwYWNlOwotICAgICAgICBtc21fdmVuY190ZW1wb3JhbF9sYXllcnMgICAgICAgICAgICB0ZW1wb3JhbF9sYXllcnNfY29uZmlnOwotCi0gICAgICAgIGJvb2wgdmVuY19xdWVyeV9jYXAoc3RydWN0IHY0bDJfcXVlcnljdHJsICZjYXApOwotICAgICAgICBib29sIHZlbmNfdmFsaWRhdGVfcmFuZ2UoT01YX1MzMiBpZCwgT01YX1MzMiB2YWwpOwotICAgICAgICBib29sIHZlbmNfc2V0X3Byb2ZpbGUoT01YX1UzMiBlUHJvZmlsZSk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfbGV2ZWwoT01YX1UzMiBlTGV2ZWwpOwotICAgICAgICBib29sIHZlbmNfc2V0X2ludHJhX3BlcmlvZChPTVhfVTMyIG5QRnJhbWVzLCBPTVhfVTMyIG5CRnJhbWVzKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF90YXJnZXRfYml0cmF0ZShPTVhfVTMyIG5UYXJnZXRCaXRyYXRlKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF9yYXRlY3RybF9jZmcoT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBlQ29udHJvbFJhdGUpOwotICAgICAgICBib29sIHZlbmNfc2V0X3Nlc3Npb25fcXBfcmFuZ2UoT01YX1FDT01fVklERU9fUEFSQU1fSVBCX1FQUkFOR0VUWVBFICpxcF9yYW5nZSk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfZW5jb2RlX2ZyYW1lcmF0ZShPTVhfVTMyIGVuY29kZV9mcmFtZXJhdGUpOwotICAgICAgICBib29sIHZlbmNfc2V0X2ludHJhX3ZvcF9yZWZyZXNoKE9NWF9CT09MIGludHJhX3ZvcF9yZWZyZXNoKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF9jb2xvcl9mb3JtYXQoT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JfZm9ybWF0KTsKLSAgICAgICAgYm9vbCB2ZW5jX3ZhbGlkYXRlX3Byb2ZpbGVfbGV2ZWwoT01YX1UzMiAqZVByb2ZpbGUsIE9NWF9VMzIgKmVMZXZlbCk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfbXVsdGlzbGljZV9jZmcoT01YX1UzMiBzbGljZW1vZGUsIE9NWF9VMzIgc2xpY2VzaXplKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF9lbnRyb3B5X2NvbmZpZyhPTVhfQk9PTCBlbmFibGUsIE9NWF9VMzIgaV9jYWJhY19sZXZlbCk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfaW5sb29wX2ZpbHRlcihPTVhfVklERU9fQVZDTE9PUEZJTFRFUlRZUEUgbG9vcF9maWx0ZXIpOwotICAgICAgICBib29sIHZlbmNfc2V0X2ludHJhX3JlZnJlc2ggKE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFIGludHJhcmVmcmVzaCwgT01YX1UzMiBpck1Ccyk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfZXJyb3JfcmVzaWxpZW5jZShPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSogZXJyb3JfcmVzaWxpZW5jZSk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfdm9wdGltaW5nX2NmZyhPTVhfVTMyIG5UaW1lSW5jUmVzKTsKLSAgICAgICAgdm9pZCB2ZW5jX2NvbmZpZ19wcmludCgpOwotICAgICAgICBib29sIHZlbmNfc2V0X3NsaWNlX2RlbGl2ZXJ5X21vZGUoT01YX1UzMiBlbmFibGUpOwotICAgICAgICBib29sIHZlbmNfc2V0X2V4dHJhZGF0YShPTVhfVTMyIGV4dHJhX2RhdGEsIE9NWF9CT09MIGVuYWJsZSk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfaWRyX3BlcmlvZChPTVhfVTMyIG5QRnJhbWVzLCBPTVhfVTMyIG5JRFJQZXJpb2QpOwotICAgICAgICBib29sIHZlbmNfcmVjb25maWd1cmVfaW50cmFfcGVyaW9kKCk7Ci0gICAgICAgIGJvb2wgdmVuY19yZWNvbmZpZ19yZXFidWZzKCk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfdnBlX3JvdGF0aW9uKE9NWF9TMzIgcm90YXRpb25fYW5nbGUpOwotICAgICAgICBib29sIHZlbmNfc2V0X2x0cm1vZGUoT01YX1UzMiBlbmFibGUsIE9NWF9VMzIgY291bnQpOwotICAgICAgICBib29sIHZlbmNfc2V0X3VzZWx0cihPTVhfVTMyIGZyYW1lSWR4KTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF9tYXJrbHRyKE9NWF9VMzIgZnJhbWVJZHgpOwotICAgICAgICBib29sIHZlbmNfc2V0X2luYmFuZF92aWRlb19oZWFkZXIoT01YX0JPT0wgZW5hYmxlKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF9hdV9kZWxpbWl0ZXIoT01YX0JPT0wgZW5hYmxlKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF9oaWVyX2xheWVycyhRT01YX1ZJREVPX0hJRVJBUkNISUNBTENPRElOR1RZUEUgdHlwZSwgT01YX1UzMiBudW1fbGF5ZXJzKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF92dWlfdGltaW5nX2luZm8oT01YX0JPT0wgZW5hYmxlKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF9wZWFrX2JpdHJhdGUoT01YX1UzMiBuUGVha0JpdHJhdGUpOwotICAgICAgICBib29sIHZlbmNfc2V0X3NlYXJjaHJhbmdlKCk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfdnB4X2Vycm9yX3Jlc2lsaWVuY2UoT01YX0JPT0wgZW5hYmxlKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF92cXppcF9zZWlfdHlwZShPTVhfQk9PTCBlbmFibGUpOwotICAgICAgICBib29sIHZlbmNfc2V0X2JhdGNoX3NpemUoT01YX1UzMiBzaXplKTsKLSAgICAgICAgYm9vbCB2ZW5jX2NhbGlicmF0ZV9nb3AoKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF92cXppcF9kZWZhdWx0cygpOwotICAgICAgICBpbnQgdmVuY19nZXRfaW5kZXhfZnJvbV9mZChPTVhfVTMyIGlvbl9mZCwgT01YX1UzMiBidWZmZXJfZmQpOwotICAgICAgICBib29sIHZlbmNfc2V0X2hpZXJwX2xheWVycyhPTVhfVTMyIGhpZXJwX2xheWVycyk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfYmFzZWxheWVyaWQoT01YX1UzMiBiYXNlaWQpOwotICAgICAgICBib29sIHZlbmNfc2V0X3FwKE9NWF9VMzIgaV9mcmFtZV9xcCwgT01YX1UzMiBwX2ZyYW1lX3FwLE9NWF9VMzIgYl9mcmFtZV9xcCwgT01YX1UzMiBlbmFibGUpOwotICAgICAgICBib29sIHZlbmNfc2V0X2FzcGVjdHJhdGlvKHZvaWQgKm5TYXIpOwotICAgICAgICBib29sIHZlbmNfc2V0X3ByaW9yaXR5KE9NWF9VMzIgcHJpb3JpdHkpOwotICAgICAgICBib29sIHZlbmNfc2V0X3Nlc3Npb25fcHJpb3JpdHkoT01YX1UzMiBwcmlvcml0eSk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfb3BlcmF0aW5ncmF0ZShPTVhfVTMyIHJhdGUpOwotICAgICAgICBib29sIHZlbmNfc2V0X2xheWVyX2JpdHJhdGVzKE9NWF9VMzIgKnBMYXllckJpdHJhdGVzLCBPTVhfVTMyIG51bUxheWVycyk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfbG93bGF0ZW5jeV9tb2RlKE9NWF9CT09MIGVuYWJsZSk7Ci0gICAgICAgIGJvb2wgdmVuY19zZXRfbG93X2xhdGVuY3koT01YX0JPT0wgZW5hYmxlKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF9yb2lfcXBfaW5mbyhPTVhfUVRJX1ZJREVPX0NPTkZJR19ST0lJTkZPICpyb2lJbmZvKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF9ibHVyX3Jlc29sdXRpb24oT01YX1FUSV9WSURFT19DT05GSUdfQkxVUklORk8gKmJsdXJJbmZvKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF9jb2xvcnNwYWNlKE9NWF9VMzIgcHJpbWFyaWVzLCBPTVhfVTMyIHJhbmdlLCBPTVhfVTMyIHRyYW5zZmVyX2NoYXJzLCBPTVhfVTMyIG1hdHJpeF9jb2VmZnMpOwotICAgICAgICBPTVhfRVJST1JUWVBFIHZlbmNfc2V0X3RlbXBvcmFsX2xheWVycyhPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSAqcFRlbXBvcmFsUGFyYW1zKTsKLSAgICAgICAgT01YX0VSUk9SVFlQRSB2ZW5jX3NldF90ZW1wb3JhbF9sYXllcnNfaW50ZXJuYWwoKTsKLSAgICAgICAgYm9vbCB2ZW5jX3NldF9pZnJhbWVzaXplX3R5cGUoUU9NWF9WSURFT19JRlJBTUVTSVpFX1RZUEUgdHlwZSk7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgdmVuY19nZXRfY29sb3JfZm9ybWF0KE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdCk7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgdmVuY19nZXRfY29kZWN0eXBlKE9NWF9WSURFT19DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdCk7Ci0KLSAgICAgICAgT01YX1UzMiBwbWVtX2ZyZWUoKTsKLSAgICAgICAgT01YX1UzMiBwbWVtX2FsbG9jYXRlKE9NWF9VMzIgc2l6ZSwgT01YX1UzMiBhbGlnbm1lbnQsIE9NWF9VMzIgY291bnQpOwotICAgICAgICBPTVhfVTMyIHZlbmNfYWxsb2NhdGVfcmVjb25fYnVmZmVycygpOwotICAgICAgICBpbmxpbmUgaW50IGNsaXAyKGludCB4KSB7Ci0gICAgICAgICAgICB4ID0geCAtMTsKLSAgICAgICAgICAgIHggPSB4IHwgeCA+PiAxOwotICAgICAgICAgICAgeCA9IHggfCB4ID4+IDI7Ci0gICAgICAgICAgICB4ID0geCB8IHggPj4gNDsKLSAgICAgICAgICAgIHggPSB4IHwgeCA+PiAxNjsKLSAgICAgICAgICAgIHggPSB4ICsgMTsKLSAgICAgICAgICAgIHJldHVybiB4OwotICAgICAgICB9Ci0gICAgICAgIGludCBtZXRhZGF0YW1vZGU7Ci0gICAgICAgIGJvb2wgc3RyZWFtaW5nW01BWF9QT1JUXTsKLSAgICAgICAgYm9vbCBleHRyYWRhdGE7Ci0gICAgICAgIHN0cnVjdCBleHRyYWRhdGFfYnVmZmVyX2luZm8gaW5wdXRfZXh0cmFkYXRhX2luZm87Ci0gICAgICAgIHN0cnVjdCBleHRyYWRhdGFfYnVmZmVyX2luZm8gb3V0cHV0X2V4dHJhZGF0YV9pbmZvOwotCi0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBwYXVzZV9yZXN1bWVfbWxvY2s7Ci0gICAgICAgIHB0aHJlYWRfY29uZF90IHBhdXNlX3Jlc3VtZV9jb25kOwotICAgICAgICBib29sIHBhdXNlZDsKLSAgICAgICAgaW50IGNvbG9yX2Zvcm1hdDsKLSAgICAgICAgYm9vbCBpc19zZWFyY2hyYW5nZV9zZXQ7Ci0gICAgICAgIGJvb2wgZW5hYmxlX212X25hcnJvd19zZWFyY2hyYW5nZTsKLSAgICAgICAgaW50IHN1cHBvcnRlZF9yY19tb2RlczsKLSAgICAgICAgYm9vbCBpc190aHVsaXVtX3YxOwotICAgICAgICBib29sIGNhbWVyYV9tb2RlX2VuYWJsZWQ7Ci0gICAgICAgIHN0cnVjdCByb2lkYXRhIHsKLSAgICAgICAgICAgIGJvb2wgZGlydHk7Ci0gICAgICAgICAgICBPTVhfVElDS1MgdGltZXN0YW1wOwotICAgICAgICAgICAgT01YX1FUSV9WSURFT19DT05GSUdfUk9JSU5GTyBpbmZvOwotICAgICAgICB9OwotICAgICAgICBib29sIG1fcm9pX2VuYWJsZWQ7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtX3JvaWxvY2s7Ci0gICAgICAgIHN0ZDo6bGlzdDxyb2lkYXRhPiBtX3JvaWxpc3Q7Ci0gICAgICAgIHZvaWQgZ2V0X3JvaV9mb3JfdGltZXN0YW1wKHN0cnVjdCByb2lkYXRhICZyb2ksIE9NWF9USUNLUyB0aW1lc3RhbXApOwotICAgICAgICBib29sIHZlbmNfZW1wdHlfYmF0Y2ggKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWYsIHVuc2lnbmVkIGluZGV4KTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBrTWF4QnVmZmVyc0luQmF0Y2ggPSAxNjsKLSAgICAgICAgdW5zaWduZWQgaW50IG1CYXRjaFNpemU7Ci0gICAgICAgIHN0cnVjdCBCYXRjaEluZm8gewotICAgICAgICAgICAgQmF0Y2hJbmZvKCk7Ci0gICAgICAgICAgICAvKiByZWdpc3RlciBhIGJ1ZmZlciBhbmQgb2J0YWluIGl0cyB1bmlxdWUgaWQgKHY0bDItYnVmLWlkKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpbnQgcmVnaXN0ZXJCdWZmZXIoaW50IGJ1ZmZlcklkKTsKLSAgICAgICAgICAgIC8qIHJldHJpZXZlIHRoZSBidWZmZXIgZ2l2ZW4gaXRzIHY0bDItYnVmLWlkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGludCByZXRyaWV2ZUJ1ZmZlckF0KGludCB2NGwySWQpOwotICAgICAgICAgICAgYm9vbCBpc1BlbmRpbmcoaW50IGJ1ZmZlcklkKTsKLQotICAgICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhCdWZzID0gNjQ7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCdWZJREZyZWUgPSAtMTsKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtTG9jazsKLSAgICAgICAgICAgIGludCBtQnVmTWFwWzY0XTsgIC8vIE1hcCB3aXRoIHNsb3RzIGZvciBlYWNoIGJ1ZmZlcgotICAgICAgICAgICAgc2l6ZV90IG1OdW1QZW5kaW5nOwotCi0gICAgICAgIH07Ci0gICAgICAgIEJhdGNoSW5mbyBtQmF0Y2hJbmZvOwotICAgICAgICBib29sIG1Vc2VBVlRpbWVyVGltZXN0YW1wczsKLX07Ci0KLWVudW0gaW5zdGFuY2Vfc3RhdGUgewotICAgIE1TTV9WSURDX0NPUkVfVU5JTklUX0RPTkUgPSAweDAwMDEsCi0gICAgTVNNX1ZJRENfQ09SRV9JTklULAotICAgIE1TTV9WSURDX0NPUkVfSU5JVF9ET05FLAotICAgIE1TTV9WSURDX09QRU4sCi0gICAgTVNNX1ZJRENfT1BFTl9ET05FLAotICAgIE1TTV9WSURDX0xPQURfUkVTT1VSQ0VTLAotICAgIE1TTV9WSURDX0xPQURfUkVTT1VSQ0VTX0RPTkUsCi0gICAgTVNNX1ZJRENfU1RBUlQsCi0gICAgTVNNX1ZJRENfU1RBUlRfRE9ORSwKLSAgICBNU01fVklEQ19TVE9QLAotICAgIE1TTV9WSURDX1NUT1BfRE9ORSwKLSAgICBNU01fVklEQ19SRUxFQVNFX1JFU09VUkNFUywKLSAgICBNU01fVklEQ19SRUxFQVNFX1JFU09VUkNFU19ET05FLAotICAgIE1TTV9WSURDX0NMT1NFLAotICAgIE1TTV9WSURDX0NMT1NFX0RPTkUsCi0gICAgTVNNX1ZJRENfQ09SRV9VTklOSVQsCi19OwotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9zcmMvb214X3N3dmVuY19tcGVnNC5jcHAgYi9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvc3JjL29teF9zd3ZlbmNfbXBlZzQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjEwZDU2Li4wMDAwMDAwCi0tLSBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9zcmMvb214X3N3dmVuY19tcGVnNC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTk4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yCi0gICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTi1JTkZSSU5HRU1FTlQgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAib214X3N3dmVuY19tcGVnNC5oIgotCi0vKiBkZWY6IFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMgKi8KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgotCi0vKiBkZWY6IFZFTlVTX0JVRkZFUl9TSVpFLCBWRU5VU19ZX1NUUklERSBldGMgKi8KLSNpbmNsdWRlIDxtZWRpYS9tc21fbWVkaWFfaW5mby5oPgotCi0vKiBkZWY6IHByaXZhdGVfaGFuZGxlX3QqLwotI2luY2x1ZGUgPGdyYWxsb2NfcHJpdi5oPgotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBPTVhfU1BFQ19WRVJTSU9OIDB4MDAwMDAxMDEKLSNkZWZpbmUgT01YX0lOSVRfU1RSVUNUKF9zXywgX25hbWVfKSAgICAgICAgICAgICBcCi0gICAgbWVtc2V0KChfc18pLCAweDAsIHNpemVvZihfbmFtZV8pKTsgICAgICAgICAgXAotICAgIChfc18pLT5uU2l6ZSA9IHNpemVvZihfbmFtZV8pOyAgICAgICAgICAgICAgIFwKLSAgICAoX3NfKS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OCi0KLSNkZWZpbmUgRU5URVJfRlVOQygpIERFQlVHX1BSSU5UX0hJR0goIkVOVEVSSU5HOiAlcyIsX19GVU5DVElPTl9fKQotI2RlZmluZSBFWElUX0ZVTkMoKSAgREVCVUdfUFJJTlRfSElHSCgiRVhJVElORzogJXMiLF9fRlVOQ1RJT05fXykKLSNkZWZpbmUgUkVUVVJOKHgpICAgIEVYSVRfRlVOQygpOyByZXR1cm4geDsKLSN1bmRlZiBBTElHTgotI2RlZmluZSBBTElHTih2YWx1ZSxhbGlnbm1lbnQpICgoKHZhbHVlKSArIChhbGlnbm1lbnQtMSkpICYgKH4oYWxpZ25tZW50LTEpKSkKLQotI2RlZmluZSBCVUZGRVJfTE9HX0xPQyAiL2RhdGEvbWlzYy9tZWRpYSIKLQotLyogZmFjdG9yeSBmdW5jdGlvbiBleGVjdXRlZCBieSB0aGUgY29yZSB0byBjcmVhdGUgaW5zdGFuY2VzICovCi12b2lkICpnZXRfb214X2NvbXBvbmVudF9mYWN0b3J5X2ZuKHZvaWQpCi17Ci0gICAgUkVUVVJOKChuZXcgb214X3ZlbmMpKTsKLX0KLQotb214X3ZlbmM6Om9teF92ZW5jKCkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICBjaGFyIHByb3BlcnR5X3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF0gPSB7MH07Ci0KLSAgICBtZW1zZXQoJm1fZGVidWcsMCxzaXplb2YobV9kZWJ1ZykpOwotCi0gICAgcHJvcGVydHlfdmFsdWVbMF0gPSAnXDAnOwotICAgIHByb3BlcnR5X2dldCgidmlkYy5kZWJ1Zy5sZXZlbCIsIHByb3BlcnR5X3ZhbHVlLCAiMSIpOwotICAgIGRlYnVnX2xldmVsID0gYXRvaShwcm9wZXJ0eV92YWx1ZSk7Ci0KLSAgICBwcm9wZXJ0eV92YWx1ZVswXSA9ICdcMCc7Ci0gICAgcHJvcGVydHlfZ2V0KCJ2aWRjLmVuYy5sb2cuaW4iLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBtX2RlYnVnLmluX2J1ZmZlcl9sb2cgPSBhdG9pKHByb3BlcnR5X3ZhbHVlKTsKLQotICAgIHByb3BlcnR5X3ZhbHVlWzBdID0gJ1wwJzsKLSAgICBwcm9wZXJ0eV9nZXQoInZpZGMuZW5jLmxvZy5vdXQiLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBtX2RlYnVnLm91dF9idWZmZXJfbG9nID0gYXRvaShwcm9wZXJ0eV92YWx1ZSk7Ci0KLSAgICBzbnByaW50ZihtX2RlYnVnLmxvZ19sb2MsIFBST1BFUlRZX1ZBTFVFX01BWCwgIiVzIiwgQlVGRkVSX0xPR19MT0MpOwotICAgIHByb3BlcnR5X3ZhbHVlWzBdID0gJ1wwJzsKLSAgICBwcm9wZXJ0eV9nZXQoInZpZGMubG9nLmxvYyIsIHByb3BlcnR5X3ZhbHVlLCAiIik7Ci0gICAgaWYgKCpwcm9wZXJ0eV92YWx1ZSkKLSAgICB7Ci0gICAgICAgc3RybGNweShtX2RlYnVnLmxvZ19sb2MsIHByb3BlcnR5X3ZhbHVlLCBQUk9QRVJUWV9WQUxVRV9NQVgpOwotICAgIH0KLQotICAgIG1lbXNldChtZXRhX2J1ZmZlcl9oZHIsMCxzaXplb2YobWV0YV9idWZmZXJfaGRyKSk7Ci0gICAgbWV0YV9tb2RlX2VuYWJsZSA9IGZhbHNlOwotICAgIG1lbXNldChtZXRhX2J1ZmZlcl9oZHIsMCxzaXplb2YobWV0YV9idWZmZXJfaGRyKSk7Ci0gICAgbWVtc2V0KG1ldGFfYnVmZmVycywwLHNpemVvZihtZXRhX2J1ZmZlcnMpKTsKLSAgICBtZW1zZXQob3BhcXVlX2J1ZmZlcl9oZHIsMCxzaXplb2Yob3BhcXVlX2J1ZmZlcl9oZHIpKTsKLSAgICBtVXNlUHJveHlDb2xvckZvcm1hdCA9IGZhbHNlOwotICAgIGdldF9zeW50YXhoZHJfZW5hYmxlID0gZmFsc2U7Ci0gICAgbV9iU2VxSGRyUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgc2V0X2Zvcm1hdCA9IGZhbHNlOwotCi0gICAgRVhJVF9GVU5DKCk7Ci19Ci0KLW9teF92ZW5jOjp+b214X3ZlbmMoKQotewotICAgIEVOVEVSX0ZVTkMoKTsKLSAgICBnZXRfc3ludGF4aGRyX2VuYWJsZSA9IGZhbHNlOwotICAgIEVYSVRfRlVOQygpOwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92ZW5jOjpjb21wb25lbnRfaW5pdChPTVhfU1RSSU5HIHJvbGUpCi17Ci0gICAgRU5URVJfRlVOQygpOwotCi0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICBTV1ZFTkNfU1RBVFVTIFJldCA9IFNXVkVOQ19TX1NVQ0NFU1M7Ci0gICAgU1dWRU5DX0NBTExCQUNLIGNhbGxCYWNrSW5mbzsKLSAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBjb2RlY190eXBlOwotICAgIFNXVkVOQ19QUk9QRVJUWSBQcm9wOwotICAgIGludCBmZHNbMl07Ci0KLSAgICBzdHJsY3B5KChjaGFyICopbV9ua2luZCxyb2xlLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICBzZWN1cmVfc2Vzc2lvbiA9IGZhbHNlOwotCi0gICAgaWYgKCFzdHJuY21wKCAoY2hhciAqKW1fbmtpbmQsIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzRzdyIsCi0gICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpCi0gICAgewotICAgICAgICBzdHJsY3B5KChjaGFyICopbV9jUm9sZSwgInZpZGVvX2VuY29kZXIubXBlZzQiLFwKLSAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgIGNvZGVjX3R5cGUgPSBPTVhfVklERU9fQ29kaW5nTVBFRzQ7Ci0gICAgICAgIG1fY29kZWMgPSBTV1ZFTkNfQ09ERUNfTVBFRzQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJuY21wKCAoY2hhciAqKW1fbmtpbmQsIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaDI2M3N3IiwKLSAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkKLSAgICB7Ci0gICAgICAgIHN0cmxjcHkoKGNoYXIgKiltX2NSb2xlLCAidmlkZW9fZW5jb2Rlci5oMjYzIixcCi0gICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICBjb2RlY190eXBlID0gT01YX1ZJREVPX0NvZGluZ0gyNjM7Ci0gICAgICAgIG1fY29kZWMgPSBTV1ZFTkNfQ09ERUNfSDI2MzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBVbmtub3duIENvbXBvbmVudCIpOwotICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWU7Ci0gICAgICAgIFJFVFVSTihlUmV0KTsKLSAgICB9Ci0KLSNpZmRlZiBFTkFCTEVfR0VUX1NZTlRBWF9IRFIKLSAgICBnZXRfc3ludGF4aGRyX2VuYWJsZSA9IHRydWU7Ci0gICAgREVCVUdfUFJJTlRfSElHSCgiR2V0IHN5bnRheCBoZWFkZXIgZW5hYmxlZCIpOwotI2VuZGlmCi0KLSAgICBjYWxsQmFja0luZm8ucGZuX2VtcHR5X2J1ZmZlcl9kb25lICAgID0gc3d2ZW5jX2VtcHR5X2J1ZmZlcl9kb25lX2NiOwotICAgIGNhbGxCYWNrSW5mby5wZm5fZmlsbF9idWZmZXJfZG9uZSAgICAgPSBzd3ZlbmNfZmlsbF9idWZmZXJfZG9uZV9jYjsKLSAgICBjYWxsQmFja0luZm8ucGZuX2V2ZW50X25vdGlmaWNhdGlvbiAgID0gc3d2ZW5jX2hhbmRsZV9ldmVudF9jYjsKLSAgICBjYWxsQmFja0luZm8ucF9jbGllbnQgICAgICAgICAgICAgICAgID0gKHZvaWQqKXRoaXM7Ci0KLSAgICBTV1ZFTkNfU1RBVFVTIHNSZXQgPSBzd3ZlbmNfaW5pdCgmbV9oU3dWZW5jLCBtX2NvZGVjLCAmY2FsbEJhY2tJbmZvKTsKLSAgICBpZiAoc1JldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInN3dmVuY19pbml0IHJldHVybmVkICVkLCByZXQgaW5zdWZmaWNpZW50IHJlc291cmNlcyIsCi0gICAgICAgICBzUmV0KTsKLSAgICAgICAgUkVUVVJOKE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcyk7Ci0gICAgfQotCi0gICAgbV9zdG9wcGVkID0gdHJ1ZTsKLQotICAgIC8vSW50aWFsaXNlIHRoZSBPTVggbGF5ZXIgdmFyaWFibGVzCi0gICAgbWVtc2V0KCZtX3BDYWxsYmFja3MsMCxzaXplb2YoT01YX0NBTExCQUNLVFlQRSkpOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NQb3J0UGFyYW0sIE9NWF9QT1JUX1BBUkFNX1RZUEUpOwotICAgIG1fc1BvcnRQYXJhbS5uUG9ydHMgPSAweDI7Ci0gICAgbV9zUG9ydFBhcmFtLm5TdGFydFBvcnROdW1iZXIgPSAoT01YX1UzMikgUE9SVF9JTkRFWF9JTjsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zUG9ydFBhcmFtX2F1ZGlvLCBPTVhfUE9SVF9QQVJBTV9UWVBFKTsKLSAgICBtX3NQb3J0UGFyYW1fYXVkaW8ublBvcnRzID0gMDsKLSAgICBtX3NQb3J0UGFyYW1fYXVkaW8ublN0YXJ0UG9ydE51bWJlciA9IDA7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc1BvcnRQYXJhbV9pbWcsIE9NWF9QT1JUX1BBUkFNX1RZUEUpOwotICAgIG1fc1BvcnRQYXJhbV9pbWcublBvcnRzID0gMDsKLSAgICBtX3NQb3J0UGFyYW1faW1nLm5TdGFydFBvcnROdW1iZXIgPSAwOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NQYXJhbUJpdHJhdGUsIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSk7Ci0gICAgbV9zUGFyYW1CaXRyYXRlLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0gICAgbV9zUGFyYW1CaXRyYXRlLmVDb250cm9sUmF0ZSA9IE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlU2tpcEZyYW1lczsKLSAgICBtX3NQYXJhbUJpdHJhdGUublRhcmdldEJpdHJhdGUgPSA2NDAwMDsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zQ29uZmlnQml0cmF0ZSwgT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSk7Ci0gICAgbV9zQ29uZmlnQml0cmF0ZS5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc0NvbmZpZ0JpdHJhdGUubkVuY29kZUJpdHJhdGUgPSA2NDAwMDsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zQ29uZmlnRnJhbWVyYXRlLCBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUpOwotICAgIG1fc0NvbmZpZ0ZyYW1lcmF0ZS5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc0NvbmZpZ0ZyYW1lcmF0ZS54RW5jb2RlRnJhbWVyYXRlID0gMzAgPDwgMTY7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc0NvbmZpZ0ludHJhUmVmcmVzaFZPUCwgT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFKTsKLSAgICBtX3NDb25maWdJbnRyYVJlZnJlc2hWT1AublBvcnRJbmRleCA9IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVDsKLSAgICBtX3NDb25maWdJbnRyYVJlZnJlc2hWT1AuSW50cmFSZWZyZXNoVk9QID0gT01YX0ZBTFNFOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NDb25maWdGcmFtZVJvdGF0aW9uLCBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRSk7Ci0gICAgbV9zQ29uZmlnRnJhbWVSb3RhdGlvbi5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfSU47Ci0gICAgbV9zQ29uZmlnRnJhbWVSb3RhdGlvbi5uUm90YXRpb24gPSAwOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NTZXNzaW9uUXVhbnRpemF0aW9uLCBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSk7Ci0gICAgbV9zU2Vzc2lvblF1YW50aXphdGlvbi5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc1Nlc3Npb25RdWFudGl6YXRpb24ublFwSSA9IDk7Ci0gICAgbV9zU2Vzc2lvblF1YW50aXphdGlvbi5uUXBQID0gNjsKLSAgICBtX3NTZXNzaW9uUXVhbnRpemF0aW9uLm5RcEIgPSAyOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NTZXNzaW9uUVBSYW5nZSwgT01YX1FDT01fVklERU9fUEFSQU1fSVBCX1FQUkFOR0VUWVBFKTsKLSAgICBtX3NTZXNzaW9uUVBSYW5nZS5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc1Nlc3Npb25RUFJhbmdlLm1pbklRUCA9IDI7Ci0gICAgbV9zU2Vzc2lvblFQUmFuZ2UubWluUFFQID0gMjsKLSAgICBtX3NTZXNzaW9uUVBSYW5nZS5taW5CUVAgPSAyOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NQYXJhbVByb2ZpbGVMZXZlbCwgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUpOwotICAgIG1fc1BhcmFtUHJvZmlsZUxldmVsLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc0ludHJhcGVyaW9kLCBRT01YX1ZJREVPX0lOVFJBUEVSSU9EVFlQRSk7Ci0gICAgbV9zSW50cmFwZXJpb2QublBvcnRJbmRleCA9IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVDsKLSAgICBtX3NJbnRyYXBlcmlvZC5uUEZyYW1lcyA9IChtX3NDb25maWdGcmFtZXJhdGUueEVuY29kZUZyYW1lcmF0ZSAqIDIpIC0gMTsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zRXJyb3JDb3JyZWN0aW9uLCBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSk7Ci0gICAgbV9zRXJyb3JDb3JyZWN0aW9uLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0gICAgbV9zRXJyb3JDb3JyZWN0aW9uLmJFbmFibGVEYXRhUGFydGl0aW9uaW5nID0gT01YX0ZBTFNFOwotICAgIG1fc0Vycm9yQ29ycmVjdGlvbi5iRW5hYmxlSEVDID0gT01YX0ZBTFNFOwotICAgIG1fc0Vycm9yQ29ycmVjdGlvbi5iRW5hYmxlUmVzeW5jID0gT01YX0ZBTFNFOwotICAgIG1fc0Vycm9yQ29ycmVjdGlvbi5iRW5hYmxlUlZMQyA9IE9NWF9GQUxTRTsKLSAgICBtX3NFcnJvckNvcnJlY3Rpb24ublJlc3luY2hNYXJrZXJTcGFjaW5nID0gMDsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zSW50cmFSZWZyZXNoLCBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSk7Ci0gICAgbV9zSW50cmFSZWZyZXNoLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0gICAgbV9zSW50cmFSZWZyZXNoLmVSZWZyZXNoTW9kZSA9IE9NWF9WSURFT19JbnRyYVJlZnJlc2hNYXg7Ci0KLSAgICBpZiAoY29kZWNfdHlwZSA9PSBPTVhfVklERU9fQ29kaW5nTVBFRzQpCi0gICAgewotICAgICAgICBtX3NQYXJhbVByb2ZpbGVMZXZlbC5lUHJvZmlsZSA9IChPTVhfVTMyKSBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlOwotICAgICAgICBtX3NQYXJhbVByb2ZpbGVMZXZlbC5lTGV2ZWwgPSAoT01YX1UzMikgT01YX1ZJREVPX01QRUc0TGV2ZWwwOwotICAgIH0gZWxzZSBpZiAoY29kZWNfdHlwZSA9PSBPTVhfVklERU9fQ29kaW5nSDI2MykKLSAgICB7Ci0gICAgICAgIG1fc1BhcmFtUHJvZmlsZUxldmVsLmVQcm9maWxlID0gKE9NWF9VMzIpIE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lOwotICAgICAgICBtX3NQYXJhbVByb2ZpbGVMZXZlbC5lTGV2ZWwgPSAoT01YX1UzMikgT01YX1ZJREVPX0gyNjNMZXZlbDEwOwotICAgIH0KLQotICAgIC8qIHNldCB0aGUgcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICBSZXQgPSBzd3ZlbmNfc2V0X3Byb2ZpbGVfbGV2ZWwobV9zUGFyYW1Qcm9maWxlTGV2ZWwuZVByb2ZpbGUsCi0gICAgICAgICAgICAgICAgbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZUxldmVsKTsKLSAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgewotICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldF9yY19tb2RlIGZhaWxlZCAoJWQpIiwKLSAgICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5kZWZpbmVkKTsKLSAgICB9Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoZSB2aWRlbyBwYXJhbWV0ZXJzIGZvciBpbnB1dCBwb3J0Ci0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NJblBvcnREZWYsIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpOwotICAgIG1fc0luUG9ydERlZi5uUG9ydEluZGV4PSAoT01YX1UzMikgUE9SVF9JTkRFWF9JTjsKLSAgICBtX3NJblBvcnREZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKLSAgICBtX3NJblBvcnREZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKLSAgICBtX3NJblBvcnREZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluVmlkZW87Ci0gICAgbV9zSW5Qb3J0RGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7Ci0gICAgbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSAoY2hhciAqKSJZVVY0MjAiOwotICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBPTVhfQ09SRV9RQ0lGX1dJRFRIOwotICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gT01YX0NPUkVfUUNJRl9IRUlHSFQ7Ci0gICAgbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5uU3RyaWRlID0gT01YX0NPUkVfUUNJRl9XSURUSDsKLSAgICBtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IE9NWF9DT1JFX1FDSUZfSEVJR0hUOwotICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSA2NDAwMDsKLSAgICBtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAxNSA8PCAxNjsKLSAgICBtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSkKLSAgICAgICAgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtOwotICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gIE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7Ci0KLSAgICAvKiBzZXQgdGhlIGZyYW1lIHNpemUgKi8KLSAgICBQcm9wLmlkID0gU1dWRU5DX1BST1BFUlRZX0lEX0ZSQU1FX1NJWkU7Ci0gICAgUHJvcC5pbmZvLmZyYW1lX3NpemUuaGVpZ2h0ID0gbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7Ci0gICAgUHJvcC5pbmZvLmZyYW1lX3NpemUud2lkdGggID0gbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKLQotICAgIFJldCA9IHN3dmVuY19zZXRwcm9wZXJ0eShtX2hTd1ZlbmMsICZQcm9wKTsKLSAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgewotICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldHByb3BlcnR5IGZhaWxlZCAoJWQpIiwKLSAgICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nKTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgdGhlIGZyYW1lIGF0dHJpYnV0ZXMgKi8KLSAgICBQcm9wLmlkID0gU1dWRU5DX1BST1BFUlRZX0lEX0ZSQU1FX0FUVFJJQlVURVM7Ci0gICAgUHJvcC5pbmZvLmZyYW1lX2F0dHJpYnV0ZXMuc3RyaWRlX2x1bWEgPSBtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLm5TdHJpZGU7Ci0gICAgUHJvcC5pbmZvLmZyYW1lX2F0dHJpYnV0ZXMuc3RyaWRlX2Nocm9tYSA9IG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8ublN0cmlkZTsKLSAgICBQcm9wLmluZm8uZnJhbWVfYXR0cmlidXRlcy5vZmZzZXRfbHVtYSA9IDA7Ci0gICAgUHJvcC5pbmZvLmZyYW1lX2F0dHJpYnV0ZXMub2Zmc2V0X2Nocm9tYSA9Ci0gICAgICAobV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgKiBtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLm5TdHJpZGUpOwotICAgIFByb3AuaW5mby5mcmFtZV9hdHRyaWJ1dGVzLnNpemUgPSAoUHJvcC5pbmZvLmZyYW1lX2F0dHJpYnV0ZXMub2Zmc2V0X2Nocm9tYSAqIDMpID4+IDE7Ci0KLSAgICBSZXQgPSBzd3ZlbmNfc2V0cHJvcGVydHkobV9oU3dWZW5jLCAmUHJvcCk7Ci0gICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgIHsKLSAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19zZXRwcm9wZXJ0eSBmYWlsZWQgKCVkKSIsCi0gICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICAgUkVUVVJOKE9NWF9FcnJvclVuZGVmaW5lZCk7Ci0gICAgfQotCi0gICAgUmV0ID0gc3d2ZW5jX2dldF9idWZmZXJfcmVxKCZtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50TWluLAotICAgICAgICAgICAgICAmbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgJm1fc0luUG9ydERlZi5uQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgJm1fc0luUG9ydERlZi5uQnVmZmVyQWxpZ25tZW50LAotICAgICAgICAgICAgICBQT1JUX0lOREVYX0lOKTsKLSAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgewotICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogJXMsIHN3dmVuY19nZXRfYnVmZmVyX3JlcSBmYWlsZWQgKCVkKSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICBSZXQpOwotICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbmRlZmluZWQpOwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgdGhlIHZpZGVvIHBhcmFtZXRlcnMgZm9yIG91dHB1dCBwb3J0Ci0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NPdXRQb3J0RGVmLCBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKTsKLSAgICBtX3NPdXRQb3J0RGVmLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0gICAgbV9zT3V0UG9ydERlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwotICAgIG1fc091dFBvcnREZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKLSAgICBtX3NPdXRQb3J0RGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOwotICAgIG1fc091dFBvcnREZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7Ci0gICAgbV9zT3V0UG9ydERlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBPTVhfQ09SRV9RQ0lGX1dJRFRIOwotICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IE9NWF9DT1JFX1FDSUZfSEVJR0hUOwotICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gNjQwMDA7Ci0gICAgbV9zT3V0UG9ydERlZi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IDE1IDw8IDE2OwotICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9ICBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOwotICAgIGlmIChjb2RlY190eXBlID09IE9NWF9WSURFT19Db2RpbmdNUEVHNCkKLSAgICB7Ci0gICAgICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9ICBPTVhfVklERU9fQ29kaW5nTVBFRzQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvZGVjX3R5cGUgPT0gT01YX1ZJREVPX0NvZGluZ0gyNjMpCi0gICAgewotICAgICAgICBtX3NPdXRQb3J0RGVmLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSAgT01YX1ZJREVPX0NvZGluZ0gyNjM7Ci0gICAgfQotCi0gICAgUmV0ID0gc3d2ZW5jX2dldF9idWZmZXJfcmVxKCZtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudE1pbiwKLSAgICAgICAgICAgICAgJm1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAmbV9zT3V0UG9ydERlZi5uQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgJm1fc091dFBvcnREZWYubkJ1ZmZlckFsaWdubWVudCwKLSAgICAgICAgICAgICAgUE9SVF9JTkRFWF9PVVQpOwotICAgIGlmIChSZXQgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAlcywgc3d2ZW5jX2dldF9idWZmZXJfcmVxIGZhaWxlZCAoJWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgIFJldCk7Ci0gICAgICAgUkVUVVJOKE9NWF9FcnJvclVuZGVmaW5lZCk7Ci0gICAgfQotCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdmlkZW8gY29sb3IgZm9ybWF0IGZvciBpbnB1dCBwb3J0Ci0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NJblBvcnRGb3JtYXQsIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSk7Ci0gICAgbV9zSW5Qb3J0Rm9ybWF0Lm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9JTjsKLSAgICBtX3NJblBvcnRGb3JtYXQubkluZGV4ID0gMDsKLSAgICBtX3NJblBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKQotICAgICAgICBRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm07Ci0gICAgbV9zSW5Qb3J0Rm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoZSBjb21wcmVzc2lvbiBmb3JtYXQgZm9yIG91dHB1dCBwb3J0Ci0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NPdXRQb3J0Rm9ybWF0LCBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUpOwotICAgIG1fc091dFBvcnRGb3JtYXQublBvcnRJbmRleCA9IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVDsKLSAgICBtX3NPdXRQb3J0Rm9ybWF0Lm5JbmRleCA9IDA7Ci0gICAgbV9zT3V0UG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOwotICAgIGlmIChjb2RlY190eXBlID09IE9NWF9WSURFT19Db2RpbmdNUEVHNCkKLSAgICB7Ci0gICAgICAgIG1fc091dFBvcnRGb3JtYXQuZUNvbXByZXNzaW9uRm9ybWF0ID0gIE9NWF9WSURFT19Db2RpbmdNUEVHNDsKLSAgICB9IGVsc2UgaWYgKGNvZGVjX3R5cGUgPT0gT01YX1ZJREVPX0NvZGluZ0gyNjMpCi0gICAgewotICAgICAgICBtX3NPdXRQb3J0Rm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCA9ICBPTVhfVklERU9fQ29kaW5nSDI2MzsKLSAgICB9Ci0KLSAgICAvLyBtYW5kYXRvcnkgSW5kaWNlcyBmb3Iga3Jvbm9zIHRlc3Qgc3VpdGUKLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc1ByaW9yaXR5TWdtdCwgT01YX1BSSU9SSVRZTUdNVFRZUEUpOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NJbkJ1ZlN1cHBsaWVyLCBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFKTsKLSAgICBtX3NJbkJ1ZlN1cHBsaWVyLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9JTjsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zT3V0QnVmU3VwcGxpZXIsIE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUpOwotICAgIG1fc091dEJ1ZlN1cHBsaWVyLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc0NvbmZpZ1FQLCBPTVhfUUNPTV9WSURFT19DT05GSUdfUVApOwotICAgIG1fc0NvbmZpZ1FQLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0KLSAgICAvLyBtcDQgc3BlY2lmaWMgaW5pdAotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zUGFyYW1NUEVHNCwgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSk7Ci0gICAgbV9zUGFyYW1NUEVHNC5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc1BhcmFtTVBFRzQuZVByb2ZpbGUgPSBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlOwotICAgIG1fc1BhcmFtTVBFRzQuZUxldmVsID0gT01YX1ZJREVPX01QRUc0TGV2ZWwwOwotICAgIG1fc1BhcmFtTVBFRzQublNsaWNlSGVhZGVyU3BhY2luZyA9IDA7Ci0gICAgbV9zUGFyYW1NUEVHNC5iU1ZIID0gT01YX0ZBTFNFOwotICAgIG1fc1BhcmFtTVBFRzQuYkdvdiA9IE9NWF9GQUxTRTsKLSAgICAvLyAyIHNlY29uZCBpbnRyYSBwZXJpb2QgZm9yIGRlZmF1bHQgb3V0cG9ydCBmcHMKLSAgICBtX3NQYXJhbU1QRUc0Lm5QRnJhbWVzID0gKG1fc091dFBvcnRGb3JtYXQueEZyYW1lcmF0ZSAqIDIgLSAxKTsKLSAgICBtX3NQYXJhbU1QRUc0LmJBQ1ByZWQgPSBPTVhfVFJVRTsKLSAgICAvLyBkZWx0YSA9IDIgQCAxNSBmcHMKLSAgICBtX3NQYXJhbU1QRUc0Lm5UaW1lSW5jUmVzID0gMzA7Ci0gICAgLy8gcGZyYW1lIGFuZCBpZnJhbWUKLSAgICBtX3NQYXJhbU1QRUc0Lm5BbGxvd2VkUGljdHVyZVR5cGVzID0gMjsKLSAgICAvLyBudW1iZXIgb2YgdmlkZW8gcGFja2V0IGhlYWRlcnMgcGVyIHZvcAotICAgIG1fc1BhcmFtTVBFRzQubkhlYWRlckV4dGVuc2lvbiA9IDE7Ci0gICAgbV9zUGFyYW1NUEVHNC5iUmV2ZXJzaWJsZVZMQyA9IE9NWF9GQUxTRTsKLQotICAgIC8vIGgyNjMgc3BlY2lmaWMgaW5pdAotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zUGFyYW1IMjYzLCBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUpOwotICAgIG1fc1BhcmFtSDI2My5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIC8vIDIgc2Vjb25kIGludHJhIHBlcmlvZCBmb3IgZGVmYXVsdCBvdXRwb3J0IGZwcwotICAgIG1fc1BhcmFtSDI2My5uUEZyYW1lcyA9IChtX3NPdXRQb3J0Rm9ybWF0LnhGcmFtZXJhdGUgKiAyIC0gMSk7Ci0gICAgbV9zUGFyYW1IMjYzLm5CRnJhbWVzID0gMDsKLSAgICBtX3NQYXJhbUgyNjMuZVByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZTsKLSAgICBtX3NQYXJhbUgyNjMuZUxldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDEwOwotICAgIG1fc1BhcmFtSDI2My5iUExVU1BUWVBFQWxsb3dlZCA9IE9NWF9GQUxTRTsKLSAgICBtX3NQYXJhbUgyNjMubkFsbG93ZWRQaWN0dXJlVHlwZXMgPSAyOwotICAgIG1fc1BhcmFtSDI2My5iRm9yY2VSb3VuZGluZ1R5cGVUb1plcm8gPSBPTVhfVFJVRTsKLSAgICBtX3NQYXJhbUgyNjMublBpY3R1cmVIZWFkZXJSZXBldGl0aW9uID0gMDsKLSAgICBtX3NQYXJhbUgyNjMubkdPQkhlYWRlckludGVydmFsID0gMTsKLQotICAgIG1fc3RhdGUgICAgICAgICAgICAgICAgICAgPSBPTVhfU3RhdGVMb2FkZWQ7Ci0gICAgbV9zRXh0cmFEYXRhID0gMDsKLQotICAgIGlmIChjb2RlY190eXBlID09IE9NWF9WSURFT19Db2RpbmdNUEVHNCkKLSAgICB7Ci0gICAgICAgIG1fY2FwYWJpbGl0eS5tYXhfaGVpZ2h0ID0gT01YX0NPUkVfNzIwUF9IRUlHSFQ7Ci0gICAgICAgIG1fY2FwYWJpbGl0eS5tYXhfd2lkdGggPSBPTVhfQ09SRV83MjBQX1dJRFRIOwotICAgIH0KLSAgICBlbHNlIGlmIChjb2RlY190eXBlID09IE9NWF9WSURFT19Db2RpbmdIMjYzKQotICAgIHsKLSAgICAgICAgbV9jYXBhYmlsaXR5Lm1heF9oZWlnaHQgPSBPTVhfQ09SRV9GV1ZHQV9IRUlHSFQ7Ci0gICAgICAgIG1fY2FwYWJpbGl0eS5tYXhfd2lkdGggPSBPTVhfQ09SRV9GV1ZHQV9XSURUSDsKLSAgICB9Ci0KLSAgICBtX2NhcGFiaWxpdHkubWluX2hlaWdodCA9IDMyOwotICAgIG1fY2FwYWJpbGl0eS5taW5fd2lkdGggPSAzMjsKLQotICAgIGlmIChlUmV0ID09IE9NWF9FcnJvck5vbmUpCi0gICAgewotICAgICAgICBpZiAocGlwZShmZHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHBpcGUgY3JlYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChmZHNbMF0gPT0gMCkgfHwgKGZkc1sxXSA9PSAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocGlwZShmZHMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBwaXBlIGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlUmV0ID09IE9NWF9FcnJvck5vbmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9waXBlX2luID0gZmRzWzBdOwotICAgICAgICAgICAgICAgIG1fcGlwZV9vdXQgPSBmZHNbMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHRocmVhZF9jcmVhdGUoJm1zZ190aHJlYWRfaWQsMCwgbWVzc2FnZV90aHJlYWRfZW5jLCB0aGlzKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICBtc2dfdGhyZWFkX2NyZWF0ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1zZ190aHJlYWRfY3JlYXRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJDb21wb25lbnRfaW5pdCByZXR1cm4gdmFsdWUgPSAweCV4IiwgZVJldCk7Ci0KLSAgICBFWElUX0ZVTkMoKTsKLQotICAgIFJFVFVSTihlUmV0KTsKLX0KLQotT01YX0VSUk9SVFlQRSAgb214X3ZlbmM6OnNldF9wYXJhbWV0ZXIKLSgKLSAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIHBhcmFtSW5kZXgsCi0gICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBhcmFtRGF0YQotKQotewotICAgIEVOVEVSX0ZVTkMoKTsKLQotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgU1dWRU5DX1NUQVRVUyBSZXQgID0gU1dWRU5DX1NfU1VDQ0VTUzsKLSAgICBTV1ZFTkNfUFJPUEVSVFkgUHJvcDsKLSAgICBib29sIGJSZXN1bHQ7Ci0gICAgdW5zaWduZWQgaW50IHN0cmlkZSwgc2NhbmxpbmVzOwotCi0gICAgKHZvaWQpaENvbXA7Ci0KLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXQgUGFyYW0gaW4gSW52YWxpZCBTdGF0ZSIpOwotICAgICAgICBSRVRVUk4oT01YX0Vycm9ySW52YWxpZFN0YXRlKTsKLSAgICB9Ci0gICAgaWYgKHBhcmFtRGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBHZXQgUGFyYW0gaW4gSW52YWxpZCBwYXJhbURhdGEiKTsKLSAgICAgICAgUkVUVVJOKE9NWF9FcnJvckJhZFBhcmFtZXRlcik7Ci0gICAgfQotCi0gICAgLyogc2V0X3BhcmFtZXRlciBjYW4gYmUgY2FsbGVkIGluIGxvYWRlZCBzdGF0ZSBvciBkaXNhYmxlZCBwb3J0ICovCi0gICAgaWYgKCAobV9zdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpIHx8Ci0gICAgICAgICAobV9zSW5Qb3J0RGVmLmJFbmFibGVkID09IE9NWF9GQUxTRSkgfHwKLSAgICAgICAgIChtX3NPdXRQb3J0RGVmLmJFbmFibGVkID09IE9NWF9GQUxTRSkKLSAgICAgICApCi0gICAgewotICAgICAgICBERUJVR19QUklOVF9MT1coIlNldCBQYXJhbWV0ZXIgY2FsbGVkIGluIHZhbGlkIHN0YXRlIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0IFBhcmFtZXRlciBjYWxsZWQgaW4gSW52YWxpZCBTdGF0ZSIpOwotICAgICAgICBSRVRVUk4oT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb24pOwotICAgIH0KLQotICAgIHN3aXRjaCAoKGludClwYXJhbUluZGV4KQotICAgIHsKLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmbjsKLSAgICAgICAgICAgIHBvcnREZWZuID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uIEg9ICVkLCBXID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAoaW50KXBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAoaW50KXBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgpOwotCi0gICAgICAgICAgICBpZiAoUE9SVF9JTkRFWF9JTiA9PSBwb3J0RGVmbi0+blBvcnRJbmRleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWRldl9pc192aWRlb19zZXNzaW9uX3N1cHBvcnRlZChwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJ2aWRlbyBzZXNzaW9uIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgb214X3JlcG9ydF91bnN1cHBvcnRlZF9zZXR0aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImkvcCBhY3R1YWwgY250IHJlcXVlc3RlZCA9ICV1IiwgcG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJpL3AgbWluIGNudCByZXF1ZXN0ZWQgPSAldSIsIHBvcnREZWZuLT5uQnVmZmVyQ291bnRNaW4pOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiaS9wIGJ1ZmZlcnNpemUgcmVxdWVzdGVkID0gJXUiLCBwb3J0RGVmbi0+bkJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIGlmIChwb3J0RGVmbi0+bkJ1ZmZlckNvdW50TWluID4gcG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogKEluX1BPUlQpIE1pbiBidWZmZXJzICgldSkgPiBhY3R1YWwgY291bnQgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydERlZm4tPm5CdWZmZXJDb3VudE1pbiwgcG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgZnJhbWUgc2l6ZSAqLwotICAgICAgICAgICAgICAgIFByb3AuaWQgPSBTV1ZFTkNfUFJPUEVSVFlfSURfRlJBTUVfU0laRTsKLSAgICAgICAgICAgICAgICBQcm9wLmluZm8uZnJhbWVfc2l6ZS5oZWlnaHQgPSBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKLSAgICAgICAgICAgICAgICBQcm9wLmluZm8uZnJhbWVfc2l6ZS53aWR0aCAgPSBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwotCi0gICAgICAgICAgICAgICAgUmV0ID0gc3d2ZW5jX3NldHByb3BlcnR5KG1faFN3VmVuYywgJlByb3ApOwotICAgICAgICAgICAgICAgIGlmIChSZXQgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfc2V0cHJvcGVydHkgZmFpbGVkICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBSZXQpOwotICAgICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgaW5wdXQgZnJhbWUtcmF0ZSAqLwotICAgICAgICAgICAgICAgIGlmIChwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgUmV0ID0gc3d2ZW5jX3NldF9mcmFtZV9yYXRlKHBvcnREZWZuLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19zZXRfZnJhbWVfcmF0ZSBmYWlsZWQgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgZnJhbWUgYXR0cmlidXRlcyAqLwotICAgICAgICAgICAgICAgIHN0cmlkZSA9IFZFTlVTX1lfU1RSSURFKENPTE9SX0ZNVF9OVjEyLCBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoKTsKLSAgICAgICAgICAgICAgICAvL1NsaWNlIGhlaWdodCBkb2Vzbid0IGdldCB1cGRhdGVkIHNvIGNocm9tYSBvZmZzZXQgY2FsY3VsYXRpb24gYmVjb21lcyBpbmNvcnJlY3QgLgotICAgICAgICAgICAgICAgIC8vVXNpbmcgRnJhbWVIZWlnaHQgSW5zdGVhZCAsIGp1c3QgZm9yIG9teC10ZXN0LWFwcCAuCi0gICAgICAgICAgICAgICAgLy9zY2FubGluZXMgPSBWRU5VU19ZX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMiwgcG9ydERlZm4tPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQpOwotICAgICAgICAgICAgICAgIHNjYW5saW5lcyA9IFZFTlVTX1lfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyLCBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgUHJvcC5pZCA9IFNXVkVOQ19QUk9QRVJUWV9JRF9GUkFNRV9BVFRSSUJVVEVTOwotICAgICAgICAgICAgICAgIFByb3AuaW5mby5mcmFtZV9hdHRyaWJ1dGVzLnN0cmlkZV9sdW1hID0gc3RyaWRlOwotICAgICAgICAgICAgICAgIFByb3AuaW5mby5mcmFtZV9hdHRyaWJ1dGVzLnN0cmlkZV9jaHJvbWEgPSBzdHJpZGU7Ci0gICAgICAgICAgICAgICAgUHJvcC5pbmZvLmZyYW1lX2F0dHJpYnV0ZXMub2Zmc2V0X2x1bWEgPSAwOwotICAgICAgICAgICAgICAgIFByb3AuaW5mby5mcmFtZV9hdHRyaWJ1dGVzLm9mZnNldF9jaHJvbWEgPSBzY2FubGluZXMgKiBzdHJpZGU7Ci0gICAgICAgICAgICAgICAgUHJvcC5pbmZvLmZyYW1lX2F0dHJpYnV0ZXMuc2l6ZSA9Ci0gICAgICAgICAgICAgICAgICBWRU5VU19CVUZGRVJfU0laRShDT0xPUl9GTVRfTlYxMiwKLSAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBSZXQgPSBzd3ZlbmNfc2V0cHJvcGVydHkobV9oU3dWZW5jLCAmUHJvcCk7Ci0gICAgICAgICAgICAgICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19zZXRwcm9wZXJ0eSBmYWlsZWQgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJpL3AgcHJldmlvdXMgYWN0dWFsIGNudCA9ICV1IiwgbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJpL3AgcHJldmlvdXMgbWluIGNudCA9ICV1IiwgbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudE1pbik7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJpL3AgcHJldmlvdXMgYnVmZmVyc2l6ZSA9ICV1IiwgbV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgIG1lbWNweSgmbV9zSW5Qb3J0RGVmLCBwb3J0RGVmbixzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpOwotCi0gICAgICAgICAgICAgICAgLyogdXBkYXRlIHRoZSBpbnB1dCBidWZmZXIgcmVxdWlyZW1lbnQgKi8KLSAgICAgICAgICAgICAgICBSZXQgPSBzd3ZlbmNfZ2V0X2J1ZmZlcl9yZXEoJm1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAmbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZtX3NJblBvcnREZWYubkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbV9zSW5Qb3J0RGVmLm5CdWZmZXJBbGlnbm1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+blBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6ICVzLCBzd3ZlbmNfZ2V0X2J1ZmZlcl9yZXEgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgUmV0KTsKLSAgICAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5kZWZpbmVkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCA+IG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocG9ydERlZm4tPm5CdWZmZXJTaXplID4gbV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBtX3NJblBvcnREZWYubkJ1ZmZlclNpemUgPSBwb3J0RGVmbi0+bkJ1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJpL3AgbmV3IGFjdHVhbCBjbnQgPSAldSIsIG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiaS9wIG5ldyBtaW4gY250ID0gJXUiLCBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50TWluKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImkvcCBuZXcgYnVmZmVyc2l6ZSA9ICV1IiwgbV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFBPUlRfSU5ERVhfT1VUID09IHBvcnREZWZuLT5uUG9ydEluZGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiby9wIGFjdHVhbCBjbnQgcmVxdWVzdGVkID0gJXUiLCBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIm8vcCBtaW4gY250IHJlcXVlc3RlZCA9ICV1IiwgcG9ydERlZm4tPm5CdWZmZXJDb3VudE1pbik7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJvL3AgYnVmZmVyc2l6ZSByZXF1ZXN0ZWQgPSAldSIsIHBvcnREZWZuLT5uQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcnREZWZuLT5uQnVmZmVyQ291bnRNaW4gPiBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAoT3V0X1BPUlQpIE1pbiBidWZmZXJzICgldSkgPiBhY3R1YWwgY291bnQgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydERlZm4tPm5CdWZmZXJDb3VudE1pbiwgcG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgb3V0cHV0IGJpdC1yYXRlICovCi0gICAgICAgICAgICAgICAgUmV0ID0gc3d2ZW5jX3NldF9iaXRfcmF0ZShwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5CaXRyYXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldF9iaXRfcmF0ZSBmYWlsZWQgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJvL3AgcHJldmlvdXMgYWN0dWFsIGNudCA9ICV1IiwgbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiby9wIHByZXZpb3VzIG1pbiBjbnQgPSAldSIsIG1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50TWluKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIm8vcCBwcmV2aW91cyBidWZmZXJzaXplID0gJXUiLCBtX3NPdXRQb3J0RGVmLm5CdWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgYnVmZmVyIHJlcXVpcmVtZW50ICovCi0gICAgICAgICAgICAgICAgYlJlc3VsdCA9IGRldl9zZXRfYnVmX3JlcSgmcG9ydERlZm4tPm5CdWZmZXJDb3VudE1pbiwKLSAgICAgICAgICAgICAgICAgICZwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgJnBvcnREZWZuLT5uQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoYlJlc3VsdCAhPSB0cnVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIGRldl9zZXRfYnVmX3JlcSBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZtX3NPdXRQb3J0RGVmLCBwb3J0RGVmbixzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpOwotCi0gICAgICAgICAgICAgICAgLyogdXBkYXRlIHRoZSBvdXRwdXQgYnVmZmVyIHJlcXVpcmVtZW50ICovCi0gICAgICAgICAgICAgICAgUmV0ID0gc3d2ZW5jX2dldF9idWZmZXJfcmVxKCZtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZtX3NPdXRQb3J0RGVmLm5CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgJm1fc091dFBvcnREZWYubkJ1ZmZlckFsaWdubWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogJXMsIHN3dmVuY19nZXRfYnVmZmVyX3JlcSBmYWlsZWQgKCVkKSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICBSZXQpOwotICAgICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbmRlZmluZWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsID4gbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gcG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBvcnREZWZuLT5uQnVmZmVyU2l6ZSA+IG1fc091dFBvcnREZWYubkJ1ZmZlclNpemUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYubkJ1ZmZlclNpemUgPSBwb3J0RGVmbi0+bkJ1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJvL3AgbmV3IGFjdHVhbCBjbnQgPSAldSIsIG1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIm8vcCBuZXcgbWluIGNudCA9ICV1IiwgbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRNaW4pOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiby9wIG5ldyBidWZmZXJzaXplID0gJXUiLCBtX3NPdXRQb3J0RGVmLm5CdWZmZXJTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldF9wYXJhbWV0ZXI6IEJhZCBQb3J0IGlkeCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBvcnREZWZuLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9zQ29uZmlnRnJhbWVyYXRlLnhFbmNvZGVGcmFtZXJhdGUgPSBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7Ci0gICAgICAgICAgICBtX3NDb25maWdCaXRyYXRlLm5FbmNvZGVCaXRyYXRlID0gcG9ydERlZm4tPmZvcm1hdC52aWRlby5uQml0cmF0ZTsKLSAgICAgICAgICAgIG1fc1BhcmFtQml0cmF0ZS5uVGFyZ2V0Qml0cmF0ZSA9IHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqcG9ydEZtdCA9Ci0gICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQgJWQiLAotICAgICAgICAgICAgICAgICAgICBwb3J0Rm10LT5lQ29sb3JGb3JtYXQpOwotICAgICAgICAgICAgU1dWRU5DX0NPTE9SX0ZPUk1BVCBjb2xvcl9mb3JtYXQ7Ci0KLSAgICAgICAgICAgIC8qIHNldCB0aGUgZHJpdmVyIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzICovCi0gICAgICAgICAgICBpZiAoUE9SVF9JTkRFWF9JTiA9PSBwb3J0Rm10LT5uUG9ydEluZGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwb3J0Rm10LT5lQ29sb3JGb3JtYXQgPT0KLSAgICAgICAgICAgICAgICAgICAgKChPTVhfQ09MT1JfRk9STUFUVFlQRSkgUU9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIG1ldGFfbW9kZSA9IDIgKGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSAqLwotICAgICAgICAgICAgICAgICAgICBtX3NJblBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSkgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtOwotICAgICAgICAgICAgICAgICAgICBjb2xvcl9mb3JtYXQgPSBTV1ZFTkNfQ09MT1JfRk9STUFUX05WMTI7Ci0gICAgICAgICAgICAgICAgICAgIG1Vc2VQcm94eUNvbG9yRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbV9pbnB1dF9tc2dfaWQgPSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQl9PUFE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fc0luUG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQgPSBwb3J0Rm10LT5lQ29sb3JGb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocG9ydEZtdC0+ZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHBvcnRGbXQtPmVDb2xvckZvcm1hdCA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICgoT01YX0NPTE9SX0ZPUk1BVFRZUEUpIFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybSkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9mb3JtYXQgPSBTV1ZFTkNfQ09MT1JfRk9STUFUX05WMTI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocG9ydEZtdC0+ZUNvbG9yRm9ybWF0ID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT01YX0NPTE9SX0ZPUk1BVFRZUEUpIFFPTVhfQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2Zvcm1hdCA9IFNXVkVOQ19DT0xPUl9GT1JNQVRfTlYyMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlczogT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQgJWQgaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Rm10LT5lQ29sb3JGb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvckJhZFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9pbnB1dF9tc2dfaWQgPSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQjsKLSAgICAgICAgICAgICAgICAgICAgbVVzZVByb3h5Q29sb3JGb3JtYXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBtX3NJblBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0OwotICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgaW5wdXQgY29sb3IgZm9ybWF0ICovCi0gICAgICAgICAgICAgICAgUHJvcC5pZCA9IFNXVkVOQ19QUk9QRVJUWV9JRF9DT0xPUl9GT1JNQVQ7Ci0gICAgICAgICAgICAgICAgUHJvcC5pbmZvLmNvbG9yX2Zvcm1hdCA9IGNvbG9yX2Zvcm1hdDsKLSAgICAgICAgICAgICAgICBSZXQgPSBzd3ZlbmNfc2V0cHJvcGVydHkobV9oU3dWZW5jLCAmUHJvcCk7Ci0gICAgICAgICAgICAgICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19zZXRwcm9wZXJ0eSBmYWlsZWQgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogc2V0IHRoZSBpbnB1dCBmcmFtZS1yYXRlICovCi0gICAgICAgICAgICAgICAgaWYgKHBvcnRGbXQtPnhGcmFtZXJhdGUgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgUmV0ID0gc3d2ZW5jX3NldF9mcmFtZV9yYXRlKHBvcnRGbXQtPnhGcmFtZXJhdGUgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgIGlmIChSZXQgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfc2V0X2ZyYW1lX3JhdGUgZmFpbGVkICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBSZXQpOwotICAgICAgICAgICAgICAgICAgICAgIC8vUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIG1fc0luUG9ydEZvcm1hdC54RnJhbWVyYXRlID0gcG9ydEZtdC0+eEZyYW1lcmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0luaXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9QT1JUX1BBUkFNX1RZUEUqIHBQYXJhbSA9IChPTVhfUE9SVF9QQVJBTV9UWVBFKikocGFyYW1EYXRhKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiU2V0IE9NWF9JbmRleFBhcmFtVmlkZW9Jbml0IGNhbGxlZCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUqIHBQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUiKTsKLQotICAgICAgICAgICAgaWYgKG1fbWF4X2FsbG93ZWRfYml0cmF0ZV9jaGVjaykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8vVEJEOiB0byBhZGQgYml0cmF0ZSBjaGVjawotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBzZXQgdGhlIG91dHB1dCBiaXQtcmF0ZSAqLwotICAgICAgICAgICAgUmV0ID0gc3d2ZW5jX3NldF9iaXRfcmF0ZShwUGFyYW0tPm5UYXJnZXRCaXRyYXRlKTsKLSAgICAgICAgICAgIGlmIChSZXQgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldF9iaXRfcmF0ZSBmYWlsZWQgKCVkKSIsCi0gICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBzZXQgdGhlIFJDLW1vZGUgKi8KLSAgICAgICAgICAgIFJldCA9IHN3dmVuY19zZXRfcmNfbW9kZShwUGFyYW0tPmVDb250cm9sUmF0ZSk7Ci0gICAgICAgICAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19zZXRfcmNfbW9kZSBmYWlsZWQgKCVkKSIsCi0gICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtX3NQYXJhbUJpdHJhdGUublRhcmdldEJpdHJhdGUgPSBwUGFyYW0tPm5UYXJnZXRCaXRyYXRlOwotICAgICAgICAgICAgbV9zUGFyYW1CaXRyYXRlLmVDb250cm9sUmF0ZSA9IHBQYXJhbS0+ZUNvbnRyb2xSYXRlOwotICAgICAgICAgICAgbV9zQ29uZmlnQml0cmF0ZS5uRW5jb2RlQml0cmF0ZSA9IHBQYXJhbS0+blRhcmdldEJpdHJhdGU7Ci0gICAgICAgICAgICBtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gcFBhcmFtLT5uVGFyZ2V0Qml0cmF0ZTsKLSAgICAgICAgICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gcFBhcmFtLT5uVGFyZ2V0Qml0cmF0ZTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiYml0cmF0ZSA9ICV1IiwgbV9zT3V0UG9ydERlZi5mb3JtYXQudmlkZW8ubkJpdHJhdGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNDoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSogcFBhcmFtID0gKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUqKXBhcmFtRGF0YTsKLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzQiKTsKLQotICAgICAgICAgICAgaWYgKHBQYXJhbS0+bkJGcmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIldhcm5pbmc6IEIgZnJhbWVzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogc2V0IHRoZSBpbnRyYSBwZXJpb2QgKi8KLSAgICAgICAgICAgIFJldCA9IHN3dmVuY19zZXRfaW50cmFfcGVyaW9kKHBQYXJhbS0+blBGcmFtZXMscFBhcmFtLT5uQkZyYW1lcyk7Ci0gICAgICAgICAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19zZXRfaW50cmFfcGVyaW9kIGZhaWxlZCAoJWQpIiwKLSAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBSZXQpOwotICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1lbWNweSgmbV9zUGFyYW1NUEVHNCxwUGFyYW0sIHNpemVvZihzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSkpOwotICAgICAgICAgICAgbV9zSW50cmFwZXJpb2QublBGcmFtZXMgPSBtX3NQYXJhbU1QRUc0Lm5QRnJhbWVzOwotICAgICAgICAgICAgbV9zSW50cmFwZXJpb2QubkJGcmFtZXMgPSBtX3NQYXJhbU1QRUc0Lm5CRnJhbWVzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9IMjYzOgotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUqIHBQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUqKXBhcmFtRGF0YTsKLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvSDI2MyIpOwotCi0gICAgICAgICAgICAvKiBzZXQgdGhlIGludHJhIHBlcmlvZCAqLwotICAgICAgICAgICAgUmV0ID0gc3d2ZW5jX3NldF9pbnRyYV9wZXJpb2QocFBhcmFtLT5uUEZyYW1lcyxwUGFyYW0tPm5CRnJhbWVzKTsKLSAgICAgICAgICAgIGlmIChSZXQgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldF9pbnRyYV9wZXJpb2QgZmFpbGVkICglZCkiLAotICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtY3B5KCZtX3NQYXJhbUgyNjMscFBhcmFtLCBzaXplb2Yoc3RydWN0IE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSkpOwotICAgICAgICAgICAgbV9zSW50cmFwZXJpb2QublBGcmFtZXMgPSBtX3NQYXJhbUgyNjMublBGcmFtZXM7Ci0gICAgICAgICAgICBtX3NJbnRyYXBlcmlvZC5uQkZyYW1lcyA9IG1fc1BhcmFtSDI2My5uQkZyYW1lczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudDoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUqIHBQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSopcGFyYW1EYXRhOwotCi0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50Iik7Ci0KLSAgICAgICAgICAgIC8qIHNldCB0aGUgcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICAgICAgICAgIFJldCA9IHN3dmVuY19zZXRfcHJvZmlsZV9sZXZlbChwUGFyYW0tPmVQcm9maWxlLHBQYXJhbS0+ZUxldmVsKTsKLSAgICAgICAgICAgIGlmIChSZXQgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldF9yY19tb2RlIGZhaWxlZCAoJWQpIiwKLSAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBSZXQpOwotICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZVByb2ZpbGUgPSBwUGFyYW0tPmVQcm9maWxlOwotICAgICAgICAgICAgbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZUxldmVsID0gcFBhcmFtLT5lTGV2ZWw7Ci0KLSAgICAgICAgICAgIGlmIChTV1ZFTkNfQ09ERUNfTVBFRzQgPT0gbV9jb2RlYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3NQYXJhbU1QRUc0LmVQcm9maWxlID0gKE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFKW1fc1BhcmFtUHJvZmlsZUxldmVsLmVQcm9maWxlOwotICAgICAgICAgICAgICAgIG1fc1BhcmFtTVBFRzQuZUxldmVsID0gKE9NWF9WSURFT19NUEVHNExFVkVMVFlQRSltX3NQYXJhbVByb2ZpbGVMZXZlbC5lTGV2ZWw7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJNUEVHNCBwcm9maWxlID0gJWQsIGxldmVsID0gJWQiLCBtX3NQYXJhbU1QRUc0LmVQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9zUGFyYW1NUEVHNC5lTGV2ZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoU1dWRU5DX0NPREVDX0gyNjMgPT0gbV9jb2RlYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3NQYXJhbUgyNjMuZVByb2ZpbGUgPSAoT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRSltX3NQYXJhbVByb2ZpbGVMZXZlbC5lUHJvZmlsZTsKLSAgICAgICAgICAgICAgICBtX3NQYXJhbUgyNjMuZUxldmVsID0gKE9NWF9WSURFT19IMjYzTEVWRUxUWVBFKW1fc1BhcmFtUHJvZmlsZUxldmVsLmVMZXZlbDsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkgyNjMgcHJvZmlsZSA9ICVkLCBsZXZlbCA9ICVkIiwgbV9zUGFyYW1IMjYzLmVQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9zUGFyYW1IMjYzLmVMZXZlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqY29tcF9yb2xlOwotICAgICAgICAgICAgY29tcF9yb2xlID0gKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgY29tcF9yb2xlLT5jUm9sZSk7Ci0KLSAgICAgICAgICAgIGlmICgobV9zdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpJiYKLSAgICAgICAgICAgICAgICAgICAgIUJJVE1BU0tfUFJFU0VOVCgmbV9mbGFncyxPTVhfQ09NUE9ORU5UX0lETEVfUEVORElORykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXQgUGFyYW1ldGVyIGNhbGxlZCBpbiB2YWxpZCBzdGF0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXQgUGFyYW1ldGVyIGNhbGxlZCBpbiBJbnZhbGlkIFN0YXRlIik7Ci0gICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKFNXVkVOQ19DT0RFQ19NUEVHNCA9PSBtX2NvZGVjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghc3RybmNtcCgoY29uc3QgY2hhciopY29tcF9yb2xlLT5jUm9sZSwidmlkZW9fZW5jb2Rlci5tcGVnNCIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RybGNweSgoY2hhciopbV9jUm9sZSwidmlkZW9fZW5jb2Rlci5tcGVnNCIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHBhcmFtZXRlcjogdW5rbm93biBJbmRleCAlcyIsIGNvbXBfcm9sZS0+Y1JvbGUpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFNXVkVOQ19DT0RFQ19IMjYzID09IG1fY29kZWMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKChjb25zdCBjaGFyKiljb21wX3JvbGUtPmNSb2xlLCJ2aWRlb19lbmNvZGVyLmgyNjMiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmxjcHkoKGNoYXIqKW1fY1JvbGUsInZpZGVvX2VuY29kZXIuaDI2MyIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHBhcmFtZXRlcjogdW5rbm93biBJbmRleCAlcyIsIGNvbXBfcm9sZS0+Y1JvbGUpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID1PTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0cGFyYW1ldGVyOiB1bmtub3duIHBhcmFtICVzIiwgbV9ua2luZCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnROYW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtUHJpb3JpdHlNZ210OgotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtUHJpb3JpdHlNZ210Iik7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldCBQYXJhbWV0ZXIgY2FsbGVkIGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT01YX1BSSU9SSVRZTUdNVFRZUEUgKnByaW9yaXR5TWdtdHlwZSA9IChPTVhfUFJJT1JJVFlNR01UVFlQRSopIHBhcmFtRGF0YTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1Qcmlvcml0eU1nbXQgJXUiLAotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eU1nbXR5cGUtPm5Hcm91cElEKTsKLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBwcmlvcml0eU1nbXR5cGUgJXUiLAotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eU1nbXR5cGUtPm5Hcm91cFByaW9yaXR5KTsKLQotICAgICAgICAgICAgbV9zUHJpb3JpdHlNZ210Lm5Hcm91cElEID0gcHJpb3JpdHlNZ210eXBlLT5uR3JvdXBJRDsKLSAgICAgICAgICAgIG1fc1ByaW9yaXR5TWdtdC5uR3JvdXBQcmlvcml0eSA9IHByaW9yaXR5TWdtdHlwZS0+bkdyb3VwUHJpb3JpdHk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUNvbXBCdWZmZXJTdXBwbGllcjoKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbUNvbXBCdWZmZXJTdXBwbGllciIpOwotICAgICAgICAgICAgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqYnVmZmVyU3VwcGxpZXJUeXBlID0gKE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyICVkIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyU3VwcGxpZXJUeXBlLT5lQnVmZmVyU3VwcGxpZXIpOwotICAgICAgICAgICAgaWYgKCAoYnVmZmVyU3VwcGxpZXJUeXBlLT5uUG9ydEluZGV4ID09IDApIHx8Ci0gICAgICAgICAgICAgICAgIChidWZmZXJTdXBwbGllclR5cGUtPm5Qb3J0SW5kZXggPT0xKQotICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fc0luQnVmU3VwcGxpZXIuZUJ1ZmZlclN1cHBsaWVyID0gYnVmZmVyU3VwcGxpZXJUeXBlLT5lQnVmZmVyU3VwcGxpZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1F1YW50aXphdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIFJDLW9mZiBjYXNlCi0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtVmlkZW9RdWFudGl6YXRpb24iKTsKLSAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFICpzZXNzaW9uX3FwID0gKE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgaWYgKHNlc3Npb25fcXAtPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUHJvcC5pZCA9IFNXVkVOQ19QUk9QRVJUWV9JRF9RUDsKLSAgICAgICAgICAgICAgICBQcm9wLmluZm8ucXAucXBfaSA9IHNlc3Npb25fcXAtPm5RcEk7Ci0gICAgICAgICAgICAgICAgUHJvcC5pbmZvLnFwLnFwX3AgPSBzZXNzaW9uX3FwLT5uUXBQOwotICAgICAgICAgICAgICAgIFByb3AuaW5mby5xcC5xcF9iID0gc2Vzc2lvbl9xcC0+blFwQjsKLQotICAgICAgICAgICAgICAgIFJldCA9IHN3dmVuY19zZXRwcm9wZXJ0eShtX2hTd1ZlbmMsICZQcm9wKTsKLSAgICAgICAgICAgICAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldHByb3BlcnR5IGZhaWxlZCAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtX3NTZXNzaW9uUXVhbnRpemF0aW9uLm5RcEkgPSBzZXNzaW9uX3FwLT5uUXBJOwotICAgICAgICAgICAgICAgIG1fc1Nlc3Npb25RdWFudGl6YXRpb24ublFwUCA9IHNlc3Npb25fcXAtPm5RcFA7Ci0gICAgICAgICAgICAgICAgbV9zU2Vzc2lvblF1YW50aXphdGlvbi5uUXBCID0gc2Vzc2lvbl9xcC0+blFwQjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFVuc3VwcG9ydGVkIHBvcnQgSW5kZXggZm9yIFNlc3Npb24gUVAgc2V0dGluZyIpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBvcnREZWZuOgotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfUUNPTV9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgKE9NWF9RQ09NX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSopcGFyYW1EYXRhOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfUWNvbUluZGV4UG9ydERlZm4iKTsKLSAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpUE9SVF9JTkRFWF9JTikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uTWVtUmVnaW9uID4gT01YX1FDT01fTWVtUmVnaW9uSW52YWxpZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5uTWVtUmVnaW9uIDwgT01YX1FDT01fTWVtUmVnaW9uTWF4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV91c2VfaW5wdXRfcG1lbSA9IE9NWF9UUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtX3VzZV9pbnB1dF9wbWVtID0gT01YX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSAoT01YX1UzMilQT1JUX0lOREVYX09VVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uTWVtUmVnaW9uID4gT01YX1FDT01fTWVtUmVnaW9uSW52YWxpZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5uTWVtUmVnaW9uIDwgT01YX1FDT01fTWVtUmVnaW9uTWF4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV91c2Vfb3V0cHV0X3BtZW0gPSBPTVhfVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV91c2Vfb3V0cHV0X3BtZW0gPSBPTVhfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0UGFyYW1ldGVyIGNhbGxlZCBvbiB1bnN1cHBvcnRlZCBQb3J0IEluZGV4IGZvciBRY29tUG9ydERlZm4iKTsKLSAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yQmFkUG9ydEluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb24iKTsKLSAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSopcGFyYW1EYXRhOwotCi0gICAgICAgICAgICAvKiBIRUMgKi8KLSAgICAgICAgICAgIGlmIChtX2NvZGVjID09IFNXVkVOQ19DT0RFQ19NUEVHNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFByb3AuaWQgPSBTV1ZFTkNfUFJPUEVSVFlfSURfTVBFRzRfSEVDOwotICAgICAgICAgICAgICAgUHJvcC5pbmZvLm1wZWc0X2hlYyA9IHBQYXJhbS0+YkVuYWJsZUhFQzsKLQotICAgICAgICAgICAgICAgUmV0ID0gc3d2ZW5jX3NldHByb3BlcnR5KG1faFN3VmVuYywgJlByb3ApOwotICAgICAgICAgICAgICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfc2V0cHJvcGVydHkgZmFpbGVkICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5kZWZpbmVkKTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgLyogRGF0YSBwYXJ0aXRpb25pbmcgKi8KLSAgICAgICAgICAgICAgIFByb3AuaWQgPSBTV1ZFTkNfUFJPUEVSVFlfSURfTVBFRzRfRFA7Ci0gICAgICAgICAgICAgICBQcm9wLmluZm8ubXBlZzRfZHAgPSBwUGFyYW0tPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nOwotCi0gICAgICAgICAgICAgICBSZXQgPSBzd3ZlbmNfc2V0cHJvcGVydHkobV9oU3dWZW5jLCAmUHJvcCk7Ci0gICAgICAgICAgICAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19zZXRwcm9wZXJ0eSBmYWlsZWQgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbmRlZmluZWQpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBSVkxDICovCi0gICAgICAgICAgICBpZiAocFBhcmFtLT5iRW5hYmxlUlZMQykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgUlZMQyBub3Qgc3VwcG9ydCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFJlLXN5bmMgTWFya2VyICovCi0gICAgICAgICAgICBQcm9wLmlkID0gU1dWRU5DX1BST1BFUlRZX0lEX1NMSUNFX0NPTkZJRzsKLSAgICAgICAgICAgIGlmICggKG1fY29kZWMgIT0gU1dWRU5DX0NPREVDX0gyNjMpICYmIChwUGFyYW0tPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRGF0YVBhcnRpb25pbmcgYXJlIG5vdCBTdXBwb3J0ZWQgZm9yIHRoaXMgY29kZWMiKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCAobV9jb2RlYyAhPSBTV1ZFTkNfQ09ERUNfSDI2MykgJiYgKHBQYXJhbS0+blJlc3luY2hNYXJrZXJTcGFjaW5nKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBQcm9wLmluZm8uc2xpY2VfY29uZmlnLm1vZGUgPSBTV1ZFTkNfU0xJQ0VfTU9ERV9CWVRFOwotICAgICAgICAgICAgICAgUHJvcC5pbmZvLnNsaWNlX2NvbmZpZy5zaXplID0gcFBhcmFtLT5uUmVzeW5jaE1hcmtlclNwYWNpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKFNXVkVOQ19DT0RFQ19IMjYzID09IG1fY29kZWMpICYmIChwUGFyYW0tPmJFbmFibGVSZXN5bmMpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFByb3AuaW5mby5zbGljZV9jb25maWcubW9kZSA9IFNXVkVOQ19TTElDRV9NT0RFX0dPQjsKLSAgICAgICAgICAgICAgIFByb3AuaW5mby5zbGljZV9jb25maWcuc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICBSZXQgPSBzd3ZlbmNfc2V0cHJvcGVydHkobV9oU3dWZW5jLCAmUHJvcCk7Ci0gICAgICAgICAgICAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19zZXRwcm9wZXJ0eSBmYWlsZWQgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbmRlZmluZWQpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgUHJvcC5pbmZvLnNsaWNlX2NvbmZpZy5tb2RlID0gU1dWRU5DX1NMSUNFX01PREVfT0ZGOwotICAgICAgICAgICAgICAgUHJvcC5pbmZvLnNsaWNlX2NvbmZpZy5zaXplID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtY3B5KCZtX3NFcnJvckNvcnJlY3Rpb24scFBhcmFtLCBzaXplb2YobV9zRXJyb3JDb3JyZWN0aW9uKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0ludHJhUmVmcmVzaDoKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW06T01YX0luZGV4UGFyYW1WaWRlb0ludHJhUmVmcmVzaCIpOwotICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEUqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFKilwYXJhbURhdGE7Ci0KLSAgICAgICAgICAgIFJldCA9IHN3dmVuY19zZXRfaW50cmFfcmVmcmVzaChwUGFyYW0pOwotICAgICAgICAgICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfc2V0X2ludHJhX3JlZnJlc2ggZmFpbGVkICglZCkiLAotICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtY3B5KCZtX3NJbnRyYVJlZnJlc2gsIHBQYXJhbSwgc2l6ZW9mKG1fc0ludHJhUmVmcmVzaCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvTWV0YUJ1ZmZlck1vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMgKnBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgKFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldF9wYXJhbWV0ZXI6T01YX1Fjb21JbmRleFBhcmFtVmlkZW9NZXRhQnVmZmVyTW9kZTogIgotICAgICAgICAgICAgICAgICAgICAicG9ydF9pbmRleCA9ICV1LCBtZXRhX21vZGUgPSAlZCIsIHBQYXJhbS0+blBvcnRJbmRleCwgcFBhcmFtLT5iU3RvcmVNZXRhRGF0YSk7Ci0KLSAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9JTikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5iU3RvcmVNZXRhRGF0YSAhPSBtZXRhX21vZGVfZW5hYmxlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YV9tb2RlX2VuYWJsZSA9IHBQYXJhbS0+YlN0b3JlTWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbWV0YV9tb2RlX2VuYWJsZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUmV0ID0gc3d2ZW5jX2dldF9idWZmZXJfcmVxKCZtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3NPdXRQb3J0RGVmLm5CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fc091dFBvcnREZWYubkJ1ZmZlckFsaWdubWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYublBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6ICVzLCBzd3ZlbmNfZ2V0X2J1ZmZlcl9yZXEgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUICYmIHNlY3VyZV9zZXNzaW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPmJTdG9yZU1ldGFEYXRhICE9IG1ldGFfbW9kZV9lbmFibGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtZXRhX21vZGVfZW5hYmxlID0gcFBhcmFtLT5iU3RvcmVNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+YlN0b3JlTWV0YURhdGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigic2V0X3BhcmFtZXRlcjogbWV0YW1vZGUgaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCBmb3IgaW5wdXQgcG9ydCBvbmx5Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbUluZGV4RXh0cmFEYXRhVHlwZToKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgic2V0X3BhcmFtZXRlcjogT01YX1Fjb21JbmRleFBhcmFtSW5kZXhFeHRyYURhdGFUeXBlIik7Ci0gICAgICAgICAgICBRT01YX0lOREVYRVhUUkFEQVRBVFlQRSAqcFBhcmFtID0gKFFPTVhfSU5ERVhFWFRSQURBVEFUWVBFICopcGFyYW1EYXRhOwotICAgICAgICAgICAgT01YX1UzMiBtYXNrID0gMDsKLQotICAgICAgICAgICAgaWYgKHBQYXJhbS0+bkluZGV4ID09IChPTVhfSU5ERVhUWVBFKU9NWF9FeHRyYURhdGFWaWRlb0VuY29kZXJTbGljZUluZm8pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX09VVCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hc2sgPSBWRU5fRVhUUkFEQVRBX1NMSUNFSU5GTzsKLQotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJTbGljZUluZm8gZXh0cmFkYXRhICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBQYXJhbS0+YkVuYWJsZWQgPT0gT01YX1RSVUUpID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigic2V0X3BhcmFtZXRlcjogU2xpY2UgaW5mb3JtYXRpb24gaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCBmb3Igb3V0cHV0IHBvcnQgb25seSIpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocFBhcmFtLT5uSW5kZXggPT0gKE9NWF9JTkRFWFRZUEUpT01YX0V4dHJhRGF0YVZpZGVvRW5jb2Rlck1CSW5mbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFzayA9IFZFTl9FWFRSQURBVEFfTUJJTkZPOwotCi0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIk1CSW5mbyBleHRyYWRhdGEgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocFBhcmFtLT5iRW5hYmxlZCA9PSBPTVhfVFJVRSkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfcGFyYW1ldGVyOiBNQiBpbmZvcm1hdGlvbiBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkIGZvciBvdXRwdXQgcG9ydCBvbmx5Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInNldF9wYXJhbWV0ZXI6IHVuc3VwcG9ydGVkIGV4dHJkYXRhIGluZGV4ICgleCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5uSW5kZXgpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGlmIChwUGFyYW0tPmJFbmFibGVkID09IE9NWF9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fc0V4dHJhRGF0YSB8PSBtYXNrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fc0V4dHJhRGF0YSAmPSB+bWFzazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgI2lmIDAKLSAgICAgICAgICAgIC8vIFRCRDogYWRkIHNldHByb3AgdG8gc3d2ZW5jIG9uY2UgdGhlIHN1cHBvcnQgaXMgYWRkZWQKLSAgICAgICAgICAgIGlmIChoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKChPTVhfUFRSKSEhKG1fc0V4dHJhRGF0YSAmIG1hc2spLAotICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpcFBhcmFtLT5uSW5kZXgpICE9IHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nIEV4dHJhZGF0YSAoJXgpIGZhaWxlZCIsIHBQYXJhbS0+bkluZGV4KTsKLSAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYublBvcnRJbmRleCA9IFBPUlRfSU5ERVhfT1VUOwotICAgICAgICAgICAgICAgIGJSZXN1bHQgPSBkZXZfZ2V0X2J1Zl9yZXEoJm1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgJm1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgJm1fc091dFBvcnREZWYubkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3NPdXRQb3J0RGVmLm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PSBiUmVzdWx0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZGV2X2dldF9idWZfcmVxIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgidXBkYXRlZCBvdXRfYnVmX3JlcTogYnVmZmVyIGNudD0ldSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50IG1pbj0ldSwgYnVmZmVyIHNpemU9JXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYubkJ1ZmZlclNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvTWF4QWxsb3dlZEJpdHJhdGVDaGVjazoKLSAgICAgICAgewotICAgICAgICAgICAgUU9NWF9FWFROSU5ERVhfUEFSQU1UWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgIChRT01YX0VYVE5JTkRFWF9QQVJBTVRZUEUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9tYXhfYWxsb3dlZF9iaXRyYXRlX2NoZWNrID0KLSAgICAgICAgICAgICAgICAgICAgKChwUGFyYW0tPmJFbmFibGUgPT0gT01YX1RSVUUpID8gdHJ1ZSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZXRfcGFyYW1ldGVyOiBtYXggYWxsb3dlZCBiaXRyYXRlIGNoZWNrICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICgocFBhcmFtLT5iRW5hYmxlID09IE9NWF9UUlVFKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvTWF4QWxsb3dlZEJpdHJhdGVDaGVjayAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGNhbGxlZCBvbiB3cm9uZyBwb3J0KCV1KSIsIHBQYXJhbS0+blBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvckJhZFBvcnRJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleEVuYWJsZVNsaWNlRGVsaXZlcnlNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICBRT01YX0VYVE5JTkRFWF9QQVJBTVRZUEUqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgKFFPTVhfRVhUTklOREVYX1BBUkFNVFlQRSopcGFyYW1EYXRhOwotICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX09VVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL1RCRDogYWRkIHNldHByb3AgdG8gc3d2ZW5jIG9uY2UgdGhlIHN1cHBvcnQgaXMgYWRkZWQKLSAgICAgICAgICAgICAgICAjaWYgMAotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9wYXJhbShwYXJhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleEVuYWJsZVNsaWNlRGVsaXZlcnlNb2RlKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFJlcXVlc3QgZm9yIHNldHRpbmcgc2xpY2UgZGVsaXZlcnkgbW9kZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgUkVUVVJOKCBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICNlbmRpZgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBSZXF1ZXN0IGZvciBzZXR0aW5nIHNsaWNlIGRlbGl2ZXJ5IG1vZGUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE9NWF9RY29tSW5kZXhFbmFibGVTbGljZURlbGl2ZXJ5TW9kZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGVkIG9uIHdyb25nIHBvcnQoJXUpIiwgcFBhcmFtLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yQmFkUG9ydEluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4RW5hYmxlSDI2M1BsdXNQVHlwZToKLSAgICAgICAgewotICAgICAgICAgICAgUU9NWF9FWFROSU5ERVhfUEFSQU1UWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgIChRT01YX0VYVE5JTkRFWF9QQVJBTVRZUEUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiT01YX1Fjb21JbmRleEVuYWJsZUgyNjNQbHVzUFR5cGUiKTsKLSAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBSZXF1ZXN0IGZvciBzZXR0aW5nIFBsdXNQVHlwZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE9NWF9RY29tSW5kZXhFbmFibGVIMjYzUGx1c1BUeXBlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsZWQgb24gd3JvbmcgcG9ydCgldSkiLCBwUGFyYW0tPm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JCYWRQb3J0SW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVBlYWtCaXRyYXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgcGVhayBiaXRyYXRlIik7Ci0gICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBRT01YX0luZGV4UGFyYW1WaWRlb0luaXRpYWxRcDoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVEJEOiBhcHBsaWNhYmxlIHRvIFJDLW9uIGNhc2Ugb25seQotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nIEluaXRpYWwgUVAgZm9yIFJDLW9uIGNhc2UiKTsKLSAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JOb25lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVNldE1WU2VhcmNocmFuZ2U6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBTZWFyY2hyYW5nZSIpOwotICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0cGFyYW1ldGVyOiB1bmtub3duIHBhcmFtICVkIiwgcGFyYW1JbmRleCk7Ci0gICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgUkVUVVJOKGVSZXQpOwotfQotCi1PTVhfRVJST1JUWVBFICBvbXhfdmVuYzo6c2V0X2NvbmZpZwotKAotICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgaENvbXAsCi0gICBPTVhfSU4gT01YX0lOREVYVFlQRSBjb25maWdJbmRleCwKLSAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBjb25maWdEYXRhCi0pCi17Ci0gICAgRU5URVJfRlVOQygpOwotCi0gICAgU1dWRU5DX1NUQVRVUyBTd1N0YXR1czsKLQotICAgICh2b2lkKWhDb21wOwotCi0gICAgaWYgKGNvbmZpZ0RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogcGFyYW0gaXMgbnVsbCIpOwotICAgICAgICBSRVRVUk4oT01YX0Vycm9yQmFkUGFyYW1ldGVyKTsKLSAgICB9Ci0KLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBjb25maWcgY2FsbGVkIGluIEludmFsaWQgc3RhdGUiKTsKLSAgICAgICAgUkVUVVJOKE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKChpbnQpY29uZmlnSW5kZXgpCi0gICAgewotICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvQml0cmF0ZToKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSogcFBhcmFtID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUqPihjb25maWdEYXRhKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldF9jb25maWcoKTogT01YX0luZGV4Q29uZmlnVmlkZW9CaXRyYXRlICgldSkiLCBwUGFyYW0tPm5FbmNvZGVCaXRyYXRlKTsKLQotICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX09VVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTd1N0YXR1cyA9IHN3dmVuY19zZXRfYml0X3JhdGUocFBhcmFtLT5uRW5jb2RlQml0cmF0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKFN3U3RhdHVzICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldF9iaXRfcmF0ZSBmYWlsZWQgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFN3U3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtX3NDb25maWdCaXRyYXRlLm5FbmNvZGVCaXRyYXRlID0gcFBhcmFtLT5uRW5jb2RlQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBtX3NQYXJhbUJpdHJhdGUublRhcmdldEJpdHJhdGUgPSBwUGFyYW0tPm5FbmNvZGVCaXRyYXRlOwotICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gcFBhcmFtLT5uRW5jb2RlQml0cmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFVuc3VwcG9ydGVkIHBvcnQgaW5kZXg6ICV1IiwgcFBhcmFtLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yQmFkUG9ydEluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9GcmFtZXJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRSogcFBhcmFtID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRSo+KGNvbmZpZ0RhdGEpOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgic2V0X2NvbmZpZygpOiBPTVhfSW5kZXhDb25maWdWaWRlb0ZyYW1lcmF0ZSAoMHgleCkiLCBwUGFyYW0tPnhFbmNvZGVGcmFtZXJhdGUpOwotCi0gICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN3U3RhdHVzID0gc3d2ZW5jX3NldF9mcmFtZV9yYXRlKHBQYXJhbS0+eEVuY29kZUZyYW1lcmF0ZSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgaWYgKFN3U3RhdHVzICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldF9mcmFtZV9yYXRlIGZhaWxlZCAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgU3dTdGF0dXMpOwotICAgICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1fc0NvbmZpZ0ZyYW1lcmF0ZS54RW5jb2RlRnJhbWVyYXRlID0gcFBhcmFtLT54RW5jb2RlRnJhbWVyYXRlOwotICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSBwUGFyYW0tPnhFbmNvZGVGcmFtZXJhdGU7Ci0gICAgICAgICAgICAgICAgbV9zT3V0UG9ydEZvcm1hdC54RnJhbWVyYXRlID0gcFBhcmFtLT54RW5jb2RlRnJhbWVyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVW5zdXBwb3J0ZWQgcG9ydCBpbmRleDogJXUiLCBwUGFyYW0tPm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JCYWRQb3J0SW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBRT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYXBlcmlvZDoKLSAgICAgICAgewotICAgICAgICAgICAgUU9NWF9WSURFT19JTlRSQVBFUklPRFRZUEUqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRT01YX1ZJREVPX0lOVFJBUEVSSU9EVFlQRSo+KGNvbmZpZ0RhdGEpOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgic2V0X2NvbmZpZygpOiBRT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYXBlcmlvZCIpOwotCi0gICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5CRnJhbWVzID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJCIGZyYW1lcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIk9sZDogUC9CIGZyYW1lcyA9ICV1LyV1LCBOZXc6IFAvQiBmcmFtZXMgPSAldS8ldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3NJbnRyYXBlcmlvZC5uUEZyYW1lcywgbV9zSW50cmFwZXJpb2QubkJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPm5QRnJhbWVzLCBwUGFyYW0tPm5CRnJhbWVzKTsKLSAgICAgICAgICAgICAgICBpZiAobV9zSW50cmFwZXJpb2QubkJGcmFtZXMgIT0gcFBhcmFtLT5uQkZyYW1lcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkR5bmFtaWNhbGx5IGNoYW5naW5nIEItZnJhbWVzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogc2V0IHRoZSBpbnRyYSBwZXJpb2QgKi8KLSAgICAgICAgICAgICAgICBTd1N0YXR1cyA9IHN3dmVuY19zZXRfaW50cmFfcGVyaW9kKHBQYXJhbS0+blBGcmFtZXMscFBhcmFtLT5uQkZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgaWYgKFN3U3RhdHVzICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldF9pbnRyYV9wZXJpb2QgZmFpbGVkICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBTd1N0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbV9zSW50cmFwZXJpb2QublBGcmFtZXMgPSBwUGFyYW0tPm5QRnJhbWVzOwotICAgICAgICAgICAgICAgIG1fc0ludHJhcGVyaW9kLm5CRnJhbWVzID0gcFBhcmFtLT5uQkZyYW1lczsKLSAgICAgICAgICAgICAgICBtX3NJbnRyYXBlcmlvZC5uSURSUGVyaW9kID0gcFBhcmFtLT5uSURSUGVyaW9kOwotCi0gICAgICAgICAgICAgICAgaWYgKG1fc091dFBvcnRGb3JtYXQuZUNvbXByZXNzaW9uRm9ybWF0ID09IE9NWF9WSURFT19Db2RpbmdNUEVHNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fc1BhcmFtTVBFRzQublBGcmFtZXMgPSBwUGFyYW0tPm5QRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9zUGFyYW1NUEVHNC5lUHJvZmlsZSAhPSBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3NQYXJhbU1QRUc0Lm5CRnJhbWVzID0gcFBhcmFtLT5uQkZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fc1BhcmFtTVBFRzQubkJGcmFtZXMgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fc091dFBvcnRGb3JtYXQuZUNvbXByZXNzaW9uRm9ybWF0ID09IE9NWF9WSURFT19Db2RpbmdIMjYzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV9zUGFyYW1IMjYzLm5QRnJhbWVzID0gcFBhcmFtLT5uUEZyYW1lczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAoUU9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFwZXJpb2QpIFVuc3VwcG9ydGVkIHBvcnQgaW5kZXg6ICV1IiwgcFBhcmFtLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yQmFkUG9ydEluZGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhVk9QUmVmcmVzaDoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8T01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFKj4oY29uZmlnRGF0YSk7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZXRfY29uZmlnKCk6IE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoIik7Ci0KLSAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBTV1ZFTkNfUFJPUEVSVFkgUHJvcDsKLQotICAgICAgICAgICAgICAgIFByb3AuaWQgPSBTV1ZFTkNfUFJPUEVSVFlfSURfSUZSQU1FX1JFUVVFU1Q7Ci0KLSAgICAgICAgICAgICAgICBTd1N0YXR1cyA9IHN3dmVuY19zZXRwcm9wZXJ0eShtX2hTd1ZlbmMsICZQcm9wKTsKLSAgICAgICAgICAgICAgICBpZiAoU3dTdGF0dXMgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfc2V0cHJvcGVydHkgZmFpbGVkICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBTd1N0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbV9zQ29uZmlnSW50cmFSZWZyZXNoVk9QLkludHJhUmVmcmVzaFZPUCA9IHBQYXJhbS0+SW50cmFSZWZyZXNoVk9QOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVW5zdXBwb3J0ZWQgcG9ydCBpbmRleDogJXUiLCBwUGFyYW0tPm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JCYWRQb3J0SW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25Sb3RhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogdW5zdXBwb3J0ZWQgaW5kZXggJWQiLCAoaW50KSBjb25maWdJbmRleCk7Ci0gICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIEVYSVRfRlVOQygpOwotCi0gICAgUkVUVVJOKE9NWF9FcnJvck5vbmUpOwotfQotCi1PTVhfRVJST1JUWVBFICBvbXhfdmVuYzo6Y29tcG9uZW50X2RlaW5pdChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXApCi17Ci0gICAgRU5URVJfRlVOQygpOwotCi0gICAgT01YX1UzMiBpID0gMDsKLSAgICBERUJVR19QUklOVF9ISUdIKCJvbXhfdmVuYygpOiBJbnNpZGUgY29tcG9uZW50X2RlaW5pdCgpIik7Ci0KLSAgICAodm9pZCloQ29tcDsKLQotICAgIGlmIChPTVhfU3RhdGVMb2FkZWQgIT0gbV9zdGF0ZSkKLSAgICB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJXQVJOSU5HOlJ4ZCBEZUluaXQsT01YIG5vdCBpbiBMT0FERUQgc3RhdGUgJWQiLAotICAgICAgICAgICAgICAgIG1fc3RhdGUpOwotICAgIH0KLSAgICBpZiAobV9vdXRfbWVtX3B0cikKLSAgICB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZWluZyB0aGUgT3V0cHV0IE1lbW9yeSIpOwotICAgICAgICBmb3IgKGk9MDsgaTwgbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWVfb3V0cHV0X2J1ZmZlciAoJm1fb3V0X21lbV9wdHJbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUobV9vdXRfbWVtX3B0cik7Ci0gICAgICAgIG1fb3V0X21lbV9wdHIgPSBOVUxMOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBidWZmZXJzIGhhdmUgdG8gYmUgY2xlYW5lZCB1cCAqLwotICAgIGlmICggbV9pbnBfbWVtX3B0ciAmJiAhbWV0YV9tb2RlX2VuYWJsZSApCi0gICAgewotICAgICAgICBERUJVR19QUklOVF9MT1coIkZyZWVpbmcgdGhlIElucHV0IE1lbW9yeSIpOwotICAgICAgICBmb3IgKGk9MDsgaTxtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWVfaW5wdXRfYnVmZmVyICgmbV9pbnBfbWVtX3B0cltpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKG1faW5wX21lbV9wdHIpOwotICAgICAgICBtX2lucF9tZW1fcHRyID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBSZXNldCBjb3VudGVycyBpbiBtc2cgcXVldWVzICovCi0gICAgbV9mdGJfcS5tX3NpemU9MDsKLSAgICBtX2NtZF9xLm1fc2l6ZT0wOwotICAgIG1fZXRiX3EubV9zaXplPTA7Ci0gICAgbV9mdGJfcS5tX3JlYWQgPSBtX2Z0Yl9xLm1fd3JpdGUgPTA7Ci0gICAgbV9jbWRfcS5tX3JlYWQgPSBtX2NtZF9xLm1fd3JpdGUgPTA7Ci0gICAgbV9ldGJfcS5tX3JlYWQgPSBtX2V0Yl9xLm1fd3JpdGUgPTA7Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJDYWxsaW5nIHN3dmVuY19kZWluaXQoKSIpOwotICAgIHN3dmVuY19kZWluaXQobV9oU3dWZW5jKTsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goIk9NWF9WZW5jOkNvbXBvbmVudCBEZWluaXQiKTsKLQotICAgIFJFVFVSTihPTVhfRXJyb3JOb25lKTsKLX0KLQotT01YX1UzMiBvbXhfdmVuYzo6ZGV2X3N0b3Aodm9pZCkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICBTV1ZFTkNfU1RBVFVTIFJldDsKLQotICAgIGlmIChmYWxzZSA9PSBtX3N0b3BwZWQpCi0gICAgewotICAgICAgIFJldCA9IHN3dmVuY19zdG9wKG1faFN3VmVuYyk7Ci0gICAgICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgICAgIHsKLSAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19zdG9wIGZhaWxlZCAoJWQpIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgICAgICBSRVRVUk4oLTEpOwotICAgICAgIH0KLSAgICAgICBzZXRfZm9ybWF0ID0gZmFsc2U7Ci0gICAgICAgbV9zdG9wcGVkID0gdHJ1ZTsKLQotICAgICAgIC8qIHBvc3QgU1RPUF9ET05FIGV2ZW50IGFzIHN0YXJ0IGlzIHN5bmNocm9udXMgKi8KLSAgICAgICBwb3N0X2V2ZW50ICgwLCBPTVhfRXJyb3JOb25lLCBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1NUT1BfRE9ORSk7Ci0gICAgfQotCi0gICAgUkVUVVJOKDApOwotfQotCi1PTVhfVTMyIG9teF92ZW5jOjpkZXZfcGF1c2Uodm9pZCkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0gICAgLy8gbm90aGluZyB0byBiZSBkb25lIGZvciBzdyBlbmNvZGVyCi0KLSAgICBSRVRVUk4odHJ1ZSk7Ci19Ci0KLU9NWF9VMzIgb214X3ZlbmM6OmRldl9yZXN1bWUodm9pZCkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0gICAgLy8gbm90aGluZyB0byBiZSBkb25lIGZvciBzdyBlbmNvZGVyCi0KLSAgICBSRVRVUk4odHJ1ZSk7Ci19Ci0KLU9NWF9VMzIgb214X3ZlbmM6OmRldl9zdGFydCh2b2lkKQotewotICAgRU5URVJfRlVOQygpOwotICAgU1dWRU5DX1NUQVRVUyBSZXQ7Ci0gICBSZXQgPSBzd3ZlbmNfc3RhcnQobV9oU3dWZW5jKTsKLSAgIGlmIChSZXQgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgIHsKLSAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3N0YXJ0IGZhaWxlZCAoJWQpIiwKLSAgICAgICAgX19GVU5DVElPTl9fLCBSZXQpOwotICAgICAgUkVUVVJOKC0xKTsKLSAgIH0KLQotICAgbV9zdG9wcGVkID0gZmFsc2U7Ci0KLSAgIFJFVFVSTigwKTsKLX0KLQotT01YX1UzMiBvbXhfdmVuYzo6ZGV2X2ZsdXNoKHVuc2lnbmVkIHBvcnQpCi17Ci0gICBFTlRFUl9GVU5DKCk7Ci0gICBTV1ZFTkNfU1RBVFVTIFJldDsKLQotICAgKHZvaWQpcG9ydDsKLSAgIFJldCA9IHN3dmVuY19mbHVzaChtX2hTd1ZlbmMpOwotICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgewotICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfZmx1c2ggZmFpbGVkICglZCkiLAotICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICBSRVRVUk4oLTEpOwotICAgfQotCi0gICBSRVRVUk4oMCk7Ci19Ci0KLU9NWF9VMzIgb214X3ZlbmM6OmRldl9zdGFydF9kb25lKHZvaWQpCi17Ci0gICBFTlRFUl9GVU5DKCk7Ci0KLSAgIC8qIHBvc3QgU1RBUlRfRE9ORSBldmVudCBhcyBzdGFydCBpcyBzeW5jaHJvbnVzICovCi0gICBwb3N0X2V2ZW50ICgwLCBPTVhfRXJyb3JOb25lLCBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1NUQVJUX0RPTkUpOwotCi0gICBSRVRVUk4oMCk7Ci19Ci0KLU9NWF9VMzIgb214X3ZlbmM6OmRldl9zZXRfbWVzc2FnZV90aHJlYWRfaWQocHRocmVhZF90IHRpZCkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICAvLyBub3RoaW5nIHRvIGJlIGRvbmUgZm9yIHN3IGVuY29kZXIKLSAgICAodm9pZCl0aWQ7Ci0KLSAgICBSRVRVUk4odHJ1ZSk7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl91c2VfYnVmKHVuc2lnbmVkIHBvcnQpCi17Ci0gICAgRU5URVJfRlVOQygpOwotICAgICh2b2lkKXBvcnQ7Ci0gICAgUkVUVVJOKHRydWUpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfZnJlZV9idWYodm9pZCAqYnVmX2FkZHIsdW5zaWduZWQgcG9ydCkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICAodm9pZClidWZfYWRkcjsKLSAgICAodm9pZClwb3J0OwotCi0gICAgUkVUVVJOKHRydWUpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfZW1wdHlfYnVmCi0oCi0gICAgdm9pZCAqYnVmZmVyLAotICAgIHZvaWQgKnBtZW1fZGF0YV9idWYsCi0gICAgdW5zaWduZWQgaW5kZXgsCi0gICAgdW5zaWduZWQgZmQKLSkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICBTV1ZFTkNfU1RBVFVTIFJldDsKLSAgICBTV1ZFTkNfSVBCVUZGRVIgaXBidWZmZXI7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmhkciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKWJ1ZmZlcjsKLSAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IDAsIGZpbGxlZF9sZW5ndGgsIG9mZnNldCA9IDA7Ci0gICAgU1dWRU5DX0NPTE9SX0ZPUk1BVCBjb2xvcl9mb3JtYXQ7Ci0gICAgU1dWRU5DX1BST1BFUlRZIHByb3A7Ci0KLSAgICAodm9pZClwbWVtX2RhdGFfYnVmOwotICAgICh2b2lkKWluZGV4OwotCi0gICAgaWYgKG1ldGFfbW9kZV9lbmFibGUpCi0gICAgewotICAgICAgICBMRUdBQ1lfQ0FNX01FVEFEQVRBX1RZUEUgKm1ldGFfYnVmID0gTlVMTDsKLSAgICAgICAgbWV0YV9idWYgPSAoTEVHQUNZX0NBTV9NRVRBREFUQV9UWVBFICopYnVmaGRyLT5wQnVmZmVyOwotICAgICAgICBpZihtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSAoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKSBRT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coImRldl9lbXB0eV9idWY6IGNvbG9yX2Zvcm1hdCBpcyBRT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUiKTsKLSAgICAgICAgICAgIHNldF9mb3JtYXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKCFtZXRhX2J1ZikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFidWZoZHItPm5GaWxsZWRMZW4gJiYgKGJ1Zmhkci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpcGJ1ZmZlci5wX2J1ZmZlcj0gYnVmaGRyLT5wQnVmZmVyOwotICAgICAgICAgICAgICAgIGlwYnVmZmVyLnNpemUgPSBidWZoZHItPm5BbGxvY0xlbjsKLSAgICAgICAgICAgICAgICBpcGJ1ZmZlci5maWxsZWRfbGVuZ3RoID0gYnVmaGRyLT5uRmlsbGVkTGVuOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZGV2X2VtcHR5X2J1ZjogZW1wdHkgRU9TIGJ1ZmZlciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtZXRhX2J1Zi0+YnVmZmVyX3R5cGUgPT0gTEVHQUNZX0NBTV9TT1VSQ0UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ID0gbWV0YV9idWYtPm1ldGFfaGFuZGxlLT5kYXRhWzFdOwotICAgICAgICAgICAgICAgIHNpemUgPSBtZXRhX2J1Zi0+bWV0YV9oYW5kbGUtPmRhdGFbMl07Ci0gICAgICAgICAgICAgICAgaWYgKHNldF9mb3JtYXQgJiYgKG1ldGFfYnVmLT5tZXRhX2hhbmRsZS0+bnVtRmRzICsgbWV0YV9idWYtPm1ldGFfaGFuZGxlLT5udW1JbnRzID4gNSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtX3NJblBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKW1ldGFfYnVmLT5tZXRhX2hhbmRsZS0+ZGF0YVs1XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaXBidWZmZXIucF9idWZmZXIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsTUFQX1NIQVJFRCwgZmQsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlwYnVmZmVyLnBfYnVmZmVyID09IE1BUF9GQUlMRUQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigibW1hcCgpIGZhaWxlZCBmb3IgZmQgJWQgb2Ygc2l6ZSAlZCIsZmQsc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIFJFVFVSTihPTVhfRXJyb3JCYWRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpcGJ1ZmZlci5zaXplID0gc2l6ZTsKLSAgICAgICAgICAgICAgICBpcGJ1ZmZlci5maWxsZWRfbGVuZ3RoID0gc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG1ldGFfYnVmLT5idWZmZXJfdHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWaWRlb0dyYWxsb2NNZXRhZGF0YSAqbWV0YV9idWYgPSAoVmlkZW9HcmFsbG9jTWV0YWRhdGEgKilidWZoZHItPnBCdWZmZXI7Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZV9oYW5kbGVfdCAqaGFuZGxlID0gKHByaXZhdGVfaGFuZGxlX3QgKiltZXRhX2J1Zi0+cEhhbmRsZTsKLSAgICAgICAgICAgICAgICBzaXplID0gaGFuZGxlLT5zaXplOwotICAgICAgICAgICAgICAgIGlmKHNldF9mb3JtYXQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImNvbG9yIGZvcm1hdCA9IDB4JXgiLGhhbmRsZS0+Zm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoT01YX0NPTE9SX0ZPUk1BVFRZUEUpaGFuZGxlLT5mb3JtYXQpICE9IG1fc0luUG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGhhbmRsZS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfTlYxMl9FTkNPREVBQkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc0luUG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXM6IE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0IDB4JXggaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLGhhbmRsZS0+Zm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVRVUk4oT01YX0Vycm9yQmFkUGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpcGJ1ZmZlci5wX2J1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUR8UFJPVF9XUklURSxNQVBfU0hBUkVELCBmZCwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBpZiAoaXBidWZmZXIucF9idWZmZXIgPT0gTUFQX0ZBSUxFRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJtbWFwKCkgZmFpbGVkIGZvciBmZCAlZCBvZiBzaXplICVkIixmZCxzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvckJhZFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlwYnVmZmVyLnNpemUgPSBzaXplOwotICAgICAgICAgICAgICAgIGlwYnVmZmVyLmZpbGxlZF9sZW5ndGggPSBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vaGFuZGxlcyB0aGUgdXNlIGNhc2UgZm9yIHN1cmZhY2UgZW5jb2RlCi0gICAgICAgICAgICAgICAgaXBidWZmZXIucF9idWZmZXIgPSBidWZoZHItPnBCdWZmZXI7Ci0gICAgICAgICAgICAgICAgaXBidWZmZXIuc2l6ZSA9IGJ1Zmhkci0+bkFsbG9jTGVuOwotICAgICAgICAgICAgICAgIGlwYnVmZmVyLmZpbGxlZF9sZW5ndGggPSBidWZoZHItPm5GaWxsZWRMZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2V0X2Zvcm1hdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXRfZm9ybWF0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBtX3NJblBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0OwotICAgICAgICAgICAgICAgIFJldCA9IHN3dmVuY19zZXRfY29sb3JfZm9ybWF0KG1fc0luUG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwotICAgICAgICAgICAgICAgIGlmIChSZXQgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldHByb3BlcnR5IGZhaWxlZCAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgICAgICAgICAgICAgICAgUkVUVVJOKE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlwYnVmZmVyLnBfYnVmZmVyID0gYnVmaGRyLT5wQnVmZmVyOwotICAgICAgICBpcGJ1ZmZlci5zaXplID0gYnVmaGRyLT5uQWxsb2NMZW47Ci0gICAgICAgIGlwYnVmZmVyLmZpbGxlZF9sZW5ndGggPSBidWZoZHItPm5GaWxsZWRMZW47Ci0gICAgfQotICAgIGlwYnVmZmVyLmZsYWdzID0gMDsKLSAgICBpZiAoYnVmaGRyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCi0gICAgewotICAgICAgaXBidWZmZXIuZmxhZ3MgfD0gU1dWRU5DX0ZMQUdfRU9TOwotICAgIH0KLSAgICBpcGJ1ZmZlci50aW1lc3RhbXAgPSBidWZoZHItPm5UaW1lU3RhbXA7Ci0gICAgaXBidWZmZXIucF9jbGllbnRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopYnVmaGRyOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJFVEI6IHBfYnVmZmVyICglcCkgc2l6ZSAoJWQpIGZpbGxlZF9sZW4gKCVkKSBmbGFncyAoMHglWCkgdGltZXN0YW1wICglbGxkKSBjbGllbnREYXRhICglcCkiLAotICAgICAgaXBidWZmZXIucF9idWZmZXIsCi0gICAgICBpcGJ1ZmZlci5zaXplLAotICAgICAgaXBidWZmZXIuZmlsbGVkX2xlbmd0aCwKLSAgICAgICh1bnNpZ25lZCBpbnQpaXBidWZmZXIuZmxhZ3MsCi0gICAgICBpcGJ1ZmZlci50aW1lc3RhbXAsCi0gICAgICBpcGJ1ZmZlci5wX2NsaWVudF9kYXRhKTsKLQotICAgIFJldCA9IHN3dmVuY19lbXB0eXRoaXNidWZmZXIobV9oU3dWZW5jLCAmaXBidWZmZXIpOwotICAgIGlmIChSZXQgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfZW1wdHl0aGlzYnVmZmVyIGZhaWxlZCAoJWQpIiwKLSAgICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgICBSRVRVUk4oZmFsc2UpOwotICAgIH0KLQotICAgIGlmIChtX2RlYnVnLmluX2J1ZmZlcl9sb2cpCi0gICAgewotICAgICAgIHN3dmVuY19pbnB1dF9sb2dfYnVmZmVycygoY29uc3QgY2hhciopaXBidWZmZXIucF9idWZmZXIsIGlwYnVmZmVyLmZpbGxlZF9sZW5ndGgpOwotICAgIH0KLQotICAgIFJFVFVSTih0cnVlKTsKLX0KLQotYm9vbCBvbXhfdmVuYzo6ZGV2X2ZpbGxfYnVmCi0oCi0gICAgdm9pZCAqYnVmZmVyLAotICAgIHZvaWQgKnBtZW1fZGF0YV9idWYsCi0gICAgdW5zaWduZWQgaW5kZXgsCi0gICAgdW5zaWduZWQgZmQKLSkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICBTV1ZFTkNfU1RBVFVTIFJldDsKLQotICAgIFNXVkVOQ19PUEJVRkZFUiBvcGJ1ZmZlcjsKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmaGRyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopYnVmZmVyOwotCi0gICAgKHZvaWQpcG1lbV9kYXRhX2J1ZjsKLSAgICAodm9pZClpbmRleDsKLSAgICAodm9pZClmZDsKLQotICAgIG9wYnVmZmVyLnBfYnVmZmVyID0gYnVmaGRyLT5wQnVmZmVyOwotICAgIG9wYnVmZmVyLnNpemUgPSBidWZoZHItPm5BbGxvY0xlbjsKLSAgICBvcGJ1ZmZlci5maWxsZWRfbGVuZ3RoID0gYnVmaGRyLT5uRmlsbGVkTGVuOwotICAgIG9wYnVmZmVyLmZsYWdzID0gYnVmaGRyLT5uRmxhZ3M7Ci0gICAgb3BidWZmZXIucF9jbGllbnRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopYnVmaGRyOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJGVEI6IHBfYnVmZmVyICglcCkgc2l6ZSAoJWQpIGZpbGxlZF9sZW4gKCVkKSBmbGFncyAoMHglWCkgdGltZXN0YW1wICglbGxkKSBjbGllbnREYXRhICglcCkiLAotICAgICAgb3BidWZmZXIucF9idWZmZXIsCi0gICAgICBvcGJ1ZmZlci5zaXplLAotICAgICAgb3BidWZmZXIuZmlsbGVkX2xlbmd0aCwKLSAgICAgIG9wYnVmZmVyLmZsYWdzLAotICAgICAgb3BidWZmZXIudGltZXN0YW1wLAotICAgICAgb3BidWZmZXIucF9jbGllbnRfZGF0YSk7Ci0KLSAgICBpZiAoIGZhbHNlID09IG1fYlNlcUhkclJlcXVlc3RlZCkKLSAgICB7Ci0gICAgICBpZiAoZGV2X2dldF9zZXFfaGRyKG9wYnVmZmVyLnBfYnVmZmVyLCBvcGJ1ZmZlci5zaXplLCAmb3BidWZmZXIuZmlsbGVkX2xlbmd0aCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGJ1Zmhkci0+bkZpbGxlZExlbiA9IG9wYnVmZmVyLmZpbGxlZF9sZW5ndGg7Ci0gICAgICAgICBidWZoZHItPm5PZmZzZXQgPSAwOwotICAgICAgICAgYnVmaGRyLT5uVGltZVN0YW1wID0gMDsKLSAgICAgICAgIGJ1Zmhkci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUc7Ci0KLSAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2VuZGluZyBGQkQgd2l0aCBjb2RlYyBjb25maWciKTsKLSAgICAgICAgIG1fYlNlcUhkclJlcXVlc3RlZCA9IHRydWU7Ci0gICAgICAgICBwb3N0X2V2ZW50ICgodW5zaWduZWQgbG9uZylidWZoZHIsMCxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZCRCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGNvdWxkbid0IGdldCBzZXF1ZW5jZSBoZWFkZXIiKTsKLSAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsT01YX0Vycm9yVW5kZWZpbmVkLE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIFJldCA9IHN3dmVuY19maWxsdGhpc2J1ZmZlcihtX2hTd1ZlbmMsICZvcGJ1ZmZlcik7Ci0gICAgICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgICAgIHsKLSAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19maWxsdGhpc2J1ZmZlciBmYWlsZWQgKCVkKSIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICAgICAgUkVUVVJOKGZhbHNlKTsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgUkVUVVJOKHRydWUpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfZ2V0X3NlcV9oZHIKLSgKLSAgIHZvaWQgKmJ1ZmZlciwKLSAgIHVuc2lnbmVkIHNpemUsCi0gICB1bnNpZ25lZCAqaGRybGVuCi0pCi17Ci0gICBFTlRFUl9GVU5DKCk7Ci0KLSAgIFNXVkVOQ19TVEFUVVMgUmV0OwotICAgU1dWRU5DX09QQlVGRkVSIEJ1ZmZlcjsKLQotICAgQnVmZmVyLnBfYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIqKSBidWZmZXI7Ci0gICBCdWZmZXIuc2l6ZSA9IHNpemU7Ci0KLSAgIFJldCA9IHN3dmVuY19nZXRzZXF1ZW5jZWhlYWRlcihtX2hTd1ZlbmMsICZCdWZmZXIpOwotICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgewotICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfZmx1c2ggZmFpbGVkICglZCkiLAotICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICBSRVRVUk4oLTEpOwotICAgfQotCi0gICAqaGRybGVuID0gQnVmZmVyLmZpbGxlZF9sZW5ndGg7Ci0KLSAgIFJFVFVSTigwKTsKLX0KLQotYm9vbCBvbXhfdmVuYzo6ZGV2X2dldF9jYXBhYmlsaXR5X2x0cmNvdW50Ci0oCi0gICBPTVhfVTMyICptaW4sCi0gICBPTVhfVTMyICptYXgsCi0gICBPTVhfVTMyICpzdGVwX3NpemUKLSkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICAodm9pZCltaW47Ci0gICAgKHZvaWQpbWF4OwotICAgICh2b2lkKXN0ZXBfc2l6ZTsKLQotICAgIERFQlVHX1BSSU5UX0VSUk9SKCJHZXQgQ2FwYWJpbGl0eSBMVFIgQ291bnQgaXMgbm90IHN1cHBvcnRlZCIpOwotCi0gICAgUkVUVVJOKGZhbHNlKTsKLX0KLQotYm9vbCBvbXhfdmVuYzo6ZGV2X2dldF92dWlfdGltaW5nX2luZm8oT01YX1UzMiAqZW5hYmxlZCkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICAodm9pZCllbmFibGVkOwotICAgIERFQlVHX1BSSU5UX0VSUk9SKCJHZXQgdnVpIHRpbWluZyBpbmZvcm1hdGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0KLSAgICBSRVRVUk4oZmFsc2UpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfZ2V0X3ZxemlwX3NlaV9pbmZvKE9NWF9VMzIgKmVuYWJsZWQpCi17Ci0gICAgRU5URVJfRlVOQygpOwotCi0gICAgKHZvaWQpZW5hYmxlZDsKLSAgICBERUJVR19QUklOVF9FUlJPUigiR2V0IHZxemlwIHNlaSBpbmZvIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQotICAgIFJFVFVSTihmYWxzZSk7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9nZXRfcGVha19iaXRyYXRlKE9NWF9VMzIgKnBlYWtiaXRyYXRlKQotewotICAgIC8vVEJEOiBzdG9yZSB0aGUgcGVhayBiaXRyYXRlIGluIGNsYXNzIGFuZCByZXR1cm4gaGVyZTsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICAodm9pZClwZWFrYml0cmF0ZTsKLSAgICBERUJVR19QUklOVF9FUlJPUigiR2V0IHBlYWsgYml0cmF0ZSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0KLSAgICBSRVRVUk4oZmFsc2UpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfZ2V0X2JhdGNoX3NpemUoT01YX1UzMiAqc2l6ZSkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICAodm9pZClzaXplOwotCi0gICAgREVCVUdfUFJJTlRfRVJST1IoIkdldCBiYXRjaCBzaXplIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQotICAgIFJFVFVSTihmYWxzZSk7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9sb2FkZWRfc3RhcnQoKQotewotICAgRU5URVJfRlVOQygpOwotICAgUkVUVVJOKHRydWUpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfbG9hZGVkX3N0b3AoKQotewotICAgRU5URVJfRlVOQygpOwotICAgUkVUVVJOKHRydWUpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfbG9hZGVkX3N0YXJ0X2RvbmUoKQotewotICAgRU5URVJfRlVOQygpOwotICAgUkVUVVJOKHRydWUpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfbG9hZGVkX3N0b3BfZG9uZSgpCi17Ci0gICBFTlRFUl9GVU5DKCk7Ci0gICBSRVRVUk4odHJ1ZSk7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9nZXRfYnVmX3JlcShPTVhfVTMyICptaW5fYnVmZl9jb3VudCwKLSAgICAgICAgT01YX1UzMiAqYWN0dWFsX2J1ZmZfY291bnQsCi0gICAgICAgIE9NWF9VMzIgKmJ1ZmZfc2l6ZSwKLSAgICAgICAgT01YX1UzMiBwb3J0KQotewotICAgRU5URVJfRlVOQygpOwotCi0gICBib29sIGJSZXQgPSB0cnVlOwotICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqUG9ydERlZjsKLQotICAgaWYgKFBPUlRfSU5ERVhfSU4gPT0gcG9ydCkKLSAgIHsKLSAgICAgUG9ydERlZiA9ICZtX3NJblBvcnREZWY7Ci0gICB9Ci0gICBlbHNlIGlmIChQT1JUX0lOREVYX09VVCA9PSBwb3J0KQotICAgewotICAgICBQb3J0RGVmID0gJm1fc091dFBvcnREZWY7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogJXMsIFVuc3VwcG9ydGVkIHBhcmFtZXRlciIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgIGJSZXQgPSBmYWxzZTsKLSAgIH0KLQotICAgaWYgKHRydWUgPT0gYlJldCkKLSAgIHsKLSAgICAgICptaW5fYnVmZl9jb3VudCA9IFBvcnREZWYtPm5CdWZmZXJDb3VudE1pbjsKLSAgICAgICphY3R1YWxfYnVmZl9jb3VudCA9IFBvcnREZWYtPm5CdWZmZXJDb3VudEFjdHVhbDsKLSAgICAgICpidWZmX3NpemUgPSBQb3J0RGVmLT5uQnVmZmVyU2l6ZTsKLSAgIH0KLQotICAgUkVUVVJOKHRydWUpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfc2V0X2J1Zl9yZXEKLSgKLSAgIE9NWF9VMzIgY29uc3QgKm1pbl9idWZmX2NvdW50LAotICAgT01YX1UzMiBjb25zdCAqYWN0dWFsX2J1ZmZfY291bnQsCi0gICBPTVhfVTMyIGNvbnN0ICpidWZmX3NpemUsCi0gICBPTVhfVTMyIHBvcnQKLSkKLXsKLSAgIEVOVEVSX0ZVTkMoKTsKLQotICAgU1dWRU5DX1NUQVRVUyBSZXQ7Ci0gICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpQb3J0RGVmOwotCi0gICAodm9pZCltaW5fYnVmZl9jb3VudDsKLSAgIGlmIChQT1JUX0lOREVYX0lOID09IHBvcnQpCi0gICB7Ci0gICAgIFBvcnREZWYgPSAmbV9zSW5Qb3J0RGVmOwotICAgfQotICAgZWxzZSBpZiAoUE9SVF9JTkRFWF9PVVQgPT0gcG9ydCkKLSAgIHsKLSAgICAgUG9ydERlZiA9ICZtX3NPdXRQb3J0RGVmOwotICAgfQotICAgZWxzZQotICAgewotICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6ICVzLCBVbnN1cHBvcnRlZCBwYXJhbWV0ZXIiLCBfX0ZVTkNUSU9OX18pOwotICAgICBSRVRVUk4oZmFsc2UpOwotICAgfQotCi0gICBpZiAoKmFjdHVhbF9idWZmX2NvdW50IDwgUG9ydERlZi0+bkJ1ZmZlckNvdW50TWluKQotICAgewotICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAlcywgKGFjdHVhbCxtaW4pIGJ1ZmZlciBjb3VudCAoJWQsICVkKSIsCi0gICAgICAgICBfX0ZVTkNUSU9OX18sICphY3R1YWxfYnVmZl9jb3VudCwgUG9ydERlZi0+bkJ1ZmZlckNvdW50TWluKTsKLSAgICAgIFJFVFVSTihmYWxzZSk7Ci0gICB9Ci0gICBpZiAoZmFsc2UgPT0gbWV0YV9tb2RlX2VuYWJsZSkKLSAgIHsKLSAgICAgIGlmICgqYnVmZl9zaXplIDwgUG9ydERlZi0+bkJ1ZmZlclNpemUpCi0gICAgICB7Ci0gICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAlcywgKG5ldyxvbGQpIGJ1ZmZlciBjb3VudCAoJWQsICVkKSIsCi0gICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqYWN0dWFsX2J1ZmZfY291bnQsIFBvcnREZWYtPm5CdWZmZXJDb3VudE1pbik7Ci0gICAgICAgICAgUkVUVVJOKGZhbHNlKTsKLSAgICAgIH0KLSAgIH0KLQotICAgUkVUVVJOKHRydWUpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfaXNfdmlkZW9fc2Vzc2lvbl9zdXBwb3J0ZWQoT01YX1UzMiB3aWR0aCwgT01YX1UzMiBoZWlnaHQpCi17Ci0gICBFTlRFUl9GVU5DKCk7Ci0KLSAgIGlmICggKHdpZHRoICogaGVpZ2h0IDwgbV9jYXBhYmlsaXR5Lm1pbl93aWR0aCAqICBtX2NhcGFiaWxpdHkubWluX2hlaWdodCkgfHwKLSAgICAgICAgKHdpZHRoICogaGVpZ2h0ID4gbV9jYXBhYmlsaXR5Lm1heF93aWR0aCAqICBtX2NhcGFiaWxpdHkubWF4X2hlaWdodCkKLSAgICAgICkKLSAgIHsKLSAgICAgICBERUJVR19QUklOVF9FUlJPUigKLSAgICAgICAgICJVbnN1cHBvcnRlZCBSZXNvbHV0aW9uIFd4SCA9ICgldSl4KCV1KSBTdXBwb3J0ZWQgUmFuZ2UgPSBtaW4gKCVkKXgoJWQpIC0gbWF4ICglZCl4KCVkKSIsCi0gICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgbV9jYXBhYmlsaXR5Lm1pbl93aWR0aCwgbV9jYXBhYmlsaXR5Lm1pbl9oZWlnaHQsCi0gICAgICAgICBtX2NhcGFiaWxpdHkubWF4X3dpZHRoLCBtX2NhcGFiaWxpdHkubWF4X2hlaWdodCk7Ci0gICAgICAgUkVUVVJOKGZhbHNlKTsKLSAgIH0KLQotICAgUkVUVVJOKHRydWUpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfYnVmZmVyX3JlYWR5X3RvX3F1ZXVlKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpCi17Ci0gICBFTlRFUl9GVU5DKCk7Ci0KLSAgICh2b2lkKWJ1ZmZlcjsKLSAgIFJFVFVSTih0cnVlKTsKLX0KLWludCBvbXhfdmVuYzo6ZGV2X2hhbmRsZV9vdXRwdXRfZXh0cmFkYXRhKHZvaWQgKmJ1ZmZlciwgaW50IGZkKQotewotICAgRU5URVJfRlVOQygpOwotCi0gICAodm9pZClidWZmZXI7Ci0gICAodm9pZClmZDsKLQotICAgUkVUVVJOKHRydWUpOwotfQotCi1pbnQgb214X3ZlbmM6OmRldl9oYW5kbGVfaW5wdXRfZXh0cmFkYXRhKHZvaWQgKmJ1ZmZlciwgaW50IGZkLCBpbnQgaW5kZXgpCi17Ci0gICBFTlRFUl9GVU5DKCk7Ci0KLSAgICh2b2lkKWJ1ZmZlcjsKLSAgICh2b2lkKWZkOwotICAgKHZvaWQpaW5kZXg7Ci0KLSAgIFJFVFVSTih0cnVlKTsKLX0KLQotdm9pZCBvbXhfdmVuYzo6ZGV2X3NldF9leHRyYWRhdGFfY29va2llKHZvaWQgKmJ1ZmZlcikKLXsKLSAgIEVOVEVSX0ZVTkMoKTsKLQotICAgKHZvaWQpYnVmZmVyOwotfQotCi1pbnQgb214X3ZlbmM6OmRldl9zZXRfZm9ybWF0KGludCBjb2xvcikKLXsKLSAgIEVOVEVSX0ZVTkMoKTsKLQotICAgKHZvaWQpY29sb3I7Ci0KLSAgIFJFVFVSTih0cnVlKTsKLSAgICAvL3JldHVybiBoYW5kbGUtPnZlbmNfc2V0X2Zvcm1hdChjb2xvcik7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9jb2xvcl9hbGlnbihPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyLAotICAgICAgICAgICAgICAgIE9NWF9VMzIgd2lkdGgsIE9NWF9VMzIgaGVpZ2h0KQotewotICAgIEVOVEVSX0ZVTkMoKTsKLQotICAgIGlmKHNlY3VyZV9zZXNzaW9uKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJDYW5ub3QgYWxpZ24gY29sb3JzIGluIHNlY3VyZSBzZXNzaW9uLiIpOwotICAgICAgICBSRVRVUk4oT01YX0ZBTFNFKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN3dmVuY19jb2xvcl9hbGlnbihidWZmZXIsIHdpZHRoLGhlaWdodCk7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmlzX3NlY3VyZV9zZXNzaW9uKCkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICBSRVRVUk4oc2VjdXJlX3Nlc3Npb24pOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfZ2V0X291dHB1dF9sb2dfZmxhZygpCi17Ci0gICAgRU5URVJfRlVOQygpOwotCi0gICAgUkVUVVJOKG1fZGVidWcub3V0X2J1ZmZlcl9sb2cgPT0gMSk7Ci19Ci0KLWludCBvbXhfdmVuYzo6ZGV2X291dHB1dF9sb2dfYnVmZmVycyhjb25zdCBjaGFyICpidWZmZXIsIGludCBidWZmZXJsZW4pCi17Ci0gICAgRU5URVJfRlVOQygpOwotCi0gICAgaWYgKG1fZGVidWcub3V0X2J1ZmZlcl9sb2cgJiYgIW1fZGVidWcub3V0ZmlsZSkKLSAgICB7Ci0gICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgaW50IHdpZHRoID0gbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKLSAgICAgICAgaW50IGhlaWdodCA9IG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwotICAgICAgICBpZihTV1ZFTkNfQ09ERUNfTVBFRzQgPT0gbV9jb2RlYykKLSAgICAgICAgewotICAgICAgICAgICBzaXplID0gc25wcmludGYobV9kZWJ1Zy5vdXRmaWxlX25hbWUsIFBST1BFUlRZX1ZBTFVFX01BWCwKLSAgICAgICAgICAgICAgIiVzL291dHB1dF9lbmNfJWRfJWRfJXAubTR2IiwKLSAgICAgICAgICAgICAgbV9kZWJ1Zy5sb2dfbG9jLCB3aWR0aCwgaGVpZ2h0LCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKFNXVkVOQ19DT0RFQ19IMjYzID09IG1fY29kZWMpCi0gICAgICAgIHsKLSAgICAgICAgICAgc2l6ZSA9IHNucHJpbnRmKG1fZGVidWcub3V0ZmlsZV9uYW1lLCBQUk9QRVJUWV9WQUxVRV9NQVgsCi0gICAgICAgICAgICAgICIlcy9vdXRwdXRfZW5jXyVkXyVkXyVwLjI2MyIsCi0gICAgICAgICAgICAgIG1fZGVidWcubG9nX2xvYywgd2lkdGgsIGhlaWdodCwgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChzaXplID4gUFJPUEVSVFlfVkFMVUVfTUFYKSB8fCAoc2l6ZSA8IDApKQotICAgICAgICB7Ci0gICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZTogJXMgZm9yIGxvZ2dpbmcgYXMgc2l6ZTolZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RlYnVnLm91dGZpbGVfbmFtZSwgc2l6ZSk7Ci0gICAgICAgICAgIFJFVFVSTigtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJvdXRwdXQgZmlsZW5hbWUgPSAlcyIsIG1fZGVidWcub3V0ZmlsZV9uYW1lKTsKLSAgICAgICAgbV9kZWJ1Zy5vdXRmaWxlID0gZm9wZW4obV9kZWJ1Zy5vdXRmaWxlX25hbWUsICJhYiIpOwotICAgICAgICBpZiAoIW1fZGVidWcub3V0ZmlsZSkKLSAgICAgICAgewotICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGU6ICVzIGZvciBsb2dnaW5nIGVycm5vOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWJ1Zy5vdXRmaWxlX25hbWUsIGVycm5vKTsKLSAgICAgICAgICAgbV9kZWJ1Zy5vdXRmaWxlX25hbWVbMF0gPSAnXDAnOwotICAgICAgICAgICBSRVRVUk4oLTEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX2RlYnVnLm91dGZpbGUgJiYgYnVmZmVyICYmIGJ1ZmZlcmxlbikKLSAgICB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiJXMgYnVmZmVyIGxlbmd0aDogJWQiLCBfX2Z1bmNfXywgYnVmZmVybGVuKTsKLSAgICAgICAgZndyaXRlKGJ1ZmZlciwgYnVmZmVybGVuLCAxLCBtX2RlYnVnLm91dGZpbGUpOwotICAgIH0KLQotICAgIFJFVFVSTigwKTsKLX0KLQotaW50IG9teF92ZW5jOjpzd3ZlbmNfaW5wdXRfbG9nX2J1ZmZlcnMoY29uc3QgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVybGVuKQotewotICAgaW50IHdpZHRoID0gbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKLSAgIGludCBoZWlnaHQgPSBtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKLSAgIGludCBzdHJpZGUgPSBWRU5VU19ZX1NUUklERShDT0xPUl9GTVRfTlYxMiwgd2lkdGgpOwotICAgaW50IHNjYW5saW5lcyA9IFZFTlVTX1lfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyLCBoZWlnaHQpOwotICAgY2hhciAqdGVtcCA9IChjaGFyKilidWZmZXI7Ci0KLSAgIGlmICghbV9kZWJ1Zy5pbmZpbGUpCi0gICB7Ci0gICAgICAgaW50IHNpemUgPSBzbnByaW50ZihtX2RlYnVnLmluZmlsZV9uYW1lLCBQUk9QRVJUWV9WQUxVRV9NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgIiVzL2lucHV0X2VuY18lZF8lZF8lcC55dXYiLAotICAgICAgICAgICAgICAgICAgICAgIG1fZGVidWcubG9nX2xvYywgd2lkdGgsIGhlaWdodCwgdGhpcyk7Ci0gICAgICAgaWYgKChzaXplID4gUFJPUEVSVFlfVkFMVUVfTUFYKSB8fCAoc2l6ZSA8IDApKQotICAgICAgIHsKLSAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBvcGVuIGlucHV0IGZpbGU6ICVzIGZvciBsb2dnaW5nIHNpemU6JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWJ1Zy5pbmZpbGVfbmFtZSwgc2l6ZSk7Ci0gICAgICAgICAgIFJFVFVSTigtMSk7Ci0gICAgICAgfQotICAgICAgIERFQlVHX1BSSU5UX0xPVygiaW5wdXQgZmlsZW5hbWUgPSAlcyIsIG1fZGVidWcuaW5maWxlX25hbWUpOwotICAgICAgIG1fZGVidWcuaW5maWxlID0gZm9wZW4gKG1fZGVidWcuaW5maWxlX25hbWUsICJhYiIpOwotICAgICAgIGlmICghbV9kZWJ1Zy5pbmZpbGUpCi0gICAgICAgewotICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJGYWlsZWQgdG8gb3BlbiBpbnB1dCBmaWxlOiAlcyBmb3IgbG9nZ2luZyIsCi0gICAgICAgICAgICAgIG1fZGVidWcuaW5maWxlX25hbWUpOwotICAgICAgICAgICBtX2RlYnVnLmluZmlsZV9uYW1lWzBdID0gJ1wwJzsKLSAgICAgICAgICAgUkVUVVJOKC0xKTsKLSAgICAgICB9Ci0gICB9Ci0gICBpZiAobV9kZWJ1Zy5pbmZpbGUgJiYgYnVmZmVyICYmIGJ1ZmZlcmxlbikKLSAgIHsKLSAgICAgICBERUJVR19QUklOVF9MT1coIiVzIGJ1ZmZlciBsZW5ndGg6ICVkIiwgX19mdW5jX18sIGJ1ZmZlcmxlbik7Ci0gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykKLSAgICAgICB7Ci0gICAgICAgICAgZndyaXRlKHRlbXAsIHdpZHRoLCAxLCBtX2RlYnVnLmluZmlsZSk7Ci0gICAgICAgICAgdGVtcCArPSBzdHJpZGU7Ci0gICAgICAgfQotICAgICAgIHRlbXAgPSAoY2hhciopKGJ1ZmZlciArIChzdHJpZGUgKiBzY2FubGluZXMpKTsKLSAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaGVpZ2h0LzI7IGkrKykKLSAgICAgICB7Ci0gICAgICAgICAgZndyaXRlKHRlbXAsIHdpZHRoLCAxLCBtX2RlYnVnLmluZmlsZSk7Ci0gICAgICAgICAgdGVtcCArPSBzdHJpZGU7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIFJFVFVSTigwKTsKLX0KLQotaW50IG9teF92ZW5jOjpkZXZfZXh0cmFkYXRhX2xvZ19idWZmZXJzKGNoYXIgKmJ1ZmZlcikKLXsKLSAgIEVOVEVSX0ZVTkMoKTsKLQotICAgKHZvaWQpYnVmZmVyOwotCi0gICBSRVRVUk4odHJ1ZSk7Ci0gICAgLy9yZXR1cm4gaGFuZGxlLT52ZW5jX2V4dHJhZGF0YV9sb2dfYnVmZmVycyhidWZmZXIpOwotfQotCi1TV1ZFTkNfU1RBVFVTIG9teF92ZW5jOjpzd3ZlbmNfZ2V0X2J1ZmZlcl9yZXEKLSgKLSAgIE9NWF9VMzIgKm1pbl9idWZmX2NvdW50LAotICAgT01YX1UzMiAqYWN0dWFsX2J1ZmZfY291bnQsCi0gICBPTVhfVTMyICpidWZmX3NpemUsCi0gICBPTVhfVTMyICpidWZmX2FsaWdubWVudCwKLSAgIE9NWF9VMzIgcG9ydAotKQotewotICAgIEVOVEVSX0ZVTkMoKTsKLQotICAgIFNXVkVOQ19QUk9QRVJUWSBQcm9wOwotICAgIFNXVkVOQ19TVEFUVVMgUmV0OwotICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKlBvcnREZWY7Ci0KLSAgICBQcm9wLmlkID0gU1dWRU5DX1BST1BFUlRZX0lEX0JVRkZFUl9SRVE7Ci0gICAgaWYgKFBPUlRfSU5ERVhfSU4gPT0gcG9ydCkKLSAgICB7Ci0gICAgICBQcm9wLmluZm8uYnVmZmVyX3JlcS50eXBlID0gU1dWRU5DX0JVRkZFUl9JTlBVVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoUE9SVF9JTkRFWF9PVVQgPT0gcG9ydCkKLSAgICB7Ci0gICAgICBQcm9wLmluZm8uYnVmZmVyX3JlcS50eXBlID0gU1dWRU5DX0JVRkZFUl9PVVRQVVQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6ICVzLCBVbnN1cHBvcnRlZCBwYXJhbWV0ZXIiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgUkVUVVJOKFNXVkVOQ19TX0lOVkFMSURfUEFSQU1FVEVSUyk7Ci0gICAgfQotCi0gICAgUmV0ID0gc3d2ZW5jX2dldHByb3BlcnR5KG1faFN3VmVuYywgJlByb3ApOwotICAgIGlmIChSZXQgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAlcywgc3d2ZW5jX3NldHByb3BlcnR5IGZhaWxlZCAoJWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgIFJldCk7Ci0gICAgICAgUkVUVVJOKFNXVkVOQ19TX0lOVkFMSURfUEFSQU1FVEVSUyk7Ci0gICAgfQotCi0gICAgKmJ1ZmZfc2l6ZSA9IFByb3AuaW5mby5idWZmZXJfcmVxLnNpemU7Ci0gICAgKm1pbl9idWZmX2NvdW50ID0gUHJvcC5pbmZvLmJ1ZmZlcl9yZXEubWluY291bnQ7Ci0gICAgKmFjdHVhbF9idWZmX2NvdW50ID0gUHJvcC5pbmZvLmJ1ZmZlcl9yZXEubWluY291bnQ7Ci0gICAgKmJ1ZmZfYWxpZ25tZW50ID0gUHJvcC5pbmZvLmJ1ZmZlcl9yZXEuYWxpZ25tZW50OwotCi0gICAgUkVUVVJOKFJldCk7Ci19Ci0KLVNXVkVOQ19TVEFUVVMgb214X3ZlbmM6OnN3dmVuY19lbXB0eV9idWZmZXJfZG9uZV9jYgotKAotICAgIFNXVkVOQ19IQU5ETEUgICAgc3d2ZW5jLAotICAgIFNXVkVOQ19JUEJVRkZFUiAqcF9pcGJ1ZmZlciwKLSAgICB2b2lkICAgICAgICAgICAgKnBfY2xpZW50Ci0pCi17Ci0gICAgRU5URVJfRlVOQygpOwotCi0gICAgKHZvaWQpc3d2ZW5jOwotICAgIFNXVkVOQ19TVEFUVVMgZVJldCA9IFNXVkVOQ19TX1NVQ0NFU1M7Ci0gICAgb214X3ZlbmMgKm9teCA9IHJlaW50ZXJwcmV0X2Nhc3Q8b214X3ZlbmMqPihwX2NsaWVudCk7Ci0KLSAgICBpZiAocF9pcGJ1ZmZlciA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgZVJldCA9IFNXVkVOQ19TX0ZBSUxVUkU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG9teC0+c3d2ZW5jX2VtcHR5X2J1ZmZlcl9kb25lKHBfaXBidWZmZXIpOwotICAgIH0KLSAgICByZXR1cm4gZVJldDsKLX0KLQotU1dWRU5DX1NUQVRVUyBvbXhfdmVuYzo6c3d2ZW5jX2VtcHR5X2J1ZmZlcl9kb25lCi0oCi0gICAgU1dWRU5DX0lQQlVGRkVSICpwX2lwYnVmZmVyCi0pCi17Ci0gICAgU1dWRU5DX1NUQVRVUyBlUmV0ID0gU1dWRU5DX1NfU1VDQ0VTUzsKLSAgICBPTVhfRVJST1JUWVBFIGVycm9yID0gT01YX0Vycm9yTm9uZTsKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogb214aGRyID0gTlVMTDsKLQotICAgIC8vb214X3ZpZGVvICpvbXggPSByZWludGVycHJldF9jYXN0PG9teF92aWRlbyo+KHBfY2xpZW50KTsKLSAgICBvbXhoZHIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUqKXBfaXBidWZmZXItPnBfY2xpZW50X2RhdGE7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkVCRDogY2xpZW50RGF0YSAoJXApIiwgcF9pcGJ1ZmZlci0+cF9jbGllbnRfZGF0YSk7Ci0KLSAgICBpZiAoIChvbXhoZHIgPT0gTlVMTCkgfHwKLSAgICAgICAgICggKChPTVhfVTMyKShvbXhoZHIgLSBtX2lucF9tZW1fcHRyKSA+bV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCkgJiYKLSAgICAgICAgICAgKChPTVhfVTMyKShvbXhoZHIgLSBtZXRhX2J1ZmZlcl9oZHIpID5tX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKQotICAgICAgICAgKQotICAgICAgICkKLSAgICB7Ci0gICAgICAgIG9teGhkciA9IE5VTEw7Ci0gICAgICAgIGVycm9yID0gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgIH0KLQotICAgIGlmIChvbXhoZHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIC8vIHVubWFwIHRoZSBpbnB1dCBidWZmZXItPnBCdWZmZXIKLSAgICAgICAgb214X3JlbGVhc2VfbWV0YV9idWZmZXIob214aGRyKTsKLSNpZmRlZiBfQU5EUk9JRF9JQ1NfCi0gICAgICAgIGlmIChtZXRhX21vZGVfZW5hYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgIExFR0FDWV9DQU1fTUVUQURBVEFfVFlQRSAqbWV0YV9idWYgPSBOVUxMOwotICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgICAgIG1ldGFfYnVmID0gKExFR0FDWV9DQU1fTUVUQURBVEFfVFlQRSAqKW9teGhkci0+cEJ1ZmZlcjsKLSAgICAgICAgICAgaWYgKG1ldGFfYnVmKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChtZXRhX2J1Zi0+YnVmZmVyX3R5cGUgPT0gTEVHQUNZX0NBTV9TT1VSQ0UpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNpemUgPSBtZXRhX2J1Zi0+bWV0YV9oYW5kbGUtPmRhdGFbMl07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAobWV0YV9idWYtPmJ1ZmZlcl90eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBWaWRlb0dyYWxsb2NNZXRhZGF0YSAqbWV0YV9idWYgPSAoVmlkZW9HcmFsbG9jTWV0YWRhdGEgKilvbXhoZHItPnBCdWZmZXI7Ci0gICAgICAgICAgICAgICAgICBwcml2YXRlX2hhbmRsZV90ICpoYW5kbGUgPSAocHJpdmF0ZV9oYW5kbGVfdCAqKW1ldGFfYnVmLT5wSGFuZGxlOwotICAgICAgICAgICAgICAgICAgc2l6ZSA9IGhhbmRsZS0+c2l6ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICAgIGludCBzdGF0dXMgPSBtdW5tYXAocF9pcGJ1ZmZlci0+cF9idWZmZXIsIHNpemUpOwotICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJVbm1hcHBlZCBwQnVmZmVyIDwlcD4gc2l6ZSA8JWQ+IHN0YXR1cyA8JWQ+IiwgcF9pcGJ1ZmZlci0+cF9idWZmZXIsIHNpemUsIHN0YXR1cyk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBwb3N0X2V2ZW50ICgodW5zaWduZWQgbG9uZylvbXhoZHIsZXJyb3IsT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQpOwotICAgIH0KLQotICAgIFJFVFVSTihlUmV0KTsKLX0KLQotU1dWRU5DX1NUQVRVUyBvbXhfdmVuYzo6c3d2ZW5jX2ZpbGxfYnVmZmVyX2RvbmVfY2IKLSgKLSAgICBTV1ZFTkNfSEFORExFICAgIHN3dmVuYywKLSAgICBTV1ZFTkNfT1BCVUZGRVIgKnBfb3BidWZmZXIsCi0gICAgdm9pZCAgICAgICAgICAgICpwX2NsaWVudAotKQotewotICAgIEVOVEVSX0ZVTkMoKTsKLQotICAgIFNXVkVOQ19TVEFUVVMgZVJldCA9IFNXVkVOQ19TX1NVQ0NFU1M7Ci0gICAgT01YX0VSUk9SVFlQRSBlcnJvciA9IE9NWF9FcnJvck5vbmU7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIG9teGhkciA9IE5VTEw7Ci0gICAgb214X3ZpZGVvICpvbXggPSByZWludGVycHJldF9jYXN0PG9teF92aWRlbyo+KHBfY2xpZW50KTsKLQotICAgICh2b2lkKXN3dmVuYzsKLQotICAgIGlmIChwX29wYnVmZmVyICE9IE5VTEwpCi0gICAgewotICAgICAgICBvbXhoZHIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUqKXBfb3BidWZmZXItPnBfY2xpZW50X2RhdGE7Ci0gICAgfQotCi0gICAgaWYgKCAocF9vcGJ1ZmZlciAhPSBOVUxMKSAmJgotICAgICAgICAgKChPTVhfVTMyKShvbXhoZHIgLSBvbXgtPm1fb3V0X21lbV9wdHIpICA8IG9teC0+bV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpCi0gICAgICAgKQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGQkQ6IGNsaWVudERhdGEgKCVwKSBidWZmZXIgKCVwKSBmaWxsZWRfbGVuZ2ggKCVkKSBmbGFncyAoMHgleCkgdHMgKCVsbGQpIiwKLSAgICAgICAgICBwX29wYnVmZmVyLT5wX2NsaWVudF9kYXRhLAotICAgICAgICAgIHBfb3BidWZmZXItPnBfYnVmZmVyLAotICAgICAgICAgIHBfb3BidWZmZXItPmZpbGxlZF9sZW5ndGgsCi0gICAgICAgICAgcF9vcGJ1ZmZlci0+ZmxhZ3MsCi0gICAgICAgICAgcF9vcGJ1ZmZlci0+dGltZXN0YW1wKTsKLQotICAgICAgICBpZiAocF9vcGJ1ZmZlci0+ZmlsbGVkX2xlbmd0aCA8PSAgb214aGRyLT5uQWxsb2NMZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9teGhkci0+cEJ1ZmZlciA9IHBfb3BidWZmZXItPnBfYnVmZmVyOwotICAgICAgICAgICAgb214aGRyLT5uRmlsbGVkTGVuID0gcF9vcGJ1ZmZlci0+ZmlsbGVkX2xlbmd0aDsKLSAgICAgICAgICAgIG9teGhkci0+bk9mZnNldCA9IDA7Ci0gICAgICAgICAgICBvbXhoZHItPm5UaW1lU3RhbXAgPSBwX29wYnVmZmVyLT50aW1lc3RhbXA7Ci0gICAgICAgICAgICBvbXhoZHItPm5GbGFncyA9IDA7Ci0gICAgICAgICAgICBpZiAoU1dWRU5DX0ZSQU1FX1RZUEVfSSA9PSBwX29wYnVmZmVyLT5mcmFtZV90eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgb214aGRyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfU1lOQ0ZSQU1FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFNXVkVOQ19GTEFHX0VPUyAmIHBfb3BidWZmZXItPmZsYWdzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgb214aGRyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYob214aGRyLT5uRmlsbGVkTGVuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgb214aGRyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiby9wIGZsYWcgPSAweCV4Iiwgb214aGRyLT5uRmxhZ3MpOwotCi0gICAgICAgICAgICAvKiBVc2UgYnVmZmVyIGNhc2UgKi8KLSAgICAgICAgICAgIGlmIChvbXgtPm91dHB1dF91c2VfYnVmZmVyICYmICFvbXgtPm1fdXNlX291dHB1dF9wbWVtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygibWVtY3B5KCkgZm9yIG8vcCBIZWFwIFVzZUJ1ZmZlciIpOwotICAgICAgICAgICAgICAgIG1lbWNweSggb214aGRyLT5wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBfb3BidWZmZXItPnBfYnVmZmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfb3BidWZmZXItPmZpbGxlZF9sZW5ndGggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9teGhkci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvbXhoZHIgPSBOVUxMOwotICAgICAgICBlcnJvciA9IE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICB9Ci0KLSAgICBvbXgtPnBvc3RfZXZlbnQgKCh1bnNpZ25lZCBsb25nKW9teGhkcixlcnJvcixPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZCRCk7Ci0KLSAgICBSRVRVUk4oZVJldCk7Ci19Ci0KLVNXVkVOQ19TVEFUVVMgb214X3ZlbmM6OnN3dmVuY19oYW5kbGVfZXZlbnRfY2IKLSgKLSAgICBTV1ZFTkNfSEFORExFIHN3dmVuYywKLSAgICBTV1ZFTkNfRVZFTlQgIGV2ZW50LAotICAgIHZvaWQgICAgICAgICAqcF9jbGllbnQKLSkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICBTV1ZFTkNfU1RBVFVTIGVSZXQgPSBTV1ZFTkNfU19TVUNDRVNTOwotICAgIG9teF92aWRlbyAqb214ID0gcmVpbnRlcnByZXRfY2FzdDxvbXhfdmlkZW8qPihwX2NsaWVudCk7Ci0KLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogb214aGRyID0gTlVMTDsKLQotICAgICh2b2lkKXN3dmVuYzsKLQotICAgIGlmIChvbXggPT0gTlVMTCB8fCBwX2NsaWVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAlcyBpbnZhbGlkIGkvcCBwYXJhbXMiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBSRVRVUk4oU1dWRU5DX1NfTlVMTF9QT0lOVEVSKTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coInN3dmVuY19oYW5kbGVfZXZlbnRfY2IgLSBldmVudCA9ICVkIiwgZXZlbnQpOwotCi0gICAgc3dpdGNoIChldmVudCkKLSAgICB7Ci0gICAgICAgIGNhc2UgU1dWRU5DX0VWRU5UX0ZMVVNIX0RPTkU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNXVkVOQ19FVkVOVF9GTFVTSF9ET05FIGlucHV0X2ZsdXNoX3Byb2dyZXNzICVkIG91dHB1dF9mbHVzaF9wcm9ncmVzcyAlZCIsCi0gICAgICAgICAgICBvbXgtPmlucHV0X2ZsdXNoX3Byb2dyZXNzLCBvbXgtPm91dHB1dF9mbHVzaF9wcm9ncmVzcyk7Ci0gICAgICAgICAgIGlmIChvbXgtPmlucHV0X2ZsdXNoX3Byb2dyZXNzKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBvbXgtPnBvc3RfZXZlbnQgKCh1bnNpZ25lZClOVUxMLCBTV1ZFTkNfU19TVUNDRVNTLAotICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVF9JTlBVVF9GTFVTSCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKG9teC0+b3V0cHV0X2ZsdXNoX3Byb2dyZXNzKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBvbXgtPnBvc3RfZXZlbnQgKCh1bnNpZ25lZClOVUxMLCBTV1ZFTkNfU19TVUNDRVNTLAotICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVF9PVVRQVVRfRkxVU0gpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTV1ZFTkNfRVZFTlRfRkFUQUxfRVJST1I6Ci0gICAgICAgIHsKLSAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTV1ZFTkNfRVZFTlRfRkFUQUxfRVJST1IiKTsKLSAgICAgICAgICAgb214LT5vbXhfcmVwb3J0X2Vycm9yKCk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlVua25vd24gZXZlbnQgcmVjZWl2ZWQgOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIFJFVFVSTihlUmV0KTsKLX0KLQotU1dWRU5DX1NUQVRVUyBvbXhfdmVuYzo6c3d2ZW5jX3NldF9yY19tb2RlCi0oCi0gICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBlQ29udHJvbFJhdGUKLSkKLXsKLSAgICBFTlRFUl9GVU5DKCk7Ci0KLSAgICBTV1ZFTkNfU1RBVFVTIFJldCA9IFNXVkVOQ19TX1NVQ0NFU1M7Ci0gICAgU1dWRU5DX1JDX01PREUgcmNfbW9kZTsKLSAgICBTV1ZFTkNfUFJPUEVSVFkgUHJvcDsKLQotICAgIHN3aXRjaCAoZUNvbnRyb2xSYXRlKQotICAgIHsKLSAgICAgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVEaXNhYmxlOgotICAgICAgICAgICAgcmNfbW9kZSA9IFNXVkVOQ19SQ19NT0RFX05PTkU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZVNraXBGcmFtZXM6Ci0gICAgICAgICAgICByY19tb2RlID0gU1dWRU5DX1JDX01PREVfVkJSX1ZGUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlOgotICAgICAgICAgICAgcmNfbW9kZSA9IFNXVkVOQ19SQ19NT0RFX1ZCUl9DRlI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVDb25zdGFudFNraXBGcmFtZXM6Ci0gICAgICAgICAgICByY19tb2RlID0gU1dWRU5DX1JDX01PREVfQ0JSX1ZGUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50OgotICAgICAgICAgICAgcmNfbW9kZSA9IFNXVkVOQ19SQ19NT0RFX0NCUl9DRlI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVU5LTk9XTiBSQyBNT0RFIik7Ci0gICAgICAgICAgICBSZXQgPSBTV1ZFTkNfU19GQUlMVVJFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKFNXVkVOQ19TX1NVQ0NFU1MgPT0gUmV0KQotICAgIHsKLSAgICAgICAgUHJvcC5pZCA9IFNXVkVOQ19QUk9QRVJUWV9JRF9SQ19NT0RFOwotICAgICAgICBQcm9wLmluZm8ucmNfbW9kZSA9IHJjX21vZGU7Ci0gICAgICAgIFJldCA9IHN3dmVuY19zZXRwcm9wZXJ0eShtX2hTd1ZlbmMsICZQcm9wKTsKLSAgICAgICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldHByb3BlcnR5IGZhaWxlZCAoJWQpIiwKLSAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICAgICAgIFJFVFVSTihTV1ZFTkNfU19GQUlMVVJFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFJFVFVSTihSZXQpOwotfQotCi1TV1ZFTkNfU1RBVFVTIG9teF92ZW5jOjpzd3ZlbmNfc2V0X3Byb2ZpbGVfbGV2ZWwKLSgKLSAgICBPTVhfVTMyIGVQcm9maWxlLAotICAgIE9NWF9VMzIgZUxldmVsCi0pCi17Ci0gICAgRU5URVJfRlVOQygpOwotCi0gICAgU1dWRU5DX1NUQVRVUyBSZXQgPSBTV1ZFTkNfU19TVUNDRVNTOwotICAgIFNXVkVOQ19QUk9QRVJUWSBQcm9wOwotICAgIFNXVkVOQ19QUk9GSUxFIFByb2ZpbGU7Ci0gICAgU1dWRU5DX0xFVkVMIExldmVsOwotCi0gICAgLyogc2V0IHRoZSBwcm9maWxlICovCi0gICAgaWYgKFNXVkVOQ19DT0RFQ19NUEVHNCA9PSBtX2NvZGVjKQotICAgIHsKLSAgICAgICBzd2l0Y2ggKGVQcm9maWxlKQotICAgICAgIHsKLSAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGU6Ci0gICAgICAgICAgICAgUHJvZmlsZS5tcGVnNCA9IFNXVkVOQ19QUk9GSUxFX01QRUc0X1NJTVBMRTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZToKLSAgICAgICAgICAgICBQcm9maWxlLm1wZWc0ID0gU1dWRU5DX1BST0ZJTEVfTVBFRzRfQURWQU5DRURfU0lNUExFOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBVTktOT1dOIFBST0ZJTEUiKTsKLSAgICAgICAgICAgICBSZXQgPSBTV1ZFTkNfU19GQUlMVVJFOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICAgICBzd2l0Y2ggKGVMZXZlbCkKLSAgICAgICB7Ci0gICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDA6Ci0gICAgICAgICAgICAgTGV2ZWwubXBlZzQgPSBTV1ZFTkNfTEVWRUxfTVBFRzRfMDsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMGI6Ci0gICAgICAgICAgICAgTGV2ZWwubXBlZzQgPSBTV1ZFTkNfTEVWRUxfTVBFRzRfMEI7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDE6Ci0gICAgICAgICAgICAgTGV2ZWwubXBlZzQgPSBTV1ZFTkNfTEVWRUxfTVBFRzRfMTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMjoKLSAgICAgICAgICAgICBMZXZlbC5tcGVnNCA9IFNXVkVOQ19MRVZFTF9NUEVHNF8yOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwzOgotICAgICAgICAgICAgIExldmVsLm1wZWc0ID0gU1dWRU5DX0xFVkVMX01QRUc0XzM7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDQ6Ci0gICAgICAgICAgICAgTGV2ZWwubXBlZzQgPSBTV1ZFTkNfTEVWRUxfTVBFRzRfNDsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsNGE6Ci0gICAgICAgICAgICAgTGV2ZWwubXBlZzQgPSBTV1ZFTkNfTEVWRUxfTVBFRzRfNEE7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDU6Ci0gICAgICAgICAgICAgTGV2ZWwubXBlZzQgPSBTV1ZFTkNfTEVWRUxfTVBFRzRfNTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVU5LTk9XTiBMRVZFTCIpOwotICAgICAgICAgICAgIFJldCA9IFNXVkVOQ19TX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChTV1ZFTkNfQ09ERUNfSDI2MyA9PSBtX2NvZGVjKQotICAgIHsKLSAgICAgICBzd2l0Y2ggKGVQcm9maWxlKQotICAgICAgIHsKLSAgICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lOgotICAgICAgICAgICAgIFByb2ZpbGUuaDI2MyA9IFNXVkVOQ19QUk9GSUxFX0gyNjNfQkFTRUxJTkU7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFVOS05PV04gUFJPRklMRSIpOwotICAgICAgICAgICAgIFJldCA9IFNXVkVOQ19TX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgICAgIHN3aXRjaCAoZUxldmVsKQotICAgICAgIHsKLSAgICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzTGV2ZWwxMDoKLSAgICAgICAgICAgICBMZXZlbC5oMjYzID0gU1dWRU5DX0xFVkVMX0gyNjNfMTA7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsMjA6Ci0gICAgICAgICAgICAgTGV2ZWwuaDI2MyA9IFNXVkVOQ19MRVZFTF9IMjYzXzIwOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNMZXZlbDMwOgotICAgICAgICAgICAgIExldmVsLmgyNjMgPSBTV1ZFTkNfTEVWRUxfSDI2M18zMDsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzTGV2ZWw0MDoKLSAgICAgICAgICAgICBMZXZlbC5oMjYzID0gU1dWRU5DX0xFVkVMX0gyNjNfNDA7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsNTA6Ci0gICAgICAgICAgICAgTGV2ZWwuaDI2MyA9IFNXVkVOQ19MRVZFTF9IMjYzXzUwOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNMZXZlbDYwOgotICAgICAgICAgICAgIExldmVsLmgyNjMgPSBTV1ZFTkNfTEVWRUxfSDI2M182MDsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzTGV2ZWw3MDoKLSAgICAgICAgICAgICBMZXZlbC5oMjYzID0gU1dWRU5DX0xFVkVMX0gyNjNfNzA7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFVOS05PV04gTEVWRUwiKTsKLSAgICAgICAgICAgICBSZXQgPSBTV1ZFTkNfU19GQUlMVVJFOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVU5TVVBQT1JURUQgQ09ERUMiKTsKLSAgICAgIFJldCA9IFNXVkVOQ19TX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgaWYgKFNXVkVOQ19TX1NVQ0NFU1MgPT0gUmV0KQotICAgIHsKLSAgICAgICBQcm9wLmlkID0gU1dWRU5DX1BST1BFUlRZX0lEX1BST0ZJTEU7Ci0gICAgICAgUHJvcC5pbmZvLnByb2ZpbGUgPSBQcm9maWxlOwotCi0gICAgICAgLyogc2V0IHRoZSBwcm9maWxlICovCi0gICAgICAgUmV0ID0gc3d2ZW5jX3NldHByb3BlcnR5KG1faFN3VmVuYywgJlByb3ApOwotICAgICAgIGlmIChSZXQgIT0gU1dWRU5DX1NfU1VDQ0VTUykKLSAgICAgICB7Ci0gICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfc2V0cHJvcGVydHkgZmFpbGVkICglZCkiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBSZXQpOwotICAgICAgICAgIFJFVFVSTihTV1ZFTkNfU19GQUlMVVJFKTsKLSAgICAgICB9Ci0KLSAgICAgICAvKiBzZXQgdGhlIGxldmVsICovCi0gICAgICAgUHJvcC5pZCA9IFNXVkVOQ19QUk9QRVJUWV9JRF9MRVZFTDsKLSAgICAgICBQcm9wLmluZm8ubGV2ZWwgPSBMZXZlbDsKLQotICAgICAgIFJldCA9IHN3dmVuY19zZXRwcm9wZXJ0eShtX2hTd1ZlbmMsICZQcm9wKTsKLSAgICAgICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICAgICAgewotICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcywgc3d2ZW5jX3NldHByb3BlcnR5IGZhaWxlZCAoJWQpIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgICAgICBSRVRVUk4oU1dWRU5DX1NfRkFJTFVSRSk7Ci0gICAgICAgfQotICAgIH0KLQotICAgIFJFVFVSTihSZXQpOwotfQotCi1TV1ZFTkNfU1RBVFVTIG9teF92ZW5jOjpzd3ZlbmNfc2V0X2ludHJhX3JlZnJlc2gKLSgKLSAgICBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSAqSW50cmFSZWZyZXNoCi0pCi17Ci0gICBFTlRFUl9GVU5DKCk7Ci0KLSAgIFNXVkVOQ19TVEFUVVMgUmV0ID0gU1dWRU5DX1NfU1VDQ0VTUzsKLSAgIFNXVkVOQ19JUl9DT05GSUcgaXJfY29uZmlnOwotICAgU1dWRU5DX1BST1BFUlRZIFByb3A7Ci0KLSAgIHN3aXRjaCAoSW50cmFSZWZyZXNoLT5lUmVmcmVzaE1vZGUpCi0gICB7Ci0gICAgICBjYXNlIE9NWF9WSURFT19JbnRyYVJlZnJlc2hDeWNsaWM6Ci0gICAgICAgIFByb3AuaW5mby5pcl9jb25maWcubW9kZSA9IFNXVkVOQ19JUl9NT0RFX0NZQ0xJQzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9NWF9WSURFT19JbnRyYVJlZnJlc2hBZGFwdGl2ZToKLSAgICAgICAgIFByb3AuaW5mby5pcl9jb25maWcubW9kZSA9IFNXVkVOQ19JUl9NT0RFX0FEQVBUSVZFOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgT01YX1ZJREVPX0ludHJhUmVmcmVzaEJvdGg6Ci0gICAgICAgICBQcm9wLmluZm8uaXJfY29uZmlnLm1vZGUgPSBTV1ZFTkNfSVJfTU9ERV9DWUNMSUNfQURBUFRJVkU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBPTVhfVklERU9fSW50cmFSZWZyZXNoUmFuZG9tOgotICAgICAgICAgUHJvcC5pbmZvLmlyX2NvbmZpZy5tb2RlID0gU1dWRU5DX0lSX01PREVfUkFORE9NOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFVOS05PV04gSU5UUkEgUkVGUkVTSCBNT0RFIik7Ci0gICAgICAgICBSZXQgPSBTV1ZFTkNfU19GQUlMVVJFOwotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIGlmIChTV1ZFTkNfU19TVUNDRVNTID09IFJldCkKLSAgIHsKLSAgICAgICBQcm9wLmlkID0gU1dWRU5DX1BST1BFUlRZX0lEX0lSX0NPTkZJRzsKLSAgICAgICBQcm9wLmluZm8uaXJfY29uZmlnLmNpcl9tYnMgPSBJbnRyYVJlZnJlc2gtPm5DaXJNQnM7Ci0KLSAgICAgICBSZXQgPSBzd3ZlbmNfc2V0cHJvcGVydHkobV9oU3dWZW5jLCAmUHJvcCk7Ci0gICAgICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgICAgIHsKLSAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19zZXRwcm9wZXJ0eSBmYWlsZWQgKCVkKSIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICAgICAgUmV0ID0gU1dWRU5DX1NfRkFJTFVSRTsKLSAgICAgICB9Ci0gICB9Ci0KLSAgIFJFVFVSTihSZXQpOwotfQotCi1TV1ZFTkNfU1RBVFVTIG9teF92ZW5jOjpzd3ZlbmNfc2V0X2ZyYW1lX3JhdGUKLSgKLSAgICBPTVhfVTMyIG5GcmFtZVJhdGUKLSkKLXsKLSAgIEVOVEVSX0ZVTkMoKTsKLQotICAgU1dWRU5DX1NUQVRVUyBSZXQgPSBTV1ZFTkNfU19TVUNDRVNTOwotICAgU1dWRU5DX1BST1BFUlRZIFByb3A7Ci0KLSAgIFByb3AuaWQgPSBTV1ZFTkNfUFJPUEVSVFlfSURfRlJBTUVfUkFURTsKLSAgIFByb3AuaW5mby5mcmFtZV9yYXRlID0gbkZyYW1lUmF0ZTsKLQotICAgUmV0ID0gc3d2ZW5jX3NldHByb3BlcnR5KG1faFN3VmVuYywgJlByb3ApOwotICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgewotICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfc2V0cHJvcGVydHkgZmFpbGVkICglZCkiLAotICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICBSZXQgPSBTV1ZFTkNfU19GQUlMVVJFOwotICAgfQotCi0gICBSRVRVUk4oUmV0KTsKLX0KLQotU1dWRU5DX1NUQVRVUyBvbXhfdmVuYzo6c3d2ZW5jX3NldF9iaXRfcmF0ZQotKAotICAgIE9NWF9VMzIgblRhcmdldEJpdHJhdGUKLSkKLXsKLSAgIEVOVEVSX0ZVTkMoKTsKLQotICAgU1dWRU5DX1NUQVRVUyBSZXQgPSBTV1ZFTkNfU19TVUNDRVNTOwotICAgU1dWRU5DX1BST1BFUlRZIFByb3A7Ci0KLSAgIFByb3AuaWQgPSBTV1ZFTkNfUFJPUEVSVFlfSURfVEFSR0VUX0JJVFJBVEU7Ci0gICBQcm9wLmluZm8udGFyZ2V0X2JpdHJhdGUgPSBuVGFyZ2V0Qml0cmF0ZTsKLQotICAgUmV0ID0gc3d2ZW5jX3NldHByb3BlcnR5KG1faFN3VmVuYywgJlByb3ApOwotICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgewotICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfc2V0cHJvcGVydHkgZmFpbGVkICglZCkiLAotICAgICAgICBfX0ZVTkNUSU9OX18sIFJldCk7Ci0gICAgICBSZXQgPSBTV1ZFTkNfU19GQUlMVVJFOwotICAgfQotCi0gICBSRVRVUk4oUmV0KTsKLX0KLQotU1dWRU5DX1NUQVRVUyBvbXhfdmVuYzo6c3d2ZW5jX3NldF9pbnRyYV9wZXJpb2QKLSgKLSAgICBPTVhfVTMyIG5QRnJhbWUsCi0gICAgT01YX1UzMiBuQkZyYW1lCi0pCi17Ci0gICBFTlRFUl9GVU5DKCk7Ci0KLSAgIFNXVkVOQ19TVEFUVVMgUmV0ID0gU1dWRU5DX1NfU1VDQ0VTUzsKLSAgIFNXVkVOQ19QUk9QRVJUWSBQcm9wOwotCi0gICBQcm9wLmlkID0gU1dWRU5DX1BST1BFUlRZX0lEX0lOVFJBX1BFUklPRDsKLSAgIFByb3AuaW5mby5pbnRyYV9wZXJpb2QucGZyYW1lcyA9IG5QRnJhbWU7Ci0gICBQcm9wLmluZm8uaW50cmFfcGVyaW9kLmJmcmFtZXMgPSBuQkZyYW1lOwotCi0gICBSZXQgPSBzd3ZlbmNfc2V0cHJvcGVydHkobV9oU3dWZW5jLCAmUHJvcCk7Ci0gICBpZiAoUmV0ICE9IFNXVkVOQ19TX1NVQ0NFU1MpCi0gICB7Ci0gICAgICBERUJVR19QUklOVF9FUlJPUigiJXMsIHN3dmVuY19zZXRwcm9wZXJ0eSBmYWlsZWQgKCVkKSIsCi0gICAgICAgIF9fRlVOQ1RJT05fXywgUmV0KTsKLSAgICAgIFJldCA9IFNXVkVOQ19TX0ZBSUxVUkU7Ci0gICB9Ci0KLSAgIFJFVFVSTihSZXQpOwotfQotCi1ib29sIG9teF92ZW5jOjpzd3ZlbmNfY29sb3JfYWxpZ24oT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciwgT01YX1UzMiB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgaGVpZ2h0KQotewotICAgICBPTVhfVTMyIHlfc3RyaWRlID0gVkVOVVNfWV9TVFJJREUoQ09MT1JfRk1UX05WMTIsIHdpZHRoKSwKLSAgICAgICAgICAgIHlfc2NhbmxpbmVzID0gVkVOVVNfWV9TQ0FOTElORVMoQ09MT1JfRk1UX05WMTIsIGhlaWdodCksCi0gICAgICAgICAgICB1dl9zdHJpZGUgPSBWRU5VU19VVl9TVFJJREUoQ09MT1JfRk1UX05WMTIsIHdpZHRoKSwKLSAgICAgICAgICAgIHV2X3NjYW5saW5lcyA9IFZFTlVTX1VWX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMiwgaGVpZ2h0KSwKLSAgICAgICAgICAgIHNyY19jaHJvbWFfb2Zmc2V0ID0gd2lkdGggKiBoZWlnaHQ7Ci0KLSAgICBpZiAoYnVmZmVyLT5uQWxsb2NMZW4gPj0gVkVOVVNfQlVGRkVSX1NJWkUoQ09MT1JfRk1UX05WMTIsIHdpZHRoLCBoZWlnaHQpKSB7Ci0gICAgICAgIE9NWF9VOCogc3JjX2J1ZiA9IGJ1ZmZlci0+cEJ1ZmZlciwgKmRzdF9idWYgPSBidWZmZXItPnBCdWZmZXI7Ci0gICAgICAgIC8vRG8gY2hyb21hIGZpcnN0LCBzbyB0aGF0IHdlIGNhbiBjb252ZXJ0IGl0IGluLXBsYWNlCi0gICAgICAgIHNyY19idWYgKz0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgICAgIGRzdF9idWYgKz0geV9zdHJpZGUgKiB5X3NjYW5saW5lczsKLSAgICAgICAgZm9yIChpbnQgbGluZSA9IGhlaWdodCAvIDIgLSAxOyBsaW5lID49IDA7IC0tbGluZSkgewotICAgICAgICAgICAgbWVtbW92ZShkc3RfYnVmICsgbGluZSAqIHV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgc3JjX2J1ZiArIGxpbmUgKiB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgd2lkdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZHN0X2J1ZiA9IHNyY19idWYgPSBidWZmZXItPnBCdWZmZXI7Ci0gICAgICAgIC8vQ29weSB0aGUgWSBuZXh0Ci0gICAgICAgIGZvciAoaW50IGxpbmUgPSBoZWlnaHQgLSAxOyBsaW5lID4gMDsgLS1saW5lKSB7Ci0gICAgICAgICAgICBtZW1tb3ZlKGRzdF9idWYgKyBsaW5lICogeV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgIHNyY19idWYgKyBsaW5lICogd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gYWxpZ24gQ2hyb21hLiBmcm9tICV1IHRvICV1IDogXAotICAgICAgICAgICAgICAgIEluc3VmZmljaWVudCBidWZmZXJMZW49JXUgdi9zIFJlcXVpcmVkPSV1IiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSh3aWR0aCpoZWlnaHQpLCAodW5zaWduZWQgaW50KXNyY19jaHJvbWFfb2Zmc2V0LCAodW5zaWduZWQgaW50KWJ1ZmZlci0+bkFsbG9jTGVuLAotICAgICAgICAgICAgICAgIFZFTlVTX0JVRkZFUl9TSVpFKENPTE9SX0ZNVF9OVjEyLCB3aWR0aCwgaGVpZ2h0KSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotU1dWRU5DX1NUQVRVUyBvbXhfdmVuYzo6c3d2ZW5jX3NldF9jb2xvcl9mb3JtYXQKLSgKLSAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yX2Zvcm1hdAotKQotewotICAgIEVOVEVSX0ZVTkMoKTsKLSAgICBTV1ZFTkNfU1RBVFVTIFJldCA9IFNXVkVOQ19TX1NVQ0NFU1M7Ci0gICAgU1dWRU5DX0NPTE9SX0ZPUk1BVCBzd3ZlbmNfY29sb3JfZm9ybWF0OwotICAgIFNXVkVOQ19QUk9QRVJUWSBQcm9wOwotICAgIGlmICgoY29sb3JfZm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSB8fAotICAgICAgICAgKGNvbG9yX2Zvcm1hdCA9PSAoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKSBRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm0pKSkKLSAgICB7Ci0gICAgICAgIHN3dmVuY19jb2xvcl9mb3JtYXQgPSBTV1ZFTkNfQ09MT1JfRk9STUFUX05WMTI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbG9yX2Zvcm1hdCA9PSAoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKSBRT01YX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIpKQotICAgIHsKLSAgICAgICAgc3d2ZW5jX2NvbG9yX2Zvcm1hdCA9IFNXVkVOQ19DT0xPUl9GT1JNQVRfTlYyMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiBjb2xvcl9mb3JtYXQgJWQgaW52YWxpZCIsX19GVU5DVElPTl9fLGNvbG9yX2Zvcm1hdCk7Ci0gICAgICAgIFJFVFVSTihTV1ZFTkNfU19GQUlMVVJFKTsKLSAgICB9Ci0gICAgLyogc2V0IHRoZSBpbnB1dCBjb2xvciBmb3JtYXQgKi8KLSAgICBQcm9wLmlkID0gU1dWRU5DX1BST1BFUlRZX0lEX0NPTE9SX0ZPUk1BVDsKLSAgICBQcm9wLmluZm8uY29sb3JfZm9ybWF0ID0gc3d2ZW5jX2NvbG9yX2Zvcm1hdDsKLSAgICBSZXQgPSBzd3ZlbmNfc2V0cHJvcGVydHkobV9oU3dWZW5jLCAmUHJvcCk7Ci0gICAgaWYgKFJldCAhPSBTV1ZFTkNfU19TVUNDRVNTKQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzLCBzd3ZlbmNfc2V0cHJvcGVydHkgZmFpbGVkICglZCkiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBSZXQpOwotICAgICAgICBSZXQgPSBTV1ZFTkNfU19GQUlMVVJFOwotICAgIH0KLSAgICBSRVRVUk4oUmV0KTsKLX0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9zcmMvb214X3ZpZGVvX2Jhc2UuY3BwIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL3NyYy9vbXhfdmlkZW9fYmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YjBkMGEuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL3NyYy9vbXhfdmlkZW9fYmFzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OTk4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMC0yMDE3LCBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IKLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICAgICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci1PUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gcCBlIG4gTSBBIFggICB3IHIgYSBwIHAgZSByIHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyBwIGUgbiAgTSBBIFggICBDIG8gciBlCi0KLSovLyoqIEBmaWxlIG9teF92aWRlb19iYXNlLmNwcAotICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE9wZW5NQVggY29yZSAmIGNvbXBvbmVudC4KLQotKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgRmlsZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TIC8vZW5hYmxlcyB0aGUgZm9ybWF0IHNwZWNpZmllcnMgaW4gaW50dHlwZXMuaAotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAib214X3ZpZGVvX2Jhc2UuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaWZkZWYgX0FORFJPSURfSUNTXwotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+Ci0jaW5jbHVkZSA8Z3JhbGxvY19wcml2Lmg+Ci0jZW5kaWYKLSNpZmRlZiBfVVNFX0dMSUJfCi0jaW5jbHVkZSA8Z2xpYi5oPgotI2RlZmluZSBzdHJsY3B5IGdfc3RybGNweQotI2VuZGlmCi0jZGVmaW5lIEgyNjRfU1VQUE9SVEVEX1dJRFRIICg0ODApCi0jZGVmaW5lIEgyNjRfU1VQUE9SVEVEX0hFSUdIVCAoMzY4KQotCi0jZGVmaW5lIFZDMV9TUF9NUF9TVEFSVF9DT0RFICAgICAgICAweEM1MDAwMDAwCi0jZGVmaW5lIFZDMV9TUF9NUF9TVEFSVF9DT0RFX01BU0sgICAweEZGMDAwMDAwCi0jZGVmaW5lIFZDMV9BUF9TVEFSVF9DT0RFICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIFZDMV9BUF9TVEFSVF9DT0RFX01BU0sgICAgICAweEZGRkZGRjAwCi0jZGVmaW5lIFZDMV9TVFJVQ1RfQ19QUk9GSUxFX01BU0sgICAweEYwCi0jZGVmaW5lIFZDMV9TVFJVQ1RfQl9MRVZFTF9NQVNLICAgICAweEUwMDAwMDAwCi0jZGVmaW5lIFZDMV9TSU1QTEVfUFJPRklMRSAgICAgICAgICAwCi0jZGVmaW5lIFZDMV9NQUlOX1BST0ZJTEUgICAgICAgICAgICAxCi0jZGVmaW5lIFZDMV9BRFZBTkNFX1BST0ZJTEUgICAgICAgICAzCi0jZGVmaW5lIFZDMV9TSU1QTEVfUFJPRklMRV9MT1dfTEVWRUwgIDAKLSNkZWZpbmUgVkMxX1NJTVBMRV9QUk9GSUxFX01FRF9MRVZFTCAgMgotI2RlZmluZSBWQzFfU1RSVUNUX0NfTEVOICAgICAgICAgICAgNAotI2RlZmluZSBWQzFfU1RSVUNUX0NfUE9TICAgICAgICAgICAgOAotI2RlZmluZSBWQzFfU1RSVUNUX0FfUE9TICAgICAgICAgICAgMTIKLSNkZWZpbmUgVkMxX1NUUlVDVF9CX1BPUyAgICAgICAgICAgIDI0Ci0jZGVmaW5lIFZDMV9TRVFfTEFZRVJfU0laRSAgICAgICAgICAzNgotCi0jZGVmaW5lIFNaXzRLICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKLSNkZWZpbmUgU1pfMU0gICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwCi0jdW5kZWYgQUxJR04KLSNkZWZpbmUgQUxJR04oeCwgdG9fYWxpZ24pICgoKCh1bnNpZ25lZCBsb25nKSB4KSArICh0b19hbGlnbiAtIDEpKSAmIH4odG9fYWxpZ24gLSAxKSkKLQotI2lmbmRlZiBJT05fRkxBR19DUF9CSVRTVFJFQU0KLSNkZWZpbmUgSU9OX0ZMQUdfQ1BfQklUU1RSRUFNIDAKLSNlbmRpZgotCi0jaWZuZGVmIElPTl9GTEFHX0NQX1BJWEVMCi0jZGVmaW5lIElPTl9GTEFHX0NQX1BJWEVMIDAKLSNlbmRpZgotCi0jdW5kZWYgTUVNX0hFQVBfSUQKLQotI2lmZGVmIE1BU1RFUl9TSURFX0NQCi0KLSNkZWZpbmUgTUVNX0hFQVBfSUQgSU9OX1NFQ1VSRV9IRUFQX0lECi0jZGVmaW5lIFNFQ1VSRV9BTElHTiBTWl80SwotI2RlZmluZSBTRUNVUkVfRkxBR1NfSU5QVVRfQlVGRkVSIChJT05fU0VDVVJFIHwgSU9OX0ZMQUdfQ1BfUElYRUwpCi0jZGVmaW5lIFNFQ1VSRV9GTEFHU19PVVRQVVRfQlVGRkVSIChJT05fU0VDVVJFIHwgSU9OX0ZMQUdfQ1BfQklUU1RSRUFNKQotCi0jZWxzZSAvL1NMQVZFX1NJREVfQ1AKLQotI2RlZmluZSBNRU1fSEVBUF9JRCBJT05fQ1BfTU1fSEVBUF9JRAotI2RlZmluZSBTRUNVUkVfQUxJR04gU1pfMU0KLSNkZWZpbmUgU0VDVVJFX0ZMQUdTX0lOUFVUX0JVRkZFUiBJT05fU0VDVVJFCi0jZGVmaW5lIFNFQ1VSRV9GTEFHU19PVVRQVVRfQlVGRkVSIElPTl9TRUNVUkUKLQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IE9NWENvbXBvbmVudENhcGFiaWxpdHlGbGFnc1R5cGUgewotICAgIC8vLy8vLy8vLy8vLy8vLy8vLyBPTVggQ09NUE9ORU5UIENBUEFCSUxJVFkgUkVMQVRFRCBNRU1CRVJTCi0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX0JPT0wgaUlzT01YQ29tcG9uZW50TXVsdGlUaHJlYWRlZDsKLSAgICBPTVhfQk9PTCBpT01YQ29tcG9uZW50U3VwcG9ydHNFeHRlcm5hbE91dHB1dEJ1ZmZlckFsbG9jOwotICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRTdXBwb3J0c0V4dGVybmFsSW5wdXRCdWZmZXJBbGxvYzsKLSAgICBPTVhfQk9PTCBpT01YQ29tcG9uZW50U3VwcG9ydHNNb3ZhYmxlSW5wdXRCdWZmZXJzOwotICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRTdXBwb3J0c1BhcnRpYWxGcmFtZXM7Ci0gICAgT01YX0JPT0wgaU9NWENvbXBvbmVudFVzZXNOQUxTdGFydENvZGVzOwotICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRDYW5IYW5kbGVJbmNvbXBsZXRlRnJhbWVzOwotICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRVc2VzRnVsbEFWQ0ZyYW1lczsKLQotfSBPTVhDb21wb25lbnRDYXBhYmlsaXR5RmxhZ3NUeXBlOwotI2RlZmluZSBPTVhfQ09NUE9ORU5UX0NBUEFCSUxJVFlfVFlQRV9JTkRFWCAweEZGN0EzNDcKLQotdm9pZCogbWVzc2FnZV90aHJlYWRfZW5jKHZvaWQgKmlucHV0KQotewotICAgIG9teF92aWRlbyogb214ID0gcmVpbnRlcnByZXRfY2FzdDxvbXhfdmlkZW8qPihpbnB1dCk7Ci0gICAgaW50IHJldDsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goIm9teF92ZW5jOiBtZXNzYWdlIHRocmVhZCBzdGFydCIpOwotICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiVmlkZW9FbmNNc2dUaHJlYWQiLCAwLCAwLCAwKTsKLSAgICB3aGlsZSAoIW9teC0+bXNnX3RocmVhZF9zdG9wKSB7Ci0gICAgICAgIHJldCA9IG9teC0+c2lnbmFsLndhaXQoMiAqIDEwMDAwMDAwMDApOwotICAgICAgICBpZiAocmV0ID09IEVUSU1FRE9VVCB8fCBvbXgtPm1zZ190aHJlYWRfc3RvcCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocmV0KSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigib214X3ZlbmM6IG1lc3NhZ2VfdGhyZWFkX2VuYyB3YWl0IG9uIGNvbmRpdGlvbiBmYWlsZWQsIGV4aXRpbmciKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG9teC0+cHJvY2Vzc19ldmVudF9jYihvbXgpOwotICAgIH0KLSAgICBERUJVR19QUklOVF9ISUdIKCJvbXhfdmVuYzogbWVzc2FnZSB0aHJlYWQgc3RvcCIpOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIHBvc3RfbWVzc2FnZShvbXhfdmlkZW8gKm9teCwgdW5zaWduZWQgY2hhciBpZCkKLXsKLSAgICBERUJVR19QUklOVF9MT1coIm9teF92ZW5jOiBwb3N0X21lc3NhZ2UgJWQiLCBpZCk7Ci0gICAgb214LT5zaWduYWwuc2lnbmFsKCk7Ci19Ci0KLS8vIG9teF9jbWRfcXVldWUgZGVzdHJ1Y3Rvcgotb214X3ZpZGVvOjpvbXhfY21kX3F1ZXVlOjp+b214X2NtZF9xdWV1ZSgpCi17Ci0gICAgLy8gTm90aGluZyB0byBkbwotfQotCi0vLyBvbXggY21kIHF1ZXVlIGNvbnN0cnVjdG9yCi1vbXhfdmlkZW86Om9teF9jbWRfcXVldWU6Om9teF9jbWRfcXVldWUoKTogbV9yZWFkKDApLG1fd3JpdGUoMCksbV9zaXplKDApCi17Ci0gICAgbWVtc2V0KG1fcSwwLHNpemVvZihvbXhfZXZlbnQpKk9NWF9DT1JFX0NPTlRST0xfQ01EUV9TSVpFKTsKLX0KLQotLy8gb214IGNtZCBxdWV1ZSBpbnNlcnQKLWJvb2wgb214X3ZpZGVvOjpvbXhfY21kX3F1ZXVlOjppbnNlcnRfZW50cnkodW5zaWduZWQgbG9uZyBwMSwgdW5zaWduZWQgbG9uZyBwMiwgdW5zaWduZWQgbG9uZyBpZCkKLXsKLSAgICBib29sIHJldCA9IHRydWU7Ci0gICAgaWYgKG1fc2l6ZSA8IE9NWF9DT1JFX0NPTlRST0xfQ01EUV9TSVpFKSB7Ci0gICAgICAgIG1fcVttX3dyaXRlXS5pZCAgICAgICA9IGlkOwotICAgICAgICBtX3FbbV93cml0ZV0ucGFyYW0xICAgPSBwMTsKLSAgICAgICAgbV9xW21fd3JpdGVdLnBhcmFtMiAgID0gcDI7Ci0gICAgICAgIG1fd3JpdGUrKzsKLSAgICAgICAgbV9zaXplICsrOwotICAgICAgICBpZiAobV93cml0ZSA+PSBPTVhfQ09SRV9DT05UUk9MX0NNRFFfU0laRSkgewotICAgICAgICAgICAgbV93cml0ZSA9IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SISEhIENvbW1hbmQgUXVldWUgRnVsbCIpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vLyBvbXggY21kIHF1ZXVlIHBvcAotYm9vbCBvbXhfdmlkZW86Om9teF9jbWRfcXVldWU6OnBvcF9lbnRyeSh1bnNpZ25lZCBsb25nICpwMSwgdW5zaWduZWQgbG9uZyAqcDIsIHVuc2lnbmVkIGxvbmcgKmlkKQotewotICAgIGJvb2wgcmV0ID0gdHJ1ZTsKLSAgICBpZiAobV9zaXplID4gMCkgewotICAgICAgICAqaWQgPSBtX3FbbV9yZWFkXS5pZDsKLSAgICAgICAgKnAxID0gbV9xW21fcmVhZF0ucGFyYW0xOwotICAgICAgICAqcDIgPSBtX3FbbV9yZWFkXS5wYXJhbTI7Ci0gICAgICAgIC8vIE1vdmUgdGhlIHJlYWQgcG9pbnRlciBhaGVhZAotICAgICAgICArK21fcmVhZDsKLSAgICAgICAgLS1tX3NpemU7Ci0gICAgICAgIGlmIChtX3JlYWQgPj0gT01YX0NPUkVfQ09OVFJPTF9DTURRX1NJWkUpIHsKLSAgICAgICAgICAgIG1fcmVhZCA9IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLy8gUmV0cmlldmUgdGhlIGZpcnN0IG1lc2cgdHlwZSBpbiB0aGUgcXVldWUKLXVuc2lnbmVkIG9teF92aWRlbzo6b214X2NtZF9xdWV1ZTo6Z2V0X3FfbXNnX3R5cGUoKQotewotICAgIHJldHVybiBtX3FbbV9yZWFkXS5pZDsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZlbmM6Om9teF92ZW5jCi0KLSAgIERFU0NSSVBUSU9OCi0gICBDb25zdHJ1Y3RvcgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgTm9uZS4KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1vbXhfdmlkZW86Om9teF92aWRlbygpOgotICAgIGMyZF9vcGVuZWQoZmFsc2UpLAotICAgIHBzb3VyY2VfZnJhbWUoTlVMTCksCi0gICAgcGRlc3RfZnJhbWUoTlVMTCksCi0gICAgc2VjdXJlX3Nlc3Npb24oZmFsc2UpLAotICAgIG1FbXB0eUVvc0J1ZmZlcihOVUxMKSwKLSAgICBtX3BJbnB1dF9wbWVtKE5VTEwpLAotICAgIG1fcE91dHB1dF9wbWVtKE5VTEwpLAotI2lmZGVmIFVTRV9JT04KLSAgICBtX3BJbnB1dF9pb24oTlVMTCksCi0gICAgbV9wT3V0cHV0X2lvbihOVUxMKSwKLSNlbmRpZgotICAgIG1fZXJyb3JfcHJvcG9nYXRlZChmYWxzZSksCi0gICAgbV9zdGF0ZShPTVhfU3RhdGVJbnZhbGlkKSwKLSAgICBtX2FwcF9kYXRhKE5VTEwpLAotICAgIG1fdXNlX2lucHV0X3BtZW0oT01YX0ZBTFNFKSwKLSAgICBtX3VzZV9vdXRwdXRfcG1lbShPTVhfRkFMU0UpLAotICAgIG1fc0V4dHJhRGF0YSgwKSwKLSAgICBtX2lucHV0X21zZ19pZChPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQiksCi0gICAgbV9pbnBfbWVtX3B0cihOVUxMKSwKLSAgICBtX291dF9tZW1fcHRyKE5VTEwpLAotICAgIGlucHV0X2ZsdXNoX3Byb2dyZXNzIChmYWxzZSksCi0gICAgb3V0cHV0X2ZsdXNoX3Byb2dyZXNzIChmYWxzZSksCi0gICAgaW5wdXRfdXNlX2J1ZmZlciAoZmFsc2UpLAotICAgIG91dHB1dF91c2VfYnVmZmVyIChmYWxzZSksCi0gICAgcGVuZGluZ19pbnB1dF9idWZmZXJzKDApLAotICAgIHBlbmRpbmdfb3V0cHV0X2J1ZmZlcnMoMCksCi0gICAgbV9vdXRfYm1fY291bnQoMCksCi0gICAgbV9pbnBfYm1fY291bnQoMCksCi0gICAgbV9mbGFncygwKSwKLSAgICBtX2V0Yl9jb3VudCgwKSwKLSAgICBtX2ZiZF9jb3VudCgwKSwKLSAgICBtX2V2ZW50X3BvcnRfc2V0dGluZ3Nfc2VudChmYWxzZSksCi0gICAgaHdfb3ZlcmxvYWQoZmFsc2UpLAotICAgIG1fZ3JhcGhpY2J1ZmZlcl9zaXplKDApCi17Ci0gICAgREVCVUdfUFJJTlRfSElHSCgib214X3ZpZGVvKCk6IEluc2lkZSBDb25zdHJ1Y3RvcigpIik7Ci0gICAgbWVtc2V0KCZtX2NtcCwwLHNpemVvZihtX2NtcCkpOwotICAgIG1lbXNldCgmbV9wQ2FsbGJhY2tzLDAsc2l6ZW9mKG1fcENhbGxiYWNrcykpOwotICAgIGFzeW5jX3RocmVhZF9jcmVhdGVkID0gZmFsc2U7Ci0gICAgbXNnX3RocmVhZF9jcmVhdGVkID0gZmFsc2U7Ci0gICAgbXNnX3RocmVhZF9zdG9wID0gZmFsc2U7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fYmx1ckluZm8sIE9NWF9RVElfVklERU9fQ09ORklHX0JMVVJJTkZPKTsKLSAgICBtX2JsdXJJbmZvLm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpUE9SVF9JTkRFWF9JTjsKLQotICAgIG1Vc2VzQ29sb3JDb252ZXJzaW9uID0gZmFsc2U7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZtX2xvY2ssIE5VTEwpOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmdGltZXN0YW1wLm1fbG9jaywgTlVMTCk7Ci0gICAgdGltZXN0YW1wLmlzX2J1ZmZlcl9wZW5kaW5nID0gZmFsc2U7Ci0gICAgc2VtX2luaXQoJm1fY21kX2xvY2ssMCwwKTsKLSAgICBERUJVR19QUklOVF9MT1coIm1ldGFfYnVmZmVyX2hkciA9ICVwIiwgbWV0YV9idWZmZXJfaGRyKTsKLQotICAgIG1lbXNldChtX3BsYXRmb3JtLCAwLCBzaXplb2YobV9wbGF0Zm9ybSkpOwotI2lmZGVmIF9BTkRST0lEXwotICAgIGNoYXIgcGxhdGZvcm1fbmFtZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gezB9OwotICAgIHByb3BlcnR5X2dldCgicm8uYm9hcmQucGxhdGZvcm0iLCBwbGF0Zm9ybV9uYW1lLCAiMCIpOwotICAgIHN0cmxjcHkobV9wbGF0Zm9ybSwgcGxhdGZvcm1fbmFtZSwgc2l6ZW9mKG1fcGxhdGZvcm0pKTsKLSNlbmRpZgotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmVuYzo6fm9teF92ZW5jCi0KLSAgIERFU0NSSVBUSU9OCi0gICBEZXN0cnVjdG9yCi0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUKLQotICAgUkVUVVJOIFZBTFVFCi0gICBOb25lLgotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLW9teF92aWRlbzo6fm9teF92aWRlbygpCi17Ci0gICAgREVCVUdfUFJJTlRfSElHSCgifm9teF92aWRlbygpOiBJbnNpZGUgRGVzdHJ1Y3RvcigpIik7Ci0gICAgaWYgKG1zZ190aHJlYWRfY3JlYXRlZCkgewotICAgICAgICBtc2dfdGhyZWFkX3N0b3AgPSB0cnVlOwotICAgICAgICBwb3N0X21lc3NhZ2UodGhpcywgT01YX0NPTVBPTkVOVF9DTE9TRV9NU0cpOwotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJvbXhfdmlkZW86IFdhaXRpbmcgb24gTXNnIFRocmVhZCBleGl0Iik7Ci0gICAgICAgIHB0aHJlYWRfam9pbihtc2dfdGhyZWFkX2lkLE5VTEwpOwotICAgIH0KLSAgICBERUJVR19QUklOVF9ISUdIKCJvbXhfdmlkZW86IFdhaXRpbmcgb24gQXN5bmMgVGhyZWFkIGV4aXQiKTsKLSAgICAvKkZvciBWNEwyIGJhc2VkIGRyaXZlcnMsIHB0aHJlYWRfam9pbiBpcyBkb25lIGluIGRldmljZV9jbG9zZQotICAgICAqIHNvIG5vIG5lZWQgdG8gZG8gaXQgaGVyZSovCi0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtX2xvY2spOwotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdGltZXN0YW1wLm1fbG9jayk7Ci0gICAgc2VtX2Rlc3Ryb3koJm1fY21kX2xvY2spOwotICAgIERFQlVHX1BSSU5UX0hJR0goIm1fZXRiX2NvdW50ID0gJSIgUFJJdTY0ICIsIG1fZmJkX2NvdW50ID0gJSIgUFJJdTY0LCBtX2V0Yl9jb3VudCwKLSAgICAgICAgICAgIG1fZmJkX2NvdW50KTsKLSAgICBERUJVR19QUklOVF9ISUdIKCJvbXhfdmlkZW86IERlc3RydWN0b3IgZXhpdCIpOwotICAgIERFQlVHX1BSSU5UX0hJR0goIkV4aXRpbmcgT01YIFZpZGVvIEVuY29kZXIgLi4uIik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmVuYzo6T01YQ250cmxQcm9jZXNzTXNnQ2IKLQotICAgREVTQ1JJUFRJT04KLSAgIElMIENsaWVudCBjYWxsYmFja3MgYXJlIGdlbmVyYXRlZCB0aHJvdWdoIHRoaXMgcm91dGluZS4gVGhlIGRlY29kZXIKLSAgIHByb3ZpZGVzIHRoZSB0aHJlYWQgY29udGV4dCBmb3IgdGhpcyByb3V0aW5lLgotCi0gICBQQVJBTUVURVJTCi0gICBjdHh0IC0tIENvbnRleHQgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgc2VsZi4KLSAgIGlkICAgLS0gRXZlbnQgaWRlbnRpZmllci4gVGhpcyBjb3VsZCBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzoKLSAgIDEuIENvbW1hbmQgY29tcGxldGlvbiBldmVudAotICAgMi4gQnVmZmVyIGRvbmUgY2FsbGJhY2sgZXZlbnQKLSAgIDMuIEZyYW1lIGRvbmUgY2FsbGJhY2sgZXZlbnQKLQotICAgUkVUVVJOIFZBTFVFCi0gICBOb25lLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdm9pZCBvbXhfdmlkZW86OnByb2Nlc3NfZXZlbnRfY2Iodm9pZCAqY3R4dCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHAxOyAvLyBQYXJhbWV0ZXIgLSAxCi0gICAgdW5zaWduZWQgbG9uZyBwMjsgLy8gUGFyYW1ldGVyIC0gMgotICAgIHVuc2lnbmVkIGxvbmcgaWRlbnQ7Ci0gICAgdW5zaWduZWQgcXNpemU9MDsgLy8gcXNpemUKLSAgICBvbXhfdmlkZW8gKnBUaGlzID0gKG9teF92aWRlbyAqKSBjdHh0OwotCi0gICAgaWYgKCFwVGhpcykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6UHJvY2Vzc01zZ0NiOkNvbnRleHQgaXMgaW5jb3JyZWN0OyBiYWlsaW5nIG91dCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gUHJvdGVjdCB0aGUgc2hhcmVkIHF1ZXVlIGRhdGEgc3RydWN0dXJlCi0gICAgZG8gewotICAgICAgICAvKlJlYWQgdGhlIG1lc3NhZ2UgaWQncyBmcm9tIHRoZSBxdWV1ZSovCi0KLSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwVGhpcy0+bV9sb2NrKTsKLSAgICAgICAgcXNpemUgPSBwVGhpcy0+bV9jbWRfcS5tX3NpemU7Ci0gICAgICAgIGlmIChxc2l6ZSkgewotICAgICAgICAgICAgcFRoaXMtPm1fY21kX3EucG9wX2VudHJ5KCZwMSwmcDIsJmlkZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChxc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBxc2l6ZSA9IHBUaGlzLT5tX2Z0Yl9xLm1fc2l6ZTsKLSAgICAgICAgICAgIGlmIChxc2l6ZSkgewotICAgICAgICAgICAgICAgIHBUaGlzLT5tX2Z0Yl9xLnBvcF9lbnRyeSgmcDEsJnAyLCZpZGVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocXNpemUgPT0gMCkgewotICAgICAgICAgICAgcXNpemUgPSBwVGhpcy0+bV9ldGJfcS5tX3NpemU7Ci0gICAgICAgICAgICBpZiAocXNpemUpIHsKLSAgICAgICAgICAgICAgICBwVGhpcy0+bV9ldGJfcS5wb3BfZW50cnkoJnAxLCZwMiwmaWRlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBUaGlzLT5tX2xvY2spOwotCi0gICAgICAgIC8qcHJvY2VzcyBtZXNzYWdlIGlmIHdlIGhhdmUgb25lKi8KLSAgICAgICAgaWYgKHFzaXplID4gMCkgewotICAgICAgICAgICAgc3dpdGNoIChpZGVudCkgewotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5tX3BDYWxsYmFja3MuRXZlbnRIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPTVhfQ29tbWFuZFN0YXRlU2V0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9zdGF0ZSA9IChPTVhfU1RBVEVUWVBFKSBwMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJQcm9jZXNzIC0+IHN0YXRlIHNldCB0byAlZCIsIHBUaGlzLT5tX3N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fcENhbGxiYWNrcy5FdmVudEhhbmRsZXIoJnBUaGlzLT5tX2NtcCwgcFRoaXMtPm1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsIHAxLCBwMiwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPTVhfRXZlbnRFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBPTVhfRXZlbnRFcnJvcjogcDIgPSAlbHUiLCBwMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwMiA9PSAodW5zaWduZWQpT01YX0Vycm9ySGFyZHdhcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX3BDYWxsYmFja3MuRXZlbnRIYW5kbGVyKCZwVGhpcy0+bV9jbXAsIHBUaGlzLT5tX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JIYXJkd2FyZSwwLE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fcENhbGxiYWNrcy5FdmVudEhhbmRsZXIoJnBUaGlzLT5tX2NtcCwgcFRoaXMtPm1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEVycm9yLCBwMiwgMCwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RGlzYWJsZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJQcm9jZXNzIC0+IFBvcnQgJWx1IHNldCB0byBQT1JUX1NUQVRFX0RJU0FCTEVEIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRlIiwgcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9wQ2FsbGJhY2tzLkV2ZW50SGFuZGxlcigmcFRoaXMtPm1fY21wLCBwVGhpcy0+bV9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwgcDEsIHAyLCBOVUxMICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RW5hYmxlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlByb2Nlc3MgLT5Qb3J0ICVsdSBzZXQgUE9SVF9TVEFURV9FTkFCTEVEIHN0YXRlIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX3BDYWxsYmFja3MuRXZlbnRIYW5kbGVyKCZwVGhpcy0+bV9jbXAsIHBUaGlzLT5tX2FwcF9kYXRhLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwgcDEsIHAyLCBOVUxMICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJwcm9jZXNzX2V2ZW50X2NiIGZvcndhcmRpbmcgRXZlbnRDbWRDb21wbGV0ZSAlbHUiLCBwMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX3BDYWxsYmFja3MuRXZlbnRIYW5kbGVyKCZwVGhpcy0+bV9jbXAsIHBUaGlzLT5tX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudENtZENvbXBsZXRlLCBwMSwgcDIsIE5VTEwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogUHJvY2Vzc01zZ0NiIE5VTEwgY2FsbGJhY2tzIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQl9PUFE6Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVEJfT1BRIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwVGhpcy0+ZW1wdHlfdGhpc19idWZmZXJfb3BhcXVlKChPTVhfSEFORExFVFlQRSlwMSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKXAyKSAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEVUQlByb3h5KCkgZmFpbGVkISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm9teF9yZXBvcnRfZXJyb3IgKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQjogewotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0VSUk9SVFlQRSBpcmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXJldCA9IHBUaGlzLT5lbXB0eV90aGlzX2J1ZmZlcl9wcm94eSgoT01YX0hBTkRMRVRZUEUpcDEsIChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKXAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcmV0ID09IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJlbXB0eV90aGlzX2J1ZmZlcl9wcm94eSBmYWlsdXJlIGR1ZSB0byBIVyBvdmVybG9hZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vbXhfcmVwb3J0X2h3X292ZXJsb2FkICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpcmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZW1wdHlfdGhpc19idWZmZXJfcHJveHkgZmFpbHVyZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZUQjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBwVGhpcy0+ZmlsbF90aGlzX2J1ZmZlcl9wcm94eSgoT01YX0hBTkRMRVRZUEUpcDEsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMikgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBGVEJQcm94eSgpIGZhaWxlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0NPTU1BTkQ6Ci0gICAgICAgICAgICAgICAgICAgIHBUaGlzLT5zZW5kX2NvbW1hbmRfcHJveHkoJnBUaGlzLT5tX2NtcCwoT01YX0NPTU1BTkRUWVBFKXAxLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1UzMilwMiwoT01YX1BUUilOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRUJEOgotICAgICAgICAgICAgICAgICAgICBpZiAoIHBUaGlzLT5lbXB0eV9idWZmZXJfZG9uZSgmcFRoaXMtPm1fY21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMSkgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBlbXB0eV9idWZmZXJfZG9uZSgpIGZhaWxlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZCRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBwVGhpcy0+ZmlsbF9idWZmZXJfZG9uZSgmcFRoaXMtPm1fY21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMSkgIT0gT01YX0Vycm9yTm9uZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZmlsbF9idWZmZXJfZG9uZSgpIGZhaWxlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UX0lOUFVUX0ZMVVNIOgotCi0gICAgICAgICAgICAgICAgICAgIHBUaGlzLT5pbnB1dF9mbHVzaF9wcm9ncmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJtX2V0Yl9jb3VudCBhdCBpL3AgZmx1c2ggPSAlIiBQUkl1NjQsIG1fZXRiX2NvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgbV9ldGJfY291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAocFRoaXMtPm1fcENhbGxiYWNrcy5FdmVudEhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgd2UgbmVlZCBnZW5lcmF0ZSBldmVudCBmb3IgRmx1c2ggZG9uZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCZwVGhpcy0+bV9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfSU5QVVRfRkxVU0hfUEVORElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRNQVNLX0NMRUFSICgmcFRoaXMtPm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9JTlBVVF9GTFVTSF9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9wQ2FsbGJhY2tzLkV2ZW50SGFuZGxlcigmcFRoaXMtPm1fY21wLCBwVGhpcy0+bV9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudENtZENvbXBsZXRlLE9NWF9Db21tYW5kRmx1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1JUX0lOREVYX0lOLE5VTEwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQklUTUFTS19QUkVTRU5UKCZwVGhpcy0+bV9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfSURMRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcFRoaXMtPm91dHB1dF9mbHVzaF9wcm9ncmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImRldl9zdG9wIGNhbGxlZCBhZnRlciBpbnB1dCBmbHVzaCBjb21wbGV0ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV2X3N0b3AoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGRldl9zdG9wKCkgZmFpbGVkIGluIGkvcCBmbHVzaCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlRfT1VUUFVUX0ZMVVNIOgotCi0gICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vdXRwdXRfZmx1c2hfcHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgibV9mYmRfY291bnQgYXQgby9wIGZsdXNoID0gJSIgUFJJdTY0LCBtX2ZiZF9jb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIG1fZmJkX2NvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5tX3BDYWxsYmFja3MuRXZlbnRIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHdlIG5lZWQgZ2VuZXJhdGUgZXZlbnQgZm9yIEZsdXNoIGRvbmUqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmcFRoaXMtPm1fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX09VVFBVVF9GTFVTSF9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIgKCZwVGhpcy0+bV9mbGFncyxPTVhfQ09NUE9ORU5UX09VVFBVVF9GTFVTSF9QRU5ESU5HKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX3BDYWxsYmFja3MuRXZlbnRIYW5kbGVyKCZwVGhpcy0+bV9jbXAsIHBUaGlzLT5tX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsT01YX0NvbW1hbmRGbHVzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPUlRfSU5ERVhfT1VULE5VTEwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQklUTUFTS19QUkVTRU5UKCZwVGhpcy0+bV9mbGFncyAsT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJkZXZfc3RvcCBjYWxsZWQgYWZ0ZXIgT3V0cHV0IGZsdXNoIGNvbXBsZXRlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwVGhpcy0+aW5wdXRfZmx1c2hfcHJvZ3Jlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldl9zdG9wKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBkZXZfc3RvcCgpIGZhaWxlZCBpbiBvL3AgZmx1c2ghIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9lcnJvciAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9TVEFSVF9ET05FOgotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWF9DT01QT05FTlRfR0VORVJBVEVfU1RBUlRfRE9ORSBtc2ciKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocFRoaXMtPm1fcENhbGxiYWNrcy5FdmVudEhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiT01YX0NPTVBPTkVOVF9HRU5FUkFURV9TVEFSVF9ET05FIFN1Y2Nlc3MiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCSVRNQVNLX1BSRVNFTlQoJnBUaGlzLT5tX2ZsYWdzLE9NWF9DT01QT05FTlRfRVhFQ1VURV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiT01YX0NPTVBPTkVOVF9HRU5FUkFURV9TVEFSVF9ET05FIE1vdmUgdG8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgY2FsbGJhY2sgbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUigoJnBUaGlzLT5tX2ZsYWdzKSxPTVhfQ09NUE9ORU5UX0VYRUNVVEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fc3RhdGUgPSBPTVhfU3RhdGVFeGVjdXRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fcENhbGxiYWNrcy5FdmVudEhhbmRsZXIoJnBUaGlzLT5tX2NtcCwgcFRoaXMtPm1fYXBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSxPTVhfQ29tbWFuZFN0YXRlU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0YXRlRXhlY3V0aW5nLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQklUTUFTS19QUkVTRU5UKCZwVGhpcy0+bV9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfUEFVU0VfUEVORElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV2X3BhdXNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBkZXZfcGF1c2UoKSBmYWlsZWQgaW4gU3RhcnQgRG9uZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm9teF9yZXBvcnRfZXJyb3IgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCSVRNQVNLX1BSRVNFTlQoJnBUaGlzLT5tX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9MT0FERURfU1RBUlRfUEVORElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV2X2xvYWRlZF9zdGFydF9kb25lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzdWNjZXNzZnVsIGxvYWRlZCBTdGFydCBEb25lISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZmFpbGVkIGluIGxvYWRlZCBTdGFydCBEb25lISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9lcnJvciAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUigoJnBUaGlzLT5tX2ZsYWdzKSxPTVhfQ09NUE9ORU5UX0xPQURFRF9TVEFSVF9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJFUlJPUjogdW5rbm93biBmbGFncz0lIiBQUkl4NjQsIHBUaGlzLT5tX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRXZlbnQgSGFuZGxlciBjYWxsYmFjayBpcyBOVUxMIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT01QT05FTlRfR0VORVJBVEVfUEFVU0VfRE9ORToKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1BBVVNFX0RPTkUgbXNnIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwVGhpcy0+bV9wQ2FsbGJhY2tzLkV2ZW50SGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmcFRoaXMtPm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9QQVVTRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2VuZCB0aGUgY2FsbGJhY2sgbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPmNvbXBsZXRlX3BlbmRpbmdfYnVmZmVyX2RvbmVfY2JzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJvbXhfdmlkZW86OnByb2Nlc3NfZXZlbnRfY2IoKSBTZW5kaW5nIFBBVVNFIGNvbXBsZXRlIGFmdGVyIGFsbCBwZW5kaW5nIEVCRC9GQkQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCgmcFRoaXMtPm1fZmxhZ3MpLE9NWF9DT01QT05FTlRfUEFVU0VfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fc3RhdGUgPSBPTVhfU3RhdGVQYXVzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9wQ2FsbGJhY2tzLkV2ZW50SGFuZGxlcigmcFRoaXMtPm1fY21wLCBwVGhpcy0+bV9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudENtZENvbXBsZXRlLE9NWF9Db21tYW5kU3RhdGVTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RhdGVQYXVzZSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9SRVNVTUVfRE9ORToKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1JFU1VNRV9ET05FIG1zZyIpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFRoaXMtPm1fcENhbGxiYWNrcy5FdmVudEhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCSVRNQVNLX1BSRVNFTlQoJnBUaGlzLT5tX2ZsYWdzLE9NWF9DT01QT05FTlRfRVhFQ1VURV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNhbGxiYWNrIG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoKCZwVGhpcy0+bV9mbGFncyksT01YX0NPTVBPTkVOVF9FWEVDVVRFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX3N0YXRlID0gT01YX1N0YXRlRXhlY3V0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX3BDYWxsYmFja3MuRXZlbnRIYW5kbGVyKCZwVGhpcy0+bV9jbXAsIHBUaGlzLT5tX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsT01YX0NvbW1hbmRTdGF0ZVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZUV4ZWN1dGluZyxOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1NUT1BfRE9ORToKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX1NUT1BfRE9ORSBtc2ciKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUaGlzLT5tX3BDYWxsYmFja3MuRXZlbnRIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+Y29tcGxldGVfcGVuZGluZ19idWZmZXJfZG9uZV9jYnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCSVRNQVNLX1BSRVNFTlQoJnBUaGlzLT5tX2ZsYWdzLE9NWF9DT01QT05FTlRfSURMRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNhbGxiYWNrIG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoKCZwVGhpcy0+bV9mbGFncyksT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX3N0YXRlID0gT01YX1N0YXRlSWRsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9wQ2FsbGJhY2tzLkV2ZW50SGFuZGxlcigmcFRoaXMtPm1fY21wLHBUaGlzLT5tX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsT01YX0NvbW1hbmRTdGF0ZVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZUlkbGUsTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJJVE1BU0tfUFJFU0VOVCgmcFRoaXMtPm1fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0xPQURFRF9TVE9QX1BFTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldl9sb2FkZWRfc3RvcF9kb25lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzdWNjZXNzZnVsIGxvYWRlZCBTdG9wIERvbmUhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBmYWlsZWQgaW4gbG9hZGVkIFN0b3AgRG9uZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm9teF9yZXBvcnRfZXJyb3IgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoKCZwVGhpcy0+bV9mbGFncyksT01YX0NPTVBPTkVOVF9MT0FERURfU1RPUF9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJFUlJPUjogdW5rbm93biBmbGFncz0lIiBQUkl4NjQsIHBUaGlzLT5tX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0hBUkRXQVJFX0VSUk9SOgotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE9NWF9DT01QT05FTlRfR0VORVJBVEVfSEFSRFdBUkVfRVJST1IhIik7Ci0gICAgICAgICAgICAgICAgICAgIHBUaGlzLT5vbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT01QT05FTlRfR0VORVJBVEVfVU5TVVBQT1JURURfU0VUVElORzoKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk9NWF9DT01QT05FTlRfR0VORVJBVEVfVU5TVVBQT1JURURfU0VUVElORyIpOwotICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF91bnN1cHBvcnRlZF9zZXR0aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0hBUkRXQVJFX09WRVJMT0FEOgotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiT01YX0NPTVBPTkVOVF9HRU5FUkFURV9IQVJEV0FSRV9PVkVSTE9BRCIpOwotICAgICAgICAgICAgICAgICAgICBwVGhpcy0+b214X3JlcG9ydF9od19vdmVybG9hZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygicHJvY2Vzc19ldmVudF9jYiB1bmtub3duIG1zZyBpZCAweCUwMngiLCAodW5zaWduZWQgaW50KWlkZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnBUaGlzLT5tX2xvY2spOwotICAgICAgICBxc2l6ZSA9IHBUaGlzLT5tX2NtZF9xLm1fc2l6ZSArIHBUaGlzLT5tX2Z0Yl9xLm1fc2l6ZSArXAotICAgICAgICAgICAgICAgIHBUaGlzLT5tX2V0Yl9xLm1fc2l6ZTsKLQotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcFRoaXMtPm1fbG9jayk7Ci0KLSAgICB9IHdoaWxlIChxc2l6ZT4wKTsKLSAgICBERUJVR19QUklOVF9MT1coImV4aXRlZCB0aGUgd2hpbGUgbG9vcCIpOwotCi19Ci0KLQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmVuYzo6R2V0Q29tcG9uZW50VmVyc2lvbgotCi0gICBERVNDUklQVElPTgotICAgUmV0dXJucyB0aGUgY29tcG9uZW50IHZlcnNpb24uCi0KLSAgIFBBUkFNRVRFUlMKLSAgIFRCRC4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBPTVhfRXJyb3JOb25lLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZpZGVvOjpnZXRfY29tcG9uZW50X3ZlcnNpb24KLSgKLSBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gT01YX09VVCBPTVhfU1RSSU5HIGNvbXBvbmVudE5hbWUsCi0gT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqIGNvbXBvbmVudFZlcnNpb24sCi0gT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqIHNwZWNWZXJzaW9uLAotIE9NWF9PVVQgT01YX1VVSURUWVBFKiBjb21wb25lbnRVVUlECi0gKQotewotICAgICh2b2lkKWhDb21wOwotICAgICh2b2lkKWNvbXBvbmVudE5hbWU7Ci0gICAgKHZvaWQpY29tcG9uZW50VmVyc2lvbjsKLSAgICAodm9pZCljb21wb25lbnRVVUlEOwotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBHZXQgQ29tcCBWZXJzaW9uIGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0gICAgLyogVEJEIC0tIFJldHVybiB0aGUgcHJvcGVyIHZlcnNpb24gKi8KLSAgICBpZiAoc3BlY1ZlcnNpb24pIHsKLSAgICAgICAgc3BlY1ZlcnNpb24tPm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZlbmM6OlNlbmRDb21tYW5kCi0KLSAgIERFU0NSSVBUSU9OCi0gICBSZXR1cm5zIHplcm8gaWYgYWxsIHRoZSBidWZmZXJzIHJlbGVhc2VkLi4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmlkZW86OnNlbmRfY29tbWFuZChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgIE9NWF9JTiBPTVhfQ09NTUFORFRZUEUgY21kLAotICAgICAgICBPTVhfSU4gT01YX1UzMiBwYXJhbTEsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSIGNtZERhdGEKLSAgICAgICAgKQotewotICAgICh2b2lkKWhDb21wOwotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZW5kIENvbW1hbmQgaW4gSW52YWxpZCBTdGF0ZSIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgIH0KLQotICAgIGlmIChjbWQgPT0gT01YX0NvbW1hbmRGbHVzaCB8fCBjbWQgPT0gT01YX0NvbW1hbmRQb3J0RGlzYWJsZSB8fCBjbWQgPT0gT01YX0NvbW1hbmRQb3J0RW5hYmxlKSB7Ci0gICAgICAgIGlmICgocGFyYW0xICE9IChPTVhfVTMyKVBPUlRfSU5ERVhfSU4pICYmIChwYXJhbTEgIT0gKE9NWF9VMzIpUE9SVF9JTkRFWF9PVVQpICYmIChwYXJhbTEgIT0gKE9NWF9VMzIpUE9SVF9JTkRFWF9CT1RIKSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBvbXhfdmlkZW86OnNlbmRfY29tbWFuZC0tPmJhZCBwb3J0IGluZGV4Iik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChjbWQgPT0gT01YX0NvbW1hbmRNYXJrQnVmZmVyKSB7Ci0gICAgICAgIGlmIChwYXJhbTEgIT0gUE9SVF9JTkRFWF9JTikgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBvbXhfdmlkZW86OnNlbmRfY29tbWFuZC0tPmJhZCBwb3J0IGluZGV4Iik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICB9Ci0gICAgICAgIGlmICghY21kRGF0YSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBvbXhfdmlkZW86OnNlbmRfY29tbWFuZC0tPnBhcmFtIGlzIG51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwb3N0X2V2ZW50KCh1bnNpZ25lZCBsb25nKWNtZCwodW5zaWduZWQgbG9uZylwYXJhbTEsT01YX0NPTVBPTkVOVF9HRU5FUkFURV9DT01NQU5EKTsKLSAgICBzZW1fd2FpdCgmbV9jbWRfbG9jayk7Ci0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmVuYzo6U2VuZENvbW1hbmQKLQotICAgREVTQ1JJUFRJT04KLSAgIFJldHVybnMgemVybyBpZiBhbGwgdGhlIGJ1ZmZlcnMgcmVsZWFzZWQuLgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UKLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92aWRlbzo6c2VuZF9jb21tYW5kX3Byb3h5KE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9DT01NQU5EVFlQRSBjbWQsCi0gICAgICAgIE9NWF9JTiBPTVhfVTMyIHBhcmFtMSwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgY21kRGF0YQotICAgICAgICApCi17Ci0gICAgKHZvaWQpaENvbXA7Ci0gICAgKHZvaWQpY21kRGF0YTsKLQotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgT01YX1NUQVRFVFlQRSBlU3RhdGUgPSAoT01YX1NUQVRFVFlQRSkgcGFyYW0xOwotICAgIGludCBiRmxhZyA9IDE7Ci0KLSAgICBpZiAoY21kID09IE9NWF9Db21tYW5kU3RhdGVTZXQpIHsKLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogQ3VycmVudCBTdGF0ZSBpcyBMb2FkZWQgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlTG9hZGVkKSB7Ci0gICAgICAgICAgICBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUlkbGUpIHsKLSAgICAgICAgICAgICAgICAvL2lmIGFsbCBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgb3IgYWxsIHBvcnRzIGRpc2FibGVkCi0gICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRlX2RvbmUoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCBtX3NJblBvcnREZWYuYkVuYWJsZWQgPT0gT01YX0ZBTFNFICYmIG1fc091dFBvcnREZWYuYkVuYWJsZWQgPT0gT01YX0ZBTFNFKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWENPUkUtU006IExvYWRlZC0tPklkbGUiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWENPUkUtU006IExvYWRlZC0tPklkbGUtUGVuZGluZyIpOwotICAgICAgICAgICAgICAgICAgICBCSVRNQVNLX1NFVCgmbV9mbGFncywgT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBldmVudCBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgYkZsYWcgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIExvYWRlZCB0byBMb2FkZWQgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE9NWENPUkUtU006IExvYWRlZC0tPkxvYWRlZCIpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsT01YX0Vycm9yU2FtZVN0YXRlLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JTYW1lU3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBMb2FkZWQgdG8gV2FpdEZvclJlc291cmNlcyAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICAvKiBTaW5jZSBlcnJvciBpcyBOb25lICwgd2Ugd2lsbCBwb3N0IGFuIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uIGRlZmluaXRpb24gKi8KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWENPUkUtU006IExvYWRlZC0tPldhaXRGb3JSZXNvdXJjZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIExvYWRlZCB0byBFeGVjdXRpbmcgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE9NWENPUkUtU006IExvYWRlZC0tPkV4ZWN1dGluZyIpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBMb2FkZWQgdG8gUGF1c2UgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT01YQ09SRS1TTTogTG9hZGVkLS0+UGF1c2UiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbixcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gTG9hZGVkIHRvIEludmFsaWQgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBPTVhDT1JFLVNNOiBMb2FkZWQtLT5JbnZhbGlkIik7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixlU3RhdGUsT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBPTVhDT1JFLVNNOiBMb2FkZWQtLT4lZCBOb3QgSGFuZGxlZCIsXAotICAgICAgICAgICAgICAgICAgICAgICAgZVN0YXRlKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogQ3VycmVudCBTdGF0ZSBpcyBJRExFICovCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGVsc2UgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgewotICAgICAgICAgICAgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVsZWFzZV9kb25lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgZXJyb3IgaXMgTm9uZSAsIHdlIHdpbGwgcG9zdCBhbiBldmVudCBhdCB0aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgIG9mIHRoaXMgZnVuY3Rpb24gZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJPTVhDT1JFLVNNOiBJZGxlLS0+TG9hZGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXZfc3RvcCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZGV2X3N0b3AoKSBmYWlsZWQgYXQgSWRsZSAtLT4gTG9hZGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySGFyZHdhcmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWENPUkUtU006IElkbGUtLT5Mb2FkZWQtUGVuZGluZyIpOwotICAgICAgICAgICAgICAgICAgICBCSVRNQVNLX1NFVCgmbV9mbGFncywgT01YX0NPTVBPTkVOVF9MT0FESU5HX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBldmVudCBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgYkZsYWcgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIElkbGUgdG8gRXhlY3V0aW5nICovCi0gICAgICAgICAgICBlbHNlIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBkZXZfc3RhcnQoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBkZXZfc3RhcnQoKSBmYWlsZWQgaW4gU0NQIG9uIElkbGUgLS0+IEV4ZSIpOwotICAgICAgICAgICAgICAgICAgICBvbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySGFyZHdhcmU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9FWEVDVVRFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWENPUkUtU006IElkbGUtLT5FeGVjdXRpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgYkZsYWcgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRldl9zdGFydF9kb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBJZGxlIHRvIElkbGUgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBPTVhDT1JFLVNNOiBJZGxlLS0+SWRsZSIpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsT01YX0Vycm9yU2FtZVN0YXRlLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JTYW1lU3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBJZGxlIHRvIFdhaXRGb3JSZXNvdXJjZXMgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBPTVhDT1JFLVNNOiBJZGxlLS0+V2FpdEZvclJlc291cmNlcyIpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBJZGxlIHRvIFBhdXNlICovCi0gICAgICAgICAgICBlbHNlIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpIHsKLSAgICAgICAgICAgICAgICAvKlRvIHBhdXNlIHRoZSBWaWRlbyBjb3JlIHdlIG5lZWQgdG8gc3RhcnQgdGhlIGRyaXZlciovCi0gICAgICAgICAgICAgICAgaWYgKCBkZXZfc3RhcnQoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBkZXZfc3RhcnQoKSBmYWlsZWQgaW4gU0NQIG9uIElkbGUgLS0+IFBhdXNlIik7Ci0gICAgICAgICAgICAgICAgICAgIG9teF9yZXBvcnRfZXJyb3IgKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JIYXJkd2FyZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBCSVRNQVNLX1NFVCgmbV9mbGFncyxPTVhfQ09NUE9ORU5UX1BBVVNFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWENPUkUtU006IElkbGUtLT5QYXVzZSIpOwotICAgICAgICAgICAgICAgICAgICBiRmxhZyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gSWRsZSB0byBJbnZhbGlkICovCi0gICAgICAgICAgICBlbHNlIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT01YQ09SRS1TTTogSWRsZS0tPkludmFsaWQiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLGVTdGF0ZSxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE9NWENPUkUtU006IElkbGUgLS0+ICVkIE5vdCBIYW5kbGVkIixlU3RhdGUpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiBDdXJyZW50IFN0YXRlIGlzIEV4ZWN1dGluZyAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBlbHNlIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgewotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gRXhlY3V0aW5nIHRvIElkbGUgKi8KLSAgICAgICAgICAgIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgewotICAgICAgICAgICAgICAgIC8qIFNpbmNlIGVycm9yIGlzIE5vbmUgLCB3ZSB3aWxsIHBvc3QgYW4gZXZlbnQKLSAgICAgICAgICAgICAgICAgICBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24gZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiT01YQ09SRS1TTTogRXhlY3V0aW5nIC0tPiBJZGxlIik7Ci0gICAgICAgICAgICAgICAgLy9oZXJlIHRoaXMgc2hvdWxkIGJlIFBhdXNlLUlkbGUgcGVuZGluZyBhbmQgc2hvdWxkIGJlIGNsZWFyZWQgd2hlbiBmbHVzaCBpcyBjb21wbGV0ZSBhbmQgY2hhbmdlIHRoZSBzdGF0ZSB0byBJZGxlCi0gICAgICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgIGV4ZWN1dGVfb214X2ZsdXNoKE9NWF9BTEwpOwotICAgICAgICAgICAgICAgIGJGbGFnID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIEV4ZWN1dGluZyB0byBQYXVzZWQgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgewotCi0gICAgICAgICAgICAgICAgaWYgKGRldl9wYXVzZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZGV2X3BhdXNlKCkgZmFpbGVkIGluIFNDUCBvbiBFeGUgLS0+IFBhdXNlIik7Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsT01YX0Vycm9ySGFyZHdhcmUsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySGFyZHdhcmU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9QQVVTRV9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJPTVhDT1JFLVNNOiBFeGVjdXRpbmctLT5QYXVzZSIpOwotICAgICAgICAgICAgICAgICAgICBiRmxhZyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gRXhlY3V0aW5nIHRvIExvYWRlZCAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT01YQ09SRS1TTTogRXhlY3V0aW5nIC0tPiBMb2FkZWQiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbixcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gRXhlY3V0aW5nIHRvIFdhaXRGb3JSZXNvdXJjZXMgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBPTVhDT1JFLVNNOiBFeGVjdXRpbmcgLS0+IFdhaXRGb3JSZXNvdXJjZXMiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbixcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gRXhlY3V0aW5nIHRvIEV4ZWN1dGluZyAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT01YQ09SRS1TTTogRXhlY3V0aW5nIC0tPiBFeGVjdXRpbmciKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvclNhbWVTdGF0ZSxcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yU2FtZVN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gRXhlY3V0aW5nIHRvIEludmFsaWQgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBPTVhDT1JFLVNNOiBFeGVjdXRpbmcgLS0+IEludmFsaWQiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLGVTdGF0ZSxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE9NWENPUkUtU006IEV4ZWN1dGluZyAtLT4gJWQgTm90IEhhbmRsZWQiLGVTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiBDdXJyZW50IFN0YXRlIGlzIFBhdXNlICAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBlbHNlIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZVBhdXNlKSB7Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBQYXVzZSB0byBFeGVjdXRpbmcgKi8KLSAgICAgICAgICAgIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJQYXVzZSAtLT4gRXhlY3V0aW5nIik7Ci0gICAgICAgICAgICAgICAgaWYgKCBkZXZfcmVzdW1lKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsT01YX0Vycm9ySGFyZHdhcmUsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySGFyZHdhcmU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9FWEVDVVRFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWENPUkUtU006IFBhdXNlLS0+RXhlY3V0aW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQgKDAsIDAsIE9NWF9DT01QT05FTlRfR0VORVJBVEVfUkVTVU1FX0RPTkUpOwotICAgICAgICAgICAgICAgICAgICBiRmxhZyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gUGF1c2UgdG8gSWRsZSAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUlkbGUpIHsKLSAgICAgICAgICAgICAgICAvKiBTaW5jZSBlcnJvciBpcyBOb25lICwgd2Ugd2lsbCBwb3N0IGFuIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uIGRlZmluaXRpb24gKi8KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlBhdXNlIC0tPiBJZGxlIik7Ci0gICAgICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgIGV4ZWN1dGVfb214X2ZsdXNoKE9NWF9BTEwpOwotICAgICAgICAgICAgICAgIGJGbGFnID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIFBhdXNlIHRvIGxvYWRlZCAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogUGF1c2UgLS0+IGxvYWRlZCIpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBQYXVzZSB0byBXYWl0Rm9yUmVzb3VyY2VzICovCi0gICAgICAgICAgICBlbHNlIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogUGF1c2UgLS0+IFdhaXRGb3JSZXNvdXJjZXMiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbixcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gUGF1c2UgdG8gUGF1c2UgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogUGF1c2UgLS0+IFBhdXNlIik7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JTYW1lU3RhdGUsXAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclNhbWVTdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIFBhdXNlIHRvIEludmFsaWQgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBQYXVzZSAtLT4gSW52YWxpZCIpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0V2ZW50RXJyb3IsZVN0YXRlLE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT01YQ09SRS1TTTogUGF1c2VkIC0tPiAlZCBOb3QgSGFuZGxlZCIsZVN0YXRlKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIEN1cnJlbnQgU3RhdGUgaXMgV2FpdEZvclJlc291cmNlcyAgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgZWxzZSBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAvKiBSZXF1ZXN0aW5nIHRyYW5zaXRpb24gZnJvbSBXYWl0Rm9yUmVzb3VyY2VzIHRvIExvYWRlZCAqLwotICAgICAgICAgICAgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpIHsKLSAgICAgICAgICAgICAgICAvKiBTaW5jZSBlcnJvciBpcyBOb25lICwgd2Ugd2lsbCBwb3N0IGFuIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uIGRlZmluaXRpb24gKi8KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWENPUkUtU006IFdhaXRGb3JSZXNvdXJjZXMtLT5Mb2FkZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFJlcXVlc3RpbmcgdHJhbnNpdGlvbiBmcm9tIFdhaXRGb3JSZXNvdXJjZXMgdG8gV2FpdEZvclJlc291cmNlcyAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE9NWENPUkUtU006IFdhaXRGb3JSZXNvdXJjZXMtLT5XYWl0Rm9yUmVzb3VyY2VzIik7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JTYW1lU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yU2FtZVN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gV2FpdEZvclJlc291cmNlcyB0byBFeGVjdXRpbmcgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGVTdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE9NWENPUkUtU006IFdhaXRGb3JSZXNvdXJjZXMtLT5FeGVjdXRpbmciKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbixcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gV2FpdEZvclJlc291cmNlcyB0byBQYXVzZSAqLwotICAgICAgICAgICAgZWxzZSBpZiAoZVN0YXRlID09IE9NWF9TdGF0ZVBhdXNlKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBPTVhDT1JFLVNNOiBXYWl0Rm9yUmVzb3VyY2VzLS0+UGF1c2UiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbixcCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gV2FpdEZvclJlc291cmNlcyB0byBJbnZhbGlkICovCi0gICAgICAgICAgICBlbHNlIGlmIChlU3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT01YQ09SRS1TTTogV2FpdEZvclJlc291cmNlcy0tPkludmFsaWQiKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLGVTdGF0ZSxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUmVxdWVzdGluZyB0cmFuc2l0aW9uIGZyb20gV2FpdEZvclJlc291cmNlcyB0byBMb2FkZWQgLQotICAgICAgICAgICAgICAgaXMgTk9UIHRlc3RlZCBieSBLaHJvbm9zIFRTICovCi0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT01YQ09SRS1TTTogJWQgLS0+ICVkKE5vdCBIYW5kbGVkKSIsbV9zdGF0ZSxlU3RhdGUpOwotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogQ3VycmVudCBTdGF0ZSBpcyBJbnZhbGlkICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgZWxzZSBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgIC8qIFN0YXRlIFRyYW5zaXRpb24gZnJvbSBJbmF2bGlkIHRvIGFueSBzdGF0ZSAqLwotICAgICAgICBpZiAoZVN0YXRlID09IChPTVhfU3RhdGVMb2FkZWQgfHwgT01YX1N0YXRlV2FpdEZvclJlc291cmNlcwotICAgICAgICAgICAgICAgICAgICB8fCBPTVhfU3RhdGVJZGxlIHx8IE9NWF9TdGF0ZUV4ZWN1dGluZwotICAgICAgICAgICAgICAgICAgICB8fCBPTVhfU3RhdGVQYXVzZSB8fCBPTVhfU3RhdGVJbnZhbGlkKSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBPTVhDT1JFLVNNOiBJbnZhbGlkIC0tPkxvYWRlZCIpOwotICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvcixPTVhfRXJyb3JJbnZhbGlkU3RhdGUsXAotICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNtZCA9PSBPTVhfQ29tbWFuZEZsdXNoKSB7Ci0gICAgICAgIGlmICgwID09IHBhcmFtMSB8fCBPTVhfQUxMID09IHBhcmFtMSkgewotICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsIE9NWF9DT01QT05FTlRfSU5QVVRfRkxVU0hfUEVORElORyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKDEgPT0gcGFyYW0xIHx8IE9NWF9BTEwgPT0gcGFyYW0xKSB7Ci0gICAgICAgICAgICAvL2dlbmVyYXRlIG91dHB1dCBmbHVzaCBldmVudCBvbmx5LgotICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsIE9NWF9DT01QT05FTlRfT1VUUFVUX0ZMVVNIX1BFTkRJTkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhlY3V0ZV9vbXhfZmx1c2gocGFyYW0xKTsKLSAgICAgICAgYkZsYWcgPSAwOwotICAgIH0gZWxzZSBpZiAoIGNtZCA9PSBPTVhfQ29tbWFuZFBvcnRFbmFibGUpIHsKLSAgICAgICAgaWYgKHBhcmFtMSA9PSBQT1JUX0lOREVYX0lOIHx8IHBhcmFtMSA9PSBPTVhfQUxMKSB7Ci0gICAgICAgICAgICBtX3NJblBvcnREZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKLQotICAgICAgICAgICAgaWYgKCAobV9zdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFCSVRNQVNLX1BSRVNFTlQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpKQotICAgICAgICAgICAgICAgICAgICB8fCBhbGxvY2F0ZV9pbnB1dF9kb25lKCkpIHsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9Db21tYW5kUG9ydEVuYWJsZSxQT1JUX0lOREVYX0lOLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiT01YQ09SRS1TTTogRGlzYWJsZWQtLT5FbmFibGVkIFBlbmRpbmciKTsKLSAgICAgICAgICAgICAgICBCSVRNQVNLX1NFVCgmbV9mbGFncywgT01YX0NPTVBPTkVOVF9JTlBVVF9FTkFCTEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgYkZsYWcgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbTEgPT0gUE9SVF9JTkRFWF9PVVQgfHwgcGFyYW0xID09IE9NWF9BTEwpIHsKLSAgICAgICAgICAgIG1fc091dFBvcnREZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKLQotICAgICAgICAgICAgaWYgKCAobV9zdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFCSVRNQVNLX1BSRVNFTlQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpKQotICAgICAgICAgICAgICAgICAgICB8fCAoYWxsb2NhdGVfb3V0cHV0X2RvbmUoKSkpIHsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9Db21tYW5kUG9ydEVuYWJsZSxQT1JUX0lOREVYX09VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiT01YQ09SRS1TTTogRGlzYWJsZWQtLT5FbmFibGVkIFBlbmRpbmciKTsKLSAgICAgICAgICAgICAgICBCSVRNQVNLX1NFVCgmbV9mbGFncywgT01YX0NPTVBPTkVOVF9PVVRQVVRfRU5BQkxFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGV2ZW50IG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgIGJGbGFnID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoY21kID09IE9NWF9Db21tYW5kUG9ydERpc2FibGUpIHsKLSAgICAgICAgaWYgKHBhcmFtMSA9PSBQT1JUX0lOREVYX0lOIHx8IHBhcmFtMSA9PSBPTVhfQUxMKSB7Ci0gICAgICAgICAgICBtX3NJblBvcnREZWYuYkVuYWJsZWQgPSBPTVhfRkFMU0U7Ci0gICAgICAgICAgICBpZiAoKG1fc3RhdGUgPT0gT01YX1N0YXRlTG9hZGVkIHx8IG1fc3RhdGUgPT0gT01YX1N0YXRlSWRsZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgcmVsZWFzZV9pbnB1dF9kb25lKCkpIHsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9Db21tYW5kUG9ydERpc2FibGUsUE9SVF9JTkRFWF9JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBCSVRNQVNLX1NFVCgmbV9mbGFncywgT01YX0NPTVBPTkVOVF9JTlBVVF9ESVNBQkxFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZVBhdXNlIHx8bV9zdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZV9vbXhfZmx1c2goUE9SVF9JTkRFWF9JTik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgYkZsYWcgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbTEgPT0gUE9SVF9JTkRFWF9PVVQgfHwgcGFyYW0xID09IE9NWF9BTEwpIHsKLSAgICAgICAgICAgIG1fc091dFBvcnREZWYuYkVuYWJsZWQgPSBPTVhfRkFMU0U7Ci0KLSAgICAgICAgICAgIGlmICgobV9zdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQgfHwgbV9zdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKQotICAgICAgICAgICAgICAgICAgICAmJiByZWxlYXNlX291dHB1dF9kb25lKCkpIHsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9Db21tYW5kUG9ydERpc2FibGUsUE9SVF9JTkRFWF9PVVQsXAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEJJVE1BU0tfU0VUKCZtX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX09VVFBVVF9ESVNBQkxFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZVBhdXNlIHx8bV9zdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZV9vbXhfZmx1c2goUE9SVF9JTkRFWF9PVVQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBldmVudCBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICBiRmxhZyA9IDA7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogSW52YWxpZCBDb21tYW5kIHJlY2VpdmVkIG90aGVyIHRoYW4gU3RhdGVTZXQgKCVkKSIsY21kKTsKLSAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vdEltcGxlbWVudGVkOwotICAgIH0KLSAgICBpZiAoZVJldCA9PSBPTVhfRXJyb3JOb25lICYmIGJGbGFnKSB7Ci0gICAgICAgIHBvc3RfZXZlbnQoY21kLGVTdGF0ZSxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICB9Ci0gICAgc2VtX3Bvc3QoJm1fY21kX2xvY2spOwotICAgIHJldHVybiBlUmV0OwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZlbmM6OkV4ZWN1dGVPbXhGbHVzaAotCi0gICBERVNDUklQVElPTgotICAgRXhlY3V0ZXMgdGhlIE9NWCBmbHVzaC4KLQotICAgUEFSQU1FVEVSUwotICAgZmx1c2h0eXBlIC0gaW5wdXQgZmx1c2goMSkvb3V0cHV0IGZsdXNoKDApLyBib3RoLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UKLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWJvb2wgb214X3ZpZGVvOjpleGVjdXRlX29teF9mbHVzaChPTVhfVTMyIGZsdXNoVHlwZSkKLXsKLSAgICBib29sIGJSZXQgPSBmYWxzZTsKLSAgICBERUJVR19QUklOVF9MT1coImV4ZWN1dGVfb214X2ZsdXNoIC0gICV1IiwgKHVuc2lnbmVkIGludClmbHVzaFR5cGUpOwotICAgIC8qIFhYWDogVGhlIGRyaXZlci9oYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGZsdXNoaW5nIG9mIGluZGl2aWR1YWwgcG9ydHMKLSAgICAgKiBpbiBhbGwgc3RhdGVzLiBTbyB3ZSBwcmV0dHkgbXVjaCBuZWVkIHRvIGZsdXNoIGJvdGggcG9ydHMgaW50ZXJuYWxseSwKLSAgICAgKiBidXQgY2xpZW50IHNob3VsZCBvbmx5IGdldCB0aGUgRkxVU0hfKElOUFVUfE9VVFBVVClfRE9ORSBmb3IgdGhlIG9uZSBpdAotICAgICAqIHJlcXVlc3RlZC4gIFNpbmNlIE9NWF9DT01QT05FTlRfKE9VVFBVVHxJTlBVVClfRkxVU0hfUEVORElORyBpc24ndCBzZXQsCi0gICAgICogd2UgYXV0b21hdGljYWxseSBvbWl0IHNlbmRpbmcgdGhlIEZMVVNIIGRvbmUgZm9yIHRoZSAib3Bwb3NpdGUiIHBvcnQuICovCi0KLSAgICBpbnB1dF9mbHVzaF9wcm9ncmVzcyA9IHRydWU7Ci0gICAgb3V0cHV0X2ZsdXNoX3Byb2dyZXNzID0gdHJ1ZTsKLSAgICBiUmV0ID0gZXhlY3V0ZV9mbHVzaF9hbGwoKTsKLSAgICByZXR1cm4gYlJldDsKLX0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gOiBleGVjdXRlX291dHB1dF9mbHVzaAotCi1ERVNDUklQVElPTgotRXhlY3V0ZXMgdGhlIE9NWCBmbHVzaCBhdCBPVVRQVVQgUE9SVC4KLQotUEFSQU1FVEVSUwotTm9uZS4KLQotUkVUVVJOIFZBTFVFCi10cnVlL2ZhbHNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1ib29sIG9teF92aWRlbzo6ZXhlY3V0ZV9vdXRwdXRfZmx1c2godm9pZCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHAxID0gMDsgLy8gUGFyYW1ldGVyIC0gMQotICAgIHVuc2lnbmVkIGxvbmcgcDIgPSAwOyAvLyBQYXJhbWV0ZXIgLSAyCi0gICAgdW5zaWduZWQgbG9uZyBpZGVudCA9IDA7Ci0gICAgYm9vbCBiUmV0ID0gdHJ1ZTsKLQotICAgIC8qR2VuZXJhdGUgRkJEIGZvciBhbGwgQnVmZmVycyBpbiB0aGUgRlRCcSovCi0gICAgREVCVUdfUFJJTlRfTE9XKCJleGVjdXRlX291dHB1dF9mbHVzaCIpOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9sb2NrKTsKLSAgICB3aGlsZSAobV9mdGJfcS5tX3NpemUpIHsKLSAgICAgICAgbV9mdGJfcS5wb3BfZW50cnkoJnAxLCZwMiwmaWRlbnQpOwotCi0gICAgICAgIGlmIChpZGVudCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZUQiApIHsKLSAgICAgICAgICAgIHBlbmRpbmdfb3V0cHV0X2J1ZmZlcnMrKzsKLSAgICAgICAgICAgIFZJRENfVFJBQ0VfSU5UX0xPVygiRlRCLXBlbmRpbmciLCBwZW5kaW5nX291dHB1dF9idWZmZXJzKTsKLSAgICAgICAgICAgIGZpbGxfYnVmZmVyX2RvbmUoJm1fY21wLChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKXAyKTsKLSAgICAgICAgfSBlbHNlIGlmIChpZGVudCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZCRCkgewotICAgICAgICAgICAgZmlsbF9idWZmZXJfZG9uZSgmbV9jbXAsKE9NWF9CVUZGRVJIRUFERVJUWVBFICopcDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7Ci0gICAgLypDaGVjayBpZiB0aGVyZSBhcmUgYnVmZmVycyB3aXRoIHRoZSBEcml2ZXIqLwotICAgIGlmIChkZXZfZmx1c2goUE9SVF9JTkRFWF9PVVQpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogby9wIGRldl9mbHVzaCgpIEZhaWxlZCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJSZXQ7Ci19Ci0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OIDogZXhlY3V0ZV9pbnB1dF9mbHVzaAotCi1ERVNDUklQVElPTgotRXhlY3V0ZXMgdGhlIE9NWCBmbHVzaCBhdCBJTlBVVCBQT1JULgotCi1QQVJBTUVURVJTCi1Ob25lLgotCi1SRVRVUk4gVkFMVUUKLXRydWUvZmFsc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWJvb2wgb214X3ZpZGVvOjpleGVjdXRlX2lucHV0X2ZsdXNoKHZvaWQpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBwMSA9IDA7IC8vIFBhcmFtZXRlciAtIDEKLSAgICB1bnNpZ25lZCBsb25nIHAyID0gMDsgLy8gUGFyYW1ldGVyIC0gMgotICAgIHVuc2lnbmVkIGxvbmcgaWRlbnQgPSAwOwotICAgIGJvb2wgYlJldCA9IHRydWU7Ci0KLSAgICAvKkdlbmVyYXRlIEVCRCBmb3IgYWxsIEJ1ZmZlcnMgaW4gdGhlIEVUQnEqLwotICAgIERFQlVHX1BSSU5UX0xPVygiZXhlY3V0ZV9pbnB1dF9mbHVzaCIpOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOwotICAgIHdoaWxlIChtX2V0Yl9xLm1fc2l6ZSkgewotICAgICAgICBtX2V0Yl9xLnBvcF9lbnRyeSgmcDEsJnAyLCZpZGVudCk7Ci0gICAgICAgIGlmIChpZGVudCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQikgewotICAgICAgICAgICAgcGVuZGluZ19pbnB1dF9idWZmZXJzKys7Ci0gICAgICAgICAgICBWSURDX1RSQUNFX0lOVF9MT1coIkVUQi1wZW5kaW5nIiwgcGVuZGluZ19pbnB1dF9idWZmZXJzKTsKLSAgICAgICAgICAgIGVtcHR5X2J1ZmZlcl9kb25lKCZtX2NtcCwoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMik7Ci0gICAgICAgIH0gZWxzZSBpZiAoaWRlbnQgPT0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQpIHsKLSAgICAgICAgICAgIGVtcHR5X2J1ZmZlcl9kb25lKCZtX2NtcCwoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaWRlbnQgPT0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVEJfT1BRKSB7Ci0gICAgICAgICAgICBtX3BDYWxsYmFja3MuRW1wdHlCdWZmZXJEb25lKCZtX2NtcCxtX2FwcF9kYXRhLChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKXAyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobVVzZVByb3h5Q29sb3JGb3JtYXQpIHsKLSAgICAgICAgaWYgKHBzb3VyY2VfZnJhbWUpIHsKLSAgICAgICAgICAgIG1fcENhbGxiYWNrcy5FbXB0eUJ1ZmZlckRvbmUoJm1fY21wLG1fYXBwX2RhdGEscHNvdXJjZV9mcmFtZSk7Ci0gICAgICAgICAgICBwc291cmNlX2ZyYW1lID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAobV9vcHFfbWV0YV9xLm1fc2l6ZSkgewotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBwMSxwMixpZDsKLSAgICAgICAgICAgIG1fb3BxX21ldGFfcS5wb3BfZW50cnkoJnAxLCZwMiwmaWQpOwotICAgICAgICAgICAgbV9wQ2FsbGJhY2tzLkVtcHR5QnVmZmVyRG9uZSgmbV9jbXAsbV9hcHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKE9NWF9CVUZGRVJIRUFERVJUWVBFICAqKXAxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGRlc3RfZnJhbWUpIHsKLSAgICAgICAgICAgIG1fb3BxX3BtZW1fcS5pbnNlcnRfZW50cnkoKHVuc2lnbmVkIGxvbmcpcGRlc3RfZnJhbWUsMCwwKTsKLSAgICAgICAgICAgIHBkZXN0X2ZyYW1lID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9sb2NrKTsKLSAgICAvKkNoZWNrIGlmIHRoZXJlIGFyZSBidWZmZXJzIHdpdGggdGhlIERyaXZlciovCi0gICAgaWYgKGRldl9mbHVzaChQT1JUX0lOREVYX0lOKSkgewotICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBpL3AgZGV2X2ZsdXNoKCkgRmFpbGVkIik7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJSZXQ7Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiA6IGV4ZWN1dGVfZmx1c2gKLQotREVTQ1JJUFRJT04KLUV4ZWN1dGVzIHRoZSBPTVggZmx1c2ggYXQgSU5QVVQgJiBPVVRQVVQgUE9SVC4KLQotUEFSQU1FVEVSUwotTm9uZS4KLQotUkVUVVJOIFZBTFVFCi10cnVlL2ZhbHNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1ib29sIG9teF92aWRlbzo6ZXhlY3V0ZV9mbHVzaF9hbGwodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHAxID0gMDsgLy8gUGFyYW1ldGVyIC0gMQotICAgIHVuc2lnbmVkIGxvbmcgcDIgPSAwOyAvLyBQYXJhbWV0ZXIgLSAyCi0gICAgdW5zaWduZWQgbG9uZyBpZGVudCA9IDA7Ci0gICAgYm9vbCBiUmV0ID0gdHJ1ZTsKLQotICAgIERFQlVHX1BSSU5UX0xPVygiZXhlY3V0ZV9mbHVzaF9hbGwiKTsKLQotICAgIC8qR2VuZXJhdGUgRUJEIGZvciBhbGwgQnVmZmVycyBpbiB0aGUgRVRCcSovCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOwotICAgIHdoaWxlIChtX2V0Yl9xLm1fc2l6ZSkgewotICAgICAgICBtX2V0Yl9xLnBvcF9lbnRyeSgmcDEsJnAyLCZpZGVudCk7Ci0gICAgICAgIGlmIChpZGVudCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQikgewotICAgICAgICAgICAgcGVuZGluZ19pbnB1dF9idWZmZXJzKys7Ci0gICAgICAgICAgICBWSURDX1RSQUNFX0lOVF9MT1coIkVUQi1wZW5kaW5nIiwgcGVuZGluZ19pbnB1dF9idWZmZXJzKTsKLSAgICAgICAgICAgIGVtcHR5X2J1ZmZlcl9kb25lKCZtX2NtcCwoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMik7Ci0gICAgICAgIH0gZWxzZSBpZiAoaWRlbnQgPT0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQpIHsKLSAgICAgICAgICAgIGVtcHR5X2J1ZmZlcl9kb25lKCZtX2NtcCwoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMSk7Ci0gICAgICAgIH0gZWxzZSBpZihpZGVudCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQl9PUFEpIHsKLSAgICAgICAgICAgIG1fcENhbGxiYWNrcy5FbXB0eUJ1ZmZlckRvbmUoJm1fY21wLG1fYXBwX2RhdGEsKE9NWF9CVUZGRVJIRUFERVJUWVBFICopcDIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKG1Vc2VQcm94eUNvbG9yRm9ybWF0KSB7Ci0gICAgICAgIGlmKHBzb3VyY2VfZnJhbWUpIHsKLSAgICAgICAgICAgIG1fcENhbGxiYWNrcy5FbXB0eUJ1ZmZlckRvbmUoJm1fY21wLG1fYXBwX2RhdGEscHNvdXJjZV9mcmFtZSk7Ci0gICAgICAgICAgICBwc291cmNlX2ZyYW1lID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICB3aGlsZShtX29wcV9tZXRhX3EubV9zaXplKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsb25nIHAxLHAyLGlkOwotICAgICAgICAgICAgbV9vcHFfbWV0YV9xLnBvcF9lbnRyeSgmcDEsJnAyLCZpZCk7Ci0gICAgICAgICAgICBtX3BDYWxsYmFja3MuRW1wdHlCdWZmZXJEb25lKCZtX2NtcCxtX2FwcF9kYXRhLAotICAgICAgICAgICAgICAgIChPTVhfQlVGRkVSSEVBREVSVFlQRSAgKilwMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYocGRlc3RfZnJhbWUpewotICAgICAgICAgICAgbV9vcHFfcG1lbV9xLmluc2VydF9lbnRyeSgodW5zaWduZWQgbG9uZylwZGVzdF9mcmFtZSwwLDApOwotICAgICAgICAgICAgcGRlc3RfZnJhbWUgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLypHZW5lcmF0ZSBGQkQgZm9yIGFsbCBCdWZmZXJzIGluIHRoZSBGVEJxKi8KLSAgICBERUJVR19QUklOVF9MT1coImV4ZWN1dGVfb3V0cHV0X2ZsdXNoIik7Ci0gICAgd2hpbGUgKG1fZnRiX3EubV9zaXplKSB7Ci0gICAgICAgIG1fZnRiX3EucG9wX2VudHJ5KCZwMSwmcDIsJmlkZW50KTsKLQotICAgICAgICBpZiAoaWRlbnQgPT0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GVEIgKSB7Ci0gICAgICAgICAgICBwZW5kaW5nX291dHB1dF9idWZmZXJzKys7Ci0gICAgICAgICAgICBWSURDX1RSQUNFX0lOVF9MT1coIkZUQi1wZW5kaW5nIiwgcGVuZGluZ19vdXRwdXRfYnVmZmVycyk7Ci0gICAgICAgICAgICBmaWxsX2J1ZmZlcl9kb25lKCZtX2NtcCwoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMik7Ci0gICAgICAgIH0gZWxzZSBpZiAoaWRlbnQgPT0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GQkQpIHsKLSAgICAgICAgICAgIGZpbGxfYnVmZmVyX2RvbmUoJm1fY21wLChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKXAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOwotICAgIC8qQ2hlY2sgaWYgdGhlcmUgYXJlIGJ1ZmZlcnMgd2l0aCB0aGUgRHJpdmVyKi8KLSAgICBpZiAoZGV2X2ZsdXNoKFBPUlRfSU5ERVhfQk9USCkpIHsKLSAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZGV2X2ZsdXNoKCkgRmFpbGVkIik7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJSZXQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmVuYzo6U2VuZENvbW1hbmRFdmVudAotCi0gICBERVNDUklQVElPTgotICAgU2VuZCB0aGUgZXZlbnQgdG8gZGVjb2RlciBwaXBlLiAgVGhpcyBpcyBuZWVkZWQgdG8gZ2VuZXJhdGUgdGhlIGNhbGxiYWNrcwotICAgaW4gZGVjb2RlciB0aHJlYWQgY29udGV4dC4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1ib29sIG9teF92aWRlbzo6cG9zdF9ldmVudCh1bnNpZ25lZCBsb25nIHAxLAotICAgICAgICB1bnNpZ25lZCBsb25nIHAyLAotICAgICAgICB1bnNpZ25lZCBsb25nIGlkKQotewotICAgIGJvb2wgYlJldCA9ICBmYWxzZTsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9sb2NrKTsKLQotICAgIGlmICgoaWQgPT0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GVEIpIHx8Ci0gICAgICAgICAgICAoaWQgPT0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GQkQpIHx8Ci0gICAgICAgICAgICAoaWQgPT0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVF9PVVRQVVRfRkxVU0gpKSB7Ci0gICAgICAgIG1fZnRiX3EuaW5zZXJ0X2VudHJ5KHAxLHAyLGlkKTsKLSAgICB9IGVsc2UgaWYgKChpZCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQikgfHwKLSAgICAgICAgICAgIChpZCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VCRCkgfHwKLSAgICAgICAgICAgIChpZCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UX0lOUFVUX0ZMVVNIKSkgewotICAgICAgICBtX2V0Yl9xLmluc2VydF9lbnRyeShwMSxwMixpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9jbWRfcS5pbnNlcnRfZW50cnkocDEscDIsaWQpOwotICAgIH0KLQotICAgIGJSZXQgPSB0cnVlOwotICAgIERFQlVHX1BSSU5UX0xPVygiVmFsdWUgb2YgdGhpcyBwb2ludGVyIGluIHBvc3RfZXZlbnQgJXAiLHRoaXMpOwotICAgIHBvc3RfbWVzc2FnZSh0aGlzLCBpZCk7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7Ci0KLSAgICByZXR1cm4gYlJldDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZW5jOjpHZXRQYXJhbWV0ZXIKLQotICAgREVTQ1JJUFRJT04KLSAgIE9NWCBHZXQgUGFyYW1ldGVyIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICBQQVJBTUVURVJTCi0gICA8VEJEPi4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBFcnJvciBOb25lIGlmIHN1Y2Nlc3NmdWwuCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmlkZW86OmdldF9wYXJhbWV0ZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgcGFyYW1JbmRleCwKLSAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgIHBhcmFtRGF0YSkKLXsKLSAgICAodm9pZCloQ29tcDsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIHVuc2lnbmVkIGludCBoZWlnaHQ9MCx3aWR0aCA9IDA7Ci0KLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogR2V0IFBhcmFtIGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0gICAgaWYgKHBhcmFtRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogR2V0IFBhcmFtIGluIEludmFsaWQgcGFyYW1EYXRhIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotICAgIHN3aXRjaCAoKGludClwYXJhbUluZGV4KSB7Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWZuOwotICAgICAgICAgICAgICAgIHBvcnREZWZuID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKikgcGFyYW1EYXRhOwotCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiBwb3J0ICVkIiwgcG9ydERlZm4tPm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChwb3J0RGVmbi0+blBvcnRJbmRleCA9PSAoT01YX1UzMikgUE9SVF9JTkRFWF9JTikgewotICAgICAgICAgICAgICAgICAgICBkZXZfZ2V0X2J1Zl9yZXEgKCZtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgJm1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9zSW5Qb3J0RGVmLm5Qb3J0SW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweShwb3J0RGVmbiwgJm1fc0luUG9ydERlZiwgc2l6ZW9mKG1fc0luUG9ydERlZikpOwotI2lmZGVmIF9BTkRST0lEX0lDU18KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFfbW9kZV9lbmFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3Qgc2l6ZSBvZiBsYXJnZXN0IG1ldGFkYXRhIChoYXBwZW5zIHRvIGJlIE5hdGl2ZUhhbmRsZVNvdXJjZSkgc2luY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBrbm93IHRoZSBleGFjdCBtZXRhZGF0YS10eXBlIHlldAotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydERlZm4tPm5CdWZmZXJTaXplID0gc2l6ZW9mKExFR0FDWV9DQU1fTUVUQURBVEFfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Vc2VQcm94eUNvbG9yRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKVFPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3J0RGVmbi0+blBvcnRJbmRleCA9PSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdGUgIT0gT01YX1N0YXRlRXhlY3V0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZfZ2V0X2J1Zl9yZXEgKCZtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fc091dFBvcnREZWYubkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zT3V0UG9ydERlZi5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweShwb3J0RGVmbiwgJm1fc091dFBvcnREZWYsIHNpemVvZihtX3NPdXRQb3J0RGVmKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBHZXRQYXJhbWV0ZXIgY2FsbGVkIG9uIEJhZCBQb3J0IEluZGV4Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjogcG9ydCAlZCwgd3hoICVkeCVkLCBtaW4gJWQsIGFjdHVhbCAlZCwgc2l6ZSAlZCwgY29sb3Jmb3JtYXQgJSN4LCBjb21wcmVzc2lvbiBmb3JtYXQgJSN4IiwKLSAgICAgICAgICAgICAgICAgICAgcG9ydERlZm4tPm5Qb3J0SW5kZXgsIHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LCBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50TWluLAotICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsLCBwb3J0RGVmbi0+bkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0LCBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvSW5pdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9QT1JUX1BBUkFNX1RZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9QT1JUX1BBUkFNX1RZUEUgKnBvcnRQYXJhbVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAoT01YX1BPUlRfUEFSQU1fVFlQRSAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvSW5pdCIpOwotCi0gICAgICAgICAgICAgICAgbWVtY3B5KHBvcnRQYXJhbVR5cGUsICZtX3NQb3J0UGFyYW0sIHNpemVvZihtX3NQb3J0UGFyYW0pKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpwb3J0Rm10ID0KLSAgICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImdldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0Iik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocG9ydEZtdC0+blBvcnRJbmRleCA9PSAoT01YX1UzMikgUE9SVF9JTkRFWF9JTikgewotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCA9IHBvcnRGbXQtPm5JbmRleDsKLQotI2lmZGVmIF9VQldDXwotICAgICAgICAgICAgICAgICAgICAvL3dlIHN1cHBvcnQgZm9sbG93aW5nIGZvcm1hdHMKLSAgICAgICAgICAgICAgICAgICAgLy9pbmRleCAwIC0gQ29tcHJlc3NlZCAoVUJXQykgVmVudXMgZmxhdm91ciBvZiBZVVY0MjBTUAotICAgICAgICAgICAgICAgICAgICAvL2luZGV4IDEgLSBWZW51cyBmbGF2b3VyIG9mIFlVVjQyMFNQCi0gICAgICAgICAgICAgICAgICAgIC8vaW5kZXggMiAtIENvbXByZXNzZWQgKFVCV0MpIFZlbnVzIGZsYXZvdXIgb2YgUkdCQTg4ODgKLSAgICAgICAgICAgICAgICAgICAgLy9pbmRleCAzIC0gVmVudXMgZmxhdm91ciBvZiBSR0JBODg4OAotICAgICAgICAgICAgICAgICAgICAvL2luZGV4IDQgLSBvcGFxdWUgd2hpY2ggaW50ZXJuYWxseSBtYXBzIHRvIFlVVjQyMFNQLgotICAgICAgICAgICAgICAgICAgICAvL2luZGV4IDUgLSB2YW5uaWxsYSBZVVY0MjBTUAotICAgICAgICAgICAgICAgICAgICAvL3RoaXMgY2FuIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUKLSAgICAgICAgICAgICAgICAgICAgaW50IHN1cHBvcnRlZEZvcm1hdHNbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFswXSA9IFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybUNvbXByZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBbMV0gPSBRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm0sCi0gICAgICAgICAgICAgICAgICAgICAgICBbMl0gPSBRT01YX0NPTE9SX0Zvcm1hdDMyYml0UkdCQTg4ODhDb21wcmVzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgWzNdID0gUU9NWF9DT0xPUl9Gb3JtYXQzMmJpdFJHQkE4ODg4LAotICAgICAgICAgICAgICAgICAgICAgICAgWzRdID0gUU9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgWzVdID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIsCi0gICAgICAgICAgICAgICAgICAgIH07Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAvL3dlIHN1cHBvcnQgdHdvIGZvcm1hdHMKLSAgICAgICAgICAgICAgICAgICAgLy9pbmRleCAwIC0gVmVudXMgZmxhdm91ciBvZiBZVVY0MjBTUAotICAgICAgICAgICAgICAgICAgICAvL2luZGV4IDEgLSBvcGFxdWUgd2hpY2ggaW50ZXJuYWxseSBtYXBzIHRvIFlVVjQyMFNQLgotICAgICAgICAgICAgICAgICAgICAvL2luZGV4IDIgLSB2YW5uaWxsYSBZVVY0MjBTUAotICAgICAgICAgICAgICAgICAgICAvL3RoaXMgY2FuIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUKLSAgICAgICAgICAgICAgICAgICAgaW50IHN1cHBvcnRlZEZvcm1hdHNbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFswXSA9IFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFsxXSA9IFFPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFsyXSA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLAotICAgICAgICAgICAgICAgICAgICB9OwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IChzaXplb2Yoc3VwcG9ydGVkRm9ybWF0cykvc2l6ZW9mKCpzdXBwb3J0ZWRGb3JtYXRzKSAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vTW9yZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocG9ydEZtdCwgJm1fc0luUG9ydEZvcm1hdCwgc2l6ZW9mKG1fc0luUG9ydEZvcm1hdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEZtdC0+bkluZGV4ID0gaW5kZXg7IC8vcmVzdG9yZSBpbmRleCBzZXQgZnJvbSBjbGllbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRGbXQtPmVDb2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSlzdXBwb3J0ZWRGb3JtYXRzW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9ydEZtdC0+blBvcnRJbmRleCA9PSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBvcnRGbXQsICZtX3NPdXRQb3J0Rm9ybWF0LCBzaXplb2YobV9zT3V0UG9ydEZvcm1hdCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogR2V0UGFyYW1ldGVyIGNhbGxlZCBvbiBCYWQgUG9ydCBJbmRleCIpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFKiBwUGFyYW0gPSAoT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZSIpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBQYXJhbSwgJm1fc1BhcmFtQml0cmF0ZSwgc2l6ZW9mKG1fc1BhcmFtQml0cmF0ZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogR2V0UGFyYW1ldGVyIGNhbGxlZCBvbiBCYWQgUG9ydCBJbmRleCIpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUqIHBQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fQVZDVFlQRSopcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb0F2YyIpOwotICAgICAgICAgICAgICAgIG1lbWNweShwUGFyYW0sICZtX3NQYXJhbUFWQywgc2l6ZW9mKG1fc1BhcmFtQVZDKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb1ZwODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9WSURFT19QQVJBTV9WUDhUWVBFKTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fVlA4VFlQRSogcFBhcmFtID0gKE9NWF9WSURFT19QQVJBTV9WUDhUWVBFKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvVnA4Iik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHBQYXJhbSwgJm1fc1BhcmFtVlA4LCBzaXplb2YobV9zUGFyYW1WUDgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbVZpZGVvSGV2YzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9WSURFT19QQVJBTV9IRVZDVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0hFVkNUWVBFKiBwUGFyYW0gPSAoT01YX1ZJREVPX1BBUkFNX0hFVkNUWVBFKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvSGV2YyIpOwotICAgICAgICAgICAgICAgIG1lbWNweShwUGFyYW0sICZtX3NQYXJhbUhFVkMsIHNpemVvZihtX3NQYXJhbUhFVkMpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUqIHBQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSopcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkIik7Ci0gICAgICAgICAgICAgICAgZVJldCA9IGdldF9zdXBwb3J0ZWRfcHJvZmlsZV9sZXZlbChwUGFyYW0pOwotICAgICAgICAgICAgICAgIGlmIChlUmV0ICYmIGVSZXQgIT0gT01YX0Vycm9yTm9Nb3JlKQotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSW52YWxpZCBlbnRyeSByZXR1cm5lZCBmcm9tIGdldF9zdXBwb3J0ZWRfcHJvZmlsZV9sZXZlbCAldSwgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcFBhcmFtLT5lUHJvZmlsZSwgKHVuc2lnbmVkIGludClwUGFyYW0tPmVMZXZlbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUqIHBQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSopcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQiKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkocFBhcmFtLCAmbV9zUGFyYW1Qcm9maWxlTGV2ZWwsIHNpemVvZihtX3NQYXJhbVByb2ZpbGVMZXZlbCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhDb25maWdIMjY0RW50cm9weUNvZGluZ0NhYmFjOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9WSURFT19IMjY0RU5UUk9QWUNPRElOR1RZUEUpOwotICAgICAgICAgICAgICAgIFFPTVhfVklERU9fSDI2NEVOVFJPUFlDT0RJTkdUWVBFICogcFBhcmFtID0gKFFPTVhfVklERU9fSDI2NEVOVFJPUFlDT0RJTkdUWVBFKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfUWNvbUluZGV4Q29uZmlnSDI2NEVudHJvcHlDb2RpbmdDYWJhYyIpOwotICAgICAgICAgICAgICAgIG1lbWNweShwUGFyYW0sICZtX3NQYXJhbUVudHJvcHksIHNpemVvZihtX3NQYXJhbUVudHJvcHkpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qQ29tcG9uZW50IHNob3VsZCBzdXBwb3J0IHRoaXMgcG9ydCBkZWZpbml0aW9uKi8KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvSW5pdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9QT1JUX1BBUkFNX1RZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9QT1JUX1BBUkFNX1RZUEUgKmF1ZGlvUG9ydFBhcmFtVHlwZSA9IChPTVhfUE9SVF9QQVJBTV9UWVBFICopIHBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImdldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtQXVkaW9Jbml0Iik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGF1ZGlvUG9ydFBhcmFtVHlwZSwgJm1fc1BvcnRQYXJhbV9hdWRpbywgc2l6ZW9mKG1fc1BvcnRQYXJhbV9hdWRpbykpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypDb21wb25lbnQgc2hvdWxkIHN1cHBvcnQgdGhpcyBwb3J0IGRlZmluaXRpb24qLwotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtSW1hZ2VJbml0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1BPUlRfUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1BPUlRfUEFSQU1fVFlQRSAqaW1hZ2VQb3J0UGFyYW1UeXBlID0gKE9NWF9QT1JUX1BBUkFNX1RZUEUgKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1JbWFnZUluaXQiKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoaW1hZ2VQb3J0UGFyYW1UeXBlLCAmbV9zUG9ydFBhcmFtX2ltZywgc2l6ZW9mKG1fc1BvcnRQYXJhbV9pbWcpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypDb21wb25lbnQgc2hvdWxkIHN1cHBvcnQgdGhpcyBwb3J0IGRlZmluaXRpb24qLwotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtT3RoZXJJbml0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1PdGhlckluaXQgJTA4eCIsIHBhcmFtSW5kZXgpOwotICAgICAgICAgICAgICAgIGVSZXQgPU9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqY29tcF9yb2xlOwotICAgICAgICAgICAgICAgIGNvbXBfcm9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIGNvbXBfcm9sZS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICAgICAgICAgIGNvbXBfcm9sZS0+blNpemUgPSBzaXplb2YoKmNvbXBfcm9sZSk7Ci0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkdldHBhcmFtZXRlcjogT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGUgJWQiLHBhcmFtSW5kZXgpOwotICAgICAgICAgICAgICAgIHN0cmxjcHkoKGNoYXIqKWNvbXBfcm9sZS0+Y1JvbGUsKGNvbnN0IGNoYXIqKW1fY1JvbGUsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogQWRkZWQgZm9yIHBhcmFtZXRlciB0ZXN0ICovCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qcmlvcml0eU1nbXQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUFJJT1JJVFlNR01UVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1BSSU9SSVRZTUdNVFRZUEUgKnByaW9yaXR5TWdtVHlwZSA9IChPTVhfUFJJT1JJVFlNR01UVFlQRSAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVByaW9yaXR5TWdtdCIpOwotICAgICAgICAgICAgICAgIG1lbWNweShwcmlvcml0eU1nbVR5cGUsICZtX3NQcmlvcml0eU1nbXQsIHNpemVvZihtX3NQcmlvcml0eU1nbXQpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEFkZGVkIGZvciBwYXJhbWV0ZXIgdGVzdCAqLwotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqYnVmZmVyU3VwcGxpZXJUeXBlID0gKE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbUNvbXBCdWZmZXJTdXBwbGllciIpOwotICAgICAgICAgICAgICAgIGlmIChidWZmZXJTdXBwbGllclR5cGUtPm5Qb3J0SW5kZXggPT0oT01YX1UzMikgUE9SVF9JTkRFWF9JTikgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyU3VwcGxpZXJUeXBlLCAmbV9zSW5CdWZTdXBwbGllciwgc2l6ZW9mKG1fc0luQnVmU3VwcGxpZXIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlclN1cHBsaWVyVHlwZS0+blBvcnRJbmRleCA9PShPTVhfVTMyKSBQT1JUX0lOREVYX09VVCkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyU3VwcGxpZXJUeXBlLCAmbV9zT3V0QnVmU3VwcGxpZXIsIHNpemVvZihtX3NPdXRCdWZTdXBwbGllcikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogR2V0UGFyYW1ldGVyIGNhbGxlZCBvbiBCYWQgUG9ydCBJbmRleCIpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9RdWFudGl6YXRpb246Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1FVQU5USVpBVElPTlRZUEUgKnNlc3Npb25fcXAgPSAoT01YX1ZJREVPX1BBUkFNX1FVQU5USVpBVElPTlRZUEUqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvUXVhbnRpemF0aW9uIik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHNlc3Npb25fcXAsICZtX3NTZXNzaW9uUXVhbnRpemF0aW9uLCBzaXplb2YobV9zU2Vzc2lvblF1YW50aXphdGlvbikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgUU9NWF9JbmRleFBhcmFtVmlkZW9Jbml0aWFsUXA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX0VYVE5JTkRFWF9WSURFT19JTklUSUFMUVApOwotICAgICAgICAgICAgICAgIFFPTVhfRVhUTklOREVYX1ZJREVPX0lOSVRJQUxRUCAqaW5pdGlhbF9xcCA9IChRT01YX0VYVE5JTkRFWF9WSURFT19JTklUSUFMUVAqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBRT01YX0luZGV4UGFyYW1WaWRlb0luaXRpYWxRcCIpOwotICAgICAgICAgICAgICAgIGluaXRpYWxfcXAtPm5RcEkgPSBtX3NTZXNzaW9uUXVhbnRpemF0aW9uLm5RcEk7Ci0gICAgICAgICAgICAgICAgaW5pdGlhbF9xcC0+blFwUCA9IG1fc1Nlc3Npb25RdWFudGl6YXRpb24ublFwUDsKLSAgICAgICAgICAgICAgICBpbml0aWFsX3FwLT5uUXBCID0gbV9zU2Vzc2lvblF1YW50aXphdGlvbi5uUXBCOwotICAgICAgICAgICAgICAgIGluaXRpYWxfcXAtPmJFbmFibGVJbml0UXAgPSBtX1FQU2V0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9JUEJRUFJhbmdlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1FDT01fVklERU9fUEFSQU1fSVBCX1FQUkFOR0VUWVBFKTsKLSAgICAgICAgICAgICAgICBPTVhfUUNPTV9WSURFT19QQVJBTV9JUEJfUVBSQU5HRVRZUEUgKnFwX3JhbmdlID0gKE9NWF9RQ09NX1ZJREVPX1BBUkFNX0lQQl9RUFJBTkdFVFlQRSopIHBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImdldF9wYXJhbWV0ZXI6IE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvSVBCUVBSYW5nZSIpOwotICAgICAgICAgICAgICAgIG1lbWNweShxcF9yYW5nZSwgJm1fc1Nlc3Npb25RUFJhbmdlLCBzaXplb2YobV9zU2Vzc2lvblFQUmFuZ2UpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb246Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUqIGVycm9ycmVzaWxpZW5jZSA9IChPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSopcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbiIpOwotICAgICAgICAgICAgICAgIGVycm9ycmVzaWxpZW5jZS0+YkVuYWJsZUhFQyA9IG1fc0Vycm9yQ29ycmVjdGlvbi5iRW5hYmxlSEVDOwotICAgICAgICAgICAgICAgIGVycm9ycmVzaWxpZW5jZS0+YkVuYWJsZVJlc3luYyA9IG1fc0Vycm9yQ29ycmVjdGlvbi5iRW5hYmxlUmVzeW5jOwotICAgICAgICAgICAgICAgIGVycm9ycmVzaWxpZW5jZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nID0gbV9zRXJyb3JDb3JyZWN0aW9uLm5SZXN5bmNoTWFya2VyU3BhY2luZzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvSW50cmFSZWZyZXNoOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFKiBpbnRyYXJlZnJlc2ggPSAoT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWF9JbmRleFBhcmFtVmlkZW9JbnRyYVJlZnJlc2giKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiT01YX0luZGV4UGFyYW1WaWRlb0ludHJhUmVmcmVzaCBHRVQiKTsKLSAgICAgICAgICAgICAgICBpbnRyYXJlZnJlc2gtPmVSZWZyZXNoTW9kZSA9IG1fc0ludHJhUmVmcmVzaC5lUmVmcmVzaE1vZGU7Ci0gICAgICAgICAgICAgICAgaW50cmFyZWZyZXNoLT5uQ2lyTUJzID0gbV9zSW50cmFSZWZyZXNoLm5DaXJNQnM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBvcnREZWZuOgotICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfQ09NUE9ORU5UX0NBUEFCSUxJVFlfVFlQRV9JTkRFWDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWENvbXBvbmVudENhcGFiaWxpdHlGbGFnc1R5cGUpOwotICAgICAgICAgICAgICAgIE9NWENvbXBvbmVudENhcGFiaWxpdHlGbGFnc1R5cGUgKnBQYXJhbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8T01YQ29tcG9uZW50Q2FwYWJpbGl0eUZsYWdzVHlwZSo+KHBhcmFtRGF0YSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfQ09NUE9ORU5UX0NBUEFCSUxJVFlfVFlQRV9JTkRFWCIpOwotICAgICAgICAgICAgICAgIHBQYXJhbS0+aUlzT01YQ29tcG9uZW50TXVsdGlUaHJlYWRlZCA9IE9NWF9UUlVFOwotICAgICAgICAgICAgICAgIHBQYXJhbS0+aU9NWENvbXBvbmVudFN1cHBvcnRzRXh0ZXJuYWxPdXRwdXRCdWZmZXJBbGxvYyA9IE9NWF9GQUxTRTsKLSAgICAgICAgICAgICAgICBwUGFyYW0tPmlPTVhDb21wb25lbnRTdXBwb3J0c0V4dGVybmFsSW5wdXRCdWZmZXJBbGxvYyA9IE9NWF9UUlVFOwotICAgICAgICAgICAgICAgIHBQYXJhbS0+aU9NWENvbXBvbmVudFN1cHBvcnRzTW92YWJsZUlucHV0QnVmZmVycyA9IE9NWF9UUlVFOwotICAgICAgICAgICAgICAgIHBQYXJhbS0+aU9NWENvbXBvbmVudFVzZXNOQUxTdGFydENvZGVzID0gT01YX1RSVUU7Ci0gICAgICAgICAgICAgICAgcFBhcmFtLT5pT01YQ29tcG9uZW50U3VwcG9ydHNQYXJ0aWFsRnJhbWVzID0gT01YX0ZBTFNFOwotICAgICAgICAgICAgICAgIHBQYXJhbS0+aU9NWENvbXBvbmVudENhbkhhbmRsZUluY29tcGxldGVGcmFtZXMgPSBPTVhfRkFMU0U7Ci0gICAgICAgICAgICAgICAgcFBhcmFtLT5pT01YQ29tcG9uZW50VXNlc0Z1bGxBVkNGcmFtZXMgPSBPTVhfRkFMU0U7Ci0gICAgICAgICAgICAgICAgbV91c2VfaW5wdXRfcG1lbSA9IE9NWF9UUlVFOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiU3VwcG9ydGluZyBjYXBhYmlsaXR5IGluZGV4IGluIGVuY29kZXIgbm9kZSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbUluZGV4RXh0cmFEYXRhVHlwZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIFFPTVhfSU5ERVhFWFRSQURBVEFUWVBFKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImdldF9wYXJhbWV0ZXI6IE9NWF9RY29tSW5kZXhQYXJhbUluZGV4RXh0cmFEYXRhVHlwZSIpOwotICAgICAgICAgICAgICAgIFFPTVhfSU5ERVhFWFRSQURBVEFUWVBFICpwUGFyYW0gPSAoUU9NWF9JTkRFWEVYVFJBREFUQVRZUEUgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+bkluZGV4ID09IChPTVhfSU5ERVhUWVBFKU9NWF9FeHRyYURhdGFWaWRlb0VuY29kZXJTbGljZUluZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX09VVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5iRW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9CT09MKShtX3NFeHRyYURhdGEgJiBWRU5DX0VYVFJBREFUQV9TTElDRUlORk8pOwotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiU2xpY2UgSW5mbyBleHRyYWRhdGEgJWQiLCBwUGFyYW0tPmJFbmFibGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJnZXRfcGFyYW1ldGVyOiBzbGljZSBpbmZvcm1hdGlvbiBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCBmb3Igb3V0cHV0IHBvcnQgb25seSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBQYXJhbS0+bkluZGV4ID09IChPTVhfSU5ERVhUWVBFKU9NWF9FeHRyYURhdGFWaWRlb0VuY29kZXJNQkluZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX09VVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5iRW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9CT09MKShtX3NFeHRyYURhdGEgJiBWRU5DX0VYVFJBREFUQV9NQklORk8pOwotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiTUIgSW5mbyBleHRyYWRhdGEgJWQiLCBwUGFyYW0tPmJFbmFibGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJnZXRfcGFyYW1ldGVyOiBNQiBpbmZvcm1hdGlvbiBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCBmb3Igb3V0cHV0IHBvcnQgb25seSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBQYXJhbS0+bkluZGV4ID09IChPTVhfSU5ERVhUWVBFKU9NWF9FeHRyYURhdGFGcmFtZURpbWVuc2lvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+YkVuYWJsZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfQk9PTCkoKG1fc0V4dHJhRGF0YSAmIFZFTkNfRVhUUkFEQVRBX0ZSQU1FRElNRU5TSU9OKSA/IDEgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZyYW1lIGRpbWVuc2lvbiBleHRyYWRhdGEgJWQiLCBwUGFyYW0tPmJFbmFibGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJnZXRfcGFyYW1ldGVyOiBmcmFtZSBkaW1lbnNpb24gaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsaWQgZm9yIGlucHV0IHBvcnQgb25seSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBQYXJhbS0+bkluZGV4ID09IChPTVhfSU5ERVhUWVBFKU9NWF9FeHRyYURhdGFWaWRlb0xUUkluZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX09VVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5iRW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9CT09MKShtX3NFeHRyYURhdGEgJiBWRU5DX0VYVFJBREFUQV9MVFJJTkZPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkxUUiBJbmZvIGV4dHJhZGF0YSAlZCIsIHBQYXJhbS0+YkVuYWJsZWQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImdldF9wYXJhbWV0ZXI6IExUUiBpbmZvcm1hdGlvbiBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCBmb3Igb3V0cHV0IHBvcnQgb25seSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZ2V0X3BhcmFtZXRlcjogdW5zdXBwb3J0ZWQgZXh0cmFkYXRhIGluZGV4ICgweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUU9NWF9JbmRleFBhcmFtVmlkZW9MVFJDb3VudFJhbmdlU3VwcG9ydGVkOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9FWFROSU5ERVhfUkFOR0VUWVBFKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJnZXRfcGFyYW1ldGVyOiBRT01YX0luZGV4UGFyYW1WaWRlb0xUUkNvdW50UmFuZ2VTdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgICAgICBRT01YX0VYVE5JTkRFWF9SQU5HRVRZUEUgKnBQYXJhbSA9IChRT01YX0VYVE5JTkRFWF9SQU5HRVRZUEUgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX09VVCkgewotICAgICAgICAgICAgICAgICAgICBPTVhfVTMyIG1pbiA9IDAsIG1heCA9IDAsIHN0ZXBfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXZfZ2V0X2NhcGFiaWxpdHlfbHRyY291bnQoJm1pbiwgJm1heCwgJnN0ZXBfc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+bk1pbiA9IG1pbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+bk1heCA9IG1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+blN0ZXBTaXplID0gc3RlcF9zaXplOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImdldF9wYXJhbWV0ZXI6IGdldF9jYXBhYmlsaXR5X2x0cmNvdW50IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJMVFIgY291bnQgcmFuZ2UgaXMgdmFsaWQgZm9yIG91dHB1dCBwb3J0IG9ubHkiKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9MVFJDb3VudDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9RQ09NX1ZJREVPX1BBUkFNX0xUUkNPVU5UX1RZUEUpOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX1Fjb21JbmRleFBhcmFtVmlkZW9MVFJDb3VudCIpOwotICAgICAgICAgICAgICAgIE9NWF9RQ09NX1ZJREVPX1BBUkFNX0xUUkNPVU5UX1RZUEUgKnBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9RQ09NX1ZJREVPX1BBUkFNX0xUUkNPVU5UX1RZUEUqPihwYXJhbURhdGEpOwotICAgICAgICAgICAgICAgIG1lbWNweShwUGFyYW0sICZtX3NQYXJhbUxUUkNvdW50LCBzaXplb2YobV9zUGFyYW1MVFJDb3VudCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFFPTVhfSW5kZXhQYXJhbVZpZGVvU3ludGF4SGRyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9FWFROSU5ERVhfUEFSQU1UWVBFKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJRT01YX0luZGV4UGFyYW1WaWRlb1N5bnRheEhkciIpOwotICAgICAgICAgICAgICAgIFFPTVhfRVhUTklOREVYX1BBUkFNVFlQRSogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRT01YX0VYVE5JTkRFWF9QQVJBTVRZUEUqPihwYXJhbURhdGEpOwotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPnBEYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVycm9yOiBEYXRhIGJ1ZmZlciBpcyBOVUxMIik7Ci0gICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0X3N5bnRheGhkcl9lbmFibGUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBnZXRfcGFyYW1ldGVyOiBHZXQgc3ludGF4IGhlYWRlciBkaXNhYmxlZCIpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJJVE1BU0tfU0VUKCZtX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX0xPQURFRF9TVEFSVF9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2X2xvYWRlZF9zdGFydCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZGV2aWNlIHN0YXJ0IHN1Y2Nlc3NmdWwiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZGV2aWNlIHN0YXJ0IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCZtX2ZsYWdzLCBPTVhfQ09NUE9ORU5UX0xPQURFRF9TVEFSVF9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckhhcmR3YXJlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZGV2X2dldF9zZXFfaGRyKHBQYXJhbS0+cERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKShwUGFyYW0tPm5TaXplIC0gc2l6ZW9mKFFPTVhfRVhUTklOREVYX1BBUkFNVFlQRSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCAqKSh2b2lkICopJnBQYXJhbS0+bkRhdGFTaXplKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJnZXQgc3ludGF4IGhlYWRlciBzdWNjZXNzZnVsIChoZHJsZW4gPSAldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcFBhcmFtLT5uRGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcFBhcmFtLT5uRGF0YVNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJIZWFkZXJbJWRdID0gJXgiLCBpLCAqKChjaGFyICopcFBhcmFtLT5wRGF0YSArIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFcnJvciByZXR1cm5lZCBmcm9tIEdldFN5bnRheEhlYWRlcigpIik7Ci0gICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JIYXJkd2FyZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fZmxhZ3MsIE9NWF9DT01QT05FTlRfTE9BREVEX1NUT1BfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldl9sb2FkZWRfc3RvcCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZGV2aWNlIHN0b3Agc3VjY2Vzc2Z1bCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJkZXZpY2Ugc3RvcCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUigmbV9mbGFncywgT01YX0NPTVBPTkVOVF9MT0FERURfU1RPUF9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckhhcmR3YXJlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4SGllcmFyY2hpY2FsU3RydWN0dXJlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9WSURFT19ISUVSQVJDSElDQUxMQVlFUlMpOwotICAgICAgICAgICAgICAgIFFPTVhfVklERU9fSElFUkFSQ0hJQ0FMTEFZRVJTKiBoaWVycCA9IChRT01YX1ZJREVPX0hJRVJBUkNISUNBTExBWUVSUyopIHBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImdldF9wYXJhbWV0ZXI6IE9NWF9RY29tSW5kZXhIaWVyYXJjaGljYWxTdHJ1Y3R1cmUiKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoaGllcnAsICZtX3NIaWVyTGF5ZXJzLCBzaXplb2YobV9zSGllckxheWVycykpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbUgyNjRWVUlUaW1pbmdJbmZvOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1FDT01fVklERU9fUEFSQU1fVlVJX1RJTUlOR19JTkZPKTsKLSAgICAgICAgICAgICAgICBPTVhfVTMyIGVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgT01YX1FDT01fVklERU9fUEFSQU1fVlVJX1RJTUlOR19JTkZPICpwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9RQ09NX1ZJREVPX1BBUkFNX1ZVSV9USU1JTkdfSU5GTyo+KHBhcmFtRGF0YSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfUWNvbUluZGV4UGFyYW1IMjY0VlVJVGltaW5nSW5mbyIpOwotICAgICAgICAgICAgICAgIGlmICghZGV2X2dldF92dWlfdGltaW5nX2luZm8oJmVuYWJsZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIGVudHJ5IHJldHVybmVkIGZyb20gZ2V0X3Z1aV9UaW1pbmdfaW5mbyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmJFbmFibGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+YkVuYWJsZSA9IChPTVhfQk9PTCllbmFibGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhQYXJhbVZRWklQU0VJVHlwZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9RVElfVklERU9fUEFSQU1fVlFaSVBfU0VJX1RZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9VMzIgZW5hYmxlZDsKLSAgICAgICAgICAgICAgICBPTVhfUVRJX1ZJREVPX1BBUkFNX1ZRWklQX1NFSV9UWVBFICpwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9RVElfVklERU9fUEFSQU1fVlFaSVBfU0VJX1RZUEUqPihwYXJhbURhdGEpOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX1FUSUluZGV4UGFyYW1WUVpJUFNFSVR5cGUiKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRldl9nZXRfdnF6aXBfc2VpX2luZm8oJmVuYWJsZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIGVudHJ5IHJldHVybmVkIGZyb20gZ2V0X3ZxemlwX3NlaV90eXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+YkVuYWJsZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5iRW5hYmxlID0gKE9NWF9CT09MKWVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVBlYWtCaXRyYXRlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1FDT01fVklERU9fUEFSQU1fUEVBS19CSVRSQVRFKTsKLSAgICAgICAgICAgICAgICBPTVhfVTMyIHBlYWtiaXRyYXRlOwotICAgICAgICAgICAgICAgIE9NWF9RQ09NX1ZJREVPX1BBUkFNX1BFQUtfQklUUkFURSAqcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxPTVhfUUNPTV9WSURFT19QQVJBTV9QRUFLX0JJVFJBVEUqPihwYXJhbURhdGEpOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX1Fjb21JbmRleFBhcmFtUGVha0JpdHJhdGUiKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRldl9nZXRfcGVha19iaXRyYXRlKCZwZWFrYml0cmF0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgZW50cnkgcmV0dXJuZWQgZnJvbSBnZXRfcGVha19iaXRyYXRlICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcFBhcmFtLT5uUGVha0JpdHJhdGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+blBlYWtCaXRyYXRlID0gcGVha2JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1CYXRjaFNpemU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUEFSQU1fVTMyVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1BBUkFNX1UzMlRZUEUqIGJhdGNoID0KLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxPTVhfUEFSQU1fVTMyVFlQRSAqPihwYXJhbURhdGEpOwotCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfUWNvbUluZGV4UGFyYW1CYXRjaFNpemUiKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRldl9nZXRfYmF0Y2hfc2l6ZSgmYmF0Y2gtPm5VMzIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIGVudHJ5IHJldHVybmVkIGZyb20gZGV2X2dldF9iYXRjaF9zaXplICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpYmF0Y2gtPm5TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJhdGNoLT5uUG9ydEluZGV4ID0gUE9SVF9JTkRFWF9JTjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1TZXF1ZW5jZUhlYWRlcldpdGhJRFI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBQcmVwZW5kU1BTUFBTVG9JRFJGcmFtZXNQYXJhbXMpOwotICAgICAgICAgICAgICAgIFByZXBlbmRTUFNQUFNUb0lEUkZyYW1lc1BhcmFtcyAqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHJlcGVuZFNQU1BQU1RvSURSRnJhbWVzUGFyYW1zICo+KHBhcmFtRGF0YSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfcGFyYW1ldGVyOiBPTVhfUWNvbUluZGV4UGFyYW1TZXF1ZW5jZUhlYWRlcldpdGhJRFIiKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkocFBhcmFtLCAmbV9zUHJlcGVuZFNQU1BQUywgc2l6ZW9mKG1fc1ByZXBlbmRTUFNQUFMpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1WZW5jQXNwZWN0UmF0aW86Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX0VYVE5JTkRFWF9WSURFT19WRU5DX1NBUik7Ci0gICAgICAgICAgICAgICBRT01YX0VYVE5JTkRFWF9WSURFT19WRU5DX1NBUiAqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRT01YX0VYVE5JTkRFWF9WSURFT19WRU5DX1NBUiAqPihwYXJhbURhdGEpOwotICAgICAgICAgICAgICAgIG1lbWNweShwUGFyYW0sICZtX3NTYXIsIHNpemVvZihtX3NTYXIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUFuZHJvaWRWaWRlb1RlbXBvcmFsTGF5ZXJpbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1RZUEUgKnBMYXllckluZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSo+KHBhcmFtRGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZXZfZ2V0X3RlbXBvcmFsX2xheWVyX2NhcHMoJm1fc1BhcmFtVGVtcG9yYWxMYXllcnMubkxheWVyQ291bnRNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbV9zUGFyYW1UZW1wb3JhbExheWVycy5uQkxheWVyQ291bnRNYXgsICZtX3NQYXJhbVRlbXBvcmFsTGF5ZXJzLmVTdXBwb3J0ZWRQYXR0ZXJucykpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBnZXQgdGVtcG9yYWwgbGF5ZXIgY2FwYWJpbGl0aWVzIik7Ci0gICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JIYXJkd2FyZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHBMYXllckluZm8sICZtX3NQYXJhbVRlbXBvcmFsTGF5ZXJzLCBzaXplb2YobV9zUGFyYW1UZW1wb3JhbExheWVycykpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9TbGljZUZNTzoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkVSUk9SOiBnZXRfcGFyYW1ldGVyOiB1bmtub3duIHBhcmFtICUwOHgiLCBwYXJhbUluZGV4KTsKLSAgICAgICAgICAgICAgICBlUmV0ID1PTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgfQotCi0gICAgcmV0dXJuIGVSZXQ7Ci0KLX0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmlkZW86OkdldENvbmZpZwotCi0gICBERVNDUklQVElPTgotICAgT01YIEdldCBDb25maWcgTWV0aG9kIGltcGxlbWVudGF0aW9uLgotCi0gICBQQVJBTUVURVJTCi0gICA8VEJEPi4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBPTVggRXJyb3IgTm9uZSBpZiBzdWNjZXNzZnVsLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZpZGVvOjpnZXRfY29uZmlnKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgIGhDb21wLAotICAgICAgICBPTVhfSU4gT01YX0lOREVYVFlQRSBjb25maWdJbmRleCwKLSAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgIGNvbmZpZ0RhdGEpCi17Ci0gICAgKHZvaWQpaENvbXA7Ci0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFN1cHBvcnRlZCBDb25maWcgSW5kZXggICAgICAgICAgIFR5cGUKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gT01YX0luZGV4Q29uZmlnVmlkZW9CaXRyYXRlICAgICAgT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRQotICAgIC8vIE9NWF9JbmRleENvbmZpZ1ZpZGVvRnJhbWVyYXRlICAgIE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRQotICAgIC8vIE9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZSAgICAgIE9NWF9DT05GSUdfUk9UQVRJT05UWVBFCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgaWYgKGNvbmZpZ0RhdGEgPT0gTlVMTCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHBhcmFtIGlzIG51bGwiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBpZiAobV9zdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogY2FuJ3QgYmUgaW4gaW52YWxpZCBzdGF0ZSIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247Ci0gICAgfQotCi0gICAgLy9AdG9kbyBuZWVkIHRvIHZhbGlkYXRlIHBhcmFtcwotICAgIHN3aXRjaCAoKGludCljb25maWdJbmRleCkgewotICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvQml0cmF0ZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFKTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFKiBwUGFyYW0gPSByZWludGVycHJldF9jYXN0PE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUqPihjb25maWdEYXRhKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkocFBhcmFtLCAmbV9zQ29uZmlnQml0cmF0ZSwgc2l6ZW9mKG1fc0NvbmZpZ0JpdHJhdGUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0ZyYW1lcmF0ZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRSogcFBhcmFtID0gcmVpbnRlcnByZXRfY2FzdDxPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUqPihjb25maWdEYXRhKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkocFBhcmFtLCAmbV9zQ29uZmlnRnJhbWVyYXRlLCBzaXplb2YobV9zQ29uZmlnRnJhbWVyYXRlKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIE9NWF9DT05GSUdfUk9UQVRJT05UWVBFKTsKLSAgICAgICAgICAgICAgICBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRSogcFBhcmFtID0gcmVpbnRlcnByZXRfY2FzdDxPTVhfQ09ORklHX1JPVEFUSU9OVFlQRSo+KGNvbmZpZ0RhdGEpOwotICAgICAgICAgICAgICAgIG1lbWNweShwUGFyYW0sICZtX3NDb25maWdGcmFtZVJvdGF0aW9uLCBzaXplb2YobV9zQ29uZmlnRnJhbWVSb3RhdGlvbikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFFPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhcGVyaW9kOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X2NvbmZpZzpRT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYXBlcmlvZCIpOwotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIFFPTVhfVklERU9fSU5UUkFQRVJJT0RUWVBFKTsKLSAgICAgICAgICAgICAgICBRT01YX1ZJREVPX0lOVFJBUEVSSU9EVFlQRSogcFBhcmFtID0gcmVpbnRlcnByZXRfY2FzdDxRT01YX1ZJREVPX0lOVFJBUEVSSU9EVFlQRSo+KGNvbmZpZ0RhdGEpOwotICAgICAgICAgICAgICAgIG1lbWNweShwUGFyYW0sICZtX3NJbnRyYXBlcmlvZCwgc2l6ZW9mKG1fc0ludHJhcGVyaW9kKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9BVkNJbnRyYVBlcmlvZDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EKTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EICpwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0QqPihjb25maWdEYXRhKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImdldF9jb25maWc6IE9NWF9JbmRleENvbmZpZ1ZpZGVvQVZDSW50cmFQZXJpb2QiKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkocFBhcmFtLCAmbV9zQ29uZmlnQVZDSURSUGVyaW9kLCBzaXplb2YobV9zQ29uZmlnQVZDSURSUGVyaW9kKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uRGVpbnRlcmxhY2U6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX1ZJREVPX0NPTkZJR19ERUlOVEVSTEFDRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX0NPTkZJR19ERUlOVEVSTEFDRSAqcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxPTVhfVklERU9fQ09ORklHX0RFSU5URVJMQUNFKj4oY29uZmlnRGF0YSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfY29uZmlnOiBPTVhfSW5kZXhDb25maWdDb21tb25EZWludGVybGFjZSIpOwotICAgICAgICAgICAgICAgIG1lbWNweShwUGFyYW0sICZtX3NDb25maWdEZWludGVybGFjZSwgc2l6ZW9mKG1fc0NvbmZpZ0RlaW50ZXJsYWNlKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb1ZwOFJlZmVyZW5jZUZyYW1lOgotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX1ZJREVPX1ZQOFJFRkVSRU5DRUZSQU1FVFlQRSk7Ci0gICAgICAgICAgICAgICBPTVhfVklERU9fVlA4UkVGRVJFTkNFRlJBTUVUWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8T01YX1ZJREVPX1ZQOFJFRkVSRU5DRUZSQU1FVFlQRSo+KGNvbmZpZ0RhdGEpOwotICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfY29uZmlnOiBPTVhfSW5kZXhDb25maWdWaWRlb1ZwOFJlZmVyZW5jZUZyYW1lIik7Ci0gICAgICAgICAgICAgICBtZW1jcHkocFBhcmFtLCAmbV9zQ29uZmlnVnA4UmVmZXJlbmNlRnJhbWUsIHNpemVvZihtX3NDb25maWdWcDhSZWZlcmVuY2VGcmFtZSkpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhDb25maWdOdW1IaWVyUExheWVyczoKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIFFPTVhfRVhUTklOREVYX1ZJREVPX0hJRVJfUF9MQVlFUlMpOwotICAgICAgICAgICAgICAgUU9NWF9FWFROSU5ERVhfVklERU9fSElFUl9QX0xBWUVSUyogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFFPTVhfRVhUTklOREVYX1ZJREVPX0hJRVJfUF9MQVlFUlMqPihjb25maWdEYXRhKTsKLSAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X2NvbmZpZzogT01YX1Fjb21JbmRleENvbmZpZ051bUhpZXJQTGF5ZXJzIik7Ci0gICAgICAgICAgICAgICBtZW1jcHkocFBhcmFtLCAmbV9zSFBsYXllcnMsIHNpemVvZihtX3NIUGxheWVycykpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhDb25maWdRcDoKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIE9NWF9TS1lQRV9WSURFT19DT05GSUdfUVApOwotICAgICAgICAgICAgICAgT01YX1NLWVBFX1ZJREVPX0NPTkZJR19RUCogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9TS1lQRV9WSURFT19DT05GSUdfUVAqPihjb25maWdEYXRhKTsKLSAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X2NvbmZpZzogT01YX1Fjb21JbmRleENvbmZpZ1FwIik7Ci0gICAgICAgICAgICAgICBtZW1jcHkocFBhcmFtLCAmbV9zQ29uZmlnUVAsIHNpemVvZihtX3NDb25maWdRUCkpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhDb25maWdCYXNlTGF5ZXJJZDoKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX1NLWVBFX1ZJREVPX0NPTkZJR19CQVNFTEFZRVJQSUQpOwotICAgICAgICAgICAgICAgT01YX1NLWVBFX1ZJREVPX0NPTkZJR19CQVNFTEFZRVJQSUQqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxPTVhfU0tZUEVfVklERU9fQ09ORklHX0JBU0VMQVlFUlBJRCo+KGNvbmZpZ0RhdGEpOwotICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfY29uZmlnOiBPTVhfUWNvbUluZGV4Q29uZmlnQmFzZUxheWVySWQiKTsKLSAgICAgICAgICAgICAgIG1lbWNweShwUGFyYW0sICZtX3NCYXNlTGF5ZXJJRCwgc2l6ZW9mKG1fc0Jhc2VMYXllcklEKSk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQW5kcm9pZEludHJhUmVmcmVzaDoKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX0lOVFJBUkVGUkVTSFRZUEUpOwotICAgICAgICAgICAgICAgT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX0lOVFJBUkVGUkVTSFRZUEUqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxPTVhfVklERU9fQ09ORklHX0FORFJPSURfSU5UUkFSRUZSRVNIVFlQRSo+KGNvbmZpZ0RhdGEpOwotICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfY29uZmlnOiBPTVhfSW5kZXhDb25maWdBbmRyb2lkSW50cmFSZWZyZXNoIik7Ci0gICAgICAgICAgICAgICBtZW1jcHkocFBhcmFtLCAmbV9zQ29uZmlnSW50cmFSZWZyZXNoLCBzaXplb2YobV9zQ29uZmlnSW50cmFSZWZyZXNoKSk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgIGNhc2UgT01YX1FUSUluZGV4Q29uZmlnVmlkZW9CbHVyUmVzb2x1dGlvbjoKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX1FUSV9WSURFT19DT05GSUdfQkxVUklORk8pOwotICAgICAgICAgICAgICAgT01YX1FUSV9WSURFT19DT05GSUdfQkxVUklORk8qIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxPTVhfUVRJX1ZJREVPX0NPTkZJR19CTFVSSU5GTyo+KGNvbmZpZ0RhdGEpOwotICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfY29uZmlnOiBPTVhfUVRJSW5kZXhDb25maWdWaWRlb0JsdXJSZXNvbHV0aW9uIik7Ci0gICAgICAgICAgICAgICBtZW1jcHkocFBhcmFtLCAmbV9ibHVySW5mbywgc2l6ZW9mKG1fYmx1ckluZm8pKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgY2FzZSBPTVhfUVRJSW5kZXhDb25maWdEZXNjcmliZUNvbG9yQXNwZWN0czoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBEZXNjcmliZUNvbG9yQXNwZWN0c1BhcmFtcyk7Ci0gICAgICAgICAgICAgICAgRGVzY3JpYmVDb2xvckFzcGVjdHNQYXJhbXMqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RGVzY3JpYmVDb2xvckFzcGVjdHNQYXJhbXMqPihjb25maWdEYXRhKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImdldF9jb25maWc6IE9NWF9RVElJbmRleENvbmZpZ0Rlc2NyaWJlQ29sb3JBc3BlY3RzIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+YlJlcXVlc3RpbmdEYXRhU3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkRvZXMgbm90IGhhbmRsZSBkYXRhc3BhY2UgcmVxdWVzdCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5iRGF0YVNwYWNlQ2hhbmdlZCA9PSBPTVhfVFJVRSkgewotCi0gICAgICAgICAgICAgICAgICAgIHByaW50X2RlYnVnX2NvbG9yX2FzcGVjdHMoJihwUGFyYW0tPnNBc3BlY3RzKSwgImdldF9jb25maWcgKGRhdGFzcGFjZSBjaGFuZ2VkKSBDbGllbnQgc2F5cyIpOwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZGF0YXNwYWNlIHNheXMgUkdCLCByZWNvbW1lbmQgNjAxLWxpbWl0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoYXQgaXMgdGhlIGRlc3RpbmF0aW9uIGNvbG9yc3BhY2UgdGhhdCBDMkQgb3IgVmVudXMgd2lsbCBjb252ZXJ0IHRvLgotICAgICAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uUGl4ZWxGb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0lORk8oImdldF9jb25maWcgKGRhdGFzcGFjZSBjaGFuZ2VkKTogQ29sb3JTcGFjZTogUmVjb21tZW5kIDYwMS1saW1pdGVkIGZvciBSR0JBODg4OCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5zQXNwZWN0cy5tUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDYwMV82XzYyNTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+c0FzcGVjdHMubVJhbmdlID0gQ29sb3JBc3BlY3RzOjpSYW5nZUxpbWl0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPnNBc3BlY3RzLm1UcmFuc2ZlciA9IENvbG9yQXNwZWN0czo6VHJhbnNmZXJTTVBURTE3ME07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPnNBc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUNjAxXzY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgSU1QTEVNRU5UQVRJT05fREVGSU5FRCAob3IgYW55dGhpbmcgZWxzZSksIHN0aWNrIHRvIGNsaWVudCdzIGRlZmF1bHRzLgotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSU5GTygiZ2V0X2NvbmZpZyAoZGF0YXNwYWNlIGNoYW5nZWQpOiBDb2xvclNwYWNlOiB1c2UgY2xpZW50LWRlZmF1bHQgZm9yIGZvcm1hdD0leCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+blBpeGVsRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwcmludF9kZWJ1Z19jb2xvcl9hc3BlY3RzKCYocFBhcmFtLT5zQXNwZWN0cyksICJnZXRfY29uZmlnIChkYXRhc3BhY2UgY2hhbmdlZCkgcmVjb21tZW5kZWQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFBhcmFtLCAmbV9zQ29uZmlnQ29sb3JBc3BlY3RzLCBzaXplb2YobV9zQ29uZmlnQ29sb3JBc3BlY3RzKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50X2RlYnVnX2NvbG9yX2FzcGVjdHMoJihwUGFyYW0tPnNBc3BlY3RzKSwgImdldF9jb25maWciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQW5kcm9pZFZpZGVvVGVtcG9yYWxMYXllcmluZzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBPTVhfVklERU9fQ09ORklHX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1RZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSAqbGF5ZXJDb25maWcgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSAqKWNvbmZpZ0RhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJnZXRfY29uZmlnOiBPTVhfSW5kZXhDb25maWdBbmRyb2lkVmlkZW9UZW1wb3JhbExheWVyaW5nIik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGNvbmZpZ0RhdGEsICZtX3NDb25maWdUZW1wb3JhbExheWVycywgc2l6ZW9mKG1fc0NvbmZpZ1RlbXBvcmFsTGF5ZXJzKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQW5kcm9pZFZlbmRvckV4dGVuc2lvbjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX0VYVEVOU0lPTlRZUEUpOwotCi0gICAgICAgICAgICAgICAgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICpleHQgPQotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqPihjb25maWdEYXRhKTsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfVkVORE9SX0VYVEVOU0lPTl9QQVJBTV9EQVRBKGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldF92ZW5kb3JfZXh0ZW5zaW9uX2NvbmZpZyhleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHVuc3VwcG9ydGVkIGluZGV4ICVkIiwgKGludCkgY29uZmlnSW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgfQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotCi19Ci0KLSNkZWZpbmUgZXh0bl9lcXVhbHMocGFyYW0sIGV4dG4pICghc3RyY21wKHBhcmFtLCBleHRuKSkKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92aWRlbzo6R2V0RXh0ZW5zaW9uSW5kZXgKLQotICAgREVTQ1JJUFRJT04KLSAgIE9NWCBHZXRFeHRlbnNpb25JbmRleCBtZXRob2QgaW1wbGVtZW50YWlvbi4gIDxUQkQ+Ci0KLSAgIFBBUkFNRVRFUlMKLSAgIDxUQkQ+LgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIE9NWCBFcnJvciBOb25lIGlmIGV2ZXJ5dGhpbmcgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92aWRlbzo6Z2V0X2V4dGVuc2lvbl9pbmRleChPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBwYXJhbU5hbWUsCi0gICAgICAgIE9NWF9PVVQgT01YX0lOREVYVFlQRSogaW5kZXhUeXBlKQotewotICAgICh2b2lkKWhDb21wOwotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBHZXQgRXh0ZW5zaW9uIEluZGV4IGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0gICAgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5RQ09NLmluZGV4LnBhcmFtLlNsaWNlRGVsaXZlcnlNb2RlIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhFbmFibGVTbGljZURlbGl2ZXJ5TW9kZTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotI2lmZGVmIF9BTkRST0lEX0lDU18KLSAgICBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKSkgewotICAgICAgICAqaW5kZXhUeXBlID0gKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleFBhcmFtVmlkZW9NZXRhQnVmZmVyTW9kZTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotI2VuZGlmCi0gICAgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5wcmVwZW5kU1BTUFBTVG9JRFJGcmFtZXMiKSkgewotICAgICAgICAqaW5kZXhUeXBlID0gKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleFBhcmFtU2VxdWVuY2VIZWFkZXJXaXRoSURSOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uSGllclN0cnVjdHVyZSIpKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfUWNvbUluZGV4SGllcmFyY2hpY2FsU3RydWN0dXJlOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uTFRSQ291bnQiKSkgewotICAgICAgICAqaW5kZXhUeXBlID0gKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleFBhcmFtVmlkZW9MVFJDb3VudDsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLkxUUlBlcmlvZCIpKSB7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLQotICAgIGlmIChleHRuX2VxdWFscyhwYXJhbU5hbWUsICJPTVguUUNPTS5pbmRleC5jb25maWcudmlkZW8uTFRSVXNlIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhDb25maWdWaWRlb0xUUlVzZTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5RQ09NLmluZGV4LmNvbmZpZy52aWRlby5MVFJNYXJrIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhDb25maWdWaWRlb0xUUk1hcms7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLQotICAgIGlmIChleHRuX2VxdWFscyhwYXJhbU5hbWUsICJPTVguUUNPTS5pbmRleC5jb25maWcudmlkZW8uaGllcnBsYXllcnMiKSkgewotICAgICAgICAqaW5kZXhUeXBlID0gKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleENvbmZpZ051bUhpZXJQTGF5ZXJzOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLlFDT00uaW5kZXgucGFyYW0udmlkZW8uYmFzZWxheWVyaWQiKSkgewotICAgICAgICAqaW5kZXhUeXBlID0gKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleENvbmZpZ0Jhc2VMYXllcklkOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLlFDT00uaW5kZXguY29uZmlnLnZpZGVvLnFwIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhDb25maWdRcDsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgIk9NWC5RQ09NLmluZGV4LnBhcmFtLnZpZGVvLnNhciIpKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfUWNvbUluZGV4UGFyYW1WZW5jQXNwZWN0UmF0aW87Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLQotICAgIGlmIChleHRuX2VxdWFscyhwYXJhbU5hbWUsICJPTVguUUNPTS5pbmRleC5wYXJhbS52aWRlby5JbnB1dEJhdGNoIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhQYXJhbUJhdGNoU2l6ZTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgT01YX1FUSV9JTkRFWF9DT05GSUdfVklERU9fU0VUVElNRURBVEEpKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhDb25maWdUaW1lUG9zaXRpb247Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLQotICAgIGlmIChleHRuX2VxdWFscyhwYXJhbU5hbWUsIE9NWF9RVElfSU5ERVhfUEFSQU1fVklERU9fRU5BQkxFX1JPSUlORk8pKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfUVRJSW5kZXhQYXJhbVZpZGVvRW5hYmxlUm9pSW5mbzsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgT01YX1FUSV9JTkRFWF9DT05GSUdfVklERU9fUk9JSU5GTykpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RVElJbmRleENvbmZpZ1ZpZGVvUm9pSW5mbzsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgaWYgKGV4dG5fZXF1YWxzKHBhcmFtTmFtZSwgT01YX1FUSV9JTkRFWF9DT05GSUdfVklERU9fQkxVUklORk8pKSB7Ci0gICAgICAgICppbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSlPTVhfUVRJSW5kZXhDb25maWdWaWRlb0JsdXJSZXNvbHV0aW9uOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlQ29sb3JBc3BlY3RzIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9RVElJbmRleENvbmZpZ0Rlc2NyaWJlQ29sb3JBc3BlY3RzOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoZXh0bl9lcXVhbHMocGFyYW1OYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmFsbG9jYXRlTmF0aXZlSGFuZGxlIikpIHsKLSAgICAgICAgKmluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKU9NWF9Hb29nbGVBbmRyb2lkSW5kZXhBbGxvY2F0ZU5hdGl2ZUhhbmRsZTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9FcnJvck5vdEltcGxlbWVudGVkOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZpZGVvOjpHZXRTdGF0ZQotCi0gICBERVNDUklQVElPTgotICAgUmV0dXJucyB0aGUgc3RhdGUgaW5mb3JtYXRpb24gYmFjayB0byB0aGUgY2FsbGVyLjxUQkQ+Ci0KLSAgIFBBUkFNRVRFUlMKLSAgIDxUQkQ+LgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIEVycm9yIE5vbmUgaWYgZXZlcnl0aGluZyBpcyBzdWNjZXNzZnVsLgotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92aWRlbzo6Z2V0X3N0YXRlKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaENvbXAsCi0gICAgICAgIE9NWF9PVVQgT01YX1NUQVRFVFlQRSogc3RhdGUpCi17Ci0gICAgKHZvaWQpaENvbXA7Ci0gICAgKnN0YXRlID0gbV9zdGF0ZTsKLSAgICBERUJVR19QUklOVF9MT1coImdldF9zdGF0ZTogUmV0dXJuaW5nIHRoZSBzdGF0ZSAlZCIsKnN0YXRlKTsKLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92aWRlbzo6Q29tcG9uZW50VHVubmVsUmVxdWVzdAotCi0gICBERVNDUklQVElPTgotICAgT01YIENvbXBvbmVudCBUdW5uZWwgUmVxdWVzdCBtZXRob2QgaW1wbGVtZW50YXRpb24uIDxUQkQ+Ci0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUuCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgT01YIEVycm9yIE5vbmUgaWYgZXZlcnl0aGluZyBzdWNjZXNzZnVsLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZpZGVvOjpjb21wb25lbnRfdHVubmVsX3JlcXVlc3QoT01YX0lOIE9NWF9IQU5ETEVUWVBFICBoQ29tcCwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgIHBlZXJDb21wb25lbnQsCi0gICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgICBwZWVyUG9ydCwKLSAgICAgICAgT01YX0lOT1VUIE9NWF9UVU5ORUxTRVRVUFRZUEUqIHR1bm5lbFNldHVwKQotewotICAgICh2b2lkKSBoQ29tcCwgKHZvaWQpIHBvcnQsICh2b2lkKSBwZWVyQ29tcG9uZW50LCAodm9pZCkgcGVlclBvcnQsICh2b2lkKSB0dW5uZWxTZXR1cDsKLSAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGNvbXBvbmVudF90dW5uZWxfcmVxdWVzdCBOb3QgSW1wbGVtZW50ZWQiKTsKLSAgICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmlkZW86OlVzZUlucHV0QnVmZmVyCi0KLSAgIERFU0NSSVBUSU9OCi0gICBIZWxwZXIgZnVuY3Rpb24gZm9yIFVzZSBidWZmZXIgaW4gdGhlIGlucHV0IHBpbgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UKLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92aWRlbzo6dXNlX2lucHV0X2J1ZmZlcigKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIGJ1ZmZlckhkciwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgYnl0ZXMsCi0gICAgICAgIE9NWF9JTiBPTVhfVTgqICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikKLXsKLSAgICAodm9pZCkgaENvbXA7Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLQotICAgIHVuc2lnbmVkICAgaSA9IDA7Ci0gICAgdW5zaWduZWQgY2hhciAqYnVmX2FkZHIgPSBOVUxMOwotCi0gICAgREVCVUdfUFJJTlRfSElHSCgidXNlX2lucHV0X2J1ZmZlcjogcG9ydCA9ICV1IGFwcERhdGEgPSAlcCBieXRlcyA9ICV1IGJ1ZmZlciA9ICVwIiwodW5zaWduZWQgaW50KXBvcnQsYXBwRGF0YSwodW5zaWduZWQgaW50KWJ5dGVzLGJ1ZmZlcik7Ci0gICAgaWYgKGJ5dGVzIDwgbV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogdXNlX2lucHV0X2J1ZmZlcjogU2l6ZSBNaXNtYXRjaCEhICIKLSAgICAgICAgICAgICAgICAiYnl0ZXNbJXVdIDwgUG9ydC5uQnVmZmVyU2l6ZVsldV0iLCAodW5zaWduZWQgaW50KWJ5dGVzLCAodW5zaWduZWQgaW50KW1fc0luUG9ydERlZi5uQnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgaWYgKCFtX2lucF9tZW1fcHRyKSB7Ci0gICAgICAgIGlucHV0X3VzZV9idWZmZXIgPSB0cnVlOwotICAgICAgICBtX2lucF9tZW1fcHRyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFKikgXAotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbG9jKCAoc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSksIG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotICAgICAgICBpZiAobV9pbnBfbWVtX3B0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGNhbGxvYygpIEZhaWxlZCBmb3IgbV9pbnBfbWVtX3B0ciIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgICAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgbV9pbnBfbWVtX3B0ciA9ICVwIiwgbV9pbnBfbWVtX3B0cik7Ci0KLQotICAgICAgICBtX3BJbnB1dF9wbWVtID0gKHN0cnVjdCBwbWVtICopIGNhbGxvYyhzaXplb2YgKHN0cnVjdCBwbWVtKSwgbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgIGlmIChtX3BJbnB1dF9wbWVtID09IE5VTEwpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogY2FsbG9jKCkgRmFpbGVkIGZvciBtX3BJbnB1dF9wbWVtIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0jaWZkZWYgVVNFX0lPTgotICAgICAgICBtX3BJbnB1dF9pb24gPSAoc3RydWN0IHZlbmNfaW9uICopIGNhbGxvYyhzaXplb2YgKHN0cnVjdCB2ZW5jX2lvbiksIG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotICAgICAgICBpZiAobV9wSW5wdXRfaW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogY2FsbG9jKCkgRmFpbGVkIGZvciBtX3BJbnB1dF9pb24iKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGZvciAoaT0wOyBpPCBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsOyBpKyspIHsKLSAgICAgICAgICAgIG1fcElucHV0X3BtZW1baV0uZmQgPSAtMTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgICAgICBtX3BJbnB1dF9pb25baV0uaW9uX2RldmljZV9mZCA9LTE7Ci0gICAgICAgICAgICBtX3BJbnB1dF9pb25baV0uZmRfaW9uX2RhdGEuZmQgPS0xOwotICAgICAgICAgICAgbV9wSW5wdXRfaW9uW2ldLmlvbl9hbGxvY19kYXRhLmhhbmRsZSA9IDA7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgZm9yIChpPTA7IGk8IG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKykgewotICAgICAgICBpZiAoQklUTUFTS19BQlNFTlQoJm1faW5wX2JtX2NvdW50LGkpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpIDwgbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCkgewotCi0gICAgICAgICpidWZmZXJIZHIgPSAobV9pbnBfbWVtX3B0ciArIGkpOwotICAgICAgICBCSVRNQVNLX1NFVCgmbV9pbnBfYm1fY291bnQsaSk7Ci0KLSAgICAgICAgKCpidWZmZXJIZHIpLT5wQnVmZmVyICAgICAgICAgICA9IChPTVhfVTggKilidWZmZXI7Ci0gICAgICAgICgqYnVmZmVySGRyKS0+blNpemUgICAgICAgICAgICAgPSBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpOwotICAgICAgICAoKmJ1ZmZlckhkciktPm5WZXJzaW9uLm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICAgICAgKCpidWZmZXJIZHIpLT5uQWxsb2NMZW4gICAgICAgICA9IG1fc0luUG9ydERlZi5uQnVmZmVyU2l6ZTsKLSAgICAgICAgKCpidWZmZXJIZHIpLT5wQXBwUHJpdmF0ZSAgICAgICA9IGFwcERhdGE7Ci0gICAgICAgICgqYnVmZmVySGRyKS0+bklucHV0UG9ydEluZGV4ICAgPSBQT1JUX0lOREVYX0lOOwotCi0gICAgICAgIGlmICghbV91c2VfaW5wdXRfcG1lbSkgewotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgIG1fcElucHV0X2lvbltpXS5pb25fZGV2aWNlX2ZkID0gYWxsb2NfbWFwX2lvbl9tZW1vcnkobV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAmbV9wSW5wdXRfaW9uW2ldLmlvbl9hbGxvY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAmbV9wSW5wdXRfaW9uW2ldLmZkX2lvbl9kYXRhLAotICAgICAgICAgICAgICAgICAgICBzZWN1cmVfc2Vzc2lvbiA/IFNFQ1VSRV9GTEFHU19JTlBVVF9CVUZGRVIgOiAwKTsKLSAgICAgICAgICAgIGlmIChtX3BJbnB1dF9pb25baV0uaW9uX2RldmljZV9mZCA8IDApIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6SU9OIGRldmljZSBvcGVuKCkgRmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcElucHV0X3BtZW1baV0uZmQgPSBtX3BJbnB1dF9pb25baV0uZmRfaW9uX2RhdGEuZmQ7Ci0jZWxzZQotICAgICAgICAgICAgbV9wSW5wdXRfcG1lbVtpXS5mZCA9IG9wZW4gKE1FTV9ERVZJQ0UsT19SRFdSKTsKLSAgICAgICAgICAgIGlmIChtX3BJbnB1dF9wbWVtW2ldLmZkID09IDApIHsKLSAgICAgICAgICAgICAgICBtX3BJbnB1dF9wbWVtW2ldLmZkID0gb3BlbiAoTUVNX0RFVklDRSxPX1JEV1IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobV9wSW5wdXRfcG1lbVtpXSAuZmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAvZGV2L3BtZW1fYWRzcCBvcGVuKCkgRmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgbV9wSW5wdXRfcG1lbVtpXS5zaXplID0gbV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplOwotICAgICAgICAgICAgbV9wSW5wdXRfcG1lbVtpXS5vZmZzZXQgPSAwOwotCi0gICAgICAgICAgICBtX3BJbnB1dF9wbWVtW2ldLmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICBpZighc2VjdXJlX3Nlc3Npb24pIHsKLSAgICAgICAgICAgICAgICBtX3BJbnB1dF9wbWVtW2ldLmJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKLSAgICAgICAgICAgICAgICAgICAgTlVMTCxtX3BJbnB1dF9wbWVtW2ldLnNpemUsUFJPVF9SRUFEfFBST1RfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsbV9wSW5wdXRfcG1lbVtpXS5mZCwwKTsKLQotICAgICAgICAgICAgICAgIGlmIChtX3BJbnB1dF9wbWVtW2ldLmJ1ZmZlciA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogbW1hcCgpIEZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICBtX3BJbnB1dF9wbWVtW2ldLmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlKG1fcElucHV0X3BtZW1baV0uZmQpOwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgICAgICAgICAgZnJlZV9pb25fbWVtb3J5KCZtX3BJbnB1dF9pb25baV0pOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU1fSU5GTyAqcFBhcmFtID0gcmVpbnRlcnByZXRfY2FzdDxPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU1fSU5GTyAqPigoKmJ1ZmZlckhkciktPnBBcHBQcml2YXRlKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiSW5zaWRlIHFjb21fZXh0IHdpdGggbHVtYTooZmQ6JWx1LG9mZnNldDoweCV4KSIsIHBQYXJhbS0+cG1lbV9mZCwgKHVuc2lnbmVkKXBQYXJhbS0+b2Zmc2V0KTsKLQotICAgICAgICAgICAgaWYgKHBQYXJhbSkgewotICAgICAgICAgICAgICAgIG1fcElucHV0X3BtZW1baV0uZmQgPSBwUGFyYW0tPnBtZW1fZmQ7Ci0gICAgICAgICAgICAgICAgbV9wSW5wdXRfcG1lbVtpXS5vZmZzZXQgPSBwUGFyYW0tPm9mZnNldDsKLSAgICAgICAgICAgICAgICBtX3BJbnB1dF9wbWVtW2ldLnNpemUgPSBtX3NJblBvcnREZWYubkJ1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgbV9wSW5wdXRfcG1lbVtpXS5idWZmZXIgPSAodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkRCRzo6IHBQYXJhbS0+cG1lbV9mZCA9ICV1LCBwUGFyYW0tPm9mZnNldCA9ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcFBhcmFtLT5wbWVtX2ZkLCAodW5zaWduZWQgaW50KXBQYXJhbS0+b2Zmc2V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJbnZhbGlkIEFwcERhdGEgZ2l2ZW4gZm9yIFBNRU0gaS9wIFVzZUJ1ZmZlciBjYXNlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIERFQlVHX1BSSU5UX0xPVygidXNlX2lucDo6IGJ1ZmhkciA9ICVwLCBwQnVmZmVyID0gJXAsIG1fcElucHV0X3BtZW1baV0uYnVmZmVyID0gJXAiLAotICAgICAgICAgICAgICAgICgqYnVmZmVySGRyKSwgKCpidWZmZXJIZHIpLT5wQnVmZmVyLCBtX3BJbnB1dF9wbWVtW2ldLmJ1ZmZlcik7Ci0gICAgICAgIGlmIChkZXZfdXNlX2J1ZihQT1JUX0lOREVYX0lOKSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGRldl91c2VfYnVmKCkgRmFpbGVkIGZvciBpL3AgYnVmIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBBbGwgYnVmZmVycyBhcmUgYWxyZWFkeSB1c2VkLCBpbnZhbGlkIHVzZV9idWYgY2FsbCBmb3IgIgotICAgICAgICAgICAgICAgICJpbmRleCA9ICV1IiwgaSk7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZpZGVvOjpVc2VPdXRwdXRCdWZmZXIKLQotICAgREVTQ1JJUFRJT04KLSAgIEhlbHBlciBmdW5jdGlvbiBmb3IgVXNlIGJ1ZmZlciBpbiB0aGUgaW5wdXQgcGluCi0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUuCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgdHJ1ZS9mYWxzZQotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZpZGVvOjp1c2Vfb3V0cHV0X2J1ZmZlcigKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIGJ1ZmZlckhkciwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgYnl0ZXMsCi0gICAgICAgIE9NWF9JTiBPTVhfVTgqICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikKLXsKLSAgICAodm9pZCloQ29tcCwgKHZvaWQpcG9ydDsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAgICAgICpidWZIZHI9IE5VTEw7IC8vIGJ1ZmZlciBoZWFkZXIKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICBpPSAwOyAvLyBUZW1wb3JhcnkgY291bnRlcgotICAgIHVuc2lnbmVkIGNoYXIgKmJ1Zl9hZGRyID0gTlVMTDsKLSAgICBpbnQgYWxpZ25fc2l6ZTsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goIkluc2lkZSB1c2Vfb3V0cHV0X2J1ZmZlcigpIik7Ci0gICAgaWYgKGJ5dGVzIDwgbV9zT3V0UG9ydERlZi5uQnVmZmVyU2l6ZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHVzZV9vdXRwdXRfYnVmZmVyOiBTaXplIE1pc21hdGNoISEgIgotICAgICAgICAgICAgICAgICJieXRlc1sldV0gPCBQb3J0Lm5CdWZmZXJTaXplWyV1XSIsICh1bnNpZ25lZCBpbnQpYnl0ZXMsICh1bnNpZ25lZCBpbnQpbV9zT3V0UG9ydERlZi5uQnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgaWYgKCFtX291dF9tZW1fcHRyKSB7Ci0gICAgICAgIG91dHB1dF91c2VfYnVmZmVyID0gdHJ1ZTsKLSAgICAgICAgaW50IG5CdWZIZHJTaXplICAgICAgICA9IDA7Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJBbGxvY2F0aW5nIEZpcnN0IE91dHB1dCBCdWZmZXIoJXUpIiwodW5zaWduZWQgaW50KW1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICAgICAgbkJ1ZkhkclNpemUgICAgICAgID0gbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwgKiBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpOwotICAgICAgICAvKgotICAgICAgICAgKiBNZW1vcnkgZm9yIG91dHB1dCBzaWRlIGludm9sdmVzIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgICAqIDEuIEFycmF5IG9mIEJ1ZmZlciBIZWFkZXJzCi0gICAgICAgICAqIDIuIEJpdG1hc2sgYXJyYXkgdG8gaG9sZCB0aGUgYnVmZmVyIGFsbG9jYXRpb24gZGV0YWlscwotICAgICAgICAgKiBJbiBvcmRlciB0byBtaW5pbWl6ZSB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgZW50aXJlIGFsbG9jYXRpb24KLSAgICAgICAgICogaXMgZG9uZSBpbiBvbmUgc3RlcC4KLSAgICAgICAgICovCi0gICAgICAgIC8vT01YIEJ1ZmZlciBoZWFkZXIKLSAgICAgICAgbV9vdXRfbWVtX3B0ciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAgKiljYWxsb2MobkJ1ZkhkclNpemUsMSk7Ci0gICAgICAgIGlmIChtX291dF9tZW1fcHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogY2FsbG9jKCkgRmFpbGVkIGZvciBtX291dF9tZW1fcHRyIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9wT3V0cHV0X3BtZW0gPSAoc3RydWN0IHBtZW0gKikgY2FsbG9jKHNpemVvZiAoc3RydWN0IHBtZW0pLCBtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgIGlmIChtX3BPdXRwdXRfcG1lbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGNhbGxvYygpIEZhaWxlZCBmb3IgbV9wT3V0cHV0X3BtZW0iKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgIG1fcE91dHB1dF9pb24gPSAoc3RydWN0IHZlbmNfaW9uICopIGNhbGxvYyhzaXplb2YgKHN0cnVjdCB2ZW5jX2lvbiksIG1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICAgICAgaWYgKG1fcE91dHB1dF9pb24gPT0gTlVMTCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBjYWxsb2MoKSBGYWlsZWQgZm9yIG1fcE91dHB1dF9pb24iKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBpZiAobV9vdXRfbWVtX3B0cikgewotICAgICAgICAgICAgYnVmSGRyICAgICAgICAgID0gIG1fb3V0X21lbV9wdHI7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk1lbW9yeSBBbGxvY2F0aW9uIFN1Y2NlZWRlZCBmb3IgT1VUIHBvcnQlcCIsbV9vdXRfbWVtX3B0cik7Ci0gICAgICAgICAgICAvLyBTZXR0dGluZyB0aGUgZW50aXJlIHN0b3JhZ2UgbmljZWx5Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVmSGRyLT5uU2l6ZSAgICAgICAgICAgICAgPSBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+blZlcnNpb24ublZlcnNpb24gID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICBidWZIZHItPm5BbGxvY0xlbiAgICAgICAgICA9IGJ5dGVzOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+bkZpbGxlZExlbiAgICAgICAgID0gMDsKLSAgICAgICAgICAgICAgICBidWZIZHItPnBBcHBQcml2YXRlICAgICAgICA9IGFwcERhdGE7Ci0gICAgICAgICAgICAgICAgYnVmSGRyLT5uT3V0cHV0UG9ydEluZGV4ICAgPSBQT1JUX0lOREVYX09VVDsKLSAgICAgICAgICAgICAgICBidWZIZHItPnBCdWZmZXIgICAgICAgICAgICA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYnVmSGRyKys7Ci0gICAgICAgICAgICAgICAgbV9wT3V0cHV0X3BtZW1baV0uZmQgPSAtMTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgICAgICAgICAgbV9wT3V0cHV0X2lvbltpXS5pb25fZGV2aWNlX2ZkID0tMTsKLSAgICAgICAgICAgICAgICBtX3BPdXRwdXRfaW9uW2ldLmZkX2lvbl9kYXRhLmZkPS0xOwotICAgICAgICAgICAgICAgIG1fcE91dHB1dF9pb25baV0uaW9uX2FsbG9jX2RhdGEuaGFuZGxlID0gMDsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBPdXRwdXQgYnVmIG1lbSBhbGxvYyBmYWlsZWRbMHglcF0iLG1fb3V0X21lbV9wdHIpOwotICAgICAgICAgICAgZVJldCA9ICBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTwgbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKykgewotICAgICAgICBpZiAoQklUTUFTS19BQlNFTlQoJm1fb3V0X2JtX2NvdW50LGkpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlUmV0ID09IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgaWYgKGkgPCBtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCkgewotICAgICAgICAgICAgKmJ1ZmZlckhkciA9IChtX291dF9tZW1fcHRyICsgaSApOwotICAgICAgICAgICAgKCpidWZmZXJIZHIpLT5wQnVmZmVyID0gKE9NWF9VOCAqKWJ1ZmZlcjsKLSAgICAgICAgICAgICgqYnVmZmVySGRyKS0+cEFwcFByaXZhdGUgPSBhcHBEYXRhOwotCi0gICAgICAgICAgICBpZiAoIW1fdXNlX291dHB1dF9wbWVtKSB7Ci0jaWZkZWYgVVNFX0lPTgotICAgICAgICAgICAgICAgIGFsaWduX3NpemUgPSAobV9zT3V0UG9ydERlZi5uQnVmZmVyU2l6ZSArIChTWl80SyAtIDEpKSAmIH4oU1pfNEsgLSAxKTsKLSAgICAgICAgICAgICAgICBtX3BPdXRwdXRfaW9uW2ldLmlvbl9kZXZpY2VfZmQgPSBhbGxvY19tYXBfaW9uX21lbW9yeShhbGlnbl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgJm1fcE91dHB1dF9pb25baV0uaW9uX2FsbG9jX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbV9wT3V0cHV0X2lvbltpXS5mZF9pb25fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZV9zZXNzaW9uID8gU0VDVVJFX0ZMQUdTX09VVFBVVF9CVUZGRVIgOiAwKTsKLSAgICAgICAgICAgICAgICBpZiAobV9wT3V0cHV0X2lvbltpXS5pb25fZGV2aWNlX2ZkIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6SU9OIGRldmljZSBvcGVuKCkgRmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2ldLmZkID0gbV9wT3V0cHV0X2lvbltpXS5mZF9pb25fZGF0YS5mZDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgbV9wT3V0cHV0X3BtZW1baV0uZmQgPSBvcGVuIChNRU1fREVWSUNFLE9fUkRXUik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobV9wT3V0cHV0X3BtZW1baV0uZmQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtX3BPdXRwdXRfcG1lbVtpXS5mZCA9IG9wZW4gKE1FTV9ERVZJQ0UsT19SRFdSKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobV9wT3V0cHV0X3BtZW1baV0uZmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogL2Rldi9wbWVtX2Fkc3Agb3BlbigpIEZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2ldLnNpemUgPSBtX3NPdXRQb3J0RGVmLm5CdWZmZXJTaXplOwotICAgICAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2ldLm9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBtX3BPdXRwdXRfcG1lbVtpXS5idWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmKCFzZWN1cmVfc2Vzc2lvbikgewotICAgICAgICAgICAgICAgICAgICBtX3BPdXRwdXRfcG1lbVtpXS5idWZmZXIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduX3NpemUsUFJPVF9SRUFEfFBST1RfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELG1fcE91dHB1dF9wbWVtW2ldLmZkLDApOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9wT3V0cHV0X3BtZW1baV0uYnVmZmVyID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogbW1hcCgpIEZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3V0cHV0X3BtZW1baV0uYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKG1fcE91dHB1dF9wbWVtW2ldLmZkKTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2lvbl9tZW1vcnkoJm1fcE91dHB1dF9pb25baV0pOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU1fSU5GTyAqcFBhcmFtID0gcmVpbnRlcnByZXRfY2FzdDxPTVhfUUNPTV9QTEFURk9STV9QUklWQVRFX1BNRU1fSU5GTyo+KCgqYnVmZmVySGRyKS0+cEFwcFByaXZhdGUpOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiSW5zaWRlIHFjb21fZXh0IHBQYXJhbTogJXAiLCBwUGFyYW0pOwotCi0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkluc2lkZSBxY29tX2V4dCB3aXRoIGx1bWE6KGZkOiVsdSxvZmZzZXQ6MHgleCkiLCBwUGFyYW0tPnBtZW1fZmQsIChpbnQpcFBhcmFtLT5vZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBtX3BPdXRwdXRfcG1lbVtpXS5mZCA9IHBQYXJhbS0+cG1lbV9mZDsKLSAgICAgICAgICAgICAgICAgICAgbV9wT3V0cHV0X3BtZW1baV0ub2Zmc2V0ID0gcFBhcmFtLT5vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2ldLnNpemUgPSBtX3NPdXRQb3J0RGVmLm5CdWZmZXJTaXplOwotICAgICAgICAgICAgICAgICAgICBtX3BPdXRwdXRfcG1lbVtpXS5idWZmZXIgPSAodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEludmFsaWQgQXBwRGF0YSBnaXZlbiBmb3IgUE1FTSBvL3AgVXNlQnVmZmVyIGNhc2UiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ1c2Vfb3V0OjogYnVmaGRyID0gJXAsIHBCdWZmZXIgPSAlcCwgbV9wT3V0cHV0X3BtZW1baV0uYnVmZmVyID0gJXAiLAotICAgICAgICAgICAgICAgICAgICAoKmJ1ZmZlckhkciksICgqYnVmZmVySGRyKS0+cEJ1ZmZlciwgbV9wT3V0cHV0X3BtZW1baV0uYnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChkZXZfdXNlX2J1ZihQT1JUX0lOREVYX09VVCkgIT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZGV2X3VzZV9idWYgRmFpbGVkIGZvciBvL3AgYnVmIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQklUTUFTS19TRVQoJm1fb3V0X2JtX2NvdW50LGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBBbGwgby9wIEJ1ZmZlcnMgaGF2ZSBiZWVuIFVzZWQsIGludmFsaWQgdXNlX2J1ZiBjYWxsIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICJpbmRleCA9ICV1IiwgaSk7Ci0gICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlUmV0OwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmlkZW86OlVzZUJ1ZmZlcgotCi0gICBERVNDUklQVElPTgotICAgT01YIFVzZSBCdWZmZXIgbWV0aG9kIGltcGxlbWVudGF0aW9uLgotCi0gICBQQVJBTUVURVJTCi0gICA8VEJEPi4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBPTVggRXJyb3IgTm9uZSAsIGlmIGV2ZXJ5dGhpbmcgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92aWRlbzo6dXNlX2J1ZmZlcigKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIGJ1ZmZlckhkciwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgYnl0ZXMsCi0gICAgICAgIE9NWF9JTiBPTVhfVTgqICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBVc2UgQnVmZmVyIGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICB9Ci0gICAgaWYgKHBvcnQgPT0gUE9SVF9JTkRFWF9JTikgewotICAgICAgICBlUmV0ID0gdXNlX2lucHV0X2J1ZmZlcihoQ29tcCxidWZmZXJIZHIscG9ydCxhcHBEYXRhLGJ5dGVzLGJ1ZmZlcik7Ci0gICAgfSBlbHNlIGlmIChwb3J0ID09IFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgIGVSZXQgPSB1c2Vfb3V0cHV0X2J1ZmZlcihoQ29tcCxidWZmZXJIZHIscG9ydCxhcHBEYXRhLGJ5dGVzLGJ1ZmZlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJbnZhbGlkIFBvcnQgSW5kZXggcmVjZWl2ZWQgJWQiLChpbnQpcG9ydCk7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgfQotCi0gICAgaWYgKGVSZXQgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBpZiAoYWxsb2NhdGVfZG9uZSgpKSB7Ci0gICAgICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCZtX2ZsYWdzLE9NWF9DT01QT05FTlRfSURMRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNhbGxiYWNrIG5vdwotICAgICAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoKCZtX2ZsYWdzKSxPTVhfQ09NUE9ORU5UX0lETEVfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfQ29tbWFuZFN0YXRlU2V0LE9NWF9TdGF0ZUlkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocG9ydCA9PSBQT1JUX0lOREVYX0lOICYmIG1fc0luUG9ydERlZi5iUG9wdWxhdGVkKSB7Ci0gICAgICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCZtX2ZsYWdzLE9NWF9DT01QT05FTlRfSU5QVVRfRU5BQkxFX1BFTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUigoJm1fZmxhZ3MpLE9NWF9DT01QT05FTlRfSU5QVVRfRU5BQkxFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0NvbW1hbmRQb3J0RW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgUE9SVF9JTkRFWF9JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVZFTlQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAocG9ydCA9PSBQT1JUX0lOREVYX09VVCAmJiBtX3NPdXRQb3J0RGVmLmJQb3B1bGF0ZWQpIHsKLSAgICAgICAgICAgIGlmIChCSVRNQVNLX1BSRVNFTlQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9PVVRQVVRfRU5BQkxFX1BFTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUigoJm1fZmxhZ3MpLE9NWF9DT01QT05FTlRfT1VUUFVUX0VOQUJMRV9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9Db21tYW5kUG9ydEVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBPUlRfSU5ERVhfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgbV9ldmVudF9wb3J0X3NldHRpbmdzX3NlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZVJldDsKLX0KLQotT01YX0VSUk9SVFlQRSBvbXhfdmlkZW86OmZyZWVfaW5wdXRfYnVmZmVyKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXJIZHIpCi17Ci0gICAgdW5zaWduZWQgaW50IGluZGV4ID0gMDsKLSAgICBPTVhfVTggKnRlbXBfYnVmZiA7Ci0KLSAgICBpZiAoYnVmZmVySGRyID09IE5VTEwgfHwgbV9pbnBfbWVtX3B0ciA9PSBOVUxMKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZnJlZV9pbnB1dDogSW52YWxpZCBidWZmZXJIZHJbJXBdIG9yIG1faW5wX21lbV9wdHJbJXBdIiwKLSAgICAgICAgICAgICAgICBidWZmZXJIZHIsIG1faW5wX21lbV9wdHIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGluZGV4ID0gYnVmZmVySGRyIC0gKCghbWV0YV9tb2RlX2VuYWJsZSk/bV9pbnBfbWVtX3B0cjptZXRhX2J1ZmZlcl9oZHIpOwotI2lmZGVmIF9BTkRST0lEX0lDU18KLSAgICBpZiAobWV0YV9tb2RlX2VuYWJsZSkgewotICAgICAgICBpZiAoaW5kZXggPCBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKSB7Ci0gICAgICAgICAgICBtZW1zZXQoJm1ldGFfYnVmZmVyX2hkcltpbmRleF0sIDAsIHNpemVvZihtZXRhX2J1ZmZlcl9oZHJbaW5kZXhdKSk7Ci0gICAgICAgICAgICBtZW1zZXQoJm1ldGFfYnVmZmVyc1tpbmRleF0sIDAsIHNpemVvZihtZXRhX2J1ZmZlcnNbaW5kZXhdKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtVXNlUHJveHlDb2xvckZvcm1hdCkKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG9wYXF1ZV9idWZmZXJfaGRyW2luZGV4XSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAoaW5kZXggPCBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsICYmICFtVXNlUHJveHlDb2xvckZvcm1hdCAmJgotICAgICAgICAgICAgZGV2X2ZyZWVfYnVmKCZtX3BJbnB1dF9wbWVtW2luZGV4XSxQT1JUX0lOREVYX0lOKSAhPSB0cnVlKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiRVJST1I6IGRldl9mcmVlX2J1ZigpIEZhaWxlZCBmb3IgaS9wIGJ1ZiIpOwotICAgIH0KLQotICAgIGlmIChpbmRleCA8IG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwgJiYgbV9wSW5wdXRfcG1lbSkgewotICAgICAgICBhdXRvX2xvY2sgbChtX2xvY2spOwotCi0gICAgICAgIGlmIChtVXNlUHJveHlDb2xvckZvcm1hdCkgewotICAgICAgICAgICAgaWYgKG1fb3BxX3BtZW1fcS5tX3NpemUpIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHAxLCBpZDsKLSAgICAgICAgICAgICAgICBtX29wcV9wbWVtX3EucG9wX2VudHJ5KCZhZGRyLCAmcDEsICZpZCk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJSZW1vdmVkIGVudHJ5IGluIG1fb3BxX3BtZW1fcTogYWRkcmVzcyAlbHUiLCBhZGRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3BJbnB1dF9wbWVtW2luZGV4XS5mZCA+IDAgJiYgaW5wdXRfdXNlX2J1ZmZlciA9PSBmYWxzZSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlQnVmZmVyOjogaS9wIEFsbG9jYXRlQnVmZmVyIGNhc2UiKTsKLSAgICAgICAgICAgIGlmKCFzZWN1cmVfc2Vzc2lvbikgewotICAgICAgICAgICAgICAgIG11bm1hcCAobV9wSW5wdXRfcG1lbVtpbmRleF0uYnVmZmVyLG1fcElucHV0X3BtZW1baW5kZXhdLnNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcmVlKG1fcElucHV0X3BtZW1baW5kZXhdLmJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BJbnB1dF9wbWVtW2luZGV4XS5idWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgY2xvc2UgKG1fcElucHV0X3BtZW1baW5kZXhdLmZkKTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgICAgICBmcmVlX2lvbl9tZW1vcnkoJm1fcElucHV0X2lvbltpbmRleF0pOwotI2VuZGlmCi0gICAgICAgICAgICBtX3BJbnB1dF9wbWVtW2luZGV4XS5mZCA9IC0xOwotICAgICAgICB9IGVsc2UgaWYgKG1fcElucHV0X3BtZW1baW5kZXhdLmZkID4gMCAmJiAoaW5wdXRfdXNlX2J1ZmZlciA9PSB0cnVlICYmCi0gICAgICAgICAgICAgICAgICAgIG1fdXNlX2lucHV0X3BtZW0gPT0gT01YX0ZBTFNFKSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlQnVmZmVyOjogaS9wIEhlYXAgVXNlQnVmZmVyIGNhc2UiKTsKLSAgICAgICAgICAgIGlmIChkZXZfZnJlZV9idWYoJm1fcElucHV0X3BtZW1baW5kZXhdLFBPUlRfSU5ERVhfSU4pICE9IHRydWUpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGRldl9mcmVlX2J1ZigpIEZhaWxlZCBmb3IgaS9wIGJ1ZiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIXNlY3VyZV9zZXNzaW9uKSB7Ci0gICAgICAgICAgICAgICAgbXVubWFwIChtX3BJbnB1dF9wbWVtW2luZGV4XS5idWZmZXIsbV9wSW5wdXRfcG1lbVtpbmRleF0uc2l6ZSk7Ci0gICAgICAgICAgICAgICAgbV9wSW5wdXRfcG1lbVtpbmRleF0uYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsb3NlIChtX3BJbnB1dF9wbWVtW2luZGV4XS5mZCk7Ci0jaWZkZWYgVVNFX0lPTgotICAgICAgICAgICAgZnJlZV9pb25fbWVtb3J5KCZtX3BJbnB1dF9pb25baW5kZXhdKTsKLSNlbmRpZgotICAgICAgICAgICAgbV9wSW5wdXRfcG1lbVtpbmRleF0uZmQgPSAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGcmVlQnVmZmVyOjogZmQgaXMgaW52YWxpZCBvciBpL3AgUE1FTSBVc2VCdWZmZXIgY2FzZSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92aWRlbzo6ZnJlZV9vdXRwdXRfYnVmZmVyKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXJIZHIpCi17Ci0gICAgdW5zaWduZWQgaW50IGluZGV4ID0gMDsKLSAgICBPTVhfVTggKnRlbXBfYnVmZiA7Ci0KLSAgICBpZiAoYnVmZmVySGRyID09IE5VTEwgfHwgbV9vdXRfbWVtX3B0ciA9PSBOVUxMKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZnJlZV9vdXRwdXQ6IEludmFsaWQgYnVmZmVySGRyWyVwXSBvciBtX291dF9tZW1fcHRyWyVwXSIsCi0gICAgICAgICAgICAgICAgYnVmZmVySGRyLCBtX291dF9tZW1fcHRyKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgaW5kZXggPSBidWZmZXJIZHIgLSBtX291dF9tZW1fcHRyOwotCi0gICAgaWYgKGluZGV4IDwgbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwgJiYKLSAgICAgICAgICAgIGRldl9mcmVlX2J1ZigmbV9wT3V0cHV0X3BtZW1baW5kZXhdLFBPUlRfSU5ERVhfT1VUKSAhPSB0cnVlKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZGV2X2ZyZWVfYnVmIEZhaWxlZCBmb3Igby9wIGJ1ZiIpOwotICAgIH0KLQotICAgIGlmIChpbmRleCA8IG1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsICYmIG1fcE91dHB1dF9wbWVtKSB7Ci0gICAgICAgIGlmIChtX3BPdXRwdXRfcG1lbVtpbmRleF0uZmQgPiAwICYmIG91dHB1dF91c2VfYnVmZmVyID09IGZhbHNlICkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlQnVmZmVyOjogby9wIEFsbG9jYXRlQnVmZmVyIGNhc2UiKTsKLSAgICAgICAgICAgIGlmKCFzZWN1cmVfc2Vzc2lvbikgewotICAgICAgICAgICAgICAgIG11bm1hcCAobV9wT3V0cHV0X3BtZW1baW5kZXhdLmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2luZGV4XS5zaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRlX25hdGl2ZV9oYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSAobmF0aXZlX2hhbmRsZV90ICopbV9wT3V0cHV0X3BtZW1baW5kZXhdLmJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKmRhdGEgPSAoY2hhciopIG1fcE91dHB1dF9wbWVtW2luZGV4XS5idWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZoYW5kbGUsIGRhdGEgKyBzaXplb2YoT01YX1UzMiksIHNpemVvZihuYXRpdmVfaGFuZGxlX3QqKSk7Ci0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUobV9wT3V0cHV0X3BtZW1baW5kZXhdLmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xvc2UgKG1fcE91dHB1dF9wbWVtW2luZGV4XS5mZCk7Ci0jaWZkZWYgVVNFX0lPTgotICAgICAgICAgICAgZnJlZV9pb25fbWVtb3J5KCZtX3BPdXRwdXRfaW9uW2luZGV4XSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2luZGV4XS5mZCA9IC0xOwotICAgICAgICB9IGVsc2UgaWYgKCBtX3BPdXRwdXRfcG1lbVtpbmRleF0uZmQgPiAwICYmIChvdXRwdXRfdXNlX2J1ZmZlciA9PSB0cnVlCi0gICAgICAgICAgICAgICAgICAgICYmIG1fdXNlX291dHB1dF9wbWVtID09IE9NWF9GQUxTRSkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZUJ1ZmZlcjo6IG8vcCBIZWFwIFVzZUJ1ZmZlciBjYXNlIik7Ci0gICAgICAgICAgICBpZiAoZGV2X2ZyZWVfYnVmKCZtX3BPdXRwdXRfcG1lbVtpbmRleF0sUE9SVF9JTkRFWF9PVVQpICE9IHRydWUpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGRldl9mcmVlX2J1ZiBGYWlsZWQgZm9yIG8vcCBidWYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCFzZWN1cmVfc2Vzc2lvbikgewotICAgICAgICAgICAgICAgIG11bm1hcCAobV9wT3V0cHV0X3BtZW1baW5kZXhdLmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2luZGV4XS5zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsb3NlIChtX3BPdXRwdXRfcG1lbVtpbmRleF0uZmQpOwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgIGZyZWVfaW9uX21lbW9yeSgmbV9wT3V0cHV0X2lvbltpbmRleF0pOwotI2VuZGlmCi0gICAgICAgICAgICBtX3BPdXRwdXRfcG1lbVtpbmRleF0uZmQgPSAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZUJ1ZmZlcjo6IGZkIGlzIGludmFsaWQgb3Igby9wIFBNRU0gVXNlQnVmZmVyIGNhc2UiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLX0KLSNpZmRlZiBfQU5EUk9JRF9JQ1NfCi1PTVhfRVJST1JUWVBFIG9teF92aWRlbzo6YWxsb2NhdGVfaW5wdXRfbWV0YV9idWZmZXIoCi0gICAgICAgIE9NWF9IQU5ETEVUWVBFICAgICAgIGhDb21wLAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlckhkciwKLSAgICAgICAgT01YX1BUUiAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgYnl0ZXMpCi17Ci0gICAgdW5zaWduZWQgaW5kZXggPSAwOwotICAgIC8vIEluIG1ldGEtbW9kZSBhbGxvYy1sZW5ndGggaXMgbm90IGtub3duIGNvbmNsdXNpdmVseQotICAgIC8vIEFsbG93IGFsbG9jYXRpb24gZm9yIGF0bGVhc3QgZ3JhbGxvYyBtZXRhZGF0YSBoYW5kbGVzCi0gICAgLy8gIGFuZCBjaGVjayBmb3Igc2l6ZSBpbiBFVEIKLSAgICBpZiAoIWJ1ZmZlckhkciB8fCBieXRlcyA8IHNpemVvZihWaWRlb0dyYWxsb2NNZXRhZGF0YSkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIndyb25nIHBhcmFtcyBhbGxvY2F0ZV9pbnB1dF9tZXRhX2J1ZmZlciBIZHIgJXAgbGVuICV1IiwKLSAgICAgICAgICAgICAgICBidWZmZXJIZHIsICh1bnNpZ25lZCBpbnQpYnl0ZXMpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGlmICghbV9pbnBfbWVtX3B0ciAmJiAhbVVzZVByb3h5Q29sb3JGb3JtYXQpIHsKLSAgICAgICAgbV9pbnBfbWVtX3B0ciA9IG1ldGFfYnVmZmVyX2hkcjsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ1c2UgbWV0YV9idWZmZXJfaGRyICglcCkgYXMgbV9pbnBfbWVtX3B0ciA9ICVwIiwKLSAgICAgICAgICAgICAgICBtZXRhX2J1ZmZlcl9oZHIsIG1faW5wX21lbV9wdHIpOwotICAgIH0KLSAgICBmb3IgKGluZGV4ID0gMDsgKChpbmRleCA8IG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpICYmCi0gICAgICAgICAgICAgICAgbWV0YV9idWZmZXJfaGRyW2luZGV4XS5wQnVmZmVyKTsgaW5kZXgrKyk7Ci0gICAgaWYgKGluZGV4ID09IG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkFsbCBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgaW5wdXRfbWV0YV9idWZmZXIiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgaWYgKG1Vc2VQcm94eUNvbG9yRm9ybWF0KSB7Ci0gICAgICAgIGlmIChvcGFxdWVfYnVmZmVyX2hkcltpbmRleF0pIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJBbGwgYnVmZmVycyBhcmUgYWxsb2NhdGVkIG9wYXF1ZV9idWZmZXJfaGRyIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhbGxvY2F0ZV9pbnB1dF9idWZmZXIoaENvbXAsJm9wYXF1ZV9idWZmZXJfaGRyW2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgUE9SVF9JTkRFWF9JTixhcHBEYXRhLG1fc0luUG9ydERlZi5uQnVmZmVyU2l6ZSkgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkFsbCBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgb3BhcXVlX2J1ZmZlcl9oZHIiKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQklUTUFTS19TRVQoJm1faW5wX2JtX2NvdW50LGluZGV4KTsKLSAgICAqYnVmZmVySGRyID0gJm1ldGFfYnVmZmVyX2hkcltpbmRleF07Ci0gICAgbWVtc2V0KCZtZXRhX2J1ZmZlcl9oZHJbaW5kZXhdLCAwLCBzaXplb2YobWV0YV9idWZmZXJfaGRyW2luZGV4XSkpOwotICAgIG1ldGFfYnVmZmVyX2hkcltpbmRleF0ublNpemUgPSBzaXplb2YobWV0YV9idWZmZXJfaGRyW2luZGV4XSk7Ci0gICAgbWV0YV9idWZmZXJfaGRyW2luZGV4XS5uQWxsb2NMZW4gPSBieXRlczsKLSAgICBtZXRhX2J1ZmZlcl9oZHJbaW5kZXhdLm5WZXJzaW9uLm5WZXJzaW9uID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICBtZXRhX2J1ZmZlcl9oZHJbaW5kZXhdLm5JbnB1dFBvcnRJbmRleCA9IFBPUlRfSU5ERVhfSU47Ci0gICAgbWV0YV9idWZmZXJfaGRyW2luZGV4XS5wQnVmZmVyID0gKE9NWF9VOCopJm1ldGFfYnVmZmVyc1tpbmRleF07Ci0gICAgbWV0YV9idWZmZXJfaGRyW2luZGV4XS5wQXBwUHJpdmF0ZSA9IGFwcERhdGE7Ci0gICAgaWYgKG1Vc2VQcm94eUNvbG9yRm9ybWF0KSB7Ci0gICAgICAgIG1fb3BxX3BtZW1fcS5pbnNlcnRfZW50cnkoKHVuc2lnbmVkIGxvbmcpb3BhcXVlX2J1ZmZlcl9oZHJbaW5kZXhdLDAsMCk7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIm9wYXF1ZV9idWZmZXJfaGRyIGluc2VydCAlcCIsIG9wYXF1ZV9idWZmZXJfaGRyW2luZGV4XSk7Ci0gICAgfQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotI2VuZGlmCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZlbmM6OkFsbG9jYXRlSW5wdXRCdWZmZXIKLQotICAgREVTQ1JJUFRJT04KLSAgIEhlbHBlciBmdW5jdGlvbiBmb3IgYWxsb2NhdGUgYnVmZmVyIGluIHRoZSBpbnB1dCBwaW4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmlkZW86OmFsbG9jYXRlX2lucHV0X2J1ZmZlcigKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIGJ1ZmZlckhkciwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgYnl0ZXMpCi17Ci0gICAgKHZvaWQpaENvbXAsICh2b2lkKXBvcnQ7Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICB1bnNpZ25lZCAgIGkgPSAwOwotCi0gICAgREVCVUdfUFJJTlRfSElHSCgiYWxsb2NhdGVfaW5wdXRfYnVmZmVyKCk6OiIpOwotICAgIGlmIChieXRlcyA8IG1fc0luUG9ydERlZi5uQnVmZmVyU2l6ZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEJ1ZmZlciBzaXplIG1pc21hdGNoIGVycm9yOiBieXRlc1sldV0gPCBuQnVmZmVyU2l6ZVsldV0iLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpYnl0ZXMsICh1bnNpZ25lZCBpbnQpbV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBpZiAoIW1faW5wX21lbV9wdHIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiJXM6IHNpemUgPSAldSwgYWN0dWFsIGNudCAldSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KW1fc0luUG9ydERlZi5uQnVmZmVyU2l6ZSwgKHVuc2lnbmVkIGludCltX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICAgICAgbV9pbnBfbWVtX3B0ciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSopIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxvYyggKHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpLCBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICAgICAgaWYgKG1faW5wX21lbV9wdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBjYWxsb2MoKSBGYWlsZWQgZm9yIG1faW5wX21lbV9wdHIiKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgbV9pbnBfbWVtX3B0ciA9ICVwIiwgbV9pbnBfbWVtX3B0cik7Ci0gICAgICAgIG1fcElucHV0X3BtZW0gPSAoc3RydWN0IHBtZW0gKikgY2FsbG9jKHNpemVvZiAoc3RydWN0IHBtZW0pLCBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKLQotICAgICAgICBpZiAobV9wSW5wdXRfcG1lbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGNhbGxvYygpIEZhaWxlZCBmb3IgbV9wSW5wdXRfcG1lbSIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgbV9wSW5wdXRfaW9uID0gKHN0cnVjdCB2ZW5jX2lvbiAqKSBjYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgdmVuY19pb24pLCBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICAgICAgaWYgKG1fcElucHV0X2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGNhbGxvYygpIEZhaWxlZCBmb3IgbV9wSW5wdXRfaW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgZm9yIChpPTA7IGk8IG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKykgewotICAgICAgICAgICAgbV9wSW5wdXRfcG1lbVtpXS5mZCA9IC0xOwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgIG1fcElucHV0X2lvbltpXS5pb25fZGV2aWNlX2ZkID0tMTsKLSAgICAgICAgICAgIG1fcElucHV0X2lvbltpXS5mZF9pb25fZGF0YS5mZCA9LTE7Ci0gICAgICAgICAgICBtX3BJbnB1dF9pb25baV0uaW9uX2FsbG9jX2RhdGEuaGFuZGxlID0gMDsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGk8IG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKykgewotICAgICAgICBpZiAoQklUTUFTS19BQlNFTlQoJm1faW5wX2JtX2NvdW50LGkpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaSA8IG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKLQotICAgICAgICAqYnVmZmVySGRyID0gKG1faW5wX21lbV9wdHIgKyBpKTsKLSAgICAgICAgKCpidWZmZXJIZHIpLT5uU2l6ZSAgICAgICAgICAgICA9IHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSk7Ci0gICAgICAgICgqYnVmZmVySGRyKS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICAoKmJ1ZmZlckhkciktPm5BbGxvY0xlbiAgICAgICAgID0gbV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplOwotICAgICAgICAoKmJ1ZmZlckhkciktPnBBcHBQcml2YXRlICAgICAgID0gYXBwRGF0YTsKLSAgICAgICAgKCpidWZmZXJIZHIpLT5uSW5wdXRQb3J0SW5kZXggICA9IFBPUlRfSU5ERVhfSU47Ci0gICAgICAgIC8vIG1ha2UgZmQgYXZhaWxhYmxlIHRvIGFwcCBsYXllciwgaGVscCB3aXRoIHRlc3RpbmcKLSAgICAgICAgKCpidWZmZXJIZHIpLT5wSW5wdXRQb3J0UHJpdmF0ZSA9IChPTVhfUFRSKSZtX3BJbnB1dF9wbWVtW2ldOwotCi0jaWZkZWYgVVNFX0lPTgotICAgICAgICBtX3BJbnB1dF9pb25baV0uaW9uX2RldmljZV9mZCA9IGFsbG9jX21hcF9pb25fbWVtb3J5KG1fc0luUG9ydERlZi5uQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAmbV9wSW5wdXRfaW9uW2ldLmlvbl9hbGxvY19kYXRhLAotICAgICAgICAgICAgICAgICZtX3BJbnB1dF9pb25baV0uZmRfaW9uX2RhdGEsCi0gICAgICAgICAgICAgICAgc2VjdXJlX3Nlc3Npb24gPyBTRUNVUkVfRkxBR1NfSU5QVVRfQlVGRkVSIDogMCk7Ci0gICAgICAgIGlmIChtX3BJbnB1dF9pb25baV0uaW9uX2RldmljZV9mZCA8IDApIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjpJT04gZGV2aWNlIG9wZW4oKSBGYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBtX3BJbnB1dF9wbWVtW2ldLmZkID0gbV9wSW5wdXRfaW9uW2ldLmZkX2lvbl9kYXRhLmZkOwotI2Vsc2UKLSAgICAgICAgbV9wSW5wdXRfcG1lbVtpXS5mZCA9IG9wZW4gKE1FTV9ERVZJQ0UsT19SRFdSKTsKLQotICAgICAgICBpZiAobV9wSW5wdXRfcG1lbVtpXS5mZCA9PSAwKSB7Ci0gICAgICAgICAgICBtX3BJbnB1dF9wbWVtW2ldLmZkID0gb3BlbiAoTUVNX0RFVklDRSxPX1JEV1IpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fcElucHV0X3BtZW1baV0uZmQgPCAwKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IC9kZXYvcG1lbV9hZHNwIG9wZW4oKSBGYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBtX3BJbnB1dF9wbWVtW2ldLnNpemUgPSBtX3NJblBvcnREZWYubkJ1ZmZlclNpemU7Ci0gICAgICAgIG1fcElucHV0X3BtZW1baV0ub2Zmc2V0ID0gMDsKLQotICAgICAgICBtX3BJbnB1dF9wbWVtW2ldLmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIGlmKCFzZWN1cmVfc2Vzc2lvbikgewotICAgICAgICAgICAgbV9wSW5wdXRfcG1lbVtpXS5idWZmZXIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoTlVMTCwKLSAgICAgICAgICAgICAgICBtX3BJbnB1dF9wbWVtW2ldLnNpemUsUFJPVF9SRUFEfFBST1RfV1JJVEUsCi0gICAgICAgICAgICAgICAgTUFQX1NIQVJFRCxtX3BJbnB1dF9wbWVtW2ldLmZkLDApOwotICAgICAgICAgICAgaWYgKG1fcElucHV0X3BtZW1baV0uYnVmZmVyID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IG1tYXAgRkFJTEVEPSAlZCIsIGVycm5vKTsKLSAgICAgICAgICAgICAgICBtX3BJbnB1dF9wbWVtW2ldLmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgY2xvc2UobV9wSW5wdXRfcG1lbVtpXS5mZCk7Ci0jaWZkZWYgVVNFX0lPTgotICAgICAgICAgICAgICAgIGZyZWVfaW9uX21lbW9yeSgmbV9wSW5wdXRfaW9uW2ldKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL1RoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgcGFzc2luZyByZWZlcmVuY2UgdG8gc291cmNlIHR5cGUgYW5kCi0gICAgICAgICAgICAvL3NlY3VyZSBoYW5kbGUgZmQgc3RydWN0IG5hdGl2ZV9oYW5kbGVfdCoKLSAgICAgICAgICAgIG1fcElucHV0X3BtZW1baV0uYnVmZmVyID0gbWFsbG9jKHNpemVvZihPTVhfVTMyKSArIHNpemVvZihuYXRpdmVfaGFuZGxlX3QqKSk7Ci0gICAgICAgICAgICBpZiAobV9wSW5wdXRfcG1lbVtpXS5idWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG5hdGl2ZS1oYW5kbGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgqYnVmZmVySGRyKS0+bkFsbG9jTGVuID0gc2l6ZW9mKE9NWF9VMzIpICsgc2l6ZW9mKG5hdGl2ZV9oYW5kbGVfdCopOwotICAgICAgICB9Ci0KLSAgICAgICAgKCpidWZmZXJIZHIpLT5wQnVmZmVyICAgICAgICAgICA9IChPTVhfVTggKiltX3BJbnB1dF9wbWVtW2ldLmJ1ZmZlcjsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJWaXJ0dWFsIGFkZHJlc3MgaW4gYWxsb2NhdGUgYnVmZmVyIGlzICVwIiwgbV9wSW5wdXRfcG1lbVtpXS5idWZmZXIpOwotICAgICAgICBCSVRNQVNLX1NFVCgmbV9pbnBfYm1fY291bnQsaSk7Ci0gICAgICAgIC8vaGVyZSBjaGFuZ2UgdGhlIEkvUCBwYXJhbSBoZXJlIGZyb20gYnVmX2FkciB0byBwbWVtCi0gICAgICAgIGlmICghbVVzZVByb3h5Q29sb3JGb3JtYXQgJiYgKGRldl91c2VfYnVmKFBPUlRfSU5ERVhfSU4pICE9IHRydWUpKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGRldl91c2VfYnVmIEZBSUxFRCBmb3IgaS9wIGJ1ZiIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogQWxsIGkvcCBidWZmZXJzIGFyZSBhbGxvY2F0ZWQsIGludmFsaWQgYWxsb2NhdGUgYnVmIGNhbGwiCi0gICAgICAgICAgICAgICAgImZvciBpbmRleCBbJWRdIiwgaSk7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZW5jOjpBbGxvY2F0ZU91dHB1dEJ1ZmZlcgotCi0gICBERVNDUklQVElPTgotICAgSGVscGVyIGZuIGZvciBBbGxvY2F0ZUJ1ZmZlciBpbiB0aGUgb3V0cHV0IHBpbgotCi0gICBQQVJBTUVURVJTCi0gICA8VEJEPi4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBPTVggRXJyb3IgTm9uZSBpZiBldmVyeXRoaW5nIHdlbnQgd2VsbC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92aWRlbzo6YWxsb2NhdGVfb3V0cHV0X2J1ZmZlcigKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIGJ1ZmZlckhkciwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgYXBwRGF0YSwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgYnl0ZXMpCi17Ci0gICAgKHZvaWQpaENvbXAsICh2b2lkKXBvcnQ7Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgICAgICAqYnVmSGRyPSBOVUxMOyAvLyBidWZmZXIgaGVhZGVyCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgaT0gMDsgLy8gVGVtcG9yYXJ5IGNvdW50ZXIKLSAgICBpbnQgYWxpZ25fc2l6ZTsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goImFsbG9jYXRlX291dHB1dF9idWZmZXIoKWZvciAldSBieXRlcyIsICh1bnNpZ25lZCBpbnQpYnl0ZXMpOwotICAgIGlmICghbV9vdXRfbWVtX3B0cikgewotICAgICAgICBpbnQgbkJ1ZkhkclNpemUgICAgICAgID0gMDsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiJXM6IHNpemUgPSAldSwgYWN0dWFsIGNudCAldSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KW1fc091dFBvcnREZWYubkJ1ZmZlclNpemUsICh1bnNpZ25lZCBpbnQpbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotICAgICAgICBuQnVmSGRyU2l6ZSAgICAgICAgPSBtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCAqIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTWVtb3J5IGZvciBvdXRwdXQgc2lkZSBpbnZvbHZlcyB0aGUgZm9sbG93aW5nOgotICAgICAgICAgKiAxLiBBcnJheSBvZiBCdWZmZXIgSGVhZGVycwotICAgICAgICAgKiAyLiBCaXRtYXNrIGFycmF5IHRvIGhvbGQgdGhlIGJ1ZmZlciBhbGxvY2F0aW9uIGRldGFpbHMKLSAgICAgICAgICogSW4gb3JkZXIgdG8gbWluaW1pemUgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGVudGlyZSBhbGxvY2F0aW9uCi0gICAgICAgICAqIGlzIGRvbmUgaW4gb25lIHN0ZXAuCi0gICAgICAgICAqLwotICAgICAgICBtX291dF9tZW1fcHRyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICAqKWNhbGxvYyhuQnVmSGRyU2l6ZSwxKTsKLQotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgbV9wT3V0cHV0X2lvbiA9IChzdHJ1Y3QgdmVuY19pb24gKikgY2FsbG9jKHNpemVvZiAoc3RydWN0IHZlbmNfaW9uKSwgbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotICAgICAgICBpZiAobV9wT3V0cHV0X2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGNhbGxvYygpIEZhaWxlZCBmb3IgbV9wT3V0cHV0X2lvbiIpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIG1fcE91dHB1dF9wbWVtID0gKHN0cnVjdCBwbWVtICopIGNhbGxvYyhzaXplb2Yoc3RydWN0IHBtZW0pLCBtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgIGlmIChtX3BPdXRwdXRfcG1lbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGNhbGxvYygpIEZhaWxlZCBmb3IgbV9wT3V0cHV0X3BtZW0iKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fb3V0X21lbV9wdHIgJiYgbV9wT3V0cHV0X3BtZW0pIHsKLSAgICAgICAgICAgIGJ1ZkhkciAgICAgICAgICA9ICBtX291dF9tZW1fcHRyOwotCi0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVmSGRyLT5uU2l6ZSAgICAgICAgICAgICAgPSBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+blZlcnNpb24ublZlcnNpb24gID0gT01YX1NQRUNfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHZhbHVlcyB3aGVuIHdlIGRldGVybWluZSB0aGUgcmlnaHQgSHhXIHBhcmFtCi0gICAgICAgICAgICAgICAgYnVmSGRyLT5uQWxsb2NMZW4gICAgICAgICAgPSBieXRlczsKLSAgICAgICAgICAgICAgICBidWZIZHItPm5GaWxsZWRMZW4gICAgICAgICA9IDA7Ci0gICAgICAgICAgICAgICAgYnVmSGRyLT5wQXBwUHJpdmF0ZSAgICAgICAgPSBhcHBEYXRhOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+bk91dHB1dFBvcnRJbmRleCAgID0gUE9SVF9JTkRFWF9PVVQ7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZSBmZCBhdmFpbGFibGUgdG8gYXBwIGxheWVyLCBoZWxwIHdpdGggdGVzdGluZwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+cE91dHB1dFBvcnRQcml2YXRlID0gKE9NWF9QVFIpJm1fcE91dHB1dF9wbWVtW2ldOwotICAgICAgICAgICAgICAgIGJ1Zkhkci0+cEJ1ZmZlciAgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgICAgICAgICBidWZIZHIrKzsKLSAgICAgICAgICAgICAgICBtX3BPdXRwdXRfcG1lbVtpXS5mZCA9IC0xOwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgICAgICAgICBtX3BPdXRwdXRfaW9uW2ldLmlvbl9kZXZpY2VfZmQgPS0xOwotICAgICAgICAgICAgICAgIG1fcE91dHB1dF9pb25baV0uZmRfaW9uX2RhdGEuZmQ9LTE7Ci0gICAgICAgICAgICAgICAgbV9wT3V0cHV0X2lvbltpXS5pb25fYWxsb2NfZGF0YS5oYW5kbGUgPSAwOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGNhbGxvYygpIGZhaWxlZCBmb3IgbV9vdXRfbWVtX3B0ci9tX3BPdXRwdXRfcG1lbSIpOwotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0hJR0goImFjdHVhbCBjbnQgPSAldSIsICh1bnNpZ25lZCBpbnQpbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotICAgIGZvciAoaT0wOyBpPCBtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7Ci0gICAgICAgIGlmIChCSVRNQVNLX0FCU0VOVCgmbV9vdXRfYm1fY291bnQsaSkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRm91bmQgYSBGcmVlIE91dHB1dCBCdWZmZXIgJWQiLGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGVSZXQgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBpZiAoaSA8IG1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKSB7Ci0jaWZkZWYgVVNFX0lPTgotICAgICAgICAgICAgYWxpZ25fc2l6ZSA9IEFMSUdOKG1fc091dFBvcnREZWYubkJ1ZmZlclNpemUsIDQwOTYpOwotICAgICAgICAgICAgbV9wT3V0cHV0X2lvbltpXS5pb25fZGV2aWNlX2ZkID0gYWxsb2NfbWFwX2lvbl9tZW1vcnkoYWxpZ25fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgJm1fcE91dHB1dF9pb25baV0uaW9uX2FsbG9jX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICZtX3BPdXRwdXRfaW9uW2ldLmZkX2lvbl9kYXRhLAotICAgICAgICAgICAgICAgICAgICBzZWN1cmVfc2Vzc2lvbiA/IFNFQ1VSRV9GTEFHU19PVVRQVVRfQlVGRkVSIDogSU9OX0ZMQUdfQ0FDSEVEKTsKLSAgICAgICAgICAgIGlmIChtX3BPdXRwdXRfaW9uW2ldLmlvbl9kZXZpY2VfZmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOklPTiBkZXZpY2Ugb3BlbigpIEZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2ldLmZkID0gbV9wT3V0cHV0X2lvbltpXS5mZF9pb25fZGF0YS5mZDsKLSNlbHNlCi0gICAgICAgICAgICBtX3BPdXRwdXRfcG1lbVtpXS5mZCA9IG9wZW4gKE1FTV9ERVZJQ0UsT19SRFdSKTsKLSAgICAgICAgICAgIGlmIChtX3BPdXRwdXRfcG1lbVtpXS5mZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9wT3V0cHV0X3BtZW1baV0uZmQgPSBvcGVuIChNRU1fREVWSUNFLE9fUkRXUik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtX3BPdXRwdXRfcG1lbVtpXS5mZCA8IDApIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IC9kZXYvcG1lbV9hZHNwIG9wZW4oKSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBtX3BPdXRwdXRfcG1lbVtpXS5zaXplID0gbV9zT3V0UG9ydERlZi5uQnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2ldLm9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2ldLmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAqYnVmZmVySGRyID0gKG1fb3V0X21lbV9wdHIgKyBpICk7Ci0KLSAgICAgICAgICAgIGlmKCFzZWN1cmVfc2Vzc2lvbikgewotICAgICAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2ldLmJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcChOVUxMLAotICAgICAgICAgICAgICAgICAgICBhbGlnbl9zaXplLFBST1RfUkVBRHxQUk9UX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELG1fcE91dHB1dF9wbWVtW2ldLmZkLDApOwotICAgICAgICAgICAgICAgIGlmIChtX3BPdXRwdXRfcG1lbVtpXS5idWZmZXIgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE1NQVBfRkFJTEVEIGluIG8vcCBhbGxvYyBidWZmZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgbV9wT3V0cHV0X3BtZW1baV0uYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UgKG1fcE91dHB1dF9wbWVtW2ldLmZkKTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgICAgICAgICAgICAgIGZyZWVfaW9uX21lbW9yeSgmbV9wT3V0cHV0X2lvbltpXSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL1RoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgcGFzc2luZyByZWZlcmVuY2UgdG8gc291cmNlIHR5cGUgYW5kCi0gICAgICAgICAgICAgICAgLy9zZWN1cmUgaGFuZGxlIGZkIHN0cnVjdCBuYXRpdmVfaGFuZGxlX3QqCi0gICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRlX25hdGl2ZV9oYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEgLypudW1GZHMqLywgMyAvKm51bUludHMqLyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbmgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJOYXRpdmUgaGFuZGxlIGNyZWF0ZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmgtPmRhdGFbMF0gPSBtX3BPdXRwdXRfcG1lbVtpXS5mZDsKLSAgICAgICAgICAgICAgICAgICAgbmgtPmRhdGFbMV0gPSAwOwotICAgICAgICAgICAgICAgICAgICBuaC0+ZGF0YVsyXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG5oLT5kYXRhWzNdID0gQUxJR04obV9zT3V0UG9ydERlZi5uQnVmZmVyU2l6ZSwgNDA5Nik7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtW2ldLmJ1ZmZlciA9IChPTVhfVTggKiluaDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDMpOyAvL2ZkLCBvZmZzZXQsIHNpemUsIGFsbG9jIGxlbmd0aAotICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBuYXRpdmUgaGFuZGxlIGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3BPdXRwdXRfcG1lbVtpXS5idWZmZXIgPSBtYWxsb2Moc2l6ZW9mKG91dHB1dF9tZXRhYnVmZmVyKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BPdXRwdXRfcG1lbVtpXS5idWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWV0YSBidWZmZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICgqYnVmZmVySGRyKS0+bkFsbG9jTGVuID0gc2l6ZW9mKG91dHB1dF9tZXRhYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlLT5kYXRhWzBdID0gbV9wT3V0cHV0X3BtZW1baV0uZmQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+ZGF0YVsxXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+ZGF0YVsyXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+ZGF0YVszXSA9IEFMSUdOKG1fc091dFBvcnREZWYubkJ1ZmZlclNpemUsIDQwOTYpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXRfbWV0YWJ1ZmZlciAqYnVmZmVyID0gKG91dHB1dF9tZXRhYnVmZmVyKikgbV9wT3V0cHV0X3BtZW1baV0uYnVmZmVyOwotICAgICAgICAgICAgICAgICAgICBidWZmZXItPnR5cGUgPSAxOwotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm5oID0gaGFuZGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKCpidWZmZXJIZHIpLT5wQnVmZmVyID0gKE9NWF9VOCAqKW1fcE91dHB1dF9wbWVtW2ldLmJ1ZmZlcjsKLSAgICAgICAgICAgICgqYnVmZmVySGRyKS0+cEFwcFByaXZhdGUgPSBhcHBEYXRhOwotCi0gICAgICAgICAgICBCSVRNQVNLX1NFVCgmbV9vdXRfYm1fY291bnQsaSk7Ci0KLSAgICAgICAgICAgIGlmIChkZXZfdXNlX2J1ZihQT1JUX0lOREVYX09VVCkgIT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZGV2X3VzZV9idWYgRkFJTEVEIGZvciBvL3AgYnVmIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogQWxsIG8vcCBidWZmZXJzIGFyZSBhbGxvY2F0ZWQsIGludmFsaWQgYWxsb2NhdGUgYnVmIGNhbGwiCi0gICAgICAgICAgICAgICAgICAgICJmb3IgaW5kZXggWyVkXSBhY3R1YWw6ICV1IiwgaSwgKHVuc2lnbmVkIGludCltX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZVJldDsKLX0KLQotCi0vLyBBbGxvY2F0ZUJ1ZmZlciAgLS0gQVBJIENhbGwKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmlkZW86OkFsbG9jYXRlQnVmZmVyCi0KLSAgIERFU0NSSVBUSU9OCi0gICBSZXR1cm5zIHplcm8gaWYgYWxsIHRoZSBidWZmZXJzIHJlbGVhc2VkLi4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmlkZW86OmFsbG9jYXRlX2J1ZmZlcihPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIGJ1ZmZlckhkciwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBieXRlcykKLXsKLQotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7IC8vIE9NWCByZXR1cm4gdHlwZQotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJBbGxvY2F0ZSBidWZmZXIgb2Ygc2l6ZSA9ICV1IG9uIHBvcnQgJWQiLCAodW5zaWduZWQgaW50KWJ5dGVzLCAoaW50KXBvcnQpOwotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBBbGxvY2F0ZSBCdWYgaW4gSW52YWxpZCBTdGF0ZSIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgIH0KLQotICAgIC8vIFdoYXQgaWYgdGhlIGNsaWVudCBjYWxscyBhZ2Fpbi4KLSAgICBpZiAocG9ydCA9PSBQT1JUX0lOREVYX0lOKSB7Ci0jaWZkZWYgX0FORFJPSURfSUNTXwotICAgICAgICBpZiAobWV0YV9tb2RlX2VuYWJsZSkKLSAgICAgICAgICAgIGVSZXQgPSBhbGxvY2F0ZV9pbnB1dF9tZXRhX2J1ZmZlcihoQ29tcCxidWZmZXJIZHIsYXBwRGF0YSxieXRlcyk7Ci0gICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgZVJldCA9IGFsbG9jYXRlX2lucHV0X2J1ZmZlcihoQ29tcCxidWZmZXJIZHIscG9ydCxhcHBEYXRhLGJ5dGVzKTsKLSAgICB9IGVsc2UgaWYgKHBvcnQgPT0gUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgZVJldCA9IGFsbG9jYXRlX291dHB1dF9idWZmZXIoaENvbXAsYnVmZmVySGRyLHBvcnQsYXBwRGF0YSxieXRlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJbnZhbGlkIFBvcnQgSW5kZXggcmVjZWl2ZWQgJWQiLChpbnQpcG9ydCk7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgfQotICAgIERFQlVHX1BSSU5UX0xPVygiQ2hlY2tpbmcgZm9yIE91dHB1dCBBbGxvY2F0ZSBidWZmZXIgRG9uZSIpOwotICAgIGlmIChlUmV0ID09IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgaWYgKGFsbG9jYXRlX2RvbmUoKSkgewotICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmbV9mbGFncyxPTVhfQ09NUE9ORU5UX0lETEVfUEVORElORykpIHsKLSAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBjYWxsYmFjayBub3cKLSAgICAgICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCgmbV9mbGFncyksT01YX0NPTVBPTkVOVF9JRExFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgIHBvc3RfZXZlbnQoT01YX0NvbW1hbmRTdGF0ZVNldCxPTVhfU3RhdGVJZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvcnQgPT0gUE9SVF9JTkRFWF9JTiAmJiBtX3NJblBvcnREZWYuYlBvcHVsYXRlZCkgewotICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmbV9mbGFncyxPTVhfQ09NUE9ORU5UX0lOUFVUX0VOQUJMRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoKCZtX2ZsYWdzKSxPTVhfQ09NUE9ORU5UX0lOUFVUX0VOQUJMRV9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9Db21tYW5kUG9ydEVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBPUlRfSU5ERVhfSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocG9ydCA9PSBQT1JUX0lOREVYX09VVCAmJiBtX3NPdXRQb3J0RGVmLmJQb3B1bGF0ZWQpIHsKLSAgICAgICAgICAgIGlmIChCSVRNQVNLX1BSRVNFTlQoJm1fZmxhZ3MsT01YX0NPTVBPTkVOVF9PVVRQVVRfRU5BQkxFX1BFTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUigoJm1fZmxhZ3MpLE9NWF9DT01QT05FTlRfT1VUUFVUX0VOQUJMRV9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9Db21tYW5kUG9ydEVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBPUlRfSU5ERVhfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgICAgICAgICAgbV9ldmVudF9wb3J0X3NldHRpbmdzX3NlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBERUJVR19QUklOVF9MT1coIkFsbG9jYXRlIEJ1ZmZlciBleGl0IHdpdGggcmV0IENvZGUgJWQiLGVSZXQpOwotICAgIHJldHVybiBlUmV0OwotfQotCi0KLS8vIEZyZWUgQnVmZmVyIC0gQVBJIGNhbGwKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmlkZW86OkZyZWVCdWZmZXIKLQotICAgREVTQ1JJUFRJT04KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmlkZW86OmZyZWVfYnVmZmVyKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgIGhDb21wLAotICAgICAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBidWZmZXIpCi17Ci0gICAgKHZvaWQpaENvbXA7Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICB1bnNpZ25lZCBpbnQgblBvcnRJbmRleDsKLQotICAgIERFQlVHX1BSSU5UX0xPVygiSW4gZm9yIGVuY29kZXIgZnJlZV9idWZmZXIiKTsKLQotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUlkbGUgJiYKLSAgICAgICAgICAgIChCSVRNQVNLX1BSRVNFTlQoJm1fZmxhZ3MgLE9NWF9DT01QT05FTlRfTE9BRElOR19QRU5ESU5HKSkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCIgZnJlZSBidWZmZXIgd2hpbGUgQ29tcG9uZW50IGluIExvYWRpbmcgcGVuZGluZyIpOwotICAgIH0gZWxzZSBpZiAoKG1fc0luUG9ydERlZi5iRW5hYmxlZCA9PSBPTVhfRkFMU0UgJiYgcG9ydCA9PSBQT1JUX0lOREVYX0lOKXx8Ci0gICAgICAgICAgICAobV9zT3V0UG9ydERlZi5iRW5hYmxlZCA9PSBPTVhfRkFMU0UgJiYgcG9ydCA9PSBQT1JUX0lOREVYX09VVCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlIEJ1ZmZlciB3aGlsZSBwb3J0ICV1IGRpc2FibGVkIiwgKHVuc2lnbmVkIGludClwb3J0KTsKLSAgICB9IGVsc2UgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nIHx8IG1fc3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJbnZhbGlkIHN0YXRlIHRvIGZyZWUgYnVmZmVyLHBvcnRzIG5lZWQgdG8gYmUgZGlzYWJsZWQiKTsKLSAgICAgICAgcG9zdF9ldmVudChPTVhfRXZlbnRFcnJvciwKLSAgICAgICAgICAgICAgICBPTVhfRXJyb3JQb3J0VW5wb3B1bGF0ZWQsCi0gICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgIHJldHVybiBlUmV0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogSW52YWxpZCBzdGF0ZSB0byBmcmVlIGJ1ZmZlcixwb3J0IGxvc3QgQnVmZmVycyIpOwotICAgICAgICBwb3N0X2V2ZW50KE9NWF9FdmVudEVycm9yLAotICAgICAgICAgICAgICAgIE9NWF9FcnJvclBvcnRVbnBvcHVsYXRlZCwKLSAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICB9Ci0KLSAgICBpZiAocG9ydCA9PSBQT1JUX0lOREVYX0lOKSB7Ci0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBidWZmZXIgaXMgdmFsaWQKLSAgICAgICAgblBvcnRJbmRleCA9IGJ1ZmZlciAtICgoIW1ldGFfbW9kZV9lbmFibGUpP21faW5wX21lbV9wdHI6bWV0YV9idWZmZXJfaGRyKTsKLQotICAgICAgICBERUJVR19QUklOVF9MT1coImZyZWVfYnVmZmVyIG9uIGkvcCBwb3J0IC0gUG9ydCBpZHggJXUsIGFjdHVhbCBjbnQgJXUiLAotICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsICh1bnNpZ25lZCBpbnQpbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgIGlmIChuUG9ydEluZGV4IDwgbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCAmJgotICAgICAgICAgICAgICAgIEJJVE1BU0tfUFJFU0VOVCgmbV9pbnBfYm1fY291bnQsIG5Qb3J0SW5kZXgpKSB7Ci0gICAgICAgICAgICAvLyBDbGVhciB0aGUgYml0IGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoJm1faW5wX2JtX2NvdW50LG5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgZnJlZV9pbnB1dF9idWZmZXIgKGJ1ZmZlcik7Ci0gICAgICAgICAgICBtX3NJblBvcnREZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKLQotICAgICAgICAgICAgLypGcmVlIHRoZSBCdWZmZXIgSGVhZGVyKi8KLSAgICAgICAgICAgIGlmIChyZWxlYXNlX2lucHV0X2RvbmUoKSkgewotICAgICAgICAgICAgICAgIGlucHV0X3VzZV9idWZmZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAvLyAibV9pbnBfbWVtX3B0ciIgbWF5IHBvaW50IHRvICJtZXRhX2J1ZmZlcl9oZHIiIGluIHNvbWUgbW9kZXMsCi0gICAgICAgICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSwgaXQgd2FzIG5vdCBleHBsaWNpdGx5IGFsbG9jYXRlZAotICAgICAgICAgICAgICAgIGlmIChtX2lucF9tZW1fcHRyICYmIG1faW5wX21lbV9wdHIgIT0gbWV0YV9idWZmZXJfaGRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZWluZyBtX2lucF9tZW1fcHRyIik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUgKG1faW5wX21lbV9wdHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX2lucF9tZW1fcHRyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZiAobV9wSW5wdXRfcG1lbSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkZyZWVpbmcgbV9wSW5wdXRfcG1lbSIpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKG1fcElucHV0X3BtZW0pOwotICAgICAgICAgICAgICAgICAgICBtX3BJbnB1dF9wbWVtID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgVVNFX0lPTgotICAgICAgICAgICAgICAgIGlmIChtX3BJbnB1dF9pb24pIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlaW5nIG1fcElucHV0X2lvbiIpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKG1fcElucHV0X2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1fcElucHV0X2lvbiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGZyZWVfYnVmZmVyICxQb3J0IEluZGV4IEludmFsaWQiKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCgmbV9mbGFncyksT01YX0NPTVBPTkVOVF9JTlBVVF9ESVNBQkxFX1BFTkRJTkcpCi0gICAgICAgICAgICAgICAgJiYgcmVsZWFzZV9pbnB1dF9kb25lKCkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiTU9WSU5HIFRPIERJU0FCTEVEIFNUQVRFIik7Ci0gICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCgmbV9mbGFncyksT01YX0NPTVBPTkVOVF9JTlBVVF9ESVNBQkxFX1BFTkRJTkcpOwotICAgICAgICAgICAgcG9zdF9ldmVudChPTVhfQ29tbWFuZFBvcnREaXNhYmxlLAotICAgICAgICAgICAgICAgICAgICBQT1JUX0lOREVYX0lOLAotICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocG9ydCA9PSBQT1JUX0lOREVYX09VVCkgewotICAgICAgICAvLyBjaGVjayBpZiB0aGUgYnVmZmVyIGlzIHZhbGlkCi0gICAgICAgIG5Qb3J0SW5kZXggPSBidWZmZXIgLSAoT01YX0JVRkZFUkhFQURFUlRZUEUqKW1fb3V0X21lbV9wdHI7Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJmcmVlX2J1ZmZlciBvbiBvL3AgcG9ydCAtIFBvcnQgaWR4ICV1LCBhY3R1YWwgY250ICV1IiwKLSAgICAgICAgICAgICAgICBuUG9ydEluZGV4LCAodW5zaWduZWQgaW50KW1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICAgICAgaWYgKG5Qb3J0SW5kZXggPCBtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCAmJgotICAgICAgICAgICAgICAgIEJJVE1BU0tfUFJFU0VOVCgmbV9vdXRfYm1fY291bnQsIG5Qb3J0SW5kZXgpKSB7Ci0gICAgICAgICAgICAvLyBDbGVhciB0aGUgYml0IGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoJm1fb3V0X2JtX2NvdW50LG5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgbV9zT3V0UG9ydERlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwotICAgICAgICAgICAgZnJlZV9vdXRwdXRfYnVmZmVyIChidWZmZXIpOwotCi0gICAgICAgICAgICBpZiAocmVsZWFzZV9vdXRwdXRfZG9uZSgpKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0X3VzZV9idWZmZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAobV9vdXRfbWVtX3B0cikgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkZyZWVpbmcgbV9vdXRfbWVtX3B0ciIpOwotICAgICAgICAgICAgICAgICAgICBmcmVlIChtX291dF9tZW1fcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgbV9vdXRfbWVtX3B0ciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX3BPdXRwdXRfcG1lbSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkZyZWVpbmcgbV9wT3V0cHV0X3BtZW0iKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShtX3BPdXRwdXRfcG1lbSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE91dHB1dF9wbWVtID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgVVNFX0lPTgotICAgICAgICAgICAgICAgIGlmIChtX3BPdXRwdXRfaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZWluZyBtX3BPdXRwdXRfaW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUobV9wT3V0cHV0X2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE91dHB1dF9pb24gPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBmcmVlX2J1ZmZlciAsIFBvcnQgSW5kZXggSW52YWxpZCIpOwotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgfQotICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCgmbV9mbGFncyksT01YX0NPTVBPTkVOVF9PVVRQVVRfRElTQUJMRV9QRU5ESU5HKQotICAgICAgICAgICAgICAgICYmIHJlbGVhc2Vfb3V0cHV0X2RvbmUoKSApIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJlZUJ1ZmZlciA6IElmIGFueSBEaXNhYmxlIGV2ZW50IHBlbmRpbmcscG9zdCBpdCIpOwotCi0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk1PVklORyBUTyBESVNBQkxFRCBTVEFURSIpOwotICAgICAgICAgICAgQklUTUFTS19DTEVBUigoJm1fZmxhZ3MpLE9NWF9DT01QT05FTlRfT1VUUFVUX0RJU0FCTEVfUEVORElORyk7Ci0gICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9Db21tYW5kUG9ydERpc2FibGUsCi0gICAgICAgICAgICAgICAgICAgIFBPUlRfSU5ERVhfT1VULAotICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UKTsKLQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICB9Ci0gICAgaWYgKChlUmV0ID09IE9NWF9FcnJvck5vbmUpICYmCi0gICAgICAgICAgICAoQklUTUFTS19QUkVTRU5UKCZtX2ZsYWdzICxPTVhfQ09NUE9ORU5UX0xPQURJTkdfUEVORElORykpKSB7Ci0gICAgICAgIGlmIChyZWxlYXNlX2RvbmUoKSkgewotICAgICAgICAgICAgaWYgKGRldl9zdG9wKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogZGV2X3N0b3AoKSBGQUlMRUQiKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySGFyZHdhcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBTZW5kIHRoZSBjYWxsYmFjayBub3cKLSAgICAgICAgICAgIEJJVE1BU0tfQ0xFQVIoKCZtX2ZsYWdzKSxPTVhfQ09NUE9ORU5UX0xPQURJTkdfUEVORElORyk7Ci0gICAgICAgICAgICBwb3N0X2V2ZW50KE9NWF9Db21tYW5kU3RhdGVTZXQsIE9NWF9TdGF0ZUxvYWRlZCwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJpbiBmcmVlIGJ1ZmZlciwgcmVsZWFzZSBub3QgZG9uZSwgbmVlZCB0byBmcmVlIG1vcmUgYnVmZmVycyBvdXRwdXQgJSIgUFJJeDY0IiBpbnB1dCAlIiBQUkl4NjQsCi0gICAgICAgICAgICAgICAgICAgIG1fb3V0X2JtX2NvdW50LCBtX2lucF9ibV9jb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZVJldDsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZpZGVvOjpFbXB0eVRoaXNCdWZmZXIKLQotICAgREVTQ1JJUFRJT04KLSAgIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHB1c2ggdGhlIGVuY29kZWQgdmlkZW8gZnJhbWVzIHRvCi0gICB0aGUgdmlkZW8gZGVjb2Rlci4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBPTVggRXJyb3IgTm9uZSBpZiBldmVyeXRoaW5nIHdlbnQgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92aWRlbzo6ZW1wdHlfdGhpc19idWZmZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSogYnVmZmVyKQotewotICAgIE9NWF9FUlJPUlRZUEUgcmV0MSA9IE9NWF9FcnJvck5vbmU7Ci0gICAgdW5zaWduZWQgaW50IG5CdWZmZXJJbmRleCA7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkVUQjogYnVmZmVyID0gJXAsIGJ1ZmZlci0+cEJ1ZmZlclslcF0iLCBidWZmZXIsIGJ1ZmZlci0+cEJ1ZmZlcik7Ci0gICAgaWYgKG1fc3RhdGUgIT0gT01YX1N0YXRlRXhlY3V0aW5nICYmCi0gICAgICAgICAgICBtX3N0YXRlICE9IE9NWF9TdGF0ZVBhdXNlICYmCi0gICAgICAgICAgICBtX3N0YXRlICE9IE9NWF9TdGF0ZUlkbGUpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBFbXB0eSB0aGlzIGJ1ZmZlciBpbiBJbnZhbGlkIFN0YXRlIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotCi0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IChidWZmZXItPm5TaXplICE9IHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogb214X3ZpZGVvOjpldGItLT4gYnVmZmVyIGlzIG51bGwgb3IgYnVmZmVyIHNpemUgaXMgaW52YWxpZCIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGlmIChidWZmZXItPm5WZXJzaW9uLm5WZXJzaW9uICE9IE9NWF9TUEVDX1ZFUlNJT04pIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBvbXhfdmlkZW86OmV0Yi0tPiBPTVggVmVyc2lvbiBJbnZhbGlkIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JWZXJzaW9uTWlzbWF0Y2g7Ci0gICAgfQotCi0gICAgaWYgKGJ1ZmZlci0+bklucHV0UG9ydEluZGV4ICE9IChPTVhfVTMyKVBPUlRfSU5ERVhfSU4pIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBCYWQgcG9ydCBpbmRleCB0byBjYWxsIGVtcHR5X3RoaXNfYnVmZmVyIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgfQotICAgIGlmICghbV9zSW5Qb3J0RGVmLmJFbmFibGVkKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogQ2Fubm90IGNhbGwgZW1wdHlfdGhpc19idWZmZXIgd2hpbGUgSS9QIHBvcnQgaXMgZGlzYWJsZWQiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOwotICAgIH0KLQotICAgIG5CdWZmZXJJbmRleCA9IGJ1ZmZlciAtICgoIW1ldGFfbW9kZV9lbmFibGUpP21faW5wX21lbV9wdHI6bWV0YV9idWZmZXJfaGRyKTsKLQotICAgIGlmIChuQnVmZmVySW5kZXggPiBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsICkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEVUQjogSW52YWxpZCBidWZmZXIgaW5kZXhbJWRdIiwgbkJ1ZmZlckluZGV4KTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBtX2V0Yl9jb3VudCsrOwotICAgIG1fZXRiX3RpbWVzdGFtcCA9IGJ1ZmZlci0+blRpbWVTdGFtcDsKLSAgICBERUJVR19QUklOVF9MT1coIkRCRzogaS9wIG5UaW1lc3RhbXAgPSAldSIsICh1bnNpZ25lZClidWZmZXItPm5UaW1lU3RhbXApOwotICAgIHBvc3RfZXZlbnQgKCh1bnNpZ25lZCBsb25nKWhDb21wLCh1bnNpZ25lZCBsb25nKWJ1ZmZlcixtX2lucHV0X21zZ19pZCk7Ci0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZpZGVvOjplbXB0eV90aGlzX2J1ZmZlcl9wcm94eQotCi0gICBERVNDUklQVElPTgotICAgVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcHVzaCB0aGUgZW5jb2RlZCB2aWRlbyBmcmFtZXMgdG8KLSAgIHRoZSB2aWRlbyBkZWNvZGVyLgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIE9NWCBFcnJvciBOb25lIGlmIGV2ZXJ5dGhpbmcgd2VudCBzdWNjZXNzZnVsLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZpZGVvOjplbXB0eV90aGlzX2J1ZmZlcl9wcm94eShPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wLAotICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIGJ1ZmZlcikKLXsKLSAgICBWSURDX1RSQUNFX05BTUVfSElHSCgiRVRCIik7Ci0gICAgKHZvaWQpaENvbXA7Ci0gICAgT01YX1U4ICpwbWVtX2RhdGFfYnVmID0gTlVMTDsKLSAgICBpbnQgcHVzaF9jbnQgPSAwOwotICAgIHVuc2lnbmVkIG5CdWZJbmRleCA9IDA7Ci0gICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIExFR0FDWV9DQU1fTUVUQURBVEFfVFlQRSAqbWVkaWFfYnVmZmVyID0gTlVMTDsKLQotICAgIGludCBmZCA9IDA7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkVUQlByb3h5OiBidWZmZXItPnBCdWZmZXJbJXBdIiwgYnVmZmVyLT5wQnVmZmVyKTsKLSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBFVEJQcm94eTogSW52YWxpZCBidWZmZXJbJXBdIiwgYnVmZmVyKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICAvLyBCdWZmZXIgc2FuaXR5IGNoZWNrcwotICAgIGlmIChtZXRhX21vZGVfZW5hYmxlICYmICFtVXNlc0NvbG9yQ29udmVyc2lvbikgewotICAgICAgICAvL0ZvciBjb2xvci1jb252ZXJzaW9uIGNhc2UsIHdlIGhhdmUgYW4gaW50ZXJuYWwgYnVmZmVyIGFuZCBub3QgYSBtZXRhIGJ1ZmZlcgotICAgICAgICBib29sIG1ldF9lcnJvciA9IGZhbHNlOwotICAgICAgICBuQnVmSW5kZXggPSBidWZmZXIgLSBtZXRhX2J1ZmZlcl9oZHI7Ci0gICAgICAgIGlmIChuQnVmSW5kZXggPj0gbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBFVEJQcm94eTogSW52YWxpZCBtZXRhLWJ1ZkluZGV4ID0gJXUiLCBuQnVmSW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgICAgICBtZWRpYV9idWZmZXIgPSAoTEVHQUNZX0NBTV9NRVRBREFUQV9UWVBFICopbWV0YV9idWZmZXJfaGRyW25CdWZJbmRleF0ucEJ1ZmZlcjsKLSAgICAgICAgaWYgKCFtZWRpYV9idWZmZXIpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlczogaW52YWxpZCBtZWRpYV9idWZmZXIiLF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobWVkaWFfYnVmZmVyLT5idWZmZXJfdHlwZSA9PSBMRUdBQ1lfQ0FNX1NPVVJDRSkKLSAgICAgICAgICAgICAgICAmJiBidWZmZXItPm5BbGxvY0xlbiAhPSBzaXplb2YoTEVHQUNZX0NBTV9NRVRBREFUQV9UWVBFKSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgbWV0YWRhdGEgc2l6ZSBleHBlY3RlZCgldSkgdi9zIHJlY2lldmVkKCV6dSkiLAotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm5BbGxvY0xlbiwgc2l6ZW9mKExFR0FDWV9DQU1fTUVUQURBVEFfVFlQRSkpOwotICAgICAgICAgICAgbWV0X2Vycm9yID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChtZWRpYV9idWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChtZWRpYV9idWZmZXItPmJ1ZmZlcl90eXBlICE9IExFR0FDWV9DQU1fU09VUkNFICYmCi0gICAgICAgICAgICAgICAgICAgIG1lZGlhX2J1ZmZlci0+YnVmZmVyX3R5cGUgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBtZXRfZXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobWVkaWFfYnVmZmVyLT5idWZmZXJfdHlwZSA9PSBMRUdBQ1lfQ0FNX1NPVVJDRSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFfYnVmZmVyLT5tZXRhX2hhbmRsZSA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0X2Vycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUQkQ6IHJldmlzaXQgdGhpcyBjaGVjayAhCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZkcyA9IG1lZGlhX2J1ZmZlci0+bWV0YV9oYW5kbGUtPm51bUZkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSW50ID0gbWVkaWFfYnVmZmVyLT5tZXRhX2hhbmRsZS0+bnVtSW50czsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldF9lcnJvciA9ICgobkZkcyA9PSAxICYmIG5JbnQgPj0gMikgLypub3JtYWwqLyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobkZkcyA8IDE2ICYmIG5JbnQgPj0gbkZkcyozKSAvKmJhdGNoKi8pID8gZmFsc2UgOiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldF9lcnJvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJVbmJhbGFuY2VkIGZkcyBpbiBoYW5kbGU6IGZkcz0lZCBpbnRzPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5GZHMsIG5JbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1ldF9lcnJvciA9IHRydWU7Ci0gICAgICAgIGlmIChtZXRfZXJyb3IpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVW5rb3duIHNvdXJjZS9tZXRhaGFuZGxlIGluIEVUQiBjYWxsIik7Ci0gICAgICAgICAgICBwb3N0X2V2ZW50ICgodW5zaWduZWQgbG9uZylidWZmZXIsMCxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VCRCk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbkJ1ZkluZGV4ID0gYnVmZmVyIC0gKChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKW1faW5wX21lbV9wdHIpOwotICAgICAgICBpZiAobkJ1ZkluZGV4ID49IG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogRVRCUHJveHk6IEludmFsaWQgYnVmSW5kZXggPSAldSIsIG5CdWZJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcGVuZGluZ19pbnB1dF9idWZmZXJzKys7Ci0gICAgVklEQ19UUkFDRV9JTlRfTE9XKCJFVEItcGVuZGluZyIsIHBlbmRpbmdfaW5wdXRfYnVmZmVycyk7Ci0gICAgaWYgKGlucHV0X2ZsdXNoX3Byb2dyZXNzID09IHRydWUpIHsKLSAgICAgICAgcG9zdF9ldmVudCAoKHVuc2lnbmVkIGxvbmcpYnVmZmVyLDAsCi0gICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQpOwotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEVUQlByb3h5OiBJbnB1dCBmbHVzaCBpbiBwcm9ncmVzcyIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0gICAgaWYgKCFtZXRhX21vZGVfZW5hYmxlKSB7Ci0gICAgICAgIGZkID0gbV9wSW5wdXRfcG1lbVtuQnVmSW5kZXhdLmZkOwotICAgIH0KLSNpZmRlZiBfQU5EUk9JRF9JQ1NfCi0gICAgaWYgKG1ldGFfbW9kZV9lbmFibGUgJiYgIW1Vc2VzQ29sb3JDb252ZXJzaW9uKSB7Ci0gICAgICAgIC8vIENhbWVyYSBvciBHcmFsbG9jLXNvdXJjZSBtZXRhLWJ1ZmZlcnMgcXVldWVkIHdpdGggZW5jb2RlYWJsZSBjb2xvci1mb3JtYXQKLSAgICAgICAgc3RydWN0IHBtZW0gSW5wdXRfcG1lbV9pbmZvOwotICAgICAgICBpZiAoIW1lZGlhX2J1ZmZlcikgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiBpbnZhbGlkIG1lZGlhX2J1ZmZlciIsX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1lZGlhX2J1ZmZlci0+YnVmZmVyX3R5cGUgPT0gTEVHQUNZX0NBTV9TT1VSQ0UpIHsKLSAgICAgICAgICAgIElucHV0X3BtZW1faW5mby5idWZmZXIgPSBtZWRpYV9idWZmZXI7Ci0gICAgICAgICAgICBJbnB1dF9wbWVtX2luZm8uZmQgPSBNZXRhQnVmZmVyVXRpbDo6Z2V0RmRBdChtZWRpYV9idWZmZXItPm1ldGFfaGFuZGxlLCAwKTsKLSAgICAgICAgICAgIGZkID0gSW5wdXRfcG1lbV9pbmZvLmZkOwotCi0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KG1lZGlhX2J1ZmZlci0+bWV0YV9oYW5kbGUsIDAsIE1ldGFCdWZmZXJVdGlsOjpJTlRfT0ZGU0VUKTsKLSAgICAgICAgICAgIGludCBzaXplID0gTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KG1lZGlhX2J1ZmZlci0+bWV0YV9oYW5kbGUsIDAsIE1ldGFCdWZmZXJVdGlsOjpJTlRfU0laRSk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBzaXplIDwgMCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJtZXRhLWJ1ZmZlciBpcyBpbnZhbGlkISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbnB1dF9wbWVtX2luZm8ub2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgSW5wdXRfcG1lbV9pbmZvLnNpemUgPSBzaXplOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfSU5GTygiRVRCIChtZXRhLUNhbWVyYSkgZmQgPSAlZCwgb2Zmc2V0ID0gJWQsIHNpemUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIElucHV0X3BtZW1faW5mby5mZCwgSW5wdXRfcG1lbV9pbmZvLm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRfcG1lbV9pbmZvLnNpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVmlkZW9HcmFsbG9jTWV0YWRhdGEgKm1lZGlhX2J1ZmZlciA9IChWaWRlb0dyYWxsb2NNZXRhZGF0YSAqKW1ldGFfYnVmZmVyX2hkcltuQnVmSW5kZXhdLnBCdWZmZXI7Ci0gICAgICAgICAgICBwcml2YXRlX2hhbmRsZV90ICpoYW5kbGUgPSAocHJpdmF0ZV9oYW5kbGVfdCAqKW1lZGlhX2J1ZmZlci0+cEhhbmRsZTsKLSAgICAgICAgICAgIElucHV0X3BtZW1faW5mby5idWZmZXIgPSBtZWRpYV9idWZmZXI7Ci0gICAgICAgICAgICBJbnB1dF9wbWVtX2luZm8uZmQgPSBoYW5kbGUtPmZkOwotICAgICAgICAgICAgZmQgPSBJbnB1dF9wbWVtX2luZm8uZmQ7Ci0gICAgICAgICAgICBJbnB1dF9wbWVtX2luZm8ub2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIElucHV0X3BtZW1faW5mby5zaXplID0gaGFuZGxlLT5zaXplOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJFVEIgKG1ldGEtZ3JhbGxvYykgZmQgPSAlZCwgb2Zmc2V0ID0gJWQsIHNpemUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIElucHV0X3BtZW1faW5mby5mZCwgSW5wdXRfcG1lbV9pbmZvLm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRfcG1lbV9pbmZvLnNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZfdXNlX2J1ZihQT1JUX0lOREVYX0lOKSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGluIGRldl91c2VfYnVmIik7Ci0gICAgICAgICAgICBwb3N0X2V2ZW50ICgodW5zaWduZWQgbG9uZylidWZmZXIsMCxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VCRCk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbnB1dF91c2VfYnVmZmVyICYmICFtX3VzZV9pbnB1dF9wbWVtICYmIG1fcElucHV0X3BtZW1bbkJ1ZkluZGV4XS5idWZmZXIpCi0jZWxzZQotICAgIGlmIChpbnB1dF91c2VfYnVmZmVyICYmICFtX3VzZV9pbnB1dF9wbWVtICYmIG1fcElucHV0X3BtZW1bbkJ1ZkluZGV4XS5idWZmZXIpCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiSGVhcCBVc2VCdWZmZXIgY2FzZSwgc28gbWVtY3B5IHRoZSBkYXRhIik7Ci0KLSAgICAgICAgYXV0b19sb2NrIGwobV9sb2NrKTsKLSAgICAgICAgcG1lbV9kYXRhX2J1ZiA9IChPTVhfVTggKiltX3BJbnB1dF9wbWVtW25CdWZJbmRleF0uYnVmZmVyOwotICAgICAgICBpZiAocG1lbV9kYXRhX2J1ZikgewotICAgICAgICAgICAgbWVtY3B5IChwbWVtX2RhdGFfYnVmLCAoYnVmZmVyLT5wQnVmZmVyICsgYnVmZmVyLT5uT2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5uRmlsbGVkTGVuKTsKLSAgICAgICAgfQotICAgICAgICBERUJVR19QUklOVF9MT1coIm1lbWNweSgpIGRvbmUgaW4gRVRCUHJveHkgZm9yIGkvcCBIZWFwIFVzZUJ1ZiIpOwotICAgIH0gZWxzZSBpZiAobVVzZVByb3h5Q29sb3JGb3JtYXQpIHsKLSAgICAgICAgLy8gR3JhbGxvYy1zb3VyY2UgYnVmZmVycyB3aXRoIGNvbG9yLWNvbnZlcnNpb24KLSAgICAgICAgZmQgPSBtX3BJbnB1dF9wbWVtW25CdWZJbmRleF0uZmQ7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiRVRCIChjb2xvci1jb252ZXJ0ZWQpIGZkID0gJWQsIHNpemUgPSAldSIsCi0gICAgICAgICAgICAgICAgZmQsICh1bnNpZ25lZCBpbnQpYnVmZmVyLT5uRmlsbGVkTGVuKTsKLSAgICB9IGVsc2UgaWYgKG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09Ci0gICAgICAgICAgICAgICAgICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSB7Ci0gICAgICAgICAgICAvL0ZvciB0aGUgY2FzZSB3aGVyZSBZVVY0MjBTUCBidWZmZXJzIGFyZSBxZXVldWVkIHRvIGNvbXBvbmVudAotICAgICAgICAgICAgLy9ieSBzb3VyY2VzIG90aGVyIHRoYW4gY2FtZXJhIChBcHBzIHZpYSBNZWRpYUNvZGVjKSwgY29udmVyc2lvbgotICAgICAgICAgICAgLy90byB2ZW5kb3IgZmxhdm91cmVkIE5WMTIgY29sb3IgZm9ybWF0IGlzIHJlcXVpcmVkLgotICAgICAgICAgICAgaWYgKCFkZXZfY29sb3JfYWxpZ24oYnVmZmVyLCBtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gYWRqdXN0IGJ1ZmZlciBjb2xvciIpOwotICAgICAgICAgICAgICAgICAgICBwb3N0X2V2ZW50KCh1bnNpZ25lZCBsb25nKWJ1ZmZlciwgMCwgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZGV2X2VtcHR5X2J1ZihidWZmZXIsIHBtZW1fZGF0YV9idWYsbkJ1ZkluZGV4LGZkKSAhPSB0cnVlKQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBFVEJQcm94eTogZGV2X2VtcHR5X2J1ZiBmYWlsZWQiKTsKLSNpZmRlZiBfQU5EUk9JRF9JQ1NfCi0gICAgICAgIG9teF9yZWxlYXNlX21ldGFfYnVmZmVyKGJ1ZmZlcik7Ci0jZW5kaWYKLSAgICAgICAgcG9zdF9ldmVudCAoKHVuc2lnbmVkIGxvbmcpYnVmZmVyLDAsT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQpOwotICAgICAgICAvKkdlbmVyYXRlIGFuIGFzeW5jIGVycm9yIGFuZCBtb3ZlIHRvIGludmFsaWQgc3RhdGUqLwotICAgICAgICBwZW5kaW5nX2lucHV0X2J1ZmZlcnMtLTsKLSAgICAgICAgVklEQ19UUkFDRV9JTlRfTE9XKCJFVEItcGVuZGluZyIsIHBlbmRpbmdfaW5wdXRfYnVmZmVycyk7Ci0gICAgICAgIGlmIChod19vdmVybG9hZCkgewotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZpZGVvOjpGaWxsVGhpc0J1ZmZlcgotCi0gICBERVNDUklQVElPTgotICAgSUwgY2xpZW50IHVzZXMgdGhpcyBtZXRob2QgdG8gcmVsZWFzZSB0aGUgZnJhbWUgYnVmZmVyCi0gICBhZnRlciBkaXNwbGF5aW5nIHRoZW0uCi0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUuCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgdHJ1ZS9mYWxzZQotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZpZGVvOjpmaWxsX3RoaXNfYnVmZmVyKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaENvbXAsCi0gICAgICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSogYnVmZmVyKQotewotICAgIERFQlVHX1BSSU5UX0xPVygiRlRCOiBidWZmZXItPnBCdWZmZXJbJXBdIiwgYnVmZmVyLT5wQnVmZmVyKTsKLSAgICBpZiAobV9zdGF0ZSAhPSBPTVhfU3RhdGVFeGVjdXRpbmcgJiYKLSAgICAgICAgICAgIG1fc3RhdGUgIT0gT01YX1N0YXRlUGF1c2UgJiYKLSAgICAgICAgICAgIG1fc3RhdGUgIT0gT01YX1N0YXRlSWRsZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEZUQiBpbiBJbnZhbGlkIFN0YXRlIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotCi0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8KGJ1ZmZlci0+blNpemUgIT0gc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBvbXhfdmlkZW86OmZ0Yi0tPkludmFsaWQgYnVmZmVyIG9yIHNpemUiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBpZiAoYnVmZmVyLT5uVmVyc2lvbi5uVmVyc2lvbiAhPSBPTVhfU1BFQ19WRVJTSU9OKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogb214X3ZpZGVvOjpmdGItLT5PTVggVmVyc2lvbiBJbnZhbGlkIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JWZXJzaW9uTWlzbWF0Y2g7Ci0gICAgfQotCi0gICAgaWYgKGJ1ZmZlci0+bk91dHB1dFBvcnRJbmRleCAhPSAoT01YX1UzMilQT1JUX0lOREVYX09VVCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IG9teF92aWRlbzo6ZnRiLS0+QmFkIHBvcnQgaW5kZXgiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICB9Ci0KLSAgICBpZiAoIW1fc091dFBvcnREZWYuYkVuYWJsZWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBvbXhfdmlkZW86OmZ0Yi0tPnBvcnQgaXMgZGlzYWJsZWQiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOwotICAgIH0KLQotICAgIHBvc3RfZXZlbnQoKHVuc2lnbmVkIGxvbmcpIGhDb21wLCAodW5zaWduZWQgbG9uZylidWZmZXIsT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GVEIpOwotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZpZGVvOjpmaWxsX3RoaXNfYnVmZmVyX3Byb3h5Ci0KLSAgIERFU0NSSVBUSU9OCi0gICBJTCBjbGllbnQgdXNlcyB0aGlzIG1ldGhvZCB0byByZWxlYXNlIHRoZSBmcmFtZSBidWZmZXIKLSAgIGFmdGVyIGRpc3BsYXlpbmcgdGhlbS4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmlkZW86OmZpbGxfdGhpc19idWZmZXJfcHJveHkoCi0gICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSogYnVmZmVyQWRkKQotewotICAgIFZJRENfVFJBQ0VfTkFNRV9ISUdIKCJGVEIiKTsKLSAgICAodm9pZCloQ29tcDsKLSAgICBPTVhfVTggKnBtZW1fZGF0YV9idWYgPSBOVUxMOwotICAgIE9NWF9FUlJPUlRZUEUgblJldCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkZUQlByb3h5OiBidWZmZXJBZGQtPnBCdWZmZXJbJXBdIiwgYnVmZmVyQWRkLT5wQnVmZmVyKTsKLQotICAgIGlmIChidWZmZXJBZGQgPT0gTlVMTCB8fCAoKGJ1ZmZlckFkZCAtIG1fb3V0X21lbV9wdHIpID49IChpbnQpbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpICkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEZUQlByb3h5OiBJbnZhbGlkIGkvcCBwYXJhbXMiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBwZW5kaW5nX291dHB1dF9idWZmZXJzKys7Ci0gICAgVklEQ19UUkFDRV9JTlRfTE9XKCJGVEItcGVuZGluZyIsIHBlbmRpbmdfb3V0cHV0X2J1ZmZlcnMpOwotICAgIC8qUmV0dXJuIGJhY2sgdGhlIG91dHB1dCBidWZmZXIgdG8gY2xpZW50Ki8KLSAgICBpZiAoIG1fc091dFBvcnREZWYuYkVuYWJsZWQgIT0gT01YX1RSVUUgfHwgb3V0cHV0X2ZsdXNoX3Byb2dyZXNzID09IHRydWUpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJvL3AgcG9ydCBpcyBEaXNhYmxlZCBvciBGbHVzaCBpbiBQcm9ncmVzcyIpOwotICAgICAgICBwb3N0X2V2ZW50ICgodW5zaWduZWQgbG9uZylidWZmZXJBZGQsMCwKLSAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZCRCk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLQotICAgIGlmIChvdXRwdXRfdXNlX2J1ZmZlciAmJiAhbV91c2Vfb3V0cHV0X3BtZW0pIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJIZWFwIFVzZUJ1ZmZlciBjYXNlIik7Ci0gICAgICAgIHBtZW1fZGF0YV9idWYgPSAoT01YX1U4ICopbV9wT3V0cHV0X3BtZW1bYnVmZmVyQWRkIC0gbV9vdXRfbWVtX3B0cl0uYnVmZmVyOwotICAgIH0KLQotICAgIGlmIChkZXZfZmlsbF9idWYoYnVmZmVyQWRkLCBwbWVtX2RhdGFfYnVmLChidWZmZXJBZGQgLSBtX291dF9tZW1fcHRyKSxtX3BPdXRwdXRfcG1lbVtidWZmZXJBZGQgLSBtX291dF9tZW1fcHRyXS5mZCkgIT0gdHJ1ZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGRldl9maWxsX2J1ZigpIEZhaWxlZCIpOwotICAgICAgICBwb3N0X2V2ZW50ICgodW5zaWduZWQgbG9uZylidWZmZXJBZGQsMCxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZCRCk7Ci0gICAgICAgIHBlbmRpbmdfb3V0cHV0X2J1ZmZlcnMtLTsKLSAgICAgICAgVklEQ19UUkFDRV9JTlRfTE9XKCJGVEItcGVuZGluZyIsIHBlbmRpbmdfb3V0cHV0X2J1ZmZlcnMpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZpZGVvOjpTZXRDYWxsYmFja3MKLQotICAgREVTQ1JJUFRJT04KLSAgIFNldCB0aGUgY2FsbGJhY2tzLgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIE9NWCBFcnJvciBOb25lIGlmIGV2ZXJ5dGhpbmcgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92aWRlbzo6c2V0X2NhbGxiYWNrcyhPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgIGhDb21wLAotICAgICAgICBPTVhfSU4gT01YX0NBTExCQUNLVFlQRSogY2FsbGJhY2tzLAotICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICBhcHBEYXRhKQotewotICAgICh2b2lkKWhDb21wOwotICAgIG1fcENhbGxiYWNrcyAgICAgICA9ICpjYWxsYmFja3M7Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsYmFja3MgU2V0ICVwICVwICVwIixtX3BDYWxsYmFja3MuRW1wdHlCdWZmZXJEb25lLFwKLSAgICAgICAgICAgIG1fcENhbGxiYWNrcy5FdmVudEhhbmRsZXIsbV9wQ2FsbGJhY2tzLkZpbGxCdWZmZXJEb25lKTsKLSAgICBtX2FwcF9kYXRhID0gICAgYXBwRGF0YTsKLSAgICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZW5jOjpVc2VFR0xJbWFnZQotCi0gICBERVNDUklQVElPTgotICAgT01YIFVzZSBFR0wgSW1hZ2UgbWV0aG9kIGltcGxlbWVudGF0aW9uIDxUQkQ+LgotCi0gICBQQVJBTUVURVJTCi0gICA8VEJEPi4KLQotICAgUkVUVVJOIFZBTFVFCi0gICBOb3QgSW1wbGVtZW50ZWQgZXJyb3IuCi0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PTVhfRVJST1JUWVBFICBvbXhfdmlkZW86OnVzZV9FR0xfaW1hZ2UoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgaENvbXAsCi0gICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIGJ1ZmZlckhkciwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICAgIGFwcERhdGEsCi0gICAgICAgIE9NWF9JTiB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBlZ2xJbWFnZSkKLXsKLSAgICAodm9pZCloQ29tcCwgKHZvaWQpYnVmZmVySGRyLCAodm9pZClwb3J0LCAodm9pZClhcHBEYXRhLCAodm9pZCllZ2xJbWFnZTsKLSAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHVzZV9FR0xfaW1hZ2U6ICBOb3QgSW1wbGVtZW50ZWQiKTsKLSAgICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmVuYzo6Q29tcG9uZW50Um9sZUVudW0KLQotICAgREVTQ1JJUFRJT04KLSAgIE9NWCBDb21wb25lbnQgUm9sZSBFbnVtIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KLQotICAgUEFSQU1FVEVSUwotICAgPFRCRD4uCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgT01YIEVycm9yIE5vbmUgaWYgZXZlcnl0aGluZyBpcyBzdWNjZXNzZnVsLgotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92aWRlbzo6Y29tcG9uZW50X3JvbGVfZW51bShPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXAsCi0gICAgICAgIE9NWF9PVVQgT01YX1U4KiAgICAgICAgcm9sZSwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgICAgICAgIGluZGV4KQotewotICAgICh2b2lkKWhDb21wOwotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgaWYgKCFzdHJuY21wKChjaGFyKiltX25raW5kLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBpZiAoKDAgPT0gaW5kZXgpICYmIHJvbGUpIHsKLSAgICAgICAgICAgIHN0cmxjcHkoKGNoYXIgKilyb2xlLCAidmlkZW9fZGVjb2Rlci5hdmMiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiY29tcG9uZW50X3JvbGVfZW51bTogcm9sZSAlcyIscm9sZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE5vIG1vcmUgcm9sZXMiKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKChjaGFyKiltX25raW5kLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5hdmMiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBpZiAoKDAgPT0gaW5kZXgpICYmIHJvbGUpIHsKLSAgICAgICAgICAgIHN0cmxjcHkoKGNoYXIgKilyb2xlLCAidmlkZW9fZW5jb2Rlci5hdmMiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiY29tcG9uZW50X3JvbGVfZW51bTogcm9sZSAlcyIscm9sZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE5vIG1vcmUgcm9sZXMiKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKChjaGFyKiltX25raW5kLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci52cDgiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBpZiAoKDAgPT0gaW5kZXgpICYmIHJvbGUpIHsKLSAgICAgICAgICAgIHN0cmxjcHkoKGNoYXIgKilyb2xlLCAidmlkZW9fZW5jb2Rlci52cDgiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiY29tcG9uZW50X3JvbGVfZW51bTogcm9sZSAlcyIscm9sZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IE5vIG1vcmUgcm9sZXMiKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKChjaGFyKiltX25raW5kLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oZXZjIiwgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgIGlmICgoMCA9PSBpbmRleCkgJiYgcm9sZSkgewotICAgICAgICAgICAgc3RybGNweSgoY2hhciAqKXJvbGUsICJ2aWRlb19lbmNvZGVyLmhldmMiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coImNvbXBvbmVudF9yb2xlX2VudW06IHJvbGUgJXMiLCByb2xlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogTm8gbW9yZSByb2xlcyIpOwotICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvck5vTW9yZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBRdWVyeWluZyBSb2xlIG9uIFVua25vd24gQ29tcG9uZW50Iik7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZTsKLSAgICB9Ci0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmVuYzo6QWxsb2NhdGVEb25lCi0KLSAgIERFU0NSSVBUSU9OCi0gICBDaGVja3MgaWYgZW50aXJlIGJ1ZmZlciBwb29sIGlzIGFsbG9jYXRlZCBieSBJTCBDbGllbnQgb3Igbm90LgotICAgTmVlZCB0aGlzIHRvIG1vdmUgdG8gSURMRSBzdGF0ZS4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotYm9vbCBvbXhfdmlkZW86OmFsbG9jYXRlX2RvbmUodm9pZCkKLXsKLSAgICBib29sIGJSZXQgPSBmYWxzZTsKLSAgICBib29sIGJSZXRfSW4gPSBmYWxzZTsKLSAgICBib29sIGJSZXRfT3V0ID0gZmFsc2U7Ci0KLSAgICBiUmV0X0luID0gYWxsb2NhdGVfaW5wdXRfZG9uZSgpOwotICAgIGJSZXRfT3V0ID0gYWxsb2NhdGVfb3V0cHV0X2RvbmUoKTsKLQotICAgIGlmIChiUmV0X0luICYmIGJSZXRfT3V0KSB7Ci0gICAgICAgIGJSZXQgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBiUmV0OwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZW5jOjpBbGxvY2F0ZUlucHV0RG9uZQotCi0gICBERVNDUklQVElPTgotICAgQ2hlY2tzIGlmIEkvUCBidWZmZXIgcG9vbCBpcyBhbGxvY2F0ZWQgYnkgSUwgQ2xpZW50IG9yIG5vdC4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotYm9vbCBvbXhfdmlkZW86OmFsbG9jYXRlX2lucHV0X2RvbmUodm9pZCkKLXsKLSAgICBib29sIGJSZXQgPSBmYWxzZTsKLSAgICB1bnNpZ25lZCBpPTA7Ci0KLSAgICBpZiAobV9pbnBfbWVtX3B0ciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBiUmV0OwotICAgIH0KLSAgICBpZiAobV9pbnBfbWVtX3B0ciApIHsKLSAgICAgICAgZm9yICg7IGk8bV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoQklUTUFTS19BQlNFTlQoJm1faW5wX2JtX2NvdW50LGkpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGk9PW1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKLSAgICAgICAgYlJldCA9IHRydWU7Ci0gICAgfQotICAgIGlmIChpPT1tX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsICYmIG1fc0luUG9ydERlZi5iRW5hYmxlZCkgewotICAgICAgICBtX3NJblBvcnREZWYuYlBvcHVsYXRlZCA9IE9NWF9UUlVFOwotICAgIH0KLSAgICByZXR1cm4gYlJldDsKLX0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmVuYzo6QWxsb2NhdGVPdXRwdXREb25lCi0KLSAgIERFU0NSSVBUSU9OCi0gICBDaGVja3MgaWYgZW50aXJlIE8vUCBidWZmZXIgcG9vbCBpcyBhbGxvY2F0ZWQgYnkgSUwgQ2xpZW50IG9yIG5vdC4KLQotICAgUEFSQU1FVEVSUwotICAgTm9uZS4KLQotICAgUkVUVVJOIFZBTFVFCi0gICB0cnVlL2ZhbHNlLgotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotYm9vbCBvbXhfdmlkZW86OmFsbG9jYXRlX291dHB1dF9kb25lKHZvaWQpCi17Ci0gICAgYm9vbCBiUmV0ID0gZmFsc2U7Ci0gICAgdW5zaWduZWQgaj0wOwotCi0gICAgaWYgKG1fb3V0X21lbV9wdHIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gYlJldDsKLSAgICB9Ci0KLSAgICBpZiAobV9vdXRfbWVtX3B0ciApIHsKLSAgICAgICAgZm9yICg7IGo8bV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGorKykgewotICAgICAgICAgICAgaWYgKEJJVE1BU0tfQUJTRU5UKCZtX291dF9ibV9jb3VudCxqKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGo9PW1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKSB7Ci0gICAgICAgIGJSZXQgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChqPT1tX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCAmJiBtX3NPdXRQb3J0RGVmLmJFbmFibGVkKSB7Ci0gICAgICAgIG1fc091dFBvcnREZWYuYlBvcHVsYXRlZCA9IE9NWF9UUlVFOwotICAgIH0KLSAgICByZXR1cm4gYlJldDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZW5jOjpSZWxlYXNlRG9uZQotCi0gICBERVNDUklQVElPTgotICAgQ2hlY2tzIGlmIElMIGNsaWVudCBoYXMgcmVsZWFzZWQgYWxsIHRoZSBidWZmZXJzLgotCi0gICBQQVJBTUVURVJTCi0gICBOb25lLgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIHRydWUvZmFsc2UKLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWJvb2wgb214X3ZpZGVvOjpyZWxlYXNlX2RvbmUodm9pZCkKLXsKLSAgICBib29sIGJSZXQgPSBmYWxzZTsKLSAgICBERUJVR19QUklOVF9MT1coIkluc2lkZSByZWxlYXNlX2RvbmUoKSIpOwotICAgIGlmIChyZWxlYXNlX2lucHV0X2RvbmUoKSkgewotICAgICAgICBpZiAocmVsZWFzZV9vdXRwdXRfZG9uZSgpKSB7Ci0gICAgICAgICAgICBiUmV0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYlJldDsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZlbmM6OlJlbGVhc2VPdXRwdXREb25lCi0KLSAgIERFU0NSSVBUSU9OCi0gICBDaGVja3MgaWYgSUwgY2xpZW50IGhhcyByZWxlYXNlZCBhbGwgdGhlIGJ1ZmZlcnMuCi0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUuCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgdHJ1ZS9mYWxzZQotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotYm9vbCBvbXhfdmlkZW86OnJlbGVhc2Vfb3V0cHV0X2RvbmUodm9pZCkKLXsKLSAgICBib29sIGJSZXQgPSBmYWxzZTsKLSAgICB1bnNpZ25lZCBpPTAsaj0wOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJJbnNpZGUgcmVsZWFzZV9vdXRwdXRfZG9uZSgpIik7Ci0gICAgaWYgKG1fb3V0X21lbV9wdHIpIHsKLSAgICAgICAgZm9yICg7IGo8bV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGorKykgewotICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmbV9vdXRfYm1fY291bnQsaikpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaj09bV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKLSAgICAgICAgICAgIGJSZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYlJldCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBiUmV0OwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZW5jOjpSZWxlYXNlSW5wdXREb25lCi0KLSAgIERFU0NSSVBUSU9OCi0gICBDaGVja3MgaWYgSUwgY2xpZW50IGhhcyByZWxlYXNlZCBhbGwgdGhlIGJ1ZmZlcnMuCi0KLSAgIFBBUkFNRVRFUlMKLSAgIE5vbmUuCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgdHJ1ZS9mYWxzZQotCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotYm9vbCBvbXhfdmlkZW86OnJlbGVhc2VfaW5wdXRfZG9uZSh2b2lkKQotewotICAgIGJvb2wgYlJldCA9IGZhbHNlOwotICAgIHVuc2lnbmVkIGk9MCxqPTA7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkluc2lkZSByZWxlYXNlX2lucHV0X2RvbmUoKSIpOwotICAgIGlmIChtX2lucF9tZW1fcHRyKSB7Ci0gICAgICAgIGZvciAoOyBqPG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWw7IGorKykgewotICAgICAgICAgICAgaWYgKCBCSVRNQVNLX1BSRVNFTlQoJm1faW5wX2JtX2NvdW50LGopKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGo9PW1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKLSAgICAgICAgICAgIGJSZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYlJldCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBiUmV0OwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92aWRlbzo6ZmlsbF9idWZmZXJfZG9uZShPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKiBidWZmZXIpCi17Ci0gICAgVklEQ19UUkFDRV9OQU1FX0hJR0goIkZCRCIpOwotICAgIGludCBpbmRleCA9IGJ1ZmZlciAtIG1fb3V0X21lbV9wdHI7Ci0KLSAgICBERUJVR19QUklOVF9MT1coImZpbGxfYnVmZmVyX2RvbmU6IGJ1ZmZlci0+cEJ1ZmZlclslcF0sIGZsYWdzPTB4JXggc2l6ZSA9ICV1IiwKLSAgICAgICAgICAgIGJ1ZmZlci0+cEJ1ZmZlciwgKHVuc2lnbmVkKWJ1ZmZlci0+bkZsYWdzLCAodW5zaWduZWQgaW50KWJ1ZmZlci0+bkZpbGxlZExlbik7Ci0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8ICgoYnVmZmVyIC0gbV9vdXRfbWVtX3B0cikgPiAoaW50KW1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKSkgewotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIHBlbmRpbmdfb3V0cHV0X2J1ZmZlcnMtLTsKLSAgICBWSURDX1RSQUNFX0lOVF9MT1coIkZUQi1wZW5kaW5nIiwgcGVuZGluZ19vdXRwdXRfYnVmZmVycyk7Ci0gICAgVklEQ19UUkFDRV9JTlRfTE9XKCJGQkQtVFMiLCBidWZmZXItPm5UaW1lU3RhbXAgLyAxMDAwKTsKLSAgICBWSURDX1RSQUNFX0lOVF9MT1coIkZCRC1zaXplIiwgYnVmZmVyLT5uRmlsbGVkTGVuKTsKLQotICAgIGlmIChzZWN1cmVfc2Vzc2lvbiAmJiBtX3BDYWxsYmFja3MuRmlsbEJ1ZmZlckRvbmUpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci0+bkZpbGxlZExlbiA+IDApCi0gICAgICAgICAgICBtX2ZiZF9jb3VudCsrOwotICAgICAgICBtX3BDYWxsYmFja3MuRmlsbEJ1ZmZlckRvbmUgKGhDb21wLG1fYXBwX2RhdGEsYnVmZmVyKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgLyogRm9yIHVzZSBidWZmZXIgd2UgbmVlZCB0byBjb3B5IHRoZSBkYXRhICovCi0gICAgaWYgKG1fcENhbGxiYWNrcy5GaWxsQnVmZmVyRG9uZSkgewotICAgICAgICBpZiAoYnVmZmVyLT5uRmlsbGVkTGVuID4gMCkgewotICAgICAgICAgICAgbV9mYmRfY291bnQrKzsKLQotICAgICAgICAgICAgaWYgKGRldl9nZXRfb3V0cHV0X2xvZ19mbGFnKCkpIHsKLSAgICAgICAgICAgICAgICBkZXZfb3V0cHV0X2xvZ19idWZmZXJzKChjb25zdCBjaGFyKilidWZmZXItPnBCdWZmZXIsIGJ1ZmZlci0+bkZpbGxlZExlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRVhUUkFEQVRBKSB7Ci0gICAgICAgICAgICBpZiAoIWRldl9oYW5kbGVfb3V0cHV0X2V4dHJhZGF0YSgodm9pZCAqKWJ1ZmZlciwgaW5kZXgpKQotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gcGFyc2Ugb3V0cHV0IGV4dHJhZGF0YSIpOwotCi0gICAgICAgICAgICBkZXZfZXh0cmFkYXRhX2xvZ19idWZmZXJzKChjaGFyICopKCgodW5zaWduZWQgbG9uZylidWZmZXItPnBCdWZmZXIgKyBidWZmZXItPm5PZmZzZXQgKwotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5uRmlsbGVkTGVuICsgMykgJiAofjMpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wQ2FsbGJhY2tzLkZpbGxCdWZmZXJEb25lIChoQ29tcCxtX2FwcF9kYXRhLGJ1ZmZlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgb214X3ZpZGVvOjplbXB0eV9idWZmZXJfZG9uZShPTVhfSEFORExFVFlQRSAgICAgICAgIGhDb21wLAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogYnVmZmVyKQotewotICAgIFZJRENfVFJBQ0VfTkFNRV9ISUdIKCJFQkQiKTsKLSAgICBpbnQgYnVmZmVyX2luZGV4ICA9IC0xOwotCi0gICAgYnVmZmVyX2luZGV4ID0gYnVmZmVyIC0gKChtVXNlUHJveHlDb2xvckZvcm1hdCAmJiAhbVVzZXNDb2xvckNvbnZlcnNpb24pID8gbWV0YV9idWZmZXJfaGRyIDogbV9pbnBfbWVtX3B0cik7Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJlbXB0eV9idWZmZXJfZG9uZTogYnVmZmVyWyVwXSIsIGJ1ZmZlcik7Ci0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAoKGJ1ZmZlcl9pbmRleCA+IChpbnQpbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCkpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUiBpbiBlbXB0eV9idWZmZXJfZG9uZSBkdWUgdG8gaW5kZXggYnVmZmVyIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgcGVuZGluZ19pbnB1dF9idWZmZXJzLS07Ci0gICAgVklEQ19UUkFDRV9JTlRfTE9XKCJFVEItcGVuZGluZyIsIHBlbmRpbmdfaW5wdXRfYnVmZmVycyk7Ci0KLSAgICBpZiAobVVzZVByb3h5Q29sb3JGb3JtYXQgJiYKLSAgICAgICAgKGJ1ZmZlcl9pbmRleCA+PSAwICYmIChidWZmZXJfaW5kZXggPCAoaW50KW1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpKSkgewotICAgICAgICBpZiAoIXBkZXN0X2ZyYW1lICAmJiAhaW5wdXRfZmx1c2hfcHJvZ3Jlc3MgJiYgbVVzZXNDb2xvckNvbnZlcnNpb24pIHsKLSAgICAgICAgICAgIHBkZXN0X2ZyYW1lID0gYnVmZmVyOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJlbXB0eV9idWZmZXJfZG9uZSBwZGVzdF9mcmFtZSBhZGRyZXNzIGlzICVwIixwZGVzdF9mcmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gcHVzaF9pbnB1dF9idWZmZXIoaENvbXApOwotICAgICAgICB9Ci0gICAgICAgIC8vY2hlY2sgaWYgZW1wdHktRU9TLWJ1ZmZlciBpcyBiZWluZyByZXR1cm5lZCwgdHJlYXQgdGhpcyBzYW1lIGFzIHRoZQotICAgICAgICAvL2NvbG9yLWNvbnZlcnNpb24gY2FzZSBhcyB3ZSBxdWV1ZWQgYSBjb2xvci1jb252ZXJzaW9uIGJ1ZmZlciB0byBlbmNvZGVyCi0gICAgICAgIGJvb2wgaGFuZGxlRW1wdHlFb3NCdWZmZXIgPSAobUVtcHR5RW9zQnVmZmVyID09IGJ1ZmZlcik7Ci0gICAgICAgIGlmIChtVXNlc0NvbG9yQ29udmVyc2lvbiB8fCBoYW5kbGVFbXB0eUVvc0J1ZmZlcikgewotICAgICAgICAgICAgaWYgKGhhbmRsZUVtcHR5RW9zQnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgbUVtcHR5RW9zQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHJldHVybiBjb2xvci1jb252ZXJzaW9uIGJ1ZmZlciBiYWNrIHRvIHRoZSBwb29sCi0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coImVtcHR5X2J1ZmZlcl9kb25lIGluc2VydCBhZGRyZXNzIGlzICVwIixidWZmZXIpOwotICAgICAgICAgICAgaWYgKCFtX29wcV9wbWVtX3EuaW5zZXJ0X2VudHJ5KCh1bnNpZ25lZCBsb25nKWJ1ZmZlciwgMCwgMCkpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZW1wdHlfYnVmZmVyX2RvbmU6IHBtZW0gcXVldWUgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBXZSBhcmUgbm90IGRlYWxpbmcgd2l0aCBjb2xvci1jb252ZXJzaW9uLCBCdWZmZXIgYmVpbmcgcmV0dXJuZWQKLSAgICAgICAgICAgIC8vIGhlcmUgaXMgY2xpZW50J3MgYnVmZmVyLCByZXR1cm4gaXQgYmFjayB0byBjbGllbnQKLSAgICAgICAgICAgIGlmIChtX3BDYWxsYmFja3MuRW1wdHlCdWZmZXJEb25lICYmIGJ1ZmZlcikgewotICAgICAgICAgICAgICAgIG1fcENhbGxiYWNrcy5FbXB0eUJ1ZmZlckRvbmUoaENvbXAsIG1fYXBwX2RhdGEsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJlbXB0eV9idWZmZXJfZG9uZTogUmV0dXJuaW5nIGNsaWVudCBidWYgJXAiLCBidWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtX3BDYWxsYmFja3MuRW1wdHlCdWZmZXJEb25lKSB7Ci0gICAgICAgIG1fcENhbGxiYWNrcy5FbXB0eUJ1ZmZlckRvbmUoaENvbXAgLG1fYXBwX2RhdGEsIGJ1ZmZlcik7Ci0gICAgfQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi12b2lkIG9teF92aWRlbzo6Y29tcGxldGVfcGVuZGluZ19idWZmZXJfZG9uZV9jYnMoKQotewotICAgIHVuc2lnbmVkIGxvbmcgcDE7Ci0gICAgdW5zaWduZWQgbG9uZyBwMjsKLSAgICB1bnNpZ25lZCBsb25nIGlkZW50OwotICAgIG9teF9jbWRfcXVldWUgdG1wX3EsIHBlbmRpbmdfYmRfcTsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbG9jayk7Ci0gICAgLy8gcG9wIGFsbCBwZW5kaW5nIEdFTkVSQVRFIEZEQiBmcm9tIGZ0YiBxdWV1ZQotICAgIHdoaWxlIChtX2Z0Yl9xLm1fc2l6ZSkgewotICAgICAgICBtX2Z0Yl9xLnBvcF9lbnRyeSgmcDEsJnAyLCZpZGVudCk7Ci0gICAgICAgIGlmIChpZGVudCA9PSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZCRCkgewotICAgICAgICAgICAgcGVuZGluZ19iZF9xLmluc2VydF9lbnRyeShwMSxwMixpZGVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0bXBfcS5pbnNlcnRfZW50cnkocDEscDIsaWRlbnQpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vcmV0dXJuIGFsbCBub24gR0VORVJBVEUgRkRCIHRvIGZ0YiBxdWV1ZQotICAgIHdoaWxlICh0bXBfcS5tX3NpemUpIHsKLSAgICAgICAgdG1wX3EucG9wX2VudHJ5KCZwMSwmcDIsJmlkZW50KTsKLSAgICAgICAgbV9mdGJfcS5pbnNlcnRfZW50cnkocDEscDIsaWRlbnQpOwotICAgIH0KLSAgICAvLyBwb3AgYWxsIHBlbmRpbmcgR0VORVJBVEUgRURCIGZyb20gZXRiIHF1ZXVlCi0gICAgd2hpbGUgKG1fZXRiX3EubV9zaXplKSB7Ci0gICAgICAgIG1fZXRiX3EucG9wX2VudHJ5KCZwMSwmcDIsJmlkZW50KTsKLSAgICAgICAgaWYgKGlkZW50ID09IE9NWF9DT01QT05FTlRfR0VORVJBVEVfRUJEKSB7Ci0gICAgICAgICAgICBwZW5kaW5nX2JkX3EuaW5zZXJ0X2VudHJ5KHAxLHAyLGlkZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRtcF9xLmluc2VydF9lbnRyeShwMSxwMixpZGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy9yZXR1cm4gYWxsIG5vbiBHRU5FUkFURSBGREIgdG8gZXRiIHF1ZXVlCi0gICAgd2hpbGUgKHRtcF9xLm1fc2l6ZSkgewotICAgICAgICB0bXBfcS5wb3BfZW50cnkoJnAxLCZwMiwmaWRlbnQpOwotICAgICAgICBtX2V0Yl9xLmluc2VydF9lbnRyeShwMSxwMixpZGVudCk7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOwotICAgIC8vIHByb2Nlc3MgYWxsIHBlbmRpbmcgYnVmZmVyIGRvbmVzCi0gICAgd2hpbGUgKHBlbmRpbmdfYmRfcS5tX3NpemUpIHsKLSAgICAgICAgcGVuZGluZ19iZF9xLnBvcF9lbnRyeSgmcDEsJnAyLCZpZGVudCk7Ci0gICAgICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FQkQ6Ci0gICAgICAgICAgICAgICAgaWYgKGVtcHR5X2J1ZmZlcl9kb25lKCZtX2NtcCwgKE9NWF9CVUZGRVJIRUFERVJUWVBFICopcDEpICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBlbXB0eV9idWZmZXJfZG9uZSgpIGZhaWxlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgb214X3JlcG9ydF9lcnJvciAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9GQkQ6Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGxfYnVmZmVyX2RvbmUoJm1fY21wLCAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilwMSkgIT0gT01YX0Vycm9yTm9uZSApIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBmaWxsX2J1ZmZlcl9kb25lKCkgZmFpbGVkISIpOwotICAgICAgICAgICAgICAgICAgICBvbXhfcmVwb3J0X2Vycm9yICgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotT01YX0VSUk9SVFlQRSBvbXhfdmlkZW86OmdldF9zdXBwb3J0ZWRfcHJvZmlsZV9sZXZlbChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcHJvZmlsZUxldmVsVHlwZSkKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIGlmICghcHJvZmlsZUxldmVsVHlwZSkKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLQotICAgIGlmIChwcm9maWxlTGV2ZWxUeXBlLT5uUG9ydEluZGV4ID09IDEpIHsKLSAgICAgICAgaWYgKG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9PSBPTVhfVklERU9fQ29kaW5nQVZDKSB7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZUxldmVsVHlwZS0+blByb2ZpbGVJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsVHlwZS0+ZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOwotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVMZXZlbCAgID0gT01YX1ZJREVPX0FWQ0xldmVsNTI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXggPT0gMSkgewotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluOwotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVMZXZlbCAgID0gT01YX1ZJREVPX0FWQ0xldmVsNTI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXggPT0gMikgewotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoOwotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVMZXZlbCAgID0gT01YX1ZJREVPX0FWQ0xldmVsNTI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXggPT0gMykgewotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOwotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVMZXZlbCAgID0gT01YX1ZJREVPX0FWQ0xldmVsNTI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXggPT0gNCkgewotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVQcm9maWxlID0gUU9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lTGV2ZWwgICA9IE9NWF9WSURFT19BVkNMZXZlbDUyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlTGV2ZWxUeXBlLT5uUHJvZmlsZUluZGV4ID09IDUpIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOwotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVMZXZlbCAgID0gT01YX1ZJREVPX0FWQ0xldmVsNTI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXggPT0gNikgewotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVQcm9maWxlID0gUU9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOwotICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbFR5cGUtPmVMZXZlbCAgID0gT01YX1ZJREVPX0FWQ0xldmVsNTI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkIG5Qcm9maWxlSW5kZXggcmV0IE5vTW9yZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXgpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobV9zT3V0UG9ydERlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID09IE9NWF9WSURFT19Db2RpbmdWUDgpIHsKLSAgICAgICAgICAgIGlmIChwcm9maWxlTGV2ZWxUeXBlLT5uUHJvZmlsZUluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lUHJvZmlsZSA9IE9NWF9WSURFT19WUDhQcm9maWxlTWFpbjsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lTGV2ZWwgICA9IE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUxldmVsVHlwZS0+blByb2ZpbGVJbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsVHlwZS0+ZVByb2ZpbGUgPSBPTVhfVklERU9fVlA4UHJvZmlsZU1haW47Ci0gICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsVHlwZS0+ZUxldmVsICAgPSBPTVhfVklERU9fVlA4TGV2ZWxfVmVyc2lvbjE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiVlA4OiBnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQgblByb2ZpbGVJbmRleCByZXQgTm9Nb3JlICV1IiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXgpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobV9zT3V0UG9ydERlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID09IE9NWF9WSURFT19Db2RpbmdIRVZDKSB7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZUxldmVsVHlwZS0+blByb2ZpbGVJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsVHlwZS0+ZVByb2ZpbGUgPSAgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjsKLSAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxUeXBlLT5lTGV2ZWwgICA9ICBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJIRVZDOiBnZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQgblByb2ZpbGVJbmRleCByZXQgTm9Nb3JlICV1IiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXByb2ZpbGVMZXZlbFR5cGUtPm5Qcm9maWxlSW5kZXgpOwotICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkIHJldCBOb01vcmUiKTsKLSAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkIHNob3VsZCBiZSBxdWVyaWVkIG9uIElucHV0IHBvcnQgb25seSAldSIsICh1bnNpZ25lZCBpbnQpcHJvZmlsZUxldmVsVHlwZS0+blBvcnRJbmRleCk7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgfQotICAgIERFQlVHX1BSSU5UX0xPVygiZ2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkIGZvciBJbnB1dCBwb3J0IHJldHVybmVkIFByb2ZpbGU6JXUsIExldmVsOiV1IiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcHJvZmlsZUxldmVsVHlwZS0+ZVByb2ZpbGUsICh1bnNpZ25lZCBpbnQpcHJvZmlsZUxldmVsVHlwZS0+ZUxldmVsKTsKLSAgICByZXR1cm4gZVJldDsKLX0KLQotI2lmZGVmIFVTRV9JT04KLWludCBvbXhfdmlkZW86OmFsbG9jX21hcF9pb25fbWVtb3J5KGludCBzaXplLAotICAgICAgICBzdHJ1Y3QgaW9uX2FsbG9jYXRpb25fZGF0YSAqYWxsb2NfZGF0YSwKLSAgICAgICAgc3RydWN0IGlvbl9mZF9kYXRhICpmZF9kYXRhLGludCBmbGFnKQotewotICAgIHN0cnVjdCB2ZW5jX2lvbiBidWZfaW9uX2luZm87Ci0gICAgaW50IGlvbl9kZXZpY2VfZmQgPS0xLHJjPTAsaW9uX2Rldl9mbGFncyA9IDA7Ci0gICAgaWYgKHNpemUgPD0wIHx8ICFhbGxvY19kYXRhIHx8ICFmZF9kYXRhKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIGlucHV0IHRvIGFsbG9jX21hcF9pb25fbWVtb3J5Iik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlvbl9kZXZfZmxhZ3MgPSBPX1JET05MWTsKLSAgICBpb25fZGV2aWNlX2ZkID0gb3BlbiAoTUVNX0RFVklDRSxpb25fZGV2X2ZsYWdzKTsKLSAgICBpZiAoaW9uX2RldmljZV9mZCA8IDApIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJT04gRGV2aWNlIG9wZW4oKSBGYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIGlvbl9kZXZpY2VfZmQ7Ci0gICAgfQotCi0gICAgaWYoc2VjdXJlX3Nlc3Npb24pIHsKLSAgICAgICAgYWxsb2NfZGF0YS0+bGVuID0gKHNpemUgKyAoU0VDVVJFX0FMSUdOIC0gMSkpICYgfihTRUNVUkVfQUxJR04gLSAxKTsKLSAgICAgICAgYWxsb2NfZGF0YS0+YWxpZ24gPSBTRUNVUkVfQUxJR047Ci0gICAgICAgIGFsbG9jX2RhdGEtPmZsYWdzID0gZmxhZzsKLSAgICAgICAgYWxsb2NfZGF0YS0+aGVhcF9pZF9tYXNrID0gSU9OX0hFQVAoTUVNX0hFQVBfSUQpOwotICAgICAgICBpZiAoYWxsb2NfZGF0YS0+ZmxhZ3MgJiBJT05fRkxBR19DUF9CSVRTVFJFQU0pIHsKLSAgICAgICAgICAgIGFsbG9jX2RhdGEtPmhlYXBfaWRfbWFzayB8PSBJT05fSEVBUChJT05fU0VDVVJFX0RJU1BMQVlfSEVBUF9JRCk7Ci0gICAgICAgIH0KLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiSU9OIEFMTE9DIHNlYyBidWY6IHNpemUgJXUgYWxpZ24gJXUgZmxhZ3MgJXgiLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpYWxsb2NfZGF0YS0+bGVuLCAodW5zaWduZWQgaW50KWFsbG9jX2RhdGEtPmFsaWduLAotICAgICAgICAgICAgICAgIGFsbG9jX2RhdGEtPmZsYWdzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBhbGxvY19kYXRhLT5sZW4gPSAoc2l6ZSArIChTWl80SyAtIDEpKSAmIH4oU1pfNEsgLSAxKTsKLSAgICAgICAgYWxsb2NfZGF0YS0+YWxpZ24gPSBTWl80SzsKLSAgICAgICAgYWxsb2NfZGF0YS0+ZmxhZ3MgPSAoZmxhZyAmIElPTl9GTEFHX0NBQ0hFRCA/IElPTl9GTEFHX0NBQ0hFRCA6IDApOwotICAgICAgICBhbGxvY19kYXRhLT5oZWFwX2lkX21hc2sgPSAoSU9OX0hFQVAoTUVNX0hFQVBfSUQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPTl9IRUFQKElPTl9JT01NVV9IRUFQX0lEKSk7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIklPTiBBTExPQyB1bnNlYyBidWY6IHNpemUgJXUgYWxpZ24gJXUgZmxhZ3MgJXgiLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpYWxsb2NfZGF0YS0+bGVuLCAodW5zaWduZWQgaW50KWFsbG9jX2RhdGEtPmFsaWduLAotICAgICAgICAgICAgICAgIGFsbG9jX2RhdGEtPmZsYWdzKTsKLSAgICB9Ci0KLSAgICByYyA9IGlvY3RsKGlvbl9kZXZpY2VfZmQsSU9OX0lPQ19BTExPQyxhbGxvY19kYXRhKTsKLSAgICBpZiAocmMgfHwgIWFsbG9jX2RhdGEtPmhhbmRsZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSU9OIEFMTE9DIG1lbW9yeSBmYWlsZWQgMHgleCIsIHJjKTsKLSAgICAgICAgYWxsb2NfZGF0YS0+aGFuZGxlID0gMDsKLSAgICAgICAgY2xvc2UoaW9uX2RldmljZV9mZCk7Ci0gICAgICAgIGlvbl9kZXZpY2VfZmQgPSAtMTsKLSAgICAgICAgcmV0dXJuIGlvbl9kZXZpY2VfZmQ7Ci0gICAgfQotICAgIGZkX2RhdGEtPmhhbmRsZSA9IGFsbG9jX2RhdGEtPmhhbmRsZTsKLSAgICByYyA9IGlvY3RsKGlvbl9kZXZpY2VfZmQsSU9OX0lPQ19NQVAsZmRfZGF0YSk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJT04gTUFQIGZhaWxlZCAiKTsKLSAgICAgICAgYnVmX2lvbl9pbmZvLmlvbl9hbGxvY19kYXRhID0gKmFsbG9jX2RhdGE7Ci0gICAgICAgIGJ1Zl9pb25faW5mby5pb25fZGV2aWNlX2ZkID0gaW9uX2RldmljZV9mZDsKLSAgICAgICAgYnVmX2lvbl9pbmZvLmZkX2lvbl9kYXRhID0gKmZkX2RhdGE7Ci0gICAgICAgIGZyZWVfaW9uX21lbW9yeSgmYnVmX2lvbl9pbmZvKTsKLSAgICAgICAgZmRfZGF0YS0+ZmQgPS0xOwotICAgICAgICBpb25fZGV2aWNlX2ZkID0tMTsKLSAgICB9Ci0gICAgcmV0dXJuIGlvbl9kZXZpY2VfZmQ7Ci19Ci0KLXZvaWQgb214X3ZpZGVvOjpmcmVlX2lvbl9tZW1vcnkoc3RydWN0IHZlbmNfaW9uICpidWZfaW9uX2luZm8pCi17Ci0gICAgaWYgKCFidWZfaW9uX2luZm8pIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgaW5wdXQgdG8gZnJlZV9pb25fbWVtb3J5Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGlvY3RsKGJ1Zl9pb25faW5mby0+aW9uX2RldmljZV9mZCxJT05fSU9DX0ZSRUUsCi0gICAgICAgICAgICAgICAgJmJ1Zl9pb25faW5mby0+aW9uX2FsbG9jX2RhdGEuaGFuZGxlKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSU9OIGZyZWUgZmFpbGVkICIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNsb3NlKGJ1Zl9pb25faW5mby0+aW9uX2RldmljZV9mZCk7Ci0gICAgYnVmX2lvbl9pbmZvLT5pb25fYWxsb2NfZGF0YS5oYW5kbGUgPSAwOwotICAgIGJ1Zl9pb25faW5mby0+aW9uX2RldmljZV9mZCA9IC0xOwotICAgIGJ1Zl9pb25faW5mby0+ZmRfaW9uX2RhdGEuZmQgPSAtMTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgX0FORFJPSURfSUNTXwotdm9pZCBvbXhfdmlkZW86Om9teF9yZWxlYXNlX21ldGFfYnVmZmVyKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpCi17Ci0gICAgaWYgKGJ1ZmZlciAmJiBtZXRhX21vZGVfZW5hYmxlKSB7Ci0gICAgICAgIExFR0FDWV9DQU1fTUVUQURBVEFfVFlQRSAqbWVkaWFfcHRyOwotICAgICAgICBzdHJ1Y3QgcG1lbSBJbnB1dF9wbWVtOwotICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXhfcG1lbSA9IDA7Ci0gICAgICAgIGJvb2wgbWV0YV9lcnJvciA9IGZhbHNlOwotCi0gICAgICAgIGluZGV4X3BtZW0gPSAoYnVmZmVyIC0gbV9pbnBfbWVtX3B0cik7Ci0gICAgICAgIGlmIChtVXNlc0NvbG9yQ29udmVyc2lvbiAmJgotICAgICAgICAgICAgICAgIChpbmRleF9wbWVtIDwgbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCkpIHsKLSAgICAgICAgICAgIGlmICghZGV2X2ZyZWVfYnVmKCgmbV9wSW5wdXRfcG1lbVtpbmRleF9wbWVtXSksUE9SVF9JTkRFWF9JTikpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigib214X3JlbGVhc2VfbWV0YV9idWZmZXIgZGV2IGZyZWUgZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZWRpYV9wdHIgPSAoTEVHQUNZX0NBTV9NRVRBREFUQV9UWVBFICopIGJ1ZmZlci0+cEJ1ZmZlcjsKLSAgICAgICAgICAgIGlmIChtZWRpYV9wdHIgJiYgbWVkaWFfcHRyLT5tZXRhX2hhbmRsZSkgewotICAgICAgICAgICAgICAgIGlmIChtZWRpYV9wdHItPmJ1ZmZlcl90eXBlID09IExFR0FDWV9DQU1fU09VUkNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0X3BtZW0uYnVmZmVyID0gbWVkaWFfcHRyOwotICAgICAgICAgICAgICAgICAgICBJbnB1dF9wbWVtLmZkID0gTWV0YUJ1ZmZlclV0aWw6OmdldEZkQXQobWVkaWFfcHRyLT5tZXRhX2hhbmRsZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KG1lZGlhX3B0ci0+bWV0YV9oYW5kbGUsIDAsIE1ldGFCdWZmZXJVdGlsOjpJTlRfU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBNZXRhQnVmZmVyVXRpbDo6Z2V0SW50QXQobWVkaWFfcHRyLT5tZXRhX2hhbmRsZSwgMCwgTWV0YUJ1ZmZlclV0aWw6OklOVF9PRkZTRVQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoSW5wdXRfcG1lbS5mZCA8IDAgfHwgc2l6ZSA8IDAgfHwgb2Zmc2V0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgbWV0YSBidWZmZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFfZXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIElucHV0X3BtZW0uc2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0X3BtZW0ub2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkVCRCBmZCA9ICVkLCBvZmZzZXQgPSAlZCwgc2l6ZSA9ICVkIixJbnB1dF9wbWVtLmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0X3BtZW0ub2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0X3BtZW0uc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYV9wdHItPmJ1ZmZlcl90eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFZpZGVvR3JhbGxvY01ldGFkYXRhICptZWRpYV9wdHIgPSAoVmlkZW9HcmFsbG9jTWV0YWRhdGEgKilidWZmZXItPnBCdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIHByaXZhdGVfaGFuZGxlX3QgKmhhbmRsZSA9IChwcml2YXRlX2hhbmRsZV90ICopbWVkaWFfcHRyLT5wSGFuZGxlOwotICAgICAgICAgICAgICAgICAgICBJbnB1dF9wbWVtLmJ1ZmZlciA9IG1lZGlhX3B0cjsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRfcG1lbS5mZCA9IGhhbmRsZS0+ZmQ7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0X3BtZW0ub2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRfcG1lbS5zaXplID0gaGFuZGxlLT5zaXplOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFfZXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1ldGFfZXJyb3IpCi0gICAgICAgICAgICAgICAgICAgIG1ldGFfZXJyb3IgPSAhZGV2X2ZyZWVfYnVmKCZJbnB1dF9wbWVtLFBPUlRfSU5ERVhfSU4pOwotICAgICAgICAgICAgICAgIGlmIChtZXRhX2Vycm9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkluIGJhdGNobW9kZSBvciBkZXZfZnJlZV9idWYgZmFpbGVkLCBmbHVzaCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZmx1c2hfcHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLSNlbmRpZgotCi1ib29sIG9teF92aWRlbzo6aXNfY29udl9uZWVkZWQoaW50IGhhbF9mbXQsIGludCBoYWxfZmxhZ3MpCi17Ci0gICAgYm9vbCBiUmV0ID0gZmFsc2U7Ci0KLSAgICBpZiAoIXN0cm5jbXAobV9wbGF0Zm9ybSwgIm1zbTg5OTYiLCA3KSkgewotICAgICAgICBiUmV0ID0gaGFsX2ZtdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCAmJgotICAgICAgICAgICAgIShoYWxfZmxhZ3MgJiBwcml2YXRlX2hhbmRsZV90OjpQUklWX0ZMQUdTX1VCV0NfQUxJR05FRCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYlJldCA9IGhhbF9mbXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7Ci0gICAgfQotCi0jaWZkZWYgX0hXX1JHQkEKLSAgICBiUmV0ID0gZmFsc2U7Ci0jZW5kaWYKLSAgICBERUJVR19QUklOVF9MT1coIlJHQkEgY29udmVyc2lvbiAlcyIsIGJSZXQgPyAiTmVlZGVkIjoiTm90LU5lZWRlZCIpOwotICAgIHJldHVybiBiUmV0OwotfQotCi12b2lkIG9teF92aWRlbzo6cHJpbnRfZGVidWdfY29sb3JfYXNwZWN0cyhDb2xvckFzcGVjdHMgKmFzcGVjdHMsIGNvbnN0IGNoYXIgKnByZWZpeCkgewotICAgIERFQlVHX1BSSU5UX0hJR0goIiVzIDogQ29sb3IgYXNwZWN0cyA6IFByaW1hcmllcyA9ICVkIFJhbmdlID0gJWQgVHJhbnNmZXIgPSAlZCBNYXRyaXhDb2VmZnMgPSAlZCIsCi0gICAgICAgICAgICBwcmVmaXgsIGFzcGVjdHMtPm1QcmltYXJpZXMsIGFzcGVjdHMtPm1SYW5nZSwgYXNwZWN0cy0+bVRyYW5zZmVyLCBhc3BlY3RzLT5tTWF0cml4Q29lZmZzKTsKLX0KLQotT01YX0VSUk9SVFlQRSAgb214X3ZpZGVvOjplbXB0eV90aGlzX2J1ZmZlcl9vcGFxdWUoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIGJ1ZmZlcikKLXsKLSAgICBWSURDX1RSQUNFX05BTUVfTE9XKCJFVEItT3BhcXVlIik7Ci0gICAgdW5zaWduZWQgbkJ1ZkluZGV4ID0gMDsKLSAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgVmlkZW9HcmFsbG9jTWV0YWRhdGEgKm1lZGlhX2J1ZmZlcjsgLy8gVGhpcyBtZXRob2QgcHJpbWFyaWx5IGFzc3VtZXMgZ3JhbGxvYy1tZXRhZGF0YQotICAgIHByaXZhdGVfaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJFVEJQcm94eU9wYXF1ZTogYnVmZmVyWyVwXSIsIGJ1ZmZlcik7Ci0KLSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBFVEJQcm94eUE6IEludmFsaWQgYnVmZmVyWyVwXSIsYnVmZmVyKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBpZiAoIWRldl9idWZmZXJfcmVhZHlfdG9fcXVldWUoYnVmZmVyKSkgewotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJJbmZvOiBFVEJQcm94eUE6IGJ1ZmZlclslcF0gaXMgZGVmZmVyZWQiLCBidWZmZXIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICBuQnVmSW5kZXggPSBidWZmZXIgLSBtZXRhX2J1ZmZlcl9oZHI7Ci0gICAgaWYgKG5CdWZJbmRleCA+PSBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogRVRCUHJveHlBOiBJbnZhbGlkIGJ1ZmluZGV4ID0gJXUiLAotICAgICAgICAgICAgICAgIG5CdWZJbmRleCk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgbWVkaWFfYnVmZmVyID0gKFZpZGVvR3JhbGxvY01ldGFkYXRhICopYnVmZmVyLT5wQnVmZmVyOwotICAgIGlmICghbWVkaWFfYnVmZmVyKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlczogaW52YWxpZCBtZWRpYV9idWZmZXIiLF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotICAgIGlmICgobWVkaWFfYnVmZmVyLT5lVHlwZSA9PSBMRUdBQ1lfQ0FNX1NPVVJDRSkKLSAgICAgICAgICAgICYmIGJ1ZmZlci0+bkFsbG9jTGVuICE9IHNpemVvZihMRUdBQ1lfQ0FNX01FVEFEQVRBX1RZUEUpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIG1ldGFkYXRhIHNpemUgZXhwZWN0ZWQoJXUpIHYvcyByZWNpZXZlZCglenUpIiwKLSAgICAgICAgICAgICAgICBidWZmZXItPm5BbGxvY0xlbiwgc2l6ZW9mKExFR0FDWV9DQU1fTUVUQURBVEFfVFlQRSkpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGlmIChtZWRpYV9idWZmZXIgJiYgbWVkaWFfYnVmZmVyLT5lVHlwZSA9PSBMRUdBQ1lfQ0FNX1NPVVJDRSkgewotICAgICAgICByZXR1cm4gZW1wdHlfdGhpc19idWZmZXJfcHJveHkoaENvbXAsIGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgaWYgKCghbWVkaWFfYnVmZmVyIHx8ICFtZWRpYV9idWZmZXItPnBIYW5kbGUgfHwgbWVkaWFfYnVmZmVyLT5lVHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgJiYKLSAgICAgICAgICAgICEoYnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbmNvcnJlY3QgQnVmZmVyIHF1ZXVlZCBtZWRpYSBidWZmZXIgPSAlcCIsCi0gICAgICAgICAgICBtZWRpYV9idWZmZXIpOwotICAgICAgICBtX3BDYWxsYmFja3MuRW1wdHlCdWZmZXJEb25lKGhDb21wLCBtX2FwcF9kYXRhLCBidWZmZXIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0gZWxzZSBpZiAobWVkaWFfYnVmZmVyKSB7Ci0gICAgICAgIGhhbmRsZSA9IChwcml2YXRlX2hhbmRsZV90ICopbWVkaWFfYnVmZmVyLT5wSGFuZGxlOwotICAgIH0KLQotICAgIC8qRW5hYmxlIGZvbGxvd2luZyBjb2RlIG9uY2UgcHJpdmF0ZSBoYW5kbGUgY29sb3IgZm9ybWF0IGlzCi0gICAgICB1cGRhdGVkIGNvcnJlY3RseSovCi0KLSAgICBpZiAoYnVmZmVyLT5uRmlsbGVkTGVuID4gMCAmJiBoYW5kbGUpIHsKLQotICAgICAgICBtVXNlc0NvbG9yQ29udmVyc2lvbiA9IGlzX2NvbnZfbmVlZGVkKGhhbmRsZS0+Zm9ybWF0LCBoYW5kbGUtPmZsYWdzKTsKLSAgICAgICAgaWYgKG1Vc2VzQ29sb3JDb252ZXJzaW9uKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9JTkZPKCJvcGVuIENvbG9yIGNvbnYgZm9yVzogJXUsIEg6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCltX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KW1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0KTsKLQotICAgICAgICAgICAgQ29sb3JDb252ZXJ0Rm9ybWF0IGMyZFNyY0ZtdCA9IFJHQkE4ODg4OwotICAgICAgICAgICAgQ29sb3JDb252ZXJ0Rm9ybWF0IGMyZERlc3RGbXQgPSBOVjEyX1VCV0M7Ci0gICAgICAgICAgICBDb2xvck1hcHBpbmc6OmNvbnN0X2l0ZXJhdG9yIGZvdW5kID0KLSAgICAgICAgICAgICAgICBjMmRjYy5tTWFwUGl4ZWxGb3JtYXQyQ292ZXJ0b3IuZmluZChoYW5kbGUtPmZvcm1hdCk7Ci0KLSAgICAgICAgICAgIGlmIChmb3VuZCAhPSBjMmRjYy5tTWFwUGl4ZWxGb3JtYXQyQ292ZXJ0b3IuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBjMmRTcmNGbXQgPSAoQ29sb3JDb252ZXJ0Rm9ybWF0KWZvdW5kLT5zZWNvbmQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghYzJkY2Muc2V0UmVzb2x1dGlvbihtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJkU3JjRm10LCBjMmREZXN0Rm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+ZmxhZ3MsIGhhbmRsZS0+d2lkdGgpKSB7Ci0gICAgICAgICAgICAgICAgbV9wQ2FsbGJhY2tzLkVtcHR5QnVmZmVyRG9uZShoQ29tcCxtX2FwcF9kYXRhLGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldFJlc29sdXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZGV2X3NldF9mb3JtYXQoYzJkRGVzdEZtdCkpCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImNhbm5vdCBzZXQgY29sb3IgZm9ybWF0Iik7Ci0KLSAgICAgICAgICAgIGRldl9nZXRfYnVmX3JlcSAoJm1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NJblBvcnREZWYublBvcnRJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaW5wdXRfZmx1c2hfcHJvZ3Jlc3MgPT0gdHJ1ZSkgewotICAgICAgICBtX3BDYWxsYmFja3MuRW1wdHlCdWZmZXJEb25lKGhDb21wLG1fYXBwX2RhdGEsYnVmZmVyKTsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBFVEJQcm94eUE6IElucHV0IGZsdXNoIGluIHByb2dyZXNzIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLQotICAgIGlmICghcHNvdXJjZV9mcmFtZSkgewotICAgICAgICBwc291cmNlX2ZyYW1lID0gYnVmZmVyOwotICAgICAgICByZXQgPSBwdXNoX2lucHV0X2J1ZmZlcihoQ29tcCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFtX29wcV9tZXRhX3EuaW5zZXJ0X2VudHJ5KCh1bnNpZ25lZCBsb25nKWJ1ZmZlciwwLDApKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEVUQlByb3h5OiBRdWV1ZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICBtX3BDYWxsYmFja3MuRW1wdHlCdWZmZXJEb25lKGhDb21wLG1fYXBwX2RhdGEsYnVmZmVyKTsKLSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92aWRlbzo6cXVldWVfbWV0YV9idWZmZXIoT01YX0hBTkRMRVRZUEUgaENvbXApCi17Ci0KLSAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gMCxwMixpZDsKLQotICAgIERFQlVHX1BSSU5UX0xPVygiSW4gcXVldWUgTWV0YSBCdWZmZXIiKTsKLSAgICBpZiAoIXBzb3VyY2VfZnJhbWUgfHwgIXBkZXN0X2ZyYW1lKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJjb252ZXJ0X3F1ZXVlX2J1ZmZlciBpbnZhbGlkIHBhcmFtcyIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGlmIChwc291cmNlX2ZyYW1lLT5uRmlsbGVkTGVuID4gMCkgewotICAgICAgICBpZiAoZGV2X3VzZV9idWYoUE9SVF9JTkRFWF9JTikgIT0gdHJ1ZSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBpbiBkZXZfdXNlX2J1ZiIpOwotICAgICAgICAgICAgcG9zdF9ldmVudCAoKHVuc2lnbmVkIGxvbmcpcHNvdXJjZV9mcmFtZSwwLE9NWF9DT01QT05FTlRfR0VORVJBVEVfRUJEKTsKLSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXQgPT0gT01YX0Vycm9yTm9uZSkKLSAgICAgICAgcmV0ID0gZW1wdHlfdGhpc19idWZmZXJfcHJveHkoaENvbXAscHNvdXJjZV9mcmFtZSk7Ci0KLSAgICBpZiAocmV0ID09IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgcHNvdXJjZV9mcmFtZSA9IE5VTEw7Ci0gICAgICAgIGlmICghcHNvdXJjZV9mcmFtZSAmJiBtX29wcV9tZXRhX3EubV9zaXplKSB7Ci0gICAgICAgICAgICBtX29wcV9tZXRhX3EucG9wX2VudHJ5KCZhZGRyZXNzLCZwMiwmaWQpOwotICAgICAgICAgICAgcHNvdXJjZV9mcmFtZSA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSogKSBhZGRyZXNzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IgYW5kIHNvdXJjZSBmcmFtZSBoYXMgYmVlbiBzY2hlZHVsZWQgZm9yIGFuIEVCRAotICAgICAgICBwc291cmNlX2ZyYW1lID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotT01YX0VSUk9SVFlQRSBvbXhfdmlkZW86OmNvbnZlcnRfcXVldWVfYnVmZmVyKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICBzdHJ1Y3QgcG1lbSAmSW5wdXRfcG1lbV9pbmZvLHVuc2lnbmVkIGxvbmcgJmluZGV4KQotewotCi0gICAgdW5zaWduZWQgY2hhciAqdXZhOwotICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKLSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAwLHAyLGlkOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJJbiBDb252ZXJ0IGFuZCBxdWV1ZSBNZXRhIEJ1ZmZlciIpOwotICAgIGlmICghcHNvdXJjZV9mcmFtZSB8fCAhcGRlc3RfZnJhbWUpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImNvbnZlcnRfcXVldWVfYnVmZmVyIGludmFsaWQgcGFyYW1zIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotICAgIGlmIChzZWN1cmVfc2Vzc2lvbikgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiY2Fubm90IGNvbnZlcnQgYnVmZmVyIGR1cmluZyBzZWN1cmUgc2Vzc2lvbiIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgIH0KLQotICAgIGlmICghcHNvdXJjZV9mcmFtZS0+bkZpbGxlZExlbikgewotICAgICAgICBpZihwc291cmNlX2ZyYW1lLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgICAgIHBkZXN0X2ZyYW1lLT5uRmlsbGVkTGVuID0gcHNvdXJjZV9mcmFtZS0+bkZpbGxlZExlbjsKLSAgICAgICAgICAgIHBkZXN0X2ZyYW1lLT5uVGltZVN0YW1wID0gcHNvdXJjZV9mcmFtZS0+blRpbWVTdGFtcDsKLSAgICAgICAgICAgIHBkZXN0X2ZyYW1lLT5uRmxhZ3MgPSBwc291cmNlX2ZyYW1lLT5uRmxhZ3M7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJTa2lwcGluZyBjb2xvciBjb252ZXJzaW9uIGZvciBlbXB0eSBFT1MgQnVmZmVyICIKLSAgICAgICAgICAgICAgICAgICAgImhlYWRlcj0lcCBmaWxsZWQtbGVuPSV1IiwgcGRlc3RfZnJhbWUsICh1bnNpZ25lZCBpbnQpcGRlc3RfZnJhbWUtPm5GaWxsZWRMZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGRlc3RfZnJhbWUtPm5PZmZzZXQgPSAwOwotICAgICAgICAgICAgcGRlc3RfZnJhbWUtPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgcGRlc3RfZnJhbWUtPm5UaW1lU3RhbXAgPSBwc291cmNlX2ZyYW1lLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgcGRlc3RfZnJhbWUtPm5GbGFncyA9IHBzb3VyY2VfZnJhbWUtPm5GbGFnczsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiQnVmZmVyIGhlYWRlciAlcCBGaWxsZWQgbGVuIHNpemUgJXUiLAotICAgICAgICAgICAgICAgICAgICBwZGVzdF9mcmFtZSwgKHVuc2lnbmVkIGludClwZGVzdF9mcmFtZS0+bkZpbGxlZExlbik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB1dmEgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoTlVMTCwgSW5wdXRfcG1lbV9pbmZvLnNpemUsCi0gICAgICAgICAgICAgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsCi0gICAgICAgICAgICAgICAgTUFQX1NIQVJFRCxJbnB1dF9wbWVtX2luZm8uZmQsMCk7Ci0gICAgICAgIGlmICh1dmEgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFjMmRjYy5jb252ZXJ0QzJEKElucHV0X3BtZW1faW5mby5mZCwgdXZhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2YSwgbV9wSW5wdXRfcG1lbVtpbmRleF0uZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRlc3RfZnJhbWUtPnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRlc3RfZnJhbWUtPnBCdWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkNvbG9yIENvbnZlcnNpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnVmX3NpemUgPSAwOwotICAgICAgICAgICAgICAgIGJ1Zl9zaXplID0gYzJkY2MuZ2V0QnVmZlNpemUoQzJEX09VVFBVVCk7Ci0gICAgICAgICAgICAgICAgcGRlc3RfZnJhbWUtPm5PZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgIHBkZXN0X2ZyYW1lLT5uRmlsbGVkTGVuID0gYnVmX3NpemU7Ci0gICAgICAgICAgICAgICAgcGRlc3RfZnJhbWUtPm5UaW1lU3RhbXAgPSBwc291cmNlX2ZyYW1lLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgICAgIHBkZXN0X2ZyYW1lLT5uRmxhZ3MgPSBwc291cmNlX2ZyYW1lLT5uRmxhZ3M7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJCdWZmZXIgaGVhZGVyICVwIEZpbGxlZCBsZW4gc2l6ZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZXN0X2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBkZXN0X2ZyYW1lLT5uRmlsbGVkTGVuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG11bm1hcCh1dmEsSW5wdXRfcG1lbV9pbmZvLnNpemUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChkZXZfdXNlX2J1ZihQT1JUX0lOREVYX0lOKSAhPSB0cnVlKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogaW4gZGV2X3VzZV9idWYiKTsKLSAgICAgICAgcG9zdF9ldmVudCAoKHVuc2lnbmVkIGxvbmcpcGRlc3RfZnJhbWUsMCxPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VCRCk7Ci0gICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSBPTVhfRXJyb3JOb25lKQotICAgICAgICByZXQgPSBlbXB0eV90aGlzX2J1ZmZlcl9wcm94eShoQ29tcCxwZGVzdF9mcmFtZSk7Ci0gICAgaWYgKHJldCA9PSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIG1fcENhbGxiYWNrcy5FbXB0eUJ1ZmZlckRvbmUoaENvbXAgLG1fYXBwX2RhdGEsIHBzb3VyY2VfZnJhbWUpOwotICAgICAgICBwc291cmNlX2ZyYW1lID0gTlVMTDsKLSAgICAgICAgcGRlc3RfZnJhbWUgPSBOVUxMOwotICAgICAgICBpZiAoIXBzb3VyY2VfZnJhbWUgJiYgbV9vcHFfbWV0YV9xLm1fc2l6ZSkgewotICAgICAgICAgICAgbV9vcHFfbWV0YV9xLnBvcF9lbnRyeSgmYWRkcmVzcywmcDIsJmlkKTsKLSAgICAgICAgICAgIHBzb3VyY2VfZnJhbWUgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUqICkgYWRkcmVzczsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXBkZXN0X2ZyYW1lICYmIG1fb3BxX3BtZW1fcS5tX3NpemUpIHsKLSAgICAgICAgICAgIG1fb3BxX3BtZW1fcS5wb3BfZW50cnkoJmFkZHJlc3MsJnAyLCZpZCk7Ci0gICAgICAgICAgICBwZGVzdF9mcmFtZSA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSogKSBhZGRyZXNzOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJwZGVzdF9mcmFtZSBwb3AgYWRkcmVzcyBpcyAlcCIscGRlc3RfZnJhbWUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IgYW5kIHNvdXJjZSBmcmFtZSBoYXMgYmVlbiBzY2hlZHVsZWQgZm9yIGFuIEVCRAotICAgICAgICBwc291cmNlX2ZyYW1lID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotT01YX0VSUk9SVFlQRSBvbXhfdmlkZW86OnB1c2hfaW5wdXRfYnVmZmVyKE9NWF9IQU5ETEVUWVBFIGhDb21wKQotewotICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IDAscDIsaWQsIGluZGV4ID0gMDsKLSAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkluIHB1c2ggaW5wdXQgYnVmZmVyIik7Ci0gICAgaWYgKCFwc291cmNlX2ZyYW1lICYmIG1fb3BxX21ldGFfcS5tX3NpemUpIHsKLSAgICAgICAgbV9vcHFfbWV0YV9xLnBvcF9lbnRyeSgmYWRkcmVzcywmcDIsJmlkKTsKLSAgICAgICAgcHNvdXJjZV9mcmFtZSA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSogKSBhZGRyZXNzOwotICAgIH0KLSAgICBpZiAoIXBkZXN0X2ZyYW1lICYmIG1fb3BxX3BtZW1fcS5tX3NpemUpIHsKLSAgICAgICAgbV9vcHFfcG1lbV9xLnBvcF9lbnRyeSgmYWRkcmVzcywmcDIsJmlkKTsKLSAgICAgICAgcGRlc3RfZnJhbWUgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUqICkgYWRkcmVzczsKLSAgICB9Ci0gICAgd2hpbGUgKHBzb3VyY2VfZnJhbWUgIT0gTlVMTCAmJiBwZGVzdF9mcmFtZSAhPSBOVUxMICYmCi0gICAgICAgICAgICByZXQgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBzdHJ1Y3QgcG1lbSBJbnB1dF9wbWVtX2luZm87Ci0gICAgICAgIExFR0FDWV9DQU1fTUVUQURBVEFfVFlQRSAqbWVkaWFfYnVmZmVyOwotICAgICAgICBpbmRleCA9IHBkZXN0X2ZyYW1lIC0gbV9pbnBfbWVtX3B0cjsKLSAgICAgICAgaWYgKGluZGV4ID49IG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJPdXRwdXQgYnVmZmVyIGluZGV4IGlzIHdyb25nICV1IGFjdCBjb3VudCAldSIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpaW5kZXgsICh1bnNpZ25lZCBpbnQpbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9NZXRhLUJ1ZmZlciB3aXRoIGVtcHR5IGZpbGxlZC1sZW5ndGggY2FuIGNvbnRhaW4gZ2FyYmFnZSBoYW5kbGUKLSAgICAgICAgLy9Tb21lIGNsaWVudHMgcXVldWUgc3VjaCBidWZmZXJzIHRvIHNpZ25hbCBFT1MuIEhhbmRsZSB0aGlzIGNhc2UKLSAgICAgICAgLy8gc2VwYXJhdGVseSBieSBxdWV1ZWluZyBhbiBpbnRlcm1lZGlhdGUgY29sb3ItY29udmVyc2lvbiBidWZmZXIKLSAgICAgICAgLy8gYW5kIHByb3BhZ2F0ZSB0aGUgRU9TLgotICAgICAgICBpZiAocHNvdXJjZV9mcmFtZS0+bkZpbGxlZExlbiA9PSAwICYmIChwc291cmNlX2ZyYW1lLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHVzaF9lbXB0eV9lb3NfYnVmZmVyKGhDb21wLCBwc291cmNlX2ZyYW1lKTsKLSAgICAgICAgfQotICAgICAgICBtZWRpYV9idWZmZXIgPSAoTEVHQUNZX0NBTV9NRVRBREFUQV9UWVBFICopcHNvdXJjZV9mcmFtZS0+cEJ1ZmZlcjsKLSAgICAgICAgLypXaWxsIGVuYWJsZSB0byB2ZXJpZnkgY2FtY29yZGVyIGluIGN1cnJlbnQgVElQUyBjYW4gYmUgcmVtb3ZlZCovCi0gICAgICAgIGlmIChtZWRpYV9idWZmZXItPmJ1ZmZlcl90eXBlID09IExFR0FDWV9DQU1fU09VUkNFKSB7Ci0gICAgICAgICAgICBJbnB1dF9wbWVtX2luZm8uYnVmZmVyID0gbWVkaWFfYnVmZmVyOwotICAgICAgICAgICAgSW5wdXRfcG1lbV9pbmZvLmZkID0gTWV0YUJ1ZmZlclV0aWw6OmdldEZkQXQobWVkaWFfYnVmZmVyLT5tZXRhX2hhbmRsZSwgMCk7Ci0gICAgICAgICAgICBJbnB1dF9wbWVtX2luZm8ub2Zmc2V0ID0gTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KG1lZGlhX2J1ZmZlci0+bWV0YV9oYW5kbGUsIDAsIE1ldGFCdWZmZXJVdGlsOjpJTlRfT0ZGU0VUKTsKLSAgICAgICAgICAgIElucHV0X3BtZW1faW5mby5zaXplID0gTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KG1lZGlhX2J1ZmZlci0+bWV0YV9oYW5kbGUsIDAsIE1ldGFCdWZmZXJVdGlsOjpJTlRfU0laRSk7Ci0gICAgICAgICAgICBtX2dyYXBoaWNidWZmZXJfc2l6ZSA9IElucHV0X3BtZW1faW5mby5zaXplOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJFVEIgZmQgPSAlZCwgb2Zmc2V0ID0gJWQsIHNpemUgPSAlZCIsSW5wdXRfcG1lbV9pbmZvLmZkLAotICAgICAgICAgICAgICAgICAgICBJbnB1dF9wbWVtX2luZm8ub2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBJbnB1dF9wbWVtX2luZm8uc2l6ZSk7Ci0gICAgICAgICAgICByZXQgPSBxdWV1ZV9tZXRhX2J1ZmZlcihoQ29tcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBWaWRlb0dyYWxsb2NNZXRhZGF0YSAqbWVkaWFfYnVmZmVyID0gKFZpZGVvR3JhbGxvY01ldGFkYXRhICopcHNvdXJjZV9mcmFtZS0+cEJ1ZmZlcjsKLSAgICAgICAgICAgIHByaXZhdGVfaGFuZGxlX3QgKmhhbmRsZSA9IChwcml2YXRlX2hhbmRsZV90ICopbWVkaWFfYnVmZmVyLT5wSGFuZGxlOwotICAgICAgICAgICAgSW5wdXRfcG1lbV9pbmZvLmJ1ZmZlciA9IG1lZGlhX2J1ZmZlcjsKLSAgICAgICAgICAgIElucHV0X3BtZW1faW5mby5mZCA9IGhhbmRsZS0+ZmQ7Ci0gICAgICAgICAgICBJbnB1dF9wbWVtX2luZm8ub2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIElucHV0X3BtZW1faW5mby5zaXplID0gaGFuZGxlLT5zaXplOwotICAgICAgICAgICAgbV9ncmFwaGljYnVmZmVyX3NpemUgPSBJbnB1dF9wbWVtX2luZm8uc2l6ZTsKLSAgICAgICAgICAgIGlmIChpc19jb252X25lZWRlZChoYW5kbGUtPmZvcm1hdCwgaGFuZGxlLT5mbGFncykpCi0gICAgICAgICAgICAgICAgcmV0ID0gY29udmVydF9xdWV1ZV9idWZmZXIoaENvbXAsSW5wdXRfcG1lbV9pbmZvLGluZGV4KTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGhhbmRsZS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfTlYxMl9FTkNPREVBQkxFIHx8Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+Zm9ybWF0ID09IFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybSB8fAotICAgICAgICAgICAgICAgICAgICBoYW5kbGUtPmZvcm1hdCA9PSBRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm1Db21wcmVzc2VkIHx8Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4IHx8Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+Zm9ybWF0ID09IFFPTVhfQ09MT1JfRm9ybWF0MzJiaXRSR0JBODg4OENvbXByZXNzZWQpCi0gICAgICAgICAgICAgICAgcmV0ID0gcXVldWVfbWV0YV9idWZmZXIoaENvbXApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92aWRlbzo6cHVzaF9lbXB0eV9lb3NfYnVmZmVyKE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogYnVmZmVyKSB7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIG9wcUJ1ZiA9IE5VTEw7Ci0gICAgT01YX0VSUk9SVFlQRSByZXRWYWwgPSBPTVhfRXJyb3JOb25lOwotICAgIHVuc2lnbmVkIGluZGV4ID0gMDsKLQotICAgIERFQlVHX1BSSU5UX0xPVygiSW4gcHVzaCBlbXB0eSBlb3MgYnVmZmVyIik7Ci0gICAgZG8gewotICAgICAgICBpZiAobVVzZXNDb2xvckNvbnZlcnNpb24pIHsKLSAgICAgICAgICAgIGlmIChwZGVzdF9mcmFtZSkgewotICAgICAgICAgICAgICAgIC8vWzFdIHVzZSBhIGNoZWNrZWQgb3V0IGNvbnZlcnNpb24gYnVmZmVyLCBpZiBvbmUgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgb3BxQnVmID0gcGRlc3RfZnJhbWU7Ci0gICAgICAgICAgICAgICAgcGRlc3RfZnJhbWUgPSBOVUxMOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtX29wcV9wbWVtX3EubV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgLy9bMl0gZWxzZSBwb3Agb3V0IG9uZSBmcm9tIHRoZSBxdWV1ZSwgaWYgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gMCwgcDIsIGlkOwotICAgICAgICAgICAgICAgIG1fb3BxX3BtZW1fcS5wb3BfZW50cnkoJmFkZHJlc3MsJnAyLCZpZCk7Ci0gICAgICAgICAgICAgICAgb3BxQnVmID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFKiApIGFkZHJlc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmRleCA9IG9wcUJ1ZiAtIG1faW5wX21lbV9wdHI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvcHFCdWYgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUqICkgYnVmZmVyOwotICAgICAgICAgICAgaW5kZXggPSBvcHFCdWYgLSBtZXRhX2J1ZmZlcl9oZHI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW9wcUJ1ZiB8fCBpbmRleCA+PSBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigicHVzaF9lbXB0eV9lb3NfYnVmZmVyOiBDb3VsZCBub3QgZmluZCBhICIKLSAgICAgICAgICAgICAgICAgICAgImNvbG9yLWNvbnZlcnNpb24gYnVmZmVyIHRvIHF1ZXVlICEgZGVmZXIgdW50aWwgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICAvL1szXSBlbHNlLCByZXR1cm5pbmcgYmFjayB3aWxsIGRlZmVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhZ2FpbgotICAgICAgICAgICAgLy91bnRpbCBhIGNvbnZlcnNpb24gYnVmZmVyIGlzIHJldHVybmVkIGJ5IHRoZSBlbmNvZGVyIGFuZCBhbHNvCi0gICAgICAgICAgICAvL2hvbGQgb24gdG8gdGhlIGNsaWVudCdzIGJ1ZmZlcgotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIH0KLSAgICAgICAgc3RydWN0IHBtZW0gSW5wdXRfcG1lbV9pbmZvOwotICAgICAgICBJbnB1dF9wbWVtX2luZm8uYnVmZmVyID0gb3BxQnVmOwotICAgICAgICBJbnB1dF9wbWVtX2luZm8uZmQgPSBtX3BJbnB1dF9wbWVtW2luZGV4XS5mZDsKLSAgICAgICAgSW5wdXRfcG1lbV9pbmZvLm9mZnNldCA9IDA7Ci0gICAgICAgIElucHV0X3BtZW1faW5mby5zaXplID0gbV9wSW5wdXRfcG1lbVtpbmRleF0uc2l6ZTsKLQotICAgICAgICBpZiAoZGV2X3VzZV9idWYoUE9SVF9JTkRFWF9JTikgIT0gdHJ1ZSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBpbiBkZXZfdXNlX2J1ZiBmb3IgZW1wdHkgZW9zIGJ1ZmZlciIpOwotICAgICAgICAgICAgcmV0VmFsID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1F1ZXVlIHdpdGggbnVsbCBwQnVmZmVyLCBhcyBwQnVmZmVyIGluIGNsaWVudCdzIGhkciBjYW4gYmUganVuawotICAgICAgICAvL0Nsb25lIHRoZSBjb2xvci1jb252ZXJzaW9uIGJ1ZmZlciB0byBhdm9pZCBvdmVyd3JpdGluZyBvcmlnaW5hbCBidWZmZXIKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgZW1wdHlFb3NCdWZIZHI7Ci0gICAgICAgIG1lbWNweSgmZW1wdHlFb3NCdWZIZHIsIG9wcUJ1Ziwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7Ci0gICAgICAgIGVtcHR5RW9zQnVmSGRyLm5GaWxsZWRMZW4gPSAwOwotICAgICAgICBlbXB0eUVvc0J1Zkhkci5uVGltZVN0YW1wID0gYnVmZmVyLT5uVGltZVN0YW1wOwotICAgICAgICBlbXB0eUVvc0J1Zkhkci5uRmxhZ3MgPSBidWZmZXItPm5GbGFnczsKLSAgICAgICAgZW1wdHlFb3NCdWZIZHIucEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIGlmICghbVVzZXNDb2xvckNvbnZlcnNpb24pCi0gICAgICAgICAgICBlbXB0eUVvc0J1Zkhkci5uQWxsb2NMZW4gPQotICAgICAgICAgICAgbV9ncmFwaGljYnVmZmVyX3NpemUgPyBtX2dyYXBoaWNidWZmZXJfc2l6ZSA6IG1fc0luUG9ydERlZi5uQnVmZmVyU2l6ZTsKLQotICAgICAgICBpZiAoZGV2X2VtcHR5X2J1ZigmZW1wdHlFb3NCdWZIZHIsIDAsIGluZGV4LCBtX3BJbnB1dF9wbWVtW2luZGV4XS5mZCkgIT0gdHJ1ZSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBpbiBkZXZfZW1wdHlfYnVmIGZvciBlbXB0eSBlb3MgYnVmZmVyIik7Ci0gICAgICAgICAgICBkZXZfZnJlZV9idWYoJklucHV0X3BtZW1faW5mbywgUE9SVF9JTkRFWF9JTik7Ci0gICAgICAgICAgICByZXRWYWwgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtRW1wdHlFb3NCdWZmZXIgPSBvcHFCdWY7Ci0gICAgfSB3aGlsZShmYWxzZSk7Ci0KLSAgICAvL3JldHVybiBjbGllbnQncyBidWZmZXIgcmVnYXJkbGVzcyBzaW5jZSBpbnRlcm1lZGlhdGUgY29sb3ItY29udmVyc2lvbgotICAgIC8vYnVmZmVyIGlzIHNlbnQgdG8gdGhlIHRoZSBlbmNvZGVyCi0gICAgbV9wQ2FsbGJhY2tzLkVtcHR5QnVmZmVyRG9uZShoQ29tcCwgbV9hcHBfZGF0YSwgYnVmZmVyKTsKLSAgICAtLXBlbmRpbmdfaW5wdXRfYnVmZmVyczsKLSAgICBWSURDX1RSQUNFX0lOVF9MT1coIkVUQi1wZW5kaW5nIiwgcGVuZGluZ19pbnB1dF9idWZmZXJzKTsKLSAgICByZXR1cm4gcmV0VmFsOwotfQotCi0vLyBubyBjb2RlIGJleW9uZCB0aGlzICEKLQotLy8gaW5saW5lIGltcG9ydCBvZiB2ZW5kb3IgZXh0ZW5zaW9ucyBpbXBsZW1lbnRhdGlvbgotI2luY2x1ZGUgIm9teF92aWRlb19leHRlbnNpb25zLmhwcCIKZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9zcmMvb214X3ZpZGVvX2VuY29kZXIuY3BwIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL3NyYy9vbXhfdmlkZW9fZW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOGE5NDkuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL3NyYy9vbXhfdmlkZW9fZW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzM4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yCi0gICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTi1JTkZSSU5HRU1FTlQgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAib214X3ZpZGVvX2VuY29kZXIuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpZmRlZiBfQU5EUk9JRF9JQ1NfCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLSNlbmRpZgotI2lmZGVmIF9BTkRST0lEXwotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBfVVNFX0dMSUJfCi0jaW5jbHVkZSA8Z2xpYi5oPgotI2RlZmluZSBzdHJsY3B5IGdfc3RybGNweQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYmZyYW1lczsKLXN0YXRpYyBpbnQgZW50cm9weTsKLXN0YXRpYyBpbnQgbG93bGF0ZW5jeTsKLS8vIGZhY3RvcnkgZnVuY3Rpb24gZXhlY3V0ZWQgYnkgdGhlIGNvcmUgdG8gY3JlYXRlIGluc3RhbmNlcwotdm9pZCAqZ2V0X29teF9jb21wb25lbnRfZmFjdG9yeV9mbih2b2lkKQotewotICAgIHJldHVybihuZXcgb214X3ZlbmMpOwotfQotCi0vL2NvbnN0cnVjdG9yCi0KLW9teF92ZW5jOjpvbXhfdmVuYygpCi17Ci0jaWZkZWYgX0FORFJPSURfSUNTXwotICAgIG1ldGFfbW9kZV9lbmFibGUgPSBmYWxzZTsKLSAgICBtZW1zZXQobWV0YV9idWZmZXJfaGRyLDAsc2l6ZW9mKG1ldGFfYnVmZmVyX2hkcikpOwotICAgIG1lbXNldChtZXRhX2J1ZmZlcnMsMCxzaXplb2YobWV0YV9idWZmZXJzKSk7Ci0gICAgbWVtc2V0KG9wYXF1ZV9idWZmZXJfaGRyLDAsc2l6ZW9mKG9wYXF1ZV9idWZmZXJfaGRyKSk7Ci0gICAgbVVzZVByb3h5Q29sb3JGb3JtYXQgPSBmYWxzZTsKLSAgICBnZXRfc3ludGF4aGRyX2VuYWJsZSA9IGZhbHNlOwotI2VuZGlmCi0gICAgYmZyYW1lcyA9IGVudHJvcHkgPSAwOwotICAgIGNoYXIgcHJvcGVydHlfdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLSAgICBwcm9wZXJ0eV9nZXQoInZpZGMuZGVidWcubGV2ZWwiLCBwcm9wZXJ0eV92YWx1ZSwgIjEiKTsKLSAgICBkZWJ1Z19sZXZlbCA9IHN0cnRvdWwocHJvcGVydHlfdmFsdWUsIE5VTEwsIDE2KTsKLSAgICBwcm9wZXJ0eV92YWx1ZVswXSA9ICdcMCc7Ci0gICAgcHJvcGVydHlfZ2V0KCJ2aWRjLmRlYnVnLmJmcmFtZXMiLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBiZnJhbWVzID0gYXRvaShwcm9wZXJ0eV92YWx1ZSk7Ci0gICAgcHJvcGVydHlfdmFsdWVbMF0gPSAnXDAnOwotICAgIHByb3BlcnR5X2dldCgidmlkYy5kZWJ1Zy5lbnRyb3B5IiwgcHJvcGVydHlfdmFsdWUsICIxIik7Ci0gICAgZW50cm9weSA9ICEhYXRvaShwcm9wZXJ0eV92YWx1ZSk7Ci0gICAgcHJvcGVydHlfdmFsdWVbMF0gPSAnXDAnOwotICAgIGhhbmRsZSA9IE5VTEw7Ci0gICAgcHJvcGVydHlfZ2V0KCJ2aWRjLmRlYnVnLmxvd2xhdGVuY3kiLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBsb3dsYXRlbmN5ID0gYXRvaShwcm9wZXJ0eV92YWx1ZSk7Ci0gICAgcHJvcGVydHlfdmFsdWVbMF0gPSAnXDAnOwotfQotCi1vbXhfdmVuYzo6fm9teF92ZW5jKCkKLXsKLSAgICBnZXRfc3ludGF4aGRyX2VuYWJsZSA9IGZhbHNlOwotICAgIC8vbm90aGluZyB0byBkbwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBGVU5DVElPTgotICAgb214X3ZlbmM6OkNvbXBvbmVudEluaXQKLQotICAgREVTQ1JJUFRJT04KLSAgIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudC4KLQotICAgUEFSQU1FVEVSUwotICAgY3R4dCAtLSBDb250ZXh0IGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIHNlbGYuCi0gICBpZCAgIC0tIEV2ZW50IGlkZW50aWZpZXIuIFRoaXMgY291bGQgYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAxLiBDb21tYW5kIGNvbXBsZXRpb24gZXZlbnQKLSAgIDIuIEJ1ZmZlciBkb25lIGNhbGxiYWNrIGV2ZW50Ci0gICAzLiBGcmFtZSBkb25lIGNhbGxiYWNrIGV2ZW50Ci0KLSAgIFJFVFVSTiBWQUxVRQotICAgTm9uZS4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgb214X3ZlbmM6OmNvbXBvbmVudF9pbml0KE9NWF9TVFJJTkcgcm9sZSkKLXsKLQotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0KLSAgICBpbnQgZmRzWzJdOwotICAgIGludCByOwotCi0gICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29kZWNfdHlwZTsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goIm9teF92ZW5jKCk6IEluc2lkZSBjb21wb25lbnRfaW5pdCgpIik7Ci0gICAgLy8gQ29weSB0aGUgcm9sZSBpbmZvcm1hdGlvbiB3aGljaCBwcm92aWRlcyB0aGUgZGVjb2RlciBtX25raW5kCi0gICAgc3RybGNweSgoY2hhciAqKW1fbmtpbmQscm9sZSxPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgc2VjdXJlX3Nlc3Npb24gPSBmYWxzZTsKLQotICAgIGlmICghc3RybmNtcCgoY2hhciAqKW1fbmtpbmQsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIsXAotICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBzdHJsY3B5KChjaGFyICopbV9jUm9sZSwgInZpZGVvX2VuY29kZXIuYXZjIixPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgIGNvZGVjX3R5cGUgPSBPTVhfVklERU9fQ29kaW5nQVZDOwotICAgIH0gZWxzZSBpZighc3RybmNtcCgoY2hhciAqKW1fbmtpbmQsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2Yy5zZWN1cmUiLFwKLSAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgc3RybGNweSgoY2hhciAqKW1fY1JvbGUsICJ2aWRlb19lbmNvZGVyLmF2YyIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICBjb2RlY190eXBlID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKLSAgICAgICAgc2VjdXJlX3Nlc3Npb24gPSB0cnVlOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RybmNtcCgoY2hhciAqKW1fbmtpbmQsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLnZwOCIsICAgIFwKLSAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgc3RybGNweSgoY2hhciAqKW1fY1JvbGUsICJ2aWRlb19lbmNvZGVyLnZwOCIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICBjb2RlY190eXBlID0gT01YX1ZJREVPX0NvZGluZ1ZQODsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cm5jbXAoKGNoYXIgKiltX25raW5kLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oZXZjIiwgICAgXAotICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBzdHJsY3B5KChjaGFyICopbV9jUm9sZSwgInZpZGVvX2VuY29kZXIuaGV2YyIsIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKLSAgICAgICAgY29kZWNfdHlwZSA9IE9NWF9WSURFT19Db2RpbmdIRVZDOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKGNoYXIgKiltX25raW5kLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oZXZjLnNlY3VyZSIsICAgIFwKLSAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgc3RybGNweSgoY2hhciAqKW1fY1JvbGUsICJ2aWRlb19lbmNvZGVyLmhldmMiLCBPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgIGNvZGVjX3R5cGUgPSBPTVhfVklERU9fQ29kaW5nSEVWQzsKLSAgICAgICAgc2VjdXJlX3Nlc3Npb24gPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVW5rbm93biBDb21wb25lbnQiKTsKLSAgICAgICAgZVJldCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnROYW1lOwotICAgIH0KLQotICAgIGlmIChlUmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgcmV0dXJuIGVSZXQ7Ci0gICAgfQotI2lmZGVmIEVOQUJMRV9HRVRfU1lOVEFYX0hEUgotICAgIGdldF9zeW50YXhoZHJfZW5hYmxlID0gdHJ1ZTsKLSAgICBERUJVR19QUklOVF9ISUdIKCJHZXQgc3ludGF4IGhlYWRlciBlbmFibGVkIik7Ci0jZW5kaWYKLQotICAgIGhhbmRsZSA9IG5ldyB2ZW5jX2Rldih0aGlzKTsKLQotICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IGhhbmRsZSBpcyBOVUxMIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgfQotCi0gICAgaWYgKGhhbmRsZS0+dmVuY19vcGVuKGNvZGVjX3R5cGUpICE9IHRydWUpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiB2ZW5jX29wZW4gZmFpbGVkIik7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7Ci0gICAgICAgIGdvdG8gaW5pdF9lcnJvcjsKLSAgICB9Ci0KLSAgICAvL0ludGlhbGlzZSB0aGUgT01YIGxheWVyIHZhcmlhYmxlcwotICAgIG1lbXNldCgmbV9wQ2FsbGJhY2tzLDAsc2l6ZW9mKE9NWF9DQUxMQkFDS1RZUEUpKTsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zUG9ydFBhcmFtLCBPTVhfUE9SVF9QQVJBTV9UWVBFKTsKLSAgICBtX3NQb3J0UGFyYW0ublBvcnRzID0gMHgyOwotICAgIG1fc1BvcnRQYXJhbS5uU3RhcnRQb3J0TnVtYmVyID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfSU47Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc1BvcnRQYXJhbV9hdWRpbywgT01YX1BPUlRfUEFSQU1fVFlQRSk7Ci0gICAgbV9zUG9ydFBhcmFtX2F1ZGlvLm5Qb3J0cyA9IDA7Ci0gICAgbV9zUG9ydFBhcmFtX2F1ZGlvLm5TdGFydFBvcnROdW1iZXIgPSAwOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NQb3J0UGFyYW1faW1nLCBPTVhfUE9SVF9QQVJBTV9UWVBFKTsKLSAgICBtX3NQb3J0UGFyYW1faW1nLm5Qb3J0cyA9IDA7Ci0gICAgbV9zUG9ydFBhcmFtX2ltZy5uU3RhcnRQb3J0TnVtYmVyID0gMDsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zUGFyYW1CaXRyYXRlLCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUpOwotICAgIG1fc1BhcmFtQml0cmF0ZS5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc1BhcmFtQml0cmF0ZS5lQ29udHJvbFJhdGUgPSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZVNraXBGcmFtZXM7Ci0gICAgbV9zUGFyYW1CaXRyYXRlLm5UYXJnZXRCaXRyYXRlID0gNjQwMDA7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc0NvbmZpZ0JpdHJhdGUsIE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUpOwotICAgIG1fc0NvbmZpZ0JpdHJhdGUublBvcnRJbmRleCA9IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVDsKLSAgICBtX3NDb25maWdCaXRyYXRlLm5FbmNvZGVCaXRyYXRlID0gNjQwMDA7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc0NvbmZpZ0ZyYW1lcmF0ZSwgT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFKTsKLSAgICBtX3NDb25maWdGcmFtZXJhdGUublBvcnRJbmRleCA9IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVDsKLSAgICBtX3NDb25maWdGcmFtZXJhdGUueEVuY29kZUZyYW1lcmF0ZSA9IDMwIDw8IDE2OwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NDb25maWdJbnRyYVJlZnJlc2hWT1AsIE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRSk7Ci0gICAgbV9zQ29uZmlnSW50cmFSZWZyZXNoVk9QLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0gICAgbV9zQ29uZmlnSW50cmFSZWZyZXNoVk9QLkludHJhUmVmcmVzaFZPUCA9IE9NWF9GQUxTRTsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zQ29uZmlnRnJhbWVSb3RhdGlvbiwgT01YX0NPTkZJR19ST1RBVElPTlRZUEUpOwotICAgIG1fc0NvbmZpZ0ZyYW1lUm90YXRpb24ublBvcnRJbmRleCA9IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVDsKLSAgICBtX3NDb25maWdGcmFtZVJvdGF0aW9uLm5Sb3RhdGlvbiA9IDA7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc0NvbmZpZ0FWQ0lEUlBlcmlvZCwgT01YX1ZJREVPX0NPTkZJR19BVkNJTlRSQVBFUklPRCk7Ci0gICAgbV9zQ29uZmlnQVZDSURSUGVyaW9kLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc1ByZXBlbmRTUFNQUFMsIFByZXBlbmRTUFNQUFNUb0lEUkZyYW1lc1BhcmFtcyk7Ci0gICAgbV9zUHJlcGVuZFNQU1BQUy5iRW5hYmxlID0gT01YX0ZBTFNFOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NTZXNzaW9uUXVhbnRpemF0aW9uLCBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSk7Ci0gICAgbV9zU2Vzc2lvblF1YW50aXphdGlvbi5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NTZXNzaW9uUVBSYW5nZSwgT01YX1FDT01fVklERU9fUEFSQU1fSVBCX1FQUkFOR0VUWVBFKTsKLSAgICBtX3NTZXNzaW9uUVBSYW5nZS5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NBVkNTbGljZUZNTywgT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1PKTsKLSAgICBtX3NBVkNTbGljZUZNTy5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc0FWQ1NsaWNlRk1PLmVTbGljZU1vZGUgPSBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0RlZmF1bHQ7Ci0gICAgbV9zQVZDU2xpY2VGTU8ubk51bVNsaWNlR3JvdXBzID0gMDsKLSAgICBtX3NBVkNTbGljZUZNTy5uU2xpY2VHcm91cE1hcFR5cGUgPSAwOwotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zUGFyYW1Qcm9maWxlTGV2ZWwsIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKTsKLSAgICBtX3NQYXJhbVByb2ZpbGVMZXZlbC5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NJbnRyYXBlcmlvZCwgUU9NWF9WSURFT19JTlRSQVBFUklPRFRZUEUpOwotICAgIG1fc0ludHJhcGVyaW9kLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0gICAgbV9zSW50cmFwZXJpb2QublBGcmFtZXMgPSAobV9zQ29uZmlnRnJhbWVyYXRlLnhFbmNvZGVGcmFtZXJhdGUgKiAyKSAtIDE7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc0Vycm9yQ29ycmVjdGlvbiwgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUpOwotICAgIG1fc0Vycm9yQ29ycmVjdGlvbi5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc0Vycm9yQ29ycmVjdGlvbi5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZyA9IE9NWF9GQUxTRTsKLSAgICBtX3NFcnJvckNvcnJlY3Rpb24uYkVuYWJsZUhFQyA9IE9NWF9GQUxTRTsKLSAgICBtX3NFcnJvckNvcnJlY3Rpb24uYkVuYWJsZVJlc3luYyA9IE9NWF9GQUxTRTsKLSAgICBtX3NFcnJvckNvcnJlY3Rpb24uYkVuYWJsZVJWTEMgPSBPTVhfRkFMU0U7Ci0gICAgbV9zRXJyb3JDb3JyZWN0aW9uLm5SZXN5bmNoTWFya2VyU3BhY2luZyA9IDA7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc0ludHJhUmVmcmVzaCwgT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEUpOwotICAgIG1fc0ludHJhUmVmcmVzaC5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc0ludHJhUmVmcmVzaC5lUmVmcmVzaE1vZGUgPSBPTVhfVklERU9fSW50cmFSZWZyZXNoTWF4OwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NDb25maWdJbnRyYVJlZnJlc2gsIE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9JTlRSQVJFRlJFU0hUWVBFKTsKLSAgICBtX3NDb25maWdJbnRyYVJlZnJlc2gublBvcnRJbmRleCA9IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVDsKLSAgICBtX3NDb25maWdJbnRyYVJlZnJlc2gublJlZnJlc2hQZXJpb2QgPSAwOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NDb25maWdDb2xvckFzcGVjdHMsIERlc2NyaWJlQ29sb3JBc3BlY3RzUGFyYW1zKTsKLSAgICBtX3NDb25maWdDb2xvckFzcGVjdHMublBvcnRJbmRleCA9IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVDsKLSAgICBtX3NDb25maWdDb2xvckFzcGVjdHMuc0FzcGVjdHMubVJhbmdlID0gIENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZDsKLSAgICBtX3NDb25maWdDb2xvckFzcGVjdHMuc0FzcGVjdHMubVByaW1hcmllcyA9IENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7Ci0gICAgbV9zQ29uZmlnQ29sb3JBc3BlY3RzLnNBc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDb2xvckFzcGVjdHM6Ok1hdHJpeFVuc3BlY2lmaWVkOwotICAgIG1fc0NvbmZpZ0NvbG9yQXNwZWN0cy5zQXNwZWN0cy5tVHJhbnNmZXIgPSBDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7Ci0KLSAgICBpZiAoY29kZWNfdHlwZSA9PSBPTVhfVklERU9fQ29kaW5nQVZDKSB7Ci0gICAgICAgIG1fc1BhcmFtUHJvZmlsZUxldmVsLmVQcm9maWxlID0gKE9NWF9VMzIpIE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgIG1fc1BhcmFtUHJvZmlsZUxldmVsLmVMZXZlbCA9IChPTVhfVTMyKSBPTVhfVklERU9fQVZDTGV2ZWwxOwotICAgIH0gZWxzZSBpZiAoY29kZWNfdHlwZSA9PSBPTVhfVklERU9fQ29kaW5nVlA4KSB7Ci0gICAgICAgIG1fc1BhcmFtUHJvZmlsZUxldmVsLmVQcm9maWxlID0gKE9NWF9VMzIpIE9NWF9WSURFT19WUDhQcm9maWxlTWFpbjsKLSAgICAgICAgbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZUxldmVsID0gKE9NWF9VMzIpIE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMDsKLSAgICB9IGVsc2UgaWYgKGNvZGVjX3R5cGUgPT0gT01YX1ZJREVPX0NvZGluZ0hFVkMpIHsKLSAgICAgICAgbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZVByb2ZpbGUgPSAoT01YX1UzMikgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjsKLSAgICAgICAgbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZUxldmVsID0gKE9NWF9VMzIpIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDE7Ci0gICAgfQotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NQYXJhbUVudHJvcHksICBRT01YX1ZJREVPX0gyNjRFTlRST1BZQ09ESU5HVFlQRSk7Ci0gICAgbV9zUGFyYW1FbnRyb3B5LmJDYWJhYyA9IE9NWF9GQUxTRTsKLQotICAgIC8vIEluaXRpYWxpemUgdGhlIHZpZGVvIHBhcmFtZXRlcnMgZm9yIGlucHV0IHBvcnQKLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc0luUG9ydERlZiwgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSk7Ci0gICAgbV9zSW5Qb3J0RGVmLm5Qb3J0SW5kZXg9IChPTVhfVTMyKSBQT1JUX0lOREVYX0lOOwotICAgIG1fc0luUG9ydERlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwotICAgIG1fc0luUG9ydERlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwotICAgIG1fc0luUG9ydERlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKLSAgICBtX3NJblBvcnREZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKLSAgICBtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSA9IChjaGFyICopIllVVjQyMCI7Ci0gICAgbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IE9NWF9DT1JFX1FDSUZfV0lEVEg7Ci0gICAgbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBPTVhfQ09SRV9RQ0lGX0hFSUdIVDsKLSAgICBtX3NJblBvcnREZWYuZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBPTVhfQ09SRV9RQ0lGX1dJRFRIOwotICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gT01YX0NPUkVfUUNJRl9IRUlHSFQ7Ci0gICAgbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDY0MDAwOwotICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IDE1IDw8IDE2OwotICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKQotICAgICAgICBRT01YX0RFRkFVTFRfQ09MT1JfRk1UOwotICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gIE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7Ci0KLSAgICBpZiAoZGV2X2dldF9idWZfcmVxKCZtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50TWluLAotICAgICAgICAgICAgICAgICZtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICZtX3NJblBvcnREZWYubkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgbV9zSW5Qb3J0RGVmLm5Qb3J0SW5kZXgpICE9IHRydWUpIHsKLSAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgZ290byBpbml0X2Vycm9yOwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgdGhlIHZpZGVvIHBhcmFtZXRlcnMgZm9yIG91dHB1dCBwb3J0Ci0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NPdXRQb3J0RGVmLCBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKTsKLSAgICBtX3NPdXRQb3J0RGVmLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0gICAgbV9zT3V0UG9ydERlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwotICAgIG1fc091dFBvcnREZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKLSAgICBtX3NPdXRQb3J0RGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOwotICAgIG1fc091dFBvcnREZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7Ci0gICAgbV9zT3V0UG9ydERlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBPTVhfQ09SRV9RQ0lGX1dJRFRIOwotICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IE9NWF9DT1JFX1FDSUZfSEVJR0hUOwotICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gNjQwMDA7Ci0gICAgbV9zT3V0UG9ydERlZi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IDE1IDw8IDE2OwotICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9ICBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOwotICAgIGlmIChjb2RlY190eXBlID09IE9NWF9WSURFT19Db2RpbmdBVkMpIHsKLSAgICAgICAgbV9zT3V0UG9ydERlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gIE9NWF9WSURFT19Db2RpbmdBVkM7Ci0gICAgfSBlbHNlIGlmIChjb2RlY190eXBlID09IE9NWF9WSURFT19Db2RpbmdWUDgpIHsKLSAgICAgICAgbV9zT3V0UG9ydERlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gIE9NWF9WSURFT19Db2RpbmdWUDg7Ci0gICAgfSBlbHNlIGlmIChjb2RlY190eXBlID09IE9NWF9WSURFT19Db2RpbmdIRVZDKSB7Ci0gICAgICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9ICBPTVhfVklERU9fQ29kaW5nSEVWQzsKLSAgICB9Ci0KLSAgICBpZiAoZGV2X2dldF9idWZfcmVxKCZtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudE1pbiwKLSAgICAgICAgICAgICAgICAmbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgJm1fc091dFBvcnREZWYubkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgbV9zT3V0UG9ydERlZi5uUG9ydEluZGV4KSAhPSB0cnVlKSB7Ci0gICAgICAgIGVSZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgfQotCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdmlkZW8gY29sb3IgZm9ybWF0IGZvciBpbnB1dCBwb3J0Ci0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NJblBvcnRGb3JtYXQsIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSk7Ci0gICAgbV9zSW5Qb3J0Rm9ybWF0Lm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9JTjsKLSAgICBtX3NJblBvcnRGb3JtYXQubkluZGV4ID0gMDsKLSAgICBtX3NJblBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKQotICAgICAgICBRT01YX0RFRkFVTFRfQ09MT1JfRk1UOwotICAgIG1fc0luUG9ydEZvcm1hdC5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOwotCi0KLSAgICAvLyBJbml0aWFsaXplIHRoZSBjb21wcmVzc2lvbiBmb3JtYXQgZm9yIG91dHB1dCBwb3J0Ci0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NPdXRQb3J0Rm9ybWF0LCBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUpOwotICAgIG1fc091dFBvcnRGb3JtYXQublBvcnRJbmRleCA9IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVDsKLSAgICBtX3NPdXRQb3J0Rm9ybWF0Lm5JbmRleCA9IDA7Ci0gICAgbV9zT3V0UG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOwotICAgIGlmIChjb2RlY190eXBlID09IE9NWF9WSURFT19Db2RpbmdBVkMpIHsKLSAgICAgICAgbV9zT3V0UG9ydEZvcm1hdC5lQ29tcHJlc3Npb25Gb3JtYXQgPSAgT01YX1ZJREVPX0NvZGluZ0FWQzsKLSAgICB9IGVsc2UgaWYgKGNvZGVjX3R5cGUgPT0gT01YX1ZJREVPX0NvZGluZ1ZQOCkgewotICAgICAgICBtX3NPdXRQb3J0Rm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCA9ICBPTVhfVklERU9fQ29kaW5nVlA4OwotICAgIH0gZWxzZSBpZiAoY29kZWNfdHlwZSA9PSBPTVhfVklERU9fQ29kaW5nSEVWQykgewotICAgICAgICBtX3NPdXRQb3J0Rm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCA9ICBPTVhfVklERU9fQ29kaW5nSEVWQzsKLSAgICB9Ci0KLSAgICAvLyBtYW5kYXRvcnkgSW5kaWNlcyBmb3Iga3Jvbm9zIHRlc3Qgc3VpdGUKLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc1ByaW9yaXR5TWdtdCwgT01YX1BSSU9SSVRZTUdNVFRZUEUpOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NJbkJ1ZlN1cHBsaWVyLCBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFKTsKLSAgICBtX3NJbkJ1ZlN1cHBsaWVyLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9JTjsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zT3V0QnVmU3VwcGxpZXIsIE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUpOwotICAgIG1fc091dEJ1ZlN1cHBsaWVyLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0KLSAgICAvLyBoMjY0IHNwZWNpZmljIGluaXQKLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc1BhcmFtQVZDLCBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSk7Ci0gICAgbV9zUGFyYW1BVkMublBvcnRJbmRleCA9IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVDsKLSAgICBtX3NQYXJhbUFWQy5uU2xpY2VIZWFkZXJTcGFjaW5nID0gMDsKLSAgICBtX3NQYXJhbUFWQy5uUEZyYW1lcyA9IChtX3NPdXRQb3J0Rm9ybWF0LnhGcmFtZXJhdGUgKiAyIC0gMSk7IC8vIDIgc2Vjb25kIGludHJhIHBlcmlvZCBmb3IgZGVmYXVsdCBvdXRwb3J0IGZwcwotICAgIG1fc1BhcmFtQVZDLm5CRnJhbWVzID0gMDsKLSAgICBtX3NQYXJhbUFWQy5iVXNlSGFkYW1hcmQgPSBPTVhfRkFMU0U7Ci0gICAgbV9zUGFyYW1BVkMublJlZklkeDEwQWN0aXZlTWludXMxID0gMTsKLSAgICBtX3NQYXJhbUFWQy5uUmVmSWR4MTFBY3RpdmVNaW51czEgPSAwOwotICAgIG1fc1BhcmFtQVZDLmJFbmFibGVVRVAgPSBPTVhfRkFMU0U7Ci0gICAgbV9zUGFyYW1BVkMuYkVuYWJsZUZNTyA9IE9NWF9GQUxTRTsKLSAgICBtX3NQYXJhbUFWQy5iRW5hYmxlQVNPID0gT01YX0ZBTFNFOwotICAgIG1fc1BhcmFtQVZDLmJFbmFibGVSUyA9IE9NWF9GQUxTRTsKLSAgICBtX3NQYXJhbUFWQy5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7Ci0gICAgbV9zUGFyYW1BVkMuZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTsKLSAgICBtX3NQYXJhbUFWQy5uQWxsb3dlZFBpY3R1cmVUeXBlcyA9IDI7Ci0gICAgbV9zUGFyYW1BVkMuYkZyYW1lTUJzT25seSA9IE9NWF9GQUxTRTsKLSAgICBtX3NQYXJhbUFWQy5iTUJBRkYgPSBPTVhfRkFMU0U7Ci0gICAgbV9zUGFyYW1BVkMuYkVudHJvcHlDb2RpbmdDQUJBQyA9IE9NWF9GQUxTRTsKLSAgICBtX3NQYXJhbUFWQy5iV2VpZ2h0ZWRQUHJlZGljdGlvbiA9IE9NWF9GQUxTRTsKLSAgICBtX3NQYXJhbUFWQy5uV2VpZ2h0ZWRCaXByZWRpY2l0b25Nb2RlID0gMDsKLSAgICBtX3NQYXJhbUFWQy5iY29uc3RJcHJlZCA9IE9NWF9GQUxTRTsKLSAgICBtX3NQYXJhbUFWQy5iRGlyZWN0OHg4SW5mZXJlbmNlID0gT01YX0ZBTFNFOwotICAgIG1fc1BhcmFtQVZDLmJEaXJlY3RTcGF0aWFsVGVtcG9yYWwgPSBPTVhfRkFMU0U7Ci0gICAgbV9zUGFyYW1BVkMubkNhYmFjSW5pdElkYyA9IDA7Ci0gICAgbV9zUGFyYW1BVkMuZUxvb3BGaWx0ZXJNb2RlID0gT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGU7Ci0KLSAgICAvLyBWUDggc3BlY2lmaWMgaW5pdAotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zUGFyYW1WUDgsIE9NWF9WSURFT19QQVJBTV9WUDhUWVBFKTsKLSAgICBtX3NQYXJhbVZQOC5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc1BhcmFtVlA4LmVQcm9maWxlID0gT01YX1ZJREVPX1ZQOFByb2ZpbGVNYWluOwotICAgIG1fc1BhcmFtVlA4LmVMZXZlbCA9IE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMDsKLSAgICBtX3NQYXJhbVZQOC5uRENUUGFydGl0aW9ucyA9IDA7Ci0gICAgbV9zUGFyYW1WUDguYkVycm9yUmVzaWxpZW50TW9kZSA9IE9NWF9GQUxTRTsKLQotICAgIC8vIEhFVkMgc3BlY2lmaWMgaW5pdAotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zUGFyYW1IRVZDLCBPTVhfVklERU9fUEFSQU1fSEVWQ1RZUEUpOwotICAgIG1fc1BhcmFtSEVWQy5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc1BhcmFtSEVWQy5lUHJvZmlsZSA9ICBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluOwotICAgIG1fc1BhcmFtSEVWQy5lTGV2ZWwgPSAgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMTsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zUGFyYW1MVFJNb2RlLCBRT01YX1ZJREVPX1BBUkFNX0xUUk1PREVfVFlQRSk7Ci0gICAgbV9zUGFyYW1MVFJNb2RlLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0gICAgbV9zUGFyYW1MVFJNb2RlLmVMVFJNb2RlID0gUU9NWF9WSURFT19MVFJNb2RlX0Rpc2FibGU7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc1BhcmFtTFRSQ291bnQsIFFPTVhfVklERU9fUEFSQU1fTFRSQ09VTlRfVFlQRSk7Ci0gICAgbV9zUGFyYW1MVFJDb3VudC5uUG9ydEluZGV4ID0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUOwotICAgIG1fc1BhcmFtTFRSQ291bnQubkNvdW50ID0gMDsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zQ29uZmlnRGVpbnRlcmxhY2UsIE9NWF9WSURFT19DT05GSUdfREVJTlRFUkxBQ0UpOwotICAgIG1fc0NvbmZpZ0RlaW50ZXJsYWNlLm5Qb3J0SW5kZXggPSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQ7Ci0gICAgbV9zQ29uZmlnRGVpbnRlcmxhY2UubkVuYWJsZSA9IE9NWF9GQUxTRTsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zSGllckxheWVycywgUU9NWF9WSURFT19ISUVSQVJDSElDQUxMQVlFUlMpOwotICAgIG1fc0hpZXJMYXllcnMublBvcnRJbmRleCA9IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVDsKLSAgICBtX3NIaWVyTGF5ZXJzLm5OdW1MYXllcnMgPSAwOwotICAgIG1fc0hpZXJMYXllcnMuZUhpZXJhcmNoaWNhbENvZGluZ1R5cGUgPSBRT01YX0hJRVJBUkNISUNBTENPRElOR19QOwotCi0gICAgT01YX0lOSVRfU1RSVUNUKCZtX3NQYXJhbVRlbXBvcmFsTGF5ZXJzLCBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSk7Ci0gICAgbV9zUGFyYW1UZW1wb3JhbExheWVycy5lU3VwcG9ydGVkUGF0dGVybnMgPSBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuQW5kcm9pZDsKLQotICAgIE9NWF9JTklUX1NUUlVDVCgmbV9zQ29uZmlnVGVtcG9yYWxMYXllcnMsIE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSk7Ci0KLSAgICBPTVhfSU5JVF9TVFJVQ1QoJm1fc1BhcmFtQVZUaW1lclRpbWVzdGFtcE1vZGUsIFFPTVhfRU5BQkxFVFlQRSk7Ci0gICAgbV9zUGFyYW1BVlRpbWVyVGltZXN0YW1wTW9kZS5iRW5hYmxlID0gT01YX0ZBTFNFOwotCi0gICAgbV9zdGF0ZSAgICAgICAgICAgICAgICAgICA9IE9NWF9TdGF0ZUxvYWRlZDsKLSAgICBtX3NFeHRyYURhdGEgPSAwOwotCi0gICAgaWYgKGVSZXQgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBtc2dfdGhyZWFkX2NyZWF0ZWQgPSB0cnVlOwotICAgICAgICByID0gcHRocmVhZF9jcmVhdGUoJm1zZ190aHJlYWRfaWQsMCwgbWVzc2FnZV90aHJlYWRfZW5jLCB0aGlzKTsKLSAgICAgICAgaWYgKHIgPCAwKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IG1lc3NhZ2VfdGhyZWFkX2VuYyB0aHJlYWQgY3JlYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgbXNnX3RocmVhZF9jcmVhdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBnb3RvIGluaXRfZXJyb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3luY190aHJlYWRfY3JlYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICByID0gcHRocmVhZF9jcmVhdGUoJmFzeW5jX3RocmVhZF9pZCwwLCB2ZW5jX2Rldjo6YXN5bmNfdmVuY19tZXNzYWdlX3RocmVhZCwgdGhpcyk7Ci0gICAgICAgICAgICBpZiAociA8IDApIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHZlbmNfZGV2Ojphc3luY192ZW5jX21lc3NhZ2VfdGhyZWFkIHRocmVhZCBjcmVhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICAgICAgICAgIGFzeW5jX3RocmVhZF9jcmVhdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbXNnX3RocmVhZF9zdG9wID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBwdGhyZWFkX2pvaW4obXNnX3RocmVhZF9pZCxOVUxMKTsKLSAgICAgICAgICAgICAgICBtc2dfdGhyZWFkX2NyZWF0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBnb3RvIGluaXRfZXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBkZXZfc2V0X21lc3NhZ2VfdGhyZWFkX2lkKGFzeW5jX3RocmVhZF9pZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobG93bGF0ZW5jeSkKLSAgICB7Ci0gICAgICAgIFFPTVhfRVhUTklOREVYX1ZJREVPX0xPV19MQVRFTkNZX01PREUgbG93X2xhdGVuY3k7Ci0gICAgICAgIGxvd19sYXRlbmN5LmJFbmFibGVMb3dMYXRlbmN5TW9kZSA9IE9NWF9UUlVFOwotICAgICAgICBERUJVR19QUklOVF9MT1coIkVuYWJsZSBsb3dsYXRlbmN5IG1vZGUiKTsKLSAgICAgICAgaWYgKCFoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKCZsb3dfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9RVElJbmRleFBhcmFtTG93TGF0ZW5jeU1vZGUpKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIGVuYWJsaW5nIGxvdyBsYXRlbmN5IG1vZGUiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBERUJVR19QUklOVF9JTkZPKCJDb21wb25lbnRfaW5pdCA6ICVzIDogcmV0dXJuID0gMHgleCIsIG1fbmtpbmQsIGVSZXQpOwotCi0gICAgewotICAgICAgICBWZW5kb3JFeHRlbnNpb25TdG9yZSAqZXh0U3RvcmUgPSBjb25zdF9jYXN0PFZlbmRvckV4dGVuc2lvblN0b3JlICo+KCZtVmVuZG9yRXh0ZW5zaW9uU3RvcmUpOwotICAgICAgICBpbml0X3ZlbmRvcl9leHRlbnNpb25zKCpleHRTdG9yZSk7Ci0gICAgICAgIG1WZW5kb3JFeHRlbnNpb25TdG9yZS5kdW1wRXh0ZW5zaW9ucygoY29uc3QgY2hhciAqKW1fbmtpbmQpOwotICAgIH0KLQotICAgIHJldHVybiBlUmV0OwotaW5pdF9lcnJvcjoKLSAgICBoYW5kbGUtPnZlbmNfY2xvc2UoKTsKLSAgICBkZWxldGUgaGFuZGxlOwotICAgIGhhbmRsZSA9IE5VTEw7Ci0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRlVOQ1RJT04KLSAgIG9teF92ZW5jOjpTZXRwYXJhbWV0ZXIKLQotICAgREVTQ1JJUFRJT04KLSAgIE9NWCBTZXQgUGFyYW1ldGVyIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KLQotICAgUEFSQU1FVEVSUwotICAgPFRCRD4uCi0KLSAgIFJFVFVSTiBWQUxVRQotICAgT01YIEVycm9yIE5vbmUgaWYgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZW5jOjpzZXRfcGFyYW1ldGVyKE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFIHBhcmFtSW5kZXgsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBwYXJhbURhdGEpCi17Ci0gICAgKHZvaWQpaENvbXA7Ci0gICAgT01YX0VSUk9SVFlQRSBlUmV0ID0gT01YX0Vycm9yTm9uZTsKLQotCi0gICAgaWYgKG1fc3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldCBQYXJhbSBpbiBJbnZhbGlkIFN0YXRlIik7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgfQotICAgIGlmIChwYXJhbURhdGEgPT0gTlVMTCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEdldCBQYXJhbSBpbiBJbnZhbGlkIHBhcmFtRGF0YSIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIC8qc2V0X3BhcmFtZXRlciBjYW4gYmUgY2FsbGVkIGluIGxvYWRlZCBzdGF0ZQotICAgICAgb3IgZGlzYWJsZWQgcG9ydCAqLwotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUxvYWRlZAotICAgICAgICAgICAgfHwgbV9zSW5Qb3J0RGVmLmJFbmFibGVkID09IE9NWF9GQUxTRQotICAgICAgICAgICAgfHwgbV9zT3V0UG9ydERlZi5iRW5hYmxlZCA9PSBPTVhfRkFMU0UpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXQgUGFyYW1ldGVyIGNhbGxlZCBpbiB2YWxpZCBzdGF0ZSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0IFBhcmFtZXRlciBjYWxsZWQgaW4gSW52YWxpZCBTdGF0ZSIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247Ci0gICAgfQotCi0gICAgc3dpdGNoICgoaW50KXBhcmFtSW5kZXgpIHsKLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcG9ydERlZm47Ci0gICAgICAgICAgICAgICAgcG9ydERlZm4gPSAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKSBwYXJhbURhdGE7Ci0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiBwb3J0ICVkLCB3eGggJWR4JWQsIG1pbiAlZCwgYWN0dWFsICVkLCBzaXplICVkLCBjb2xvcmZvcm1hdCAlI3gsIGNvbXByZXNzaW9uIGZvcm1hdCAlI3giLAotICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+blBvcnRJbmRleCwgcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsIHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uQnVmZmVyQ291bnRNaW4sIHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwsIHBvcnREZWZuLT5uQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgcG9ydERlZm4tPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQsIHBvcnREZWZuLT5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0KTsKLQotICAgICAgICAgICAgICAgIGlmIChQT1JUX0lOREVYX0lOID09IHBvcnREZWZuLT5uUG9ydEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGV2X2lzX3ZpZGVvX3Nlc3Npb25fc3VwcG9ydGVkKHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInZpZGVvIHNlc3Npb24gbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgb214X3JlcG9ydF91bnN1cHBvcnRlZF9zZXR0aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsID4gTUFYX05VTV9JTlBVVF9CVUZGRVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IChJbl9QT1JUKSBhY3R1YWwgY291bnQgKCV1KSBleGNlZWRzIG1heCgldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwsICh1bnNpZ25lZCBpbnQpTUFYX05VTV9JTlBVVF9CVUZGRVJTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1faW5wX21lbV9wdHIgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCAhPSBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydERlZm4tPm5CdWZmZXJTaXplICE9IG1fc0luUG9ydERlZi5uQnVmZmVyU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogKEluX1BPUlQpIGJ1ZmZlciBjb3VudC9zaXplIGNhbiBjaGFuZ2Ugb25seSBpZiBwb3J0IGlzIHVuYWxsb2NhdGVkICEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnREZWZuLT5uQnVmZmVyQ291bnRNaW4gPiBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IChJbl9QT1JUKSBNaW4gYnVmZmVycyAoJXUpID4gYWN0dWFsIGNvdW50ICgldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBvcnREZWZuLT5uQnVmZmVyQ291bnRNaW4sICh1bnNpZ25lZCBpbnQpcG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKHBhcmFtRGF0YSxPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uKSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHZlbmNfc2V0X3BhcmFtIGlucHV0IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS0+aHdfb3ZlcmxvYWQgPyBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXMgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJm1fc0luUG9ydERlZiwgcG9ydERlZm4sc2l6ZW9mKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpKTsKLQotI2lmZGVmIF9BTkRST0lEX0lDU18KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnREZWZuLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKVFPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9zSW5Qb3J0RGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUU9NWF9ERUZBVUxUX0NPTE9SX0ZNVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VQcm94eUNvbG9yRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1faW5wdXRfbXNnX2lkID0gT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVEJfT1BROwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VQcm94eUNvbG9yRm9ybWF0ID0gZmFsc2U7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgLypRdWVyeSBJbnB1dCBCdWZmZXIgUmVxdWlyZW1lbnRzKi8KLSAgICAgICAgICAgICAgICAgICAgZGV2X2dldF9idWZfcmVxICAgKCZtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3NJblBvcnREZWYubkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zSW5Qb3J0RGVmLm5Qb3J0SW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qUXVlcnkgb3VwdXQgQnVmZmVyIFJlcXVpcmVtZW50cyovCi0gICAgICAgICAgICAgICAgICAgIGRldl9nZXRfYnVmX3JlcSAgICgmbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3NPdXRQb3J0RGVmLm5CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYublBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUE9SVF9JTkRFWF9PVVQgPT0gcG9ydERlZm4tPm5Qb3J0SW5kZXgpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCA+IE1BWF9OVU1fT1VUUFVUX0JVRkZFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogKE91dF9QT1JUKSBhY3R1YWwgY291bnQgKCV1KSBleGNlZWRzIG1heCgldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwsICh1bnNpZ25lZCBpbnQpTUFYX05VTV9PVVRQVVRfQlVGRkVSUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX291dF9tZW1fcHRyICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwgIT0gbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+bkJ1ZmZlclNpemUgIT0gbV9zT3V0UG9ydERlZi5uQnVmZmVyU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogKE91dF9QT1JUKSBidWZmZXIgY291bnQvc2l6ZSBjYW4gY2hhbmdlIG9ubHkgaWYgcG9ydCBpcyB1bmFsbG9jYXRlZCAhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZFN0YXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnREZWZuLT5uQnVmZmVyQ291bnRNaW4gPiBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IChPdXRfUE9SVCkgTWluIGJ1ZmZlcnMgKCV1KSA+IGFjdHVhbCBjb3VudCAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwb3J0RGVmbi0+bkJ1ZmZlckNvdW50TWluLCAodW5zaWduZWQgaW50KXBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT52ZW5jX3NldF9wYXJhbShwYXJhbURhdGEsT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgIT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiB2ZW5jX3NldF9wYXJhbSBvdXRwdXQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgmbV9zT3V0UG9ydERlZixwb3J0RGVmbixzaXplb2Yoc3RydWN0IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpKTsKLSAgICAgICAgICAgICAgICAgICAgLypRdWVyeSBvdXB1dCBCdWZmZXIgUmVxdWlyZW1lbnRzKi8KLSAgICAgICAgICAgICAgICAgICAgZGV2X2dldF9idWZfcmVxKCZtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fc091dFBvcnREZWYubkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zT3V0UG9ydERlZi5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3Byb2ZpbGVfbGV2ZWwoKTsgLy9mcmFtZXJhdGUgLCBiaXRyYXRlCi0KLSAgICAgICAgICAgICAgICAgICAgbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0X3BhcmFtZXRlcjogQmFkIFBvcnQgaWR4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBvcnREZWZuLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9zQ29uZmlnRnJhbWVyYXRlLnhFbmNvZGVGcmFtZXJhdGUgPSBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7Ci0gICAgICAgICAgICAgICAgbV9zQ29uZmlnQml0cmF0ZS5uRW5jb2RlQml0cmF0ZSA9IHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgbV9zUGFyYW1CaXRyYXRlLm5UYXJnZXRCaXRyYXRlID0gcG9ydERlZm4tPmZvcm1hdC52aWRlby5uQml0cmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqcG9ydEZtdCA9Ci0gICAgICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0Rm10LT5lQ29sb3JGb3JtYXQpOwotICAgICAgICAgICAgICAgIC8vc2V0IHRoZSBkcml2ZXIgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMKLSAgICAgICAgICAgICAgICBpZiAoUE9SVF9JTkRFWF9JTiA9PSBwb3J0Rm10LT5uUG9ydEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKHBhcmFtRGF0YSxPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdCkgIT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRGbXQtPmVDb2xvckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9wcm9maWxlX2xldmVsKCk7IC8vZnJhbWVyYXRlCi0KLSNpZmRlZiBfQU5EUk9JRF9JQ1NfCi0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0Rm10LT5lQ29sb3JGb3JtYXQgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpUU9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3NJblBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFPTVhfREVGQVVMVF9DT0xPUl9GTVQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVXNlUHJveHlDb2xvckZvcm1hdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2lucHV0X21zZ19pZCA9IE9NWF9DT01QT05FTlRfR0VORVJBVEVfRVRCX09QUTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9zSW5Qb3J0Rm9ybWF0LmVDb2xvckZvcm1hdCA9IHBvcnRGbXQtPmVDb2xvckZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gcG9ydEZtdC0+ZUNvbG9yRm9ybWF0OwotICAgICAgICAgICAgICAgICAgICAgICAgbV9pbnB1dF9tc2dfaWQgPSBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VUQjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VQcm94eUNvbG9yRm9ybWF0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9zSW5Qb3J0Rm9ybWF0LnhGcmFtZXJhdGUgPSBwb3J0Rm10LT54RnJhbWVyYXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL1RPRE8gaWYgbm8gdXNlIGNhc2UgZm9yIE8vUCBwb3J0LGRlbGV0IG1fc091dFBvcnRGb3JtYXQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Jbml0OgotICAgICAgICAgICAgeyAvL1RPRE8sIGRvIHdlIG5lZWQgdGhpcyBpbmRleCBzZXQgcGFyYW0KLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9QT1JUX1BBUkFNX1RZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9QT1JUX1BBUkFNX1RZUEUqIHBQYXJhbSA9IChPTVhfUE9SVF9QQVJBTV9UWVBFKikocGFyYW1EYXRhKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlNldCBPTVhfSW5kZXhQYXJhbVZpZGVvSW5pdCBjYWxsZWQiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFKTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUqIHBQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlIik7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+dmVuY19zZXRfcGFyYW0ocGFyYW1EYXRhLE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlKSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fc1BhcmFtQml0cmF0ZS5uVGFyZ2V0Qml0cmF0ZSA9IHBQYXJhbS0+blRhcmdldEJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgbV9zUGFyYW1CaXRyYXRlLmVDb250cm9sUmF0ZSA9IHBQYXJhbS0+ZUNvbnRyb2xSYXRlOwotICAgICAgICAgICAgICAgIHVwZGF0ZV9wcm9maWxlX2xldmVsKCk7IC8vYml0cmF0ZQotICAgICAgICAgICAgICAgIG1fc0NvbmZpZ0JpdHJhdGUubkVuY29kZUJpdHJhdGUgPSBwUGFyYW0tPm5UYXJnZXRCaXRyYXRlOwotICAgICAgICAgICAgICAgIG1fc0luUG9ydERlZi5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSBwUGFyYW0tPm5UYXJnZXRCaXRyYXRlOwotICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gcFBhcmFtLT5uVGFyZ2V0Qml0cmF0ZTsKLSAgICAgICAgICAgICAgICAvKiBSQyBtb2RlIGNoYW4gY2hhZ2UgYnVmZmVyIHJlcXVpcmVtZW50cyBvbiBJbnB1dCBwb3J0ICovCi0gICAgICAgICAgICAgICAgZGV2X2dldF9idWZfcmVxKCZtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgJm1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9zSW5Qb3J0RGVmLm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiYml0cmF0ZSA9ICV1IiwgKHVuc2lnbmVkIGludCltX3NPdXRQb3J0RGVmLmZvcm1hdC52aWRlby5uQml0cmF0ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0F2YzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSogcFBhcmFtID0gKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgYXZjX3BhcmFtOwotICAgICAgICAgICAgICAgIG1lbWNweSgmYXZjX3BhcmFtLCBwUGFyYW0sIHNpemVvZiggc3RydWN0IE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjIik7Ci0KLSAgICAgICAgICAgICAgICBhdmNfcGFyYW0ubkJGcmFtZXMgPSAwOwotICAgICAgICAgICAgICAgIGlmICgocFBhcmFtLT5lUHJvZmlsZSA9PSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gpfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwUGFyYW0tPmVQcm9maWxlID09IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbikpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uQkZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZjX3BhcmFtLm5CRnJhbWVzID0gcFBhcmFtLT5uQkZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiQiBmcmFtZXMgc2V0IHVzaW5nIENsaWVudCBzZXRwYXJhbSB0byAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjX3BhcmFtLm5CRnJhbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChiZnJhbWVzICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZjX3BhcmFtLm5CRnJhbWVzID0gYmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiQiBmcmFtZXMgc2V0IHVzaW5nIHNldHByb3AgdG8gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y19wYXJhbS5uQkZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJBVkM6IEJGcmFtZXM6ICV1IiwgKHVuc2lnbmVkIGludClhdmNfcGFyYW0ubkJGcmFtZXMpOwotICAgICAgICAgICAgICAgICAgICBhdmNfcGFyYW0uYkVudHJvcHlDb2RpbmdDQUJBQyA9IChPTVhfQk9PTCkoYXZjX3BhcmFtLmJFbnRyb3B5Q29kaW5nQ0FCQUMgJiYgZW50cm9weSk7Ci0gICAgICAgICAgICAgICAgICAgIGF2Y19wYXJhbS5uQ2FiYWNJbml0SWRjID0gZW50cm9weSA/IGF2Y19wYXJhbS5uQ2FiYWNJbml0SWRjIDogMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uQkZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIldhcm5pbmc6IEIgZnJhbWVzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKCZhdmNfcGFyYW0sT01YX0luZGV4UGFyYW1WaWRlb0F2YykgIT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoJm1fc1BhcmFtQVZDLHBQYXJhbSwgc2l6ZW9mKHN0cnVjdCBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSkpOwotICAgICAgICAgICAgICAgIG1fc0ludHJhcGVyaW9kLm5QRnJhbWVzID0gbV9zUGFyYW1BVkMublBGcmFtZXM7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+bkJGcmFtZXMgfHwgYmZyYW1lcykKLSAgICAgICAgICAgICAgICAgICAgbV9zSW50cmFwZXJpb2QubkJGcmFtZXMgPSBtX3NQYXJhbUFWQy5uQkZyYW1lcyA9IGF2Y19wYXJhbS5uQkZyYW1lczsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG1fc0ludHJhcGVyaW9kLm5CRnJhbWVzID0gbV9zUGFyYW1BVkMubkJGcmFtZXM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb1ZwODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9WSURFT19QQVJBTV9WUDhUWVBFKTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fVlA4VFlQRSogcFBhcmFtID0gKE9NWF9WSURFT19QQVJBTV9WUDhUWVBFKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1ZQOFRZUEUgdnA4X3BhcmFtOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb1ZwOCIpOwotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5EQ1RQYXJ0aXRpb25zICE9IG1fc1BhcmFtVlA4Lm5EQ1RQYXJ0aXRpb25zIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+YkVycm9yUmVzaWxpZW50TW9kZSAhPSBtX3NQYXJhbVZQOC5iRXJyb3JSZXNpbGllbnRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJWUDggZG9lc24ndCBzdXBwb3J0IG5EQ1RQYXJ0aXRpb25zIG9yIGJFcnJvclJlc2lsaWVudE1vZGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZ2cDhfcGFyYW0sIHBQYXJhbSwgc2l6ZW9mKCBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1ZQOFRZUEUpKTsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT52ZW5jX3NldF9wYXJhbSgmdnA4X3BhcmFtLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbVZpZGVvVnA4KSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgmbV9zUGFyYW1WUDgscFBhcmFtLCBzaXplb2Yoc3RydWN0IE9NWF9WSURFT19QQVJBTV9WUDhUWVBFKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0hldmM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fSEVWQ1RZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9IRVZDVFlQRSogcFBhcmFtID0gKE9NWF9WSURFT19QQVJBTV9IRVZDVFlQRSopcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9IRVZDVFlQRSBoZXZjX3BhcmFtOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1WaWRlb0hldmMiKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmhldmNfcGFyYW0sIHBQYXJhbSwgc2l6ZW9mKCBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0hFVkNUWVBFKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+dmVuY19zZXRfcGFyYW0oJmhldmNfcGFyYW0sIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9IZXZjKSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgOiBzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvSGV2YyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoJm1fc1BhcmFtSEVWQywgcFBhcmFtLCBzaXplb2Yoc3RydWN0IE9NWF9WSURFT19QQVJBTV9IRVZDVFlQRSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKiBwUGFyYW0gPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50Iik7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+dmVuY19zZXRfcGFyYW0ocFBhcmFtLE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50KSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudCBmYWlsZWQgZm9yIFByb2ZpbGU6ICV1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGV2ZWwgOiV1IiwgKHVuc2lnbmVkIGludClwUGFyYW0tPmVQcm9maWxlLCAodW5zaWduZWQgaW50KXBQYXJhbS0+ZUxldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZVByb2ZpbGUgPSBwUGFyYW0tPmVQcm9maWxlOwotICAgICAgICAgICAgICAgIG1fc1BhcmFtUHJvZmlsZUxldmVsLmVMZXZlbCA9IHBQYXJhbS0+ZUxldmVsOwotCi0gICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKChjaGFyICopbV9ua2luZCwgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fc1BhcmFtQVZDLmVQcm9maWxlID0gKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSltX3NQYXJhbVByb2ZpbGVMZXZlbC5lUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgbV9zUGFyYW1BVkMuZUxldmVsID0gKE9NWF9WSURFT19BVkNMRVZFTFRZUEUpbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZUxldmVsOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkFWQyBwcm9maWxlID0gJWQsIGxldmVsID0gJWQiLCBtX3NQYXJhbUFWQy5lUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NQYXJhbUFWQy5lTGV2ZWwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKGNoYXIgKiltX25raW5kLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5hdmMuc2VjdXJlIixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fc1BhcmFtQVZDLmVQcm9maWxlID0gKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSltX3NQYXJhbVByb2ZpbGVMZXZlbC5lUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgbV9zUGFyYW1BVkMuZUxldmVsID0gKE9NWF9WSURFT19BVkNMRVZFTFRZUEUpbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZUxldmVsOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlxuIEFWQyBwcm9maWxlID0gJWQsIGxldmVsID0gJWQiLCBtX3NQYXJhbUFWQy5lUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NQYXJhbUFWQy5lTGV2ZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RybmNtcCgoY2hhciopbV9ua2luZCwgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIudnA4IixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fc1BhcmFtVlA4LmVQcm9maWxlID0gKE9NWF9WSURFT19WUDhQUk9GSUxFVFlQRSltX3NQYXJhbVByb2ZpbGVMZXZlbC5lUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgbV9zUGFyYW1WUDguZUxldmVsID0gKE9NWF9WSURFT19WUDhMRVZFTFRZUEUpbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZUxldmVsOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlZQOCBwcm9maWxlID0gJWQsIGxldmVsID0gJWQiLCBtX3NQYXJhbVZQOC5lUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NQYXJhbVZQOC5lTGV2ZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RybmNtcCgoY2hhciopbV9ua2luZCwgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaGV2YyIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgICAgICAgICBtX3NQYXJhbUhFVkMuZVByb2ZpbGUgPSAoT01YX1ZJREVPX0hFVkNQUk9GSUxFVFlQRSltX3NQYXJhbVByb2ZpbGVMZXZlbC5lUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgbV9zUGFyYW1IRVZDLmVMZXZlbCA9IChPTVhfVklERU9fSEVWQ0xFVkVMVFlQRSltX3NQYXJhbVByb2ZpbGVMZXZlbC5lTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiSEVWQyBwcm9maWxlID0gJWQsIGxldmVsID0gJWQiLCBtX3NQYXJhbUhFVkMuZVByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zUGFyYW1IRVZDLmVMZXZlbCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqY29tcF9yb2xlOwotICAgICAgICAgICAgICAgIGNvbXBfcm9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcF9yb2xlLT5jUm9sZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKG1fc3RhdGUgPT0gT01YX1N0YXRlTG9hZGVkKSYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhQklUTUFTS19QUkVTRU5UKCZtX2ZsYWdzLE9NWF9DT01QT05FTlRfSURMRV9QRU5ESU5HKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlNldCBQYXJhbWV0ZXIgY2FsbGVkIGluIHZhbGlkIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldCBQYXJhbWV0ZXIgY2FsbGVkIGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghc3RybmNtcCgoY2hhciopbV9ua2luZCwgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIixPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKChjaGFyKiljb21wX3JvbGUtPmNSb2xlLCJ2aWRlb19lbmNvZGVyLmF2YyIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJsY3B5KChjaGFyKiltX2NSb2xlLCJ2aWRlb19lbmNvZGVyLmF2YyIsT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXRwYXJhbWV0ZXI6IHVua25vd24gSW5kZXggJXMiLCBjb21wX3JvbGUtPmNSb2xlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVSZXQgPU9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKGNoYXIqKW1fbmtpbmQsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2Yy5zZWN1cmUiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoKGNoYXIqKWNvbXBfcm9sZS0+Y1JvbGUsInZpZGVvX2VuY29kZXIuYXZjIixPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxjcHkoKGNoYXIqKW1fY1JvbGUsInZpZGVvX2VuY29kZXIuYXZjIixPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHBhcmFtZXRlcjogdW5rbm93biBJbmRleCAlc1xuIiwgY29tcF9yb2xlLT5jUm9sZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID1PTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKChjaGFyKiltX25raW5kLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci52cDgiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoKGNvbnN0IGNoYXIqKWNvbXBfcm9sZS0+Y1JvbGUsInZpZGVvX2VuY29kZXIudnA4IixPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxjcHkoKGNoYXIqKW1fY1JvbGUsInZpZGVvX2VuY29kZXIudnA4IixPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHBhcmFtZXRlcjogdW5rbm93biBJbmRleCAlcyIsIGNvbXBfcm9sZS0+Y1JvbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9T01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKChjaGFyKiltX25raW5kLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oZXZjIixPTVhfTUFYX1NUUklOR05BTUVfU0laRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKChjb25zdCBjaGFyKiljb21wX3JvbGUtPmNSb2xlLCJ2aWRlb19lbmNvZGVyLmhldmMiLE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RybGNweSgoY2hhciopbV9jUm9sZSwidmlkZW9fZW5jb2Rlci5oZXZjIixPTVhfTUFYX1NUUklOR05BTUVfU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHBhcmFtZXRlcjogdW5rbm93biBJbmRleCAlcyIsIGNvbXBfcm9sZS0+Y1JvbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHBhcmFtZXRlcjogdW5rbm93biBwYXJhbSAlcyIsIG1fbmtpbmQpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qcmlvcml0eU1nbXQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUFJJT1JJVFlNR01UVFlQRSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVByaW9yaXR5TWdtdCIpOwotICAgICAgICAgICAgICAgIGlmIChtX3N0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldCBQYXJhbWV0ZXIgY2FsbGVkIGluIEludmFsaWQgU3RhdGUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBPTVhfUFJJT1JJVFlNR01UVFlQRSAqcHJpb3JpdHlNZ210eXBlID0gKE9NWF9QUklPUklUWU1HTVRUWVBFKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1Qcmlvcml0eU1nbXQgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwcmlvcml0eU1nbXR5cGUtPm5Hcm91cElEKTsKLQotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogcHJpb3JpdHlNZ210eXBlICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcHJpb3JpdHlNZ210eXBlLT5uR3JvdXBQcmlvcml0eSk7Ci0KLSAgICAgICAgICAgICAgICBtX3NQcmlvcml0eU1nbXQubkdyb3VwSUQgPSBwcmlvcml0eU1nbXR5cGUtPm5Hcm91cElEOwotICAgICAgICAgICAgICAgIG1fc1ByaW9yaXR5TWdtdC5uR3JvdXBQcmlvcml0eSA9IHByaW9yaXR5TWdtdHlwZS0+bkdyb3VwUHJpb3JpdHk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbUNvbXBCdWZmZXJTdXBwbGllciIpOwotICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgKmJ1ZmZlclN1cHBsaWVyVHlwZSA9IChPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogT01YX0luZGV4UGFyYW1Db21wQnVmZmVyU3VwcGxpZXIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU3VwcGxpZXJUeXBlLT5lQnVmZmVyU3VwcGxpZXIpOwotICAgICAgICAgICAgICAgIGlmIChidWZmZXJTdXBwbGllclR5cGUtPm5Qb3J0SW5kZXggPT0gMCB8fCBidWZmZXJTdXBwbGllclR5cGUtPm5Qb3J0SW5kZXggPT0xKQotICAgICAgICAgICAgICAgICAgICBtX3NJbkJ1ZlN1cHBsaWVyLmVCdWZmZXJTdXBwbGllciA9IGJ1ZmZlclN1cHBsaWVyVHlwZS0+ZUJ1ZmZlclN1cHBsaWVyOwotCi0gICAgICAgICAgICAgICAgZWxzZQotCi0gICAgICAgICAgICAgICAgICAgIGVSZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9Hb29nbGVBbmRyb2lkSW5kZXhBbGxvY2F0ZU5hdGl2ZUhhbmRsZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIEFsbG9jYXRlTmF0aXZlSGFuZGxlUGFyYW1zKTsKLQotICAgICAgICAgICAgICAgIEFsbG9jYXRlTmF0aXZlSGFuZGxlUGFyYW1zKiBhbGxvY2F0ZU5hdGl2ZUhhbmRsZVBhcmFtcyA9IChBbGxvY2F0ZU5hdGl2ZUhhbmRsZVBhcmFtcyAqKSBwYXJhbURhdGE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXNlY3VyZV9zZXNzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFbmFibGUvRGlzYWJsZSBhbGxvY2F0ZS1uYXRpdmUtaGFuZGxlIGFsbG93ZWQgb25seSBpbiBzZWN1cmUgc2Vzc2lvbiIpOwotICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFsbG9jYXRlTmF0aXZlSGFuZGxlUGFyYW1zLT5uUG9ydEluZGV4ICE9IFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFbmFibGUvRGlzYWJsZSBhbGxvY2F0ZS1uYXRpdmUtaGFuZGxlIGFsbG93ZWQgb25seSBvbiBPdXRwdXQgcG9ydCEiKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX291dF9tZW1fcHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFbmFibGUvRGlzYWJsZSBhbGxvY2F0ZS1uYXRpdmUtaGFuZGxlIGlzIG5vdCBhbGxvd2VkIHNpbmNlIE91dHB1dCBwb3J0IGlzIG5vdCBmcmVlICEiKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRlTmF0aXZlSGFuZGxlUGFyYW1zICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVfbmF0aXZlX2hhbmRsZSA9IGFsbG9jYXRlTmF0aXZlSGFuZGxlUGFyYW1zLT5lbmFibGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9RdWFudGl6YXRpb246Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW1ldGVyOiBPTVhfSW5kZXhQYXJhbVZpZGVvUXVhbnRpemF0aW9uIik7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1FVQU5USVpBVElPTlRZUEUgKnNlc3Npb25fcXAgPSAoT01YX1ZJREVPX1BBUkFNX1FVQU5USVpBVElPTlRZUEUqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25fcXAtPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+dmVuY19zZXRfcGFyYW0ocGFyYW1EYXRhLCBPTVhfSW5kZXhQYXJhbVZpZGVvUXVhbnRpemF0aW9uKSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fc1Nlc3Npb25RdWFudGl6YXRpb24ublFwSSA9IHNlc3Npb25fcXAtPm5RcEk7Ci0gICAgICAgICAgICAgICAgICAgIG1fc1Nlc3Npb25RdWFudGl6YXRpb24ublFwUCA9IHNlc3Npb25fcXAtPm5RcFA7Ci0gICAgICAgICAgICAgICAgICAgIG1fc1Nlc3Npb25RdWFudGl6YXRpb24ublFwQiA9IHNlc3Npb25fcXAtPm5RcEI7Ci0gICAgICAgICAgICAgICAgICAgIG1fUVBTZXQgPSBFTkFCTEVfSV9RUCB8IEVOQUJMRV9QX1FQIHwgRU5BQkxFX0JfUVA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBVbnN1cHBvcnRlZCBwb3J0IEluZGV4IGZvciBTZXNzaW9uIFFQIHNldHRpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9JUEJRUFJhbmdlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1FDT01fVklERU9fUEFSQU1fSVBCX1FQUkFOR0VUWVBFKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvSVBCUVBSYW5nZSIpOwotICAgICAgICAgICAgICAgIE9NWF9RQ09NX1ZJREVPX1BBUkFNX0lQQl9RUFJBTkdFVFlQRSAqc2Vzc2lvbl9xcF9yYW5nZSA9IChPTVhfUUNPTV9WSURFT19QQVJBTV9JUEJfUVBSQU5HRVRZUEUqKSBwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25fcXBfcmFuZ2UtPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+dmVuY19zZXRfcGFyYW0ocGFyYW1EYXRhLCAoT01YX0lOREVYVFlQRSlPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0lQQlFQUmFuZ2UpICE9IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9zU2Vzc2lvblFQUmFuZ2UubWluSVFQID0gc2Vzc2lvbl9xcF9yYW5nZS0+bWluSVFQOwotICAgICAgICAgICAgICAgICAgICBtX3NTZXNzaW9uUVBSYW5nZS5tYXhJUVAgPSBzZXNzaW9uX3FwX3JhbmdlLT5tYXhJUVA7Ci0gICAgICAgICAgICAgICAgICAgIG1fc1Nlc3Npb25RUFJhbmdlLm1pblBRUCA9IHNlc3Npb25fcXBfcmFuZ2UtPm1pblBRUDsKLSAgICAgICAgICAgICAgICAgICAgbV9zU2Vzc2lvblFQUmFuZ2UubWF4UFFQID0gc2Vzc2lvbl9xcF9yYW5nZS0+bWF4UFFQOwotICAgICAgICAgICAgICAgICAgICBtX3NTZXNzaW9uUVBSYW5nZS5taW5CUVAgPSBzZXNzaW9uX3FwX3JhbmdlLT5taW5CUVA7Ci0gICAgICAgICAgICAgICAgICAgIG1fc1Nlc3Npb25RUFJhbmdlLm1heEJRUCA9IHNlc3Npb25fcXBfcmFuZ2UtPm1heEJRUDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFVuc3VwcG9ydGVkIHBvcnQgSW5kZXggZm9yIFFQIHJhbmdlIHNldHRpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUU9NWF9JbmRleFBhcmFtVmlkZW9Jbml0aWFsUXA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX0VYVE5JTkRFWF9WSURFT19JTklUSUFMUVApOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X3BhcmFtZXRlcjogUU9NWF9JbmRleFBhcmFtVmlkZW9Jbml0aWFsUXAiKTsKLSAgICAgICAgICAgICAgICBRT01YX0VYVE5JTkRFWF9WSURFT19JTklUSUFMUVAgKmluaXRpYWxfcXAgPSAoUU9NWF9FWFROSU5ERVhfVklERU9fSU5JVElBTFFQKikgcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIGlmIChpbml0aWFsX3FwLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKHBhcmFtRGF0YSwgKE9NWF9JTkRFWFRZUEUpUU9NWF9JbmRleFBhcmFtVmlkZW9Jbml0aWFsUXApICE9IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9zU2Vzc2lvblF1YW50aXphdGlvbi5uUXBJID0gaW5pdGlhbF9xcC0+blFwSTsKLSAgICAgICAgICAgICAgICAgICAgbV9zU2Vzc2lvblF1YW50aXphdGlvbi5uUXBQID0gaW5pdGlhbF9xcC0+blFwUDsKLSAgICAgICAgICAgICAgICAgICAgbV9zU2Vzc2lvblF1YW50aXphdGlvbi5uUXBCID0gaW5pdGlhbF9xcC0+blFwQjsKLSAgICAgICAgICAgICAgICAgICAgbV9RUFNldCA9IGluaXRpYWxfcXAtPmJFbmFibGVJbml0UXA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBVbnN1cHBvcnRlZCBwb3J0IEluZGV4IGZvciBpbml0aWFsIFFQIHNldHRpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBvcnREZWZuOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgT01YX1FDT01fUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKTsKLSAgICAgICAgICAgICAgICBPTVhfUUNPTV9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgIChPTVhfUUNPTV9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldF9wYXJhbWV0ZXI6IE9NWF9RY29tSW5kZXhQb3J0RGVmbiIpOwotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpUE9SVF9JTkRFWF9JTikgewotICAgICAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uTWVtUmVnaW9uID4gT01YX1FDT01fTWVtUmVnaW9uSW52YWxpZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+bk1lbVJlZ2lvbiA8IE9NWF9RQ09NX01lbVJlZ2lvbk1heCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV91c2VfaW5wdXRfcG1lbSA9IE9NWF9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbV91c2VfaW5wdXRfcG1lbSA9IE9NWF9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IChPTVhfVTMyKVBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5NZW1SZWdpb24gPiBPTVhfUUNPTV9NZW1SZWdpb25JbnZhbGlkICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5uTWVtUmVnaW9uIDwgT01YX1FDT01fTWVtUmVnaW9uTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3VzZV9vdXRwdXRfcG1lbSA9IE9NWF9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbV91c2Vfb3V0cHV0X3BtZW0gPSBPTVhfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldFBhcmFtZXRlciBjYWxsZWQgb24gdW5zdXBwb3J0ZWQgUG9ydCBJbmRleCBmb3IgUWNvbVBvcnREZWZuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb24iKTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKHBhcmFtRGF0YSwgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBSZXF1ZXN0IGZvciBzZXR0aW5nIEVycm9yIFJlc2lsaWVuY2UgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgmbV9zRXJyb3JDb3JyZWN0aW9uLHBQYXJhbSwgc2l6ZW9mKG1fc0Vycm9yQ29ycmVjdGlvbikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9JbnRyYVJlZnJlc2g6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfcGFyYW06T01YX0luZGV4UGFyYW1WaWRlb0ludHJhUmVmcmVzaCIpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfcGFyYW0ocGFyYW1EYXRhLE9NWF9JbmRleFBhcmFtVmlkZW9JbnRyYVJlZnJlc2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogUmVxdWVzdCBmb3Igc2V0dGluZyBpbnRyYSByZWZyZXNoIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoJm1fc0ludHJhUmVmcmVzaCwgcFBhcmFtLCBzaXplb2YobV9zSW50cmFSZWZyZXNoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgX0FORFJPSURfSUNTXwotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvTWV0YUJ1ZmZlck1vZGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzUGFyYW1zKTsKLSAgICAgICAgICAgICAgICBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzUGFyYW1zICpwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAoU3RvcmVNZXRhRGF0YUluQnVmZmVyc1BhcmFtcyopcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldF9wYXJhbWV0ZXI6T01YX1Fjb21JbmRleFBhcmFtVmlkZW9NZXRhQnVmZmVyTW9kZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgInBvcnRfaW5kZXggPSAldSwgbWV0YV9tb2RlID0gJWQiLCAodW5zaWduZWQgaW50KXBQYXJhbS0+blBvcnRJbmRleCwgcFBhcmFtLT5iU3RvcmVNZXRhRGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX0lOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPmJTdG9yZU1ldGFEYXRhICE9IG1ldGFfbW9kZV9lbmFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9tZXRhX21vZGUocFBhcmFtLT5iU3RvcmVNZXRhRGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHNldCBNZXRhYnVmZmVyIG1vZGUgJWQgZmFpbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmJTdG9yZU1ldGFEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9tb2RlX2VuYWJsZSA9IHBQYXJhbS0+YlN0b3JlTWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0YV9tb2RlX2VuYWJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc0luUG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50TWluOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKCZtX3NJblBvcnREZWYsT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgIT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHZlbmNfc2V0X3BhcmFtIGlucHV0IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUT0RPOiByZXNldCBlbmNvZGVyIGRyaXZlciBNZXRhIG1vZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9nZXRfYnVmX3JlcSAgICgmbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9zT3V0UG9ydERlZi5uQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYublBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX09VVCAmJiBzZWN1cmVfc2Vzc2lvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfcGFyYW1ldGVyOiBtZXRhbW9kZSBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkIGZvciBpbnB1dCBwb3J0IG9ubHkgaW4gc2VjdXJlIHNlc3Npb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfcGFyYW1ldGVyOiBtZXRhbW9kZSBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkIGZvciBpbnB1dCBwb3J0IG9ubHkiKTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1JbmRleEV4dHJhRGF0YVR5cGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX0lOREVYRVhUUkFEQVRBVFlQRSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgic2V0X3BhcmFtZXRlcjogT01YX1Fjb21JbmRleFBhcmFtSW5kZXhFeHRyYURhdGFUeXBlIik7Ci0gICAgICAgICAgICAgICAgUU9NWF9JTkRFWEVYVFJBREFUQVRZUEUgKnBQYXJhbSA9IChRT01YX0lOREVYRVhUUkFEQVRBVFlQRSAqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBib29sIGVuYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIE9NWF9VMzIgbWFzayA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uSW5kZXggPT0gKE9NWF9JTkRFWFRZUEUpT01YX0V4dHJhRGF0YVZpZGVvRW5jb2RlclNsaWNlSW5mbykgewotICAgICAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXNrID0gVkVOQ19FWFRSQURBVEFfU0xJQ0VJTkZPOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJTbGljZUluZm8gZXh0cmFkYXRhICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwUGFyYW0tPmJFbmFibGVkID09IE9NWF9UUlVFKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfcGFyYW1ldGVyOiBTbGljZSBpbmZvcm1hdGlvbiBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCBmb3Igb3V0cHV0IHBvcnQgb25seSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFBhcmFtLT5uSW5kZXggPT0gKE9NWF9JTkRFWFRZUEUpT01YX0V4dHJhRGF0YVZpZGVvRW5jb2Rlck1CSW5mbykgewotICAgICAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXNrID0gVkVOQ19FWFRSQURBVEFfTUJJTkZPOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJNQkluZm8gZXh0cmFkYXRhICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwUGFyYW0tPmJFbmFibGVkID09IE9NWF9UUlVFKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfcGFyYW1ldGVyOiBNQiBpbmZvcm1hdGlvbiBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCBmb3Igb3V0cHV0IHBvcnQgb25seSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFBhcmFtLT5uSW5kZXggPT0gKE9NWF9JTkRFWFRZUEUpT01YX0V4dHJhRGF0YUZyYW1lRGltZW5zaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9JTikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBWRU5DX0VYVFJBREFUQV9GUkFNRURJTUVOU0lPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZyYW1lIGRpbWVuc2lvbiBleHRyYWRhdGEgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBQYXJhbS0+YkVuYWJsZWQgPT0gT01YX1RSVUUpID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInNldF9wYXJhbWV0ZXI6IEZyYW1lIERpbWVuc2lvbiBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCBmb3IgaW5wdXQgcG9ydCBvbmx5Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwUGFyYW0tPm5JbmRleCA9PSAoT01YX0lOREVYVFlQRSlPTVhfUVRJSW5kZXhQYXJhbVZRWmlwU0VJRXh0cmFEYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9JTikgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IFZFTkNfRVhUUkFEQVRBX1ZRWklQOwotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiVlFaSVAgZXh0cmFkYXRhICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwUGFyYW0tPmJFbmFibGVkID09IE9NWF9UUlVFKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfcGFyYW1ldGVyOiBWUVpJUCBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCBmb3IgaW5wdXQgcG9ydCBvbmx5Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwUGFyYW0tPm5JbmRleCA9PSAoT01YX0lOREVYVFlQRSlPTVhfRXh0cmFEYXRhVmlkZW9MVFJJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPmJFbmFibGVkID09IE9NWF9UUlVFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBWRU5DX0VYVFJBREFUQV9MVFJJTkZPOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJMVFJJbmZvIGV4dHJhZGF0YSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocFBhcmFtLT5iRW5hYmxlZCA9PSBPTVhfVFJVRSkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigic2V0X3BhcmFtZXRlcjogTFRSIGluZm9ybWF0aW9uIGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkIGZvciBvdXRwdXQgcG9ydCBvbmx5Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlUmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInNldF9wYXJhbWV0ZXI6IHVuc3VwcG9ydGVkIGV4dHJkYXRhIGluZGV4ICgleCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+bkluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+YkVuYWJsZWQgPT0gT01YX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgIG1fc0V4dHJhRGF0YSB8PSBtYXNrOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbV9zRXh0cmFEYXRhICY9IH5tYXNrOwotCi0gICAgICAgICAgICAgICAgZW5hYmxlID0gISEobV9zRXh0cmFEYXRhICYgbWFzayk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+dmVuY19zZXRfcGFyYW0oJmVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlwUGFyYW0tPm5JbmRleCkgIT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgRXh0cmFkYXRhICgleCkgZmFpbGVkIiwgcFBhcmFtLT5uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9JTikgewotICAgICAgICAgICAgICAgICAgICBtX3NJblBvcnREZWYublBvcnRJbmRleCA9IFBPUlRfSU5ERVhfSU47Ci0gICAgICAgICAgICAgICAgICAgIGRldl9nZXRfYnVmX3JlcSgmbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9zSW5Qb3J0RGVmLm5CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc0luUG9ydERlZi5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgidXBkYXRlZCBpbl9idWZfcmVxOiBidWZmZXIgY250PSV1LCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50IG1pbj0ldSwgYnVmZmVyIHNpemU9JXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCltX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KW1fc091dFBvcnREZWYubkJ1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9zT3V0UG9ydERlZi5uUG9ydEluZGV4ID0gUE9SVF9JTkRFWF9PVVQ7Ci0gICAgICAgICAgICAgICAgICAgIGRldl9nZXRfYnVmX3JlcSgmbV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3NPdXRQb3J0RGVmLm5CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYublBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInVwZGF0ZWQgb3V0X2J1Zl9yZXE6IGJ1ZmZlciBjbnQ9JXUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bnQgbWluPSV1LCBidWZmZXIgc2l6ZT0ldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCltX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KW1fc091dFBvcnREZWYubkJ1ZmZlckNvdW50TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpbV9zT3V0UG9ydERlZi5uQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFFPTVhfSW5kZXhQYXJhbVZpZGVvTFRSTW9kZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIFFPTVhfVklERU9fUEFSQU1fTFRSTU9ERV9UWVBFKTsKLSAgICAgICAgICAgICAgICBRT01YX1ZJREVPX1BBUkFNX0xUUk1PREVfVFlQRSogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgKFFPTVhfVklERU9fUEFSQU1fTFRSTU9ERV9UWVBFKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKHBhcmFtRGF0YSwgKE9NWF9JTkRFWFRZUEUpUU9NWF9JbmRleFBhcmFtVmlkZW9MVFJNb2RlKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgTFRSIG1vZGUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgmbV9zUGFyYW1MVFJNb2RlLCBwUGFyYW0sIHNpemVvZihtX3NQYXJhbUxUUk1vZGUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBRT01YX0luZGV4UGFyYW1WaWRlb0xUUkNvdW50OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9WSURFT19QQVJBTV9MVFJDT1VOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICBRT01YX1ZJREVPX1BBUkFNX0xUUkNPVU5UX1RZUEUqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgIChRT01YX1ZJREVPX1BBUkFNX0xUUkNPVU5UX1RZUEUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfcGFyYW0ocGFyYW1EYXRhLCAoT01YX0lOREVYVFlQRSlRT01YX0luZGV4UGFyYW1WaWRlb0xUUkNvdW50KSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgTFRSIGNvdW50IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoJm1fc1BhcmFtTFRSQ291bnQsIHBQYXJhbSwgc2l6ZW9mKG1fc1BhcmFtTFRSQ291bnQpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb01heEFsbG93ZWRCaXRyYXRlQ2hlY2s6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX0VYVE5JTkRFWF9QQVJBTVRZUEUpOwotICAgICAgICAgICAgICAgIFFPTVhfRVhUTklOREVYX1BBUkFNVFlQRSogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgKFFPTVhfRVhUTklOREVYX1BBUkFNVFlQRSopcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlLT5tX21heF9hbGxvd2VkX2JpdHJhdGVfY2hlY2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgKChwUGFyYW0tPmJFbmFibGUgPT0gT01YX1RSVUUpID8gdHJ1ZSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgic2V0X3BhcmFtZXRlcjogbWF4IGFsbG93ZWQgYml0cmF0ZSBjaGVjayAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwUGFyYW0tPmJFbmFibGUgPT0gT01YX1RSVUUpID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT01YX1Fjb21JbmRleFBhcmFtVmlkZW9NYXhBbGxvd2VkQml0cmF0ZUNoZWNrICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNhbGxlZCBvbiB3cm9uZyBwb3J0KCV1KSIsICh1bnNpZ25lZCBpbnQpcFBhcmFtLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleEVuYWJsZVNsaWNlRGVsaXZlcnlNb2RlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9FWFROSU5ERVhfUEFSQU1UWVBFKTsKLSAgICAgICAgICAgICAgICBRT01YX0VYVE5JTkRFWF9QQVJBTVRZUEUqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgIChRT01YX0VYVE5JTkRFWF9QQVJBTVRZUEUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9wYXJhbShwYXJhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhFbmFibGVTbGljZURlbGl2ZXJ5TW9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogUmVxdWVzdCBmb3Igc2V0dGluZyBzbGljZSBkZWxpdmVyeSBtb2RlIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT01YX1Fjb21JbmRleEVuYWJsZVNsaWNlRGVsaXZlcnlNb2RlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGVkIG9uIHdyb25nIHBvcnQoJXUpIiwgKHVuc2lnbmVkIGludClwUGFyYW0tPm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1TZXF1ZW5jZUhlYWRlcldpdGhJRFI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBQcmVwZW5kU1BTUFBTVG9JRFJGcmFtZXNQYXJhbXMpOwotICAgICAgICAgICAgICAgIGlmKCFoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKHBhcmFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfUWNvbUluZGV4UGFyYW1TZXF1ZW5jZUhlYWRlcldpdGhJRFIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlczogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPTVhfUUNvbUluZGV4UGFyYW1TZXF1ZW5jZUhlYWRlcldpdGhJRFI6IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCBmb3IgaW5iYW5kIHNwcy9wcHMgZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoJm1fc1ByZXBlbmRTUFNQUFMsIHBhcmFtRGF0YSwgc2l6ZW9mKG1fc1ByZXBlbmRTUFNQUFMpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbUFVRGVsaW1pdGVyOgotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9RQ09NX1ZJREVPX0NPTkZJR19BVUQpOwotICAgICAgICAgICAgICAgaWYoIWhhbmRsZS0+dmVuY19zZXRfcGFyYW0ocGFyYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleFBhcmFtQVVEZWxpbWl0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9NWF9RQ29tSW5kZXhQYXJhbUFVRGVsaW1pdGVyOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgZm9yIEFVIERlbGltaXRlcnMgZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgIGNhc2UgT01YX1Fjb21JbmRleEhpZXJhcmNoaWNhbFN0cnVjdHVyZToKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKHBhcmFtRGF0YSwgUU9NWF9WSURFT19ISUVSQVJDSElDQUxMQVlFUlMpOwotICAgICAgICAgICAgICAgIFFPTVhfVklERU9fSElFUkFSQ0hJQ0FMTEFZRVJTKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAoUU9NWF9WSURFT19ISUVSQVJDSElDQUxMQVlFUlMqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk9NWF9RY29tSW5kZXhIaWVyYXJjaGljYWxTdHJ1Y3R1cmUiKTsKLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9wYXJhbShwYXJhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhIaWVyYXJjaGljYWxTdHJ1Y3R1cmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFJlcXVlc3QgZm9yIHNldHRpbmcgUGx1c1BUeXBlIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKChwUGFyYW0tPmVIaWVyYXJjaGljYWxDb2RpbmdUeXBlID09IFFPTVhfSElFUkFSQ0hJQ0FMQ09ESU5HX0IpICYmIHBQYXJhbS0+bk51bUxheWVycykKLSAgICAgICAgICAgICAgICAgICAgaGllcl9iX2VuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtX3NIaWVyTGF5ZXJzLm5OdW1MYXllcnMgPSBwUGFyYW0tPm5OdW1MYXllcnM7Ci0gICAgICAgICAgICAgICAgICAgIG1fc0hpZXJMYXllcnMuZUhpZXJhcmNoaWNhbENvZGluZ1R5cGUgPSBwUGFyYW0tPmVIaWVyYXJjaGljYWxDb2RpbmdUeXBlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT01YX1Fjb21JbmRleEhpZXJhcmNoaWNhbFN0cnVjdHVyZSBjYWxsZWQgb24gd3JvbmcgcG9ydCgldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBQYXJhbS0+blBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1IMjY0VlVJVGltaW5nSW5mbzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9RQ09NX1ZJREVPX1BBUkFNX1ZVSV9USU1JTkdfSU5GTyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKHBhcmFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSkgT01YX1Fjb21JbmRleFBhcmFtSDI2NFZVSVRpbWluZ0luZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBWVUkgdGltaW5nIGluZm8iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtUGVha0JpdHJhdGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUUNPTV9WSURFT19QQVJBTV9QRUFLX0JJVFJBVEUpOwotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9wYXJhbShwYXJhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpIE9NWF9RY29tSW5kZXhQYXJhbVBlYWtCaXRyYXRlKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgcGVhayBiaXRyYXRlIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1TZXRNVlNlYXJjaHJhbmdlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9wYXJhbShwYXJhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpIE9NWF9RY29tSW5kZXhQYXJhbVNldE1WU2VhcmNocmFuZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBTZWFyY2hyYW5nZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0h5YnJpZEhpZXJwTW9kZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIFFPTVhfRVhUTklOREVYX1ZJREVPX0hZQlJJRF9IUF9NT0RFKTsKLSAgICAgICAgICAgICAgIGlmKCFoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKHBhcmFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0h5YnJpZEhpZXJwTW9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiUmVxdWVzdCB0byBFbmFibGUgSHlicmlkIEhpZXItUCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4UGFyYW1CYXRjaFNpemU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBPTVhfUEFSQU1fVTMyVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYoIWhhbmRsZS0+dmVuY19zZXRfcGFyYW0ocGFyYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhQYXJhbUJhdGNoU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiQXR0ZW1wdGluZyB0byBzZXQgYmF0Y2ggc2l6ZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4Q29uZmlnSDI2NEVudHJvcHlDb2RpbmdDYWJhYzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIFFPTVhfVklERU9fSDI2NEVOVFJPUFlDT0RJTkdUWVBFKTsKLSAgICAgICAgICAgICAgICBpZighaGFuZGxlLT52ZW5jX3NldF9wYXJhbShwYXJhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleENvbmZpZ0gyNjRFbnRyb3B5Q29kaW5nQ2FiYWMpKSB7Ci0gICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkF0dGVtcHRpbmcgdG8gc2V0IEVudHJvcHkgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhQYXJhbVZRWklQU0VJVHlwZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9RVElfVklERU9fUEFSQU1fVlFaSVBfU0VJX1RZUEUpOwotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9wYXJhbShwYXJhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpIE9NWF9RVElJbmRleFBhcmFtVlFaSVBTRUlUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgVlFaSVAgU0VJIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9zRXh0cmFEYXRhIHw9IFZFTkNfRVhUUkFEQVRBX1ZRWklQOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVZlbmNBc3BlY3RSYXRpbzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIFFPTVhfRVhUTklOREVYX1ZJREVPX1ZFTkNfU0FSKTsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfcGFyYW0ocGFyYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleFBhcmFtVmVuY0FzcGVjdFJhdGlvKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgT01YX1Fjb21JbmRleFBhcmFtVmVuY0FzcGVjdFJhdGlvIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoJm1fc1NhciwgcGFyYW1EYXRhLCBzaXplb2YobV9zU2FyKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1FUSUluZGV4UGFyYW1WaWRlb0VuYWJsZVJvaUluZm86Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUtPnZlbmNfc2V0X3BhcmFtKHBhcmFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfUVRJSW5kZXhQYXJhbVZpZGVvRW5hYmxlUm9pSW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nIE9NWF9RVElJbmRleFBhcmFtVmlkZW9FbmFibGVSb2lJbmZvIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3NFeHRyYURhdGEgfD0gVkVOQ19FWFRSQURBVEFfUk9JOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQW5kcm9pZFZpZGVvVGVtcG9yYWxMYXllcmluZzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdUWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfcGFyYW0ocGFyYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BbmRyb2lkVmlkZW9UZW1wb3JhbExheWVyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIGNvbmZpZ3VyZSB0ZW1wb3JhbCBsYXllcnMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgYWN0dWFsIGNvbmZpZ3VyYXRpb24gYXBwbGllZAotICAgICAgICAgICAgICAgIG1lbWNweSgmbV9zUGFyYW1UZW1wb3JhbExheWVycywgcGFyYW1EYXRhLCBzaXplb2YobV9zUGFyYW1UZW1wb3JhbExheWVycykpOwotICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlIGNvbmZpZyBkYXRhIGluIHN5bmMKLSAgICAgICAgICAgICAgICBtX3NDb25maWdUZW1wb3JhbExheWVycy5lUGF0dGVybiA9IG1fc1BhcmFtVGVtcG9yYWxMYXllcnMuZVBhdHRlcm47Ci0gICAgICAgICAgICAgICAgbV9zQ29uZmlnVGVtcG9yYWxMYXllcnMubkJMYXllckNvdW50QWN0dWFsID0gbV9zUGFyYW1UZW1wb3JhbExheWVycy5uQkxheWVyQ291bnRBY3R1YWw7Ci0gICAgICAgICAgICAgICAgbV9zQ29uZmlnVGVtcG9yYWxMYXllcnMublBMYXllckNvdW50QWN0dWFsID0gbV9zUGFyYW1UZW1wb3JhbExheWVycy5uUExheWVyQ291bnRBY3R1YWw7Ci0gICAgICAgICAgICAgICAgbV9zQ29uZmlnVGVtcG9yYWxMYXllcnMuYkJpdHJhdGVSYXRpb3NTcGVjaWZpZWQgPSBtX3NQYXJhbVRlbXBvcmFsTGF5ZXJzLmJCaXRyYXRlUmF0aW9zU3BlY2lmaWVkOwotICAgICAgICAgICAgICAgIG1lbWNweSgmbV9zQ29uZmlnVGVtcG9yYWxMYXllcnMubkJpdHJhdGVSYXRpb3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmbV9zUGFyYW1UZW1wb3JhbExheWVycy5uQml0cmF0ZVJhdGlvc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19BTkRST0lEX01BWFRFTVBPUkFMTEFZRVJTICogc2l6ZW9mKE9NWF9VMzIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhQYXJhbURpc2FibGVQUToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShwYXJhbURhdGEsIFFPTVhfRElTQUJMRVRZUEUpOwotICAgICAgICAgICAgICAgIGhhbmRsZS0+dmVuY19zZXRfcGFyYW0ocGFyYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX1FUSUluZGV4UGFyYW1EaXNhYmxlUFEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RVElJbmRleFBhcmFtSWZyYW1lU2l6ZVR5cGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX1ZJREVPX0lGUkFNRVNJWkUpOwotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9wYXJhbShwYXJhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX1FUSUluZGV4UGFyYW1JZnJhbWVTaXplVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nIE9NWF9RVElJbmRleFBhcmFtSWZyYW1lU2l6ZVR5cGUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RVElJbmRleFBhcmFtRW5hYmxlQVZUaW1lclRpbWVzdGFtcHM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEocGFyYW1EYXRhLCBRT01YX0VOQUJMRVRZUEUpOwotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9wYXJhbShwYXJhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX1FUSUluZGV4UGFyYW1FbmFibGVBVlRpbWVyVGltZXN0YW1wcykpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nIE9NWF9RVElJbmRleFBhcmFtRW5hYmxlQVZUaW1lclRpbWVzdGFtcHMgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgmbV9zUGFyYW1BVlRpbWVyVGltZXN0YW1wTW9kZSwgcGFyYW1EYXRhLCBzaXplb2YoUU9NWF9FTkFCTEVUWVBFKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1NsaWNlRk1POgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0cGFyYW1ldGVyOiB1bmtub3duIHBhcmFtICVkIiwgcGFyYW1JbmRleCk7Ci0gICAgICAgICAgICAgICAgZVJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlUmV0OwotfQotCi1ib29sIG9teF92ZW5jOjp1cGRhdGVfcHJvZmlsZV9sZXZlbCgpCi17Ci0gICAgT01YX1UzMiBlUHJvZmlsZSwgZUxldmVsOwotCi0gICAgaWYgKCFoYW5kbGUtPnZlbmNfZ2V0X3Byb2ZpbGVfbGV2ZWwoJmVQcm9maWxlLCZlTGV2ZWwpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gdXBkYXRlIHRoZSBwcm9maWxlX2xldmVsIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBtX3NQYXJhbVByb2ZpbGVMZXZlbC5lUHJvZmlsZSA9IChPTVhfVklERU9fQVZDUFJPRklMRVRZUEUpZVByb2ZpbGU7Ci0gICAgbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZUxldmVsID0gKE9NWF9WSURFT19BVkNMRVZFTFRZUEUpZUxldmVsOwotCi0gICAgaWYgKCFzdHJuY21wKChjaGFyICopbV9ua2luZCwgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIixcCi0gICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgIG1fc1BhcmFtQVZDLmVQcm9maWxlID0gKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSllUHJvZmlsZTsKLSAgICAgICAgbV9zUGFyYW1BVkMuZUxldmVsID0gKE9NWF9WSURFT19BVkNMRVZFTFRZUEUpZUxldmVsOwotICAgICAgICBERUJVR19QUklOVF9MT1coIkFWQyBwcm9maWxlID0gJWQsIGxldmVsID0gJWQiLCBtX3NQYXJhbUFWQy5lUHJvZmlsZSwKLSAgICAgICAgICAgICAgICBtX3NQYXJhbUFWQy5lTGV2ZWwpOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKGNoYXIgKiltX25raW5kLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5hdmMuc2VjdXJlIixcCi0gICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgIG1fc1BhcmFtQVZDLmVQcm9maWxlID0gKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSllUHJvZmlsZTsKLSAgICAgICAgbV9zUGFyYW1BVkMuZUxldmVsID0gKE9NWF9WSURFT19BVkNMRVZFTFRZUEUpZUxldmVsOwotICAgICAgICBERUJVR19QUklOVF9MT1coIlxuIEFWQyBwcm9maWxlID0gJWQsIGxldmVsID0gJWQiLCBtX3NQYXJhbUFWQy5lUHJvZmlsZSwKLSAgICAgICAgICAgICAgICBtX3NQYXJhbUFWQy5lTGV2ZWwpOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RybmNtcCgoY2hhciAqKW1fbmtpbmQsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLnZwOCIsXAotICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKSkgewotICAgICAgICBtX3NQYXJhbVZQOC5lUHJvZmlsZSA9IChPTVhfVklERU9fVlA4UFJPRklMRVRZUEUpZVByb2ZpbGU7Ci0gICAgICAgIG1fc1BhcmFtVlA4LmVMZXZlbCA9IChPTVhfVklERU9fVlA4TEVWRUxUWVBFKWVMZXZlbDsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJWUDggcHJvZmlsZSA9ICVkLCBsZXZlbCA9ICVkIiwgbV9zUGFyYW1WUDguZVByb2ZpbGUsCi0gICAgICAgICAgICAgICAgbV9zUGFyYW1WUDguZUxldmVsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cm5jbXAoKGNoYXIgKiltX25raW5kLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oZXZjIixcCi0gICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUpKSB7Ci0gICAgICAgIG1fc1BhcmFtSEVWQy5lUHJvZmlsZSA9IChPTVhfVklERU9fSEVWQ1BST0ZJTEVUWVBFKWVQcm9maWxlOwotICAgICAgICBtX3NQYXJhbUhFVkMuZUxldmVsID0gKE9NWF9WSURFT19IRVZDTEVWRUxUWVBFKWVMZXZlbDsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJIRVZDIHByb2ZpbGUgPSAlZCwgbGV2ZWwgPSAlZCIsIG1fc1BhcmFtSEVWQy5lUHJvZmlsZSwKLSAgICAgICAgICAgICAgICBtX3NQYXJhbUhFVkMuZUxldmVsKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmlkZW86OlNldENvbmZpZwotCi0gICBERVNDUklQVElPTgotICAgT01YIFNldCBDb25maWcgbWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgIFBBUkFNRVRFUlMKLSAgIDxUQkQ+LgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIE9NWCBFcnJvciBOb25lIGlmIHN1Y2Nlc3NmdWwuCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT01YX0VSUk9SVFlQRSAgb214X3ZlbmM6OnNldF9jb25maWcoT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgaENvbXAsCi0gICAgICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFIGNvbmZpZ0luZGV4LAotICAgICAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgY29uZmlnRGF0YSkKLXsKLSAgICAodm9pZCloQ29tcDsKLSAgICBpZiAoY29uZmlnRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogcGFyYW0gaXMgbnVsbCIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBjb25maWcgY2FsbGVkIGluIEludmFsaWQgc3RhdGUiKTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOwotICAgIH0KLQotICAgIC8vIHBhcmFtcyB3aWxsIGJlIHZhbGlkYXRlZCBwcmlvciB0byB2ZW5jX2luaXQKLSAgICBzd2l0Y2ggKChpbnQpY29uZmlnSW5kZXgpIHsKLSAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0JpdHJhdGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFKj4oY29uZmlnRGF0YSk7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgic2V0X2NvbmZpZygpOiBPTVhfSW5kZXhDb25maWdWaWRlb0JpdHJhdGUgKCV1KSIsICh1bnNpZ25lZCBpbnQpcFBhcmFtLT5uRW5jb2RlQml0cmF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPnZlbmNfc2V0X2NvbmZpZyhjb25maWdEYXRhLCBPTVhfSW5kZXhDb25maWdWaWRlb0JpdHJhdGUpICE9IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBPTVhfSW5kZXhDb25maWdWaWRlb0JpdHJhdGUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbV9zQ29uZmlnQml0cmF0ZS5uRW5jb2RlQml0cmF0ZSA9IHBQYXJhbS0+bkVuY29kZUJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG1fc1BhcmFtQml0cmF0ZS5uVGFyZ2V0Qml0cmF0ZSA9IHBQYXJhbS0+bkVuY29kZUJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gcFBhcmFtLT5uRW5jb2RlQml0cmF0ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFVuc3VwcG9ydGVkIHBvcnQgaW5kZXg6ICV1IiwgKHVuc2lnbmVkIGludClwUGFyYW0tPm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0ZyYW1lcmF0ZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRSogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUqPihjb25maWdEYXRhKTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZXRfY29uZmlnKCk6IE9NWF9JbmRleENvbmZpZ1ZpZGVvRnJhbWVyYXRlICgweCV4KSIsICh1bnNpZ25lZCBpbnQpcFBhcmFtLT54RW5jb2RlRnJhbWVyYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+dmVuY19zZXRfY29uZmlnKGNvbmZpZ0RhdGEsIE9NWF9JbmRleENvbmZpZ1ZpZGVvRnJhbWVyYXRlKSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgT01YX0luZGV4Q29uZmlnVmlkZW9GcmFtZXJhdGUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbV9zQ29uZmlnRnJhbWVyYXRlLnhFbmNvZGVGcmFtZXJhdGUgPSBwUGFyYW0tPnhFbmNvZGVGcmFtZXJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSBwUGFyYW0tPnhFbmNvZGVGcmFtZXJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnRGb3JtYXQueEZyYW1lcmF0ZSA9IHBQYXJhbS0+eEVuY29kZUZyYW1lcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogRnJhbWUgcmF0ZSBjYW4gY2hhbmdlIGJ1ZmZlciByZXF1aXJlbWVudHMuIElmIHF1ZXJ5IGlzIG5vdCBhbGxvd2VkLAotICAgICAgICAgICAgICAgICAgICAgKiBmYWlsdXJlIGlzIG5vdCBGQVRBTCBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgZGV2X2dldF9idWZfcmVxKCZtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3NJblBvcnREZWYubkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zSW5Qb3J0RGVmLm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVW5zdXBwb3J0ZWQgcG9ydCBpbmRleDogJXUiLCAodW5zaWduZWQgaW50KXBQYXJhbS0+blBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUU9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFwZXJpb2Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgUU9NWF9WSURFT19JTlRSQVBFUklPRFRZUEUpOwotICAgICAgICAgICAgICAgIFFPTVhfVklERU9fSU5UUkFQRVJJT0RUWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFFPTVhfVklERU9fSU5UUkFQRVJJT0RUWVBFKj4oY29uZmlnRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZXRfY29uZmlnKCk6IFFPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhcGVyaW9kIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX09VVCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJPbGQ6IFAvQiBmcmFtZXMgPSAldS8ldSwgTmV3OiBQL0IgZnJhbWVzID0gJXUvJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpbV9zSW50cmFwZXJpb2QublBGcmFtZXMsICh1bnNpZ25lZCBpbnQpbV9zSW50cmFwZXJpb2QubkJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwUGFyYW0tPm5QRnJhbWVzLCAodW5zaWduZWQgaW50KXBQYXJhbS0+bkJGcmFtZXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9zSW50cmFwZXJpb2QubkJGcmFtZXMgIT0gcFBhcmFtLT5uQkZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoaGllcl9iX2VuYWJsZWQgJiYgbV9zdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9JTkZPKCJCLWZyYW1lcyBzZXR0aW5nIGlzIHN1cHBvcnRlZCBpZiBIaWVyQiBpcyBlbmFibGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+dmVuY19zZXRfY29uZmlnKGNvbmZpZ0RhdGEsIChPTVhfSU5ERVhUWVBFKSBRT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYXBlcmlvZCkgIT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nIFFPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhcGVyaW9kIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3NJbnRyYXBlcmlvZC5uUEZyYW1lcyA9IHBQYXJhbS0+blBGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIG1fc0ludHJhcGVyaW9kLm5CRnJhbWVzID0gcFBhcmFtLT5uQkZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgbV9zSW50cmFwZXJpb2QubklEUlBlcmlvZCA9IHBQYXJhbS0+bklEUlBlcmlvZDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbV9zUGFyYW1BVkMublBGcmFtZXMgPSBwUGFyYW0tPm5QRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtX3NQYXJhbUFWQy5lUHJvZmlsZSAhPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3NQYXJhbUFWQy5lUHJvZmlsZSAhPSAoT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFKSBPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fc1BhcmFtQVZDLmVQcm9maWxlICE9IChPTVhfVklERU9fQVZDUFJPRklMRVRZUEUpIFFPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc1BhcmFtQVZDLm5CRnJhbWVzID0gcFBhcmFtLT5uQkZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NQYXJhbUFWQy5uQkZyYW1lcyA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiAoUU9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFwZXJpb2QpIFVuc3VwcG9ydGVkIHBvcnQgaW5kZXg6ICV1IiwgKHVuc2lnbmVkIGludClwUGFyYW0tPm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2g6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFKTsKLSAgICAgICAgICAgICAgICBPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEUqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8T01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFKj4oY29uZmlnRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZXRfY29uZmlnKCk6IE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX09VVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT52ZW5jX3NldF9jb25maWcoY29uZmlnRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2gpICE9IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhVk9QUmVmcmVzaCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtX3NDb25maWdJbnRyYVJlZnJlc2hWT1AuSW50cmFSZWZyZXNoVk9QID0gcFBhcmFtLT5JbnRyYVJlZnJlc2hWT1A7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBVbnN1cHBvcnRlZCBwb3J0IGluZGV4OiAldSIsICh1bnNpZ25lZCBpbnQpcFBhcmFtLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25Sb3RhdGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX0NPTkZJR19ST1RBVElPTlRZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfUk9UQVRJT05UWVBFICpwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9DT05GSUdfUk9UQVRJT05UWVBFKj4oY29uZmlnRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ICE9IFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVW5zdXBwb3J0ZWQgcG9ydCBpbmRleDogJXUiLCAodW5zaWduZWQgaW50KXBQYXJhbS0+blBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICggcFBhcmFtLT5uUm90YXRpb24gPT0gMCAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPm5Sb3RhdGlvbiA9PSA5MCAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+blJvdGF0aW9uID09IDE4MCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5uUm90YXRpb24gPT0gMjcwICkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZXRfY29uZmlnOiBSb3RhdGlvbiBBbmdsZSAldSIsICh1bnNpZ25lZCBpbnQpcFBhcmFtLT5uUm90YXRpb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogdW4gc3VwcG9ydGVkIFJvdGF0aW9uICV1IiwgKHVuc2lnbmVkIGludClwUGFyYW0tPm5Sb3RhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX3NDb25maWdGcmFtZVJvdGF0aW9uLm5Sb3RhdGlvbiA9PSBwUGFyYW0tPm5Sb3RhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZXRfY29uZmlnOiByb3RhdGlvbiAoJWQpIG5vdCBjaGFuZ2VkIiwgcFBhcmFtLT5uUm90YXRpb24pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT52ZW5jX3NldF9jb25maWcoY29uZmlnRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlKSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldCBPTVhfSW5kZXhDb25maWdDb21tb25Sb3RhdGUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3NDb25maWdGcmFtZVJvdGF0aW9uLm5Sb3RhdGlvbiA9IHBQYXJhbS0+blJvdGF0aW9uOwotCi0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIG91dHB1dC1wb3J0IHJlc29sdXRpb24gKHNpbmNlIGl0IG1pZ2h0IGhhdmUgYmVlbiBmbGlwcGVkIGJ5IHJvdGF0aW9uKQotICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPnZlbmNfZ2V0X2RpbWVuc2lvbnMoUE9SVF9JTkRFWF9PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbV9zT3V0UG9ydERlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbV9zT3V0UG9ydERlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0KSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJzZXQgUm90YXRpb246IHVwZGF0ZWQgZGltZW5zaW9ucyA9ICV1IHggJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc091dFBvcnREZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhDb25maWdWaWRlb0ZyYW1lUGFja2luZ0FycmFuZ2VtZW50OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInNldF9jb25maWcoKTogT01YX1Fjb21JbmRleENvbmZpZ1ZpZGVvRnJhbWVQYWNraW5nQXJyYW5nZW1lbnQiKTsKLSAgICAgICAgICAgICAgICBpZiAobV9zT3V0UG9ydEZvcm1hdC5lQ29tcHJlc3Npb25Gb3JtYXQgPT0gT01YX1ZJREVPX0NvZGluZ0FWQykgewotICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBPTVhfUUNPTV9GUkFNRV9QQUNLX0FSUkFOR0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgT01YX1FDT01fRlJBTUVfUEFDS19BUlJBTkdFTUVOVCAqY29uZmlnRm10ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUUNPTV9GUkFNRV9QQUNLX0FSUkFOR0VNRU5UICopIGNvbmZpZ0RhdGE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBGcmFtZVBhY2tpbmdEYXRhIG5vdCBzdXBwb3J0ZWQgZm9yIG5vbiBBVkMgY29tcHJlc3Npb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUU9NWF9JbmRleENvbmZpZ1ZpZGVvTFRSUGVyaW9kOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIFFPTVhfVklERU9fQ09ORklHX0xUUlBFUklPRF9UWVBFKTsKLSAgICAgICAgICAgICAgICBRT01YX1ZJREVPX0NPTkZJR19MVFJQRVJJT0RfVFlQRSogcFBhcmFtID0gKFFPTVhfVklERU9fQ09ORklHX0xUUlBFUklPRF9UWVBFKiljb25maWdEYXRhOwotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9jb25maWcoY29uZmlnRGF0YSwgKE9NWF9JTkRFWFRZUEUpUU9NWF9JbmRleENvbmZpZ1ZpZGVvTFRSUGVyaW9kKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgTFRSIHBlcmlvZCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZtX3NDb25maWdMVFJQZXJpb2QsIHBQYXJhbSwgc2l6ZW9mKG1fc0NvbmZpZ0xUUlBlcmlvZCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb1ZwOFJlZmVyZW5jZUZyYW1lOgotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX1ZJREVPX1ZQOFJFRkVSRU5DRUZSQU1FVFlQRSk7Ci0gICAgICAgICAgICAgICBPTVhfVklERU9fVlA4UkVGRVJFTkNFRlJBTUVUWVBFKiBwUGFyYW0gPSAoT01YX1ZJREVPX1ZQOFJFRkVSRU5DRUZSQU1FVFlQRSopIGNvbmZpZ0RhdGE7Ci0gICAgICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfY29uZmlnKHBQYXJhbSwgKE9NWF9JTkRFWFRZUEUpIE9NWF9JbmRleENvbmZpZ1ZpZGVvVnA4UmVmZXJlbmNlRnJhbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nIFZQOCByZWZlcmVuY2UgZnJhbWUiKTsKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgbWVtY3B5KCZtX3NDb25maWdWcDhSZWZlcmVuY2VGcmFtZSwgcFBhcmFtLCBzaXplb2YobV9zQ29uZmlnVnA4UmVmZXJlbmNlRnJhbWUpKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0KLSAgICAgICBjYXNlIFFPTVhfSW5kZXhDb25maWdWaWRlb0xUUlVzZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBRT01YX1ZJREVPX0NPTkZJR19MVFJVU0VfVFlQRSk7Ci0gICAgICAgICAgICAgICAgUU9NWF9WSURFT19DT05GSUdfTFRSVVNFX1RZUEUqIHBQYXJhbSA9IChRT01YX1ZJREVPX0NPTkZJR19MVFJVU0VfVFlQRSopY29uZmlnRGF0YTsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfY29uZmlnKHBQYXJhbSwgKE9NWF9JTkRFWFRZUEUpUU9NWF9JbmRleENvbmZpZ1ZpZGVvTFRSVXNlKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgTFRSIHVzZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZtX3NDb25maWdMVFJVc2UsIHBQYXJhbSwgc2l6ZW9mKG1fc0NvbmZpZ0xUUlVzZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFFPTVhfSW5kZXhDb25maWdWaWRlb0xUUk1hcms6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgUU9NWF9WSURFT19DT05GSUdfTFRSTUFSS19UWVBFKTsKLSAgICAgICAgICAgICAgICBRT01YX1ZJREVPX0NPTkZJR19MVFJNQVJLX1RZUEUqIHBQYXJhbSA9IChRT01YX1ZJREVPX0NPTkZJR19MVFJNQVJLX1RZUEUqKWNvbmZpZ0RhdGE7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUtPnZlbmNfc2V0X2NvbmZpZyhwUGFyYW0sIChPTVhfSU5ERVhUWVBFKVFPTVhfSW5kZXhDb25maWdWaWRlb0xUUk1hcmspKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBMVFIgbWFyayBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9BVkNJbnRyYVBlcmlvZDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EKTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EICpwUGFyYW0gPSAoT01YX1ZJREVPX0NPTkZJR19BVkNJTlRSQVBFUklPRCopIGNvbmZpZ0RhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXRfY29uZmlnOiBPTVhfSW5kZXhDb25maWdWaWRlb0FWQ0ludHJhUGVyaW9kIik7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUtPnZlbmNfc2V0X2NvbmZpZyhwUGFyYW0sIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ1ZpZGVvQVZDSW50cmFQZXJpb2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBPTVhfSW5kZXhDb25maWdWaWRlb0FWQ0ludHJhUGVyaW9kIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoJm1fc0NvbmZpZ0FWQ0lEUlBlcmlvZCwgcFBhcmFtLCBzaXplb2YobV9zQ29uZmlnQVZDSURSUGVyaW9kKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uRGVpbnRlcmxhY2U6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX1ZJREVPX0NPTkZJR19ERUlOVEVSTEFDRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX0NPTkZJR19ERUlOVEVSTEFDRSAqcFBhcmFtID0gKE9NWF9WSURFT19DT05GSUdfREVJTlRFUkxBQ0UqKSBjb25maWdEYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0X2NvbmZpZzogT01YX0luZGV4Q29uZmlnQ29tbW9uRGVpbnRlcmxhY2UiKTsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfY29uZmlnKHBQYXJhbSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQ29tbW9uRGVpbnRlcmxhY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBPTVhfSW5kZXhDb25maWdDb21tb25EZWludGVybGFjZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZtX3NDb25maWdEZWludGVybGFjZSwgcFBhcmFtLCBzaXplb2YobV9zQ29uZmlnRGVpbnRlcmxhY2UpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4Q29uZmlnTnVtSGllclBMYXllcnM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIFFPTVhfRVhUTklOREVYX1ZJREVPX0hJRVJfUF9MQVlFUlMpOwotICAgICAgICAgICAgUU9NWF9FWFROSU5ERVhfVklERU9fSElFUl9QX0xBWUVSUyogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAoUU9NWF9FWFROSU5ERVhfVklERU9fSElFUl9QX0xBWUVSUyopY29uZmlnRGF0YTsKLSAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9jb25maWcocFBhcmFtLCAoT01YX0lOREVYVFlQRSlPTVhfUWNvbUluZGV4Q29uZmlnTnVtSGllclBMYXllcnMpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nIE9NWF9RY29tSW5kZXhDb25maWdOdW1IaWVyUExheWVycyBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KCZtX3NIUGxheWVycywgcFBhcmFtLCBzaXplb2YobV9zSFBsYXllcnMpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleENvbmZpZ0Jhc2VMYXllcklkOgotICAgICAgICB7Ci0gICAgICAgICAgICBWQUxJREFURV9PTVhfUEFSQU1fREFUQShjb25maWdEYXRhLCBPTVhfU0tZUEVfVklERU9fQ09ORklHX0JBU0VMQVlFUlBJRCk7Ci0gICAgICAgICAgICBPTVhfU0tZUEVfVklERU9fQ09ORklHX0JBU0VMQVlFUlBJRCogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAoT01YX1NLWVBFX1ZJREVPX0NPTkZJR19CQVNFTEFZRVJQSUQqKSBjb25maWdEYXRhOwotICAgICAgICAgICAgaWYgKCFoYW5kbGUtPnZlbmNfc2V0X2NvbmZpZyhwUGFyYW0sIChPTVhfSU5ERVhUWVBFKU9NWF9RY29tSW5kZXhDb25maWdCYXNlTGF5ZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgT01YX1Fjb21JbmRleENvbmZpZ0Jhc2VMYXllcklkIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkoJm1fc0Jhc2VMYXllcklELCBwUGFyYW0sIHNpemVvZihtX3NCYXNlTGF5ZXJJRCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4Q29uZmlnUXA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIE9NWF9TS1lQRV9WSURFT19DT05GSUdfUVApOwotICAgICAgICAgICAgT01YX1NLWVBFX1ZJREVPX0NPTkZJR19RUCogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAoT01YX1NLWVBFX1ZJREVPX0NPTkZJR19RUCopIGNvbmZpZ0RhdGE7Ci0gICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfY29uZmlnKHBQYXJhbSwgKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleENvbmZpZ1FwKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBPTVhfUWNvbUluZGV4Q29uZmlnUXAgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweSgmbV9zQ29uZmlnUVAsIHBQYXJhbSwgc2l6ZW9mKG1fc0NvbmZpZ1FQKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ByaW9yaXR5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIE9NWF9QQVJBTV9VMzJUWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfY29uZmlnKGNvbmZpZ0RhdGEsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ1ByaW9yaXR5KSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBPTVhfSW5kZXhDb25maWdQcmlvcml0eSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdPcGVyYXRpbmdSYXRlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIE9NWF9QQVJBTV9VMzJUWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfY29uZmlnKGNvbmZpZ0RhdGEsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ09wZXJhdGluZ1JhdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IE9NWF9JbmRleENvbmZpZ09wZXJhdGluZ1JhdGUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS0+aHdfb3ZlcmxvYWQgPyBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXMgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1FUSUluZGV4Q29uZmlnVmlkZW9Sb2lJbmZvOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIE9NWF9RVElfVklERU9fQ09ORklHX1JPSUlORk8pOwotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9jb25maWcoY29uZmlnRGF0YSwgKE9NWF9JTkRFWFRZUEUpT01YX1FUSUluZGV4Q29uZmlnVmlkZW9Sb2lJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBPTVhfUVRJSW5kZXhDb25maWdWaWRlb1JvaUluZm8iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVGltZVBvc2l0aW9uOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAoT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUqKSBjb25maWdEYXRhOwotICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGltZXN0YW1wLm1fbG9jayk7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wLm1fVGltZVN0YW1wID0gKE9NWF9VNjQpcFBhcmFtLT5uVGltZXN0YW1wOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiQnVmZmVyID0gJXAsIFRpbWVzdGFtcCA9ICVsbHUiLCB0aW1lc3RhbXAucGVuZGluZ19idWZmZXIsIChPTVhfVTY0KXBQYXJhbS0+blRpbWVzdGFtcCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcC5pc19idWZmZXJfcGVuZGluZyAmJiAoT01YX1U2NCl0aW1lc3RhbXAucGVuZGluZ19idWZmZXItPm5UaW1lU3RhbXAgPT0gdGltZXN0YW1wLm1fVGltZVN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0lORk8oIlF1ZXVlaW5nIGJhY2sgcGVuZGluZyBidWZmZXIgJXAiLCB0aW1lc3RhbXAucGVuZGluZ19idWZmZXIpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLT5wb3N0X2V2ZW50KCh1bnNpZ25lZCBsb25nKWhDb21wLCh1bnNpZ25lZCBsb25nKXRpbWVzdGFtcC5wZW5kaW5nX2J1ZmZlcixtX2lucHV0X21zZ19pZCk7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5wZW5kaW5nX2J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5pc19idWZmZXJfcGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdGltZXN0YW1wLm1fbG9jayk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBbmRyb2lkSW50cmFSZWZyZXNoOgotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX0lOVFJBUkVGUkVTSFRZUEUpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9JTlRSQVJFRlJFU0hUWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX0lOVFJBUkVGUkVTSFRZUEUqKSBjb25maWdEYXRhOwotICAgICAgICAgICAgICAgIGlmIChtX3N0YXRlID09IE9NWF9TdGF0ZUxvYWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbV9zSW5Qb3J0RGVmLmJFbmFibGVkID09IE9NWF9GQUxTRQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbV9zT3V0UG9ydERlZi5iRW5hYmxlZCA9PSBPTVhfRkFMU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUtPnZlbmNfc2V0X2NvbmZpZyhjb25maWdEYXRhLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhDb25maWdBbmRyb2lkSW50cmFSZWZyZXNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVJlZnJlc2hUeXBlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fc0NvbmZpZ0ludHJhUmVmcmVzaC5uUmVmcmVzaFBlcmlvZCA9IHBQYXJhbS0+blJlZnJlc2hQZXJpb2Q7Ci0gICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgT01YX0luZGV4Q29uZmlnQW5kcm9pZEludHJhUmVmcmVzaCBzdXBwb3J0ZWQgb25seSBhdCBzdGFydCBvZiBzZXNzaW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhDb25maWdWaWRlb0JsdXJSZXNvbHV0aW9uOgotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX1FUSV9WSURFT19DT05GSUdfQkxVUklORk8pOwotICAgICAgICAgICAgICAgIE9NWF9RVElfVklERU9fQ09ORklHX0JMVVJJTkZPKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9RVElfVklERU9fQ09ORklHX0JMVVJJTkZPKikgY29uZmlnRGF0YTsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfY29uZmlnKGNvbmZpZ0RhdGEsIChPTVhfSU5ERVhUWVBFKU9NWF9RVElJbmRleENvbmZpZ1ZpZGVvQmx1clJlc29sdXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IE9NWF9RVElJbmRleENvbmZpZ1ZpZGVvQmx1clJlc29sdXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZtX2JsdXJJbmZvLCBwUGFyYW0sIHNpemVvZihtX2JsdXJJbmZvKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4Q29uZmlnSDI2NFRyYW5zZm9ybTh4ODoKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLT52ZW5jX3NldF9jb25maWcoY29uZmlnRGF0YSwgKE9NWF9JTkRFWFRZUEUpT01YX1Fjb21JbmRleENvbmZpZ0gyNjRUcmFuc2Zvcm04eDgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBPTVhfUWNvbUluZGV4Q29uZmlnSDI2NFRyYW5zZm9ybTh4OCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1FUSUluZGV4Q29uZmlnRGVzY3JpYmVDb2xvckFzcGVjdHM6Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIERlc2NyaWJlQ29sb3JBc3BlY3RzUGFyYW1zKTsKLSAgICAgICAgICAgICAgIERlc2NyaWJlQ29sb3JBc3BlY3RzUGFyYW1zICpwYXJhbXMgPSAoRGVzY3JpYmVDb2xvckFzcGVjdHNQYXJhbXMgKiljb25maWdEYXRhOwotICAgICAgICAgICAgICAgcHJpbnRfZGVidWdfY29sb3JfYXNwZWN0cygmKHBhcmFtcy0+c0FzcGVjdHMpLCAic2V0X2NvbmZpZyIpOwotICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUtPnZlbmNfc2V0X2NvbmZpZyhjb25maWdEYXRhLCAoT01YX0lOREVYVFlQRSlPTVhfUVRJSW5kZXhDb25maWdEZXNjcmliZUNvbG9yQXNwZWN0cykpIHsKLSAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBPTVhfUVRJSW5kZXhDb25maWdEZXNjcmliZUNvbG9yQXNwZWN0cyIpOwotICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBtZW1jcHkoJm1fc0NvbmZpZ0NvbG9yQXNwZWN0cywgY29uZmlnRGF0YSwgc2l6ZW9mKG1fc0NvbmZpZ0NvbG9yQXNwZWN0cykpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBbmRyb2lkVmlkZW9UZW1wb3JhbExheWVyaW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZBTElEQVRFX09NWF9QQVJBTV9EQVRBKGNvbmZpZ0RhdGEsIE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSk7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdUWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdUWVBFKikgY29uZmlnRGF0YTsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS0+dmVuY19zZXRfY29uZmlnKGNvbmZpZ0RhdGEsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0FuZHJvaWRWaWRlb1RlbXBvcmFsTGF5ZXJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoJm1fc0NvbmZpZ1RlbXBvcmFsTGF5ZXJzLCBwUGFyYW0sIHNpemVvZihtX3NDb25maWdUZW1wb3JhbExheWVycykpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0FuZHJvaWRWZW5kb3JFeHRlbnNpb246Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1BBUkFNX0RBVEEoY29uZmlnRGF0YSwgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFKTsKLQotICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxPTVhfQ09ORklHX0FORFJPSURfVkVORE9SX0VYVEVOU0lPTlRZUEUgKj4oY29uZmlnRGF0YSk7Ci0gICAgICAgICAgICAgICAgVkFMSURBVEVfT01YX1ZFTkRPUl9FWFRFTlNJT05fUEFSQU1fREFUQShleHQpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNldF92ZW5kb3JfZXh0ZW5zaW9uX2NvbmZpZyhleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHVuc3VwcG9ydGVkIGluZGV4ICVkIiwgKGludCkgY29uZmlnSW5kZXgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZVTkNUSU9OCi0gICBvbXhfdmVuYzo6Q29tcG9uZW50RGVJbml0Ci0KLSAgIERFU0NSSVBUSU9OCi0gICBEZXN0cm95cyB0aGUgY29tcG9uZW50IGFuZCByZWxlYXNlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gdGhlIGhlYXAuCi0KLSAgIFBBUkFNRVRFUlMKLSAgIDxUQkQ+LgotCi0gICBSRVRVUk4gVkFMVUUKLSAgIE9NWCBFcnJvciBOb25lIGlmIGV2ZXJ5dGhpbmcgc3VjY2Vzc2Z1bC4KLQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9NWF9FUlJPUlRZUEUgIG9teF92ZW5jOjpjb21wb25lbnRfZGVpbml0KE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcCkKLXsKLSAgICAodm9pZCkgaENvbXA7Ci0gICAgT01YX1UzMiBpID0gMDsKLSAgICBERUJVR19QUklOVF9ISUdIKCJvbXhfdmVuYygpOiBJbnNpZGUgY29tcG9uZW50X2RlaW5pdCgpIik7Ci0gICAgaWYgKE9NWF9TdGF0ZUxvYWRlZCAhPSBtX3N0YXRlKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJXQVJOSU5HOlJ4ZCBEZUluaXQsT01YIG5vdCBpbiBMT0FERUQgc3RhdGUgJWQiLFwKLSAgICAgICAgICAgICAgICBtX3N0YXRlKTsKLSAgICB9Ci0gICAgaWYgKG1fb3V0X21lbV9wdHIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJGcmVlaW5nIHRoZSBPdXRwdXQgTWVtb3J5Iik7Ci0gICAgICAgIGZvciAoaT0wOyBpPCBtX3NPdXRQb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrICkgewotICAgICAgICAgICAgaWYgKEJJVE1BU0tfUFJFU0VOVCgmbV9vdXRfYm1fY291bnQsIGkpKSB7Ci0gICAgICAgICAgICAgICAgQklUTUFTS19DTEVBUigmbV9vdXRfYm1fY291bnQsIGkpOwotICAgICAgICAgICAgICAgIGZyZWVfb3V0cHV0X2J1ZmZlciAoJm1fb3V0X21lbV9wdHJbaV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVsZWFzZV9vdXRwdXRfZG9uZSgpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShtX291dF9tZW1fcHRyKTsKLSAgICAgICAgbV9vdXRfbWVtX3B0ciA9IE5VTEw7Ci0gICAgfQotCi0gICAgLypDaGVjayBpZiB0aGUgaW5wdXQgYnVmZmVycyBoYXZlIHRvIGJlIGNsZWFuZWQgdXAqLwotICAgIGlmIChtX2lucF9tZW1fcHRyCi0jaWZkZWYgX0FORFJPSURfSUNTXwotICAgICAgICAgICAgJiYgIW1ldGFfbW9kZV9lbmFibGUKLSNlbmRpZgotICAgICAgICkgewotICAgICAgICBERUJVR19QUklOVF9MT1coIkZyZWVpbmcgdGhlIElucHV0IE1lbW9yeSIpOwotICAgICAgICBmb3IgKGk9MDsgaTxtX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsOyBpKysgKSB7Ci0gICAgICAgICAgICBpZiAoQklUTUFTS19QUkVTRU5UKCZtX2lucF9ibV9jb3VudCwgaSkpIHsKLSAgICAgICAgICAgICAgICBCSVRNQVNLX0NMRUFSKCZtX2lucF9ibV9jb3VudCwgaSk7Ci0gICAgICAgICAgICAgICAgZnJlZV9pbnB1dF9idWZmZXIgKCZtX2lucF9tZW1fcHRyW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlbGVhc2VfaW5wdXRfZG9uZSgpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGZyZWUobV9pbnBfbWVtX3B0cik7Ci0gICAgICAgIG1faW5wX21lbV9wdHIgPSBOVUxMOwotICAgIH0KLQotICAgIC8vIFJlc2V0IGNvdW50ZXJzIGluIG1lc2cgcXVldWVzCi0gICAgbV9mdGJfcS5tX3NpemU9MDsKLSAgICBtX2NtZF9xLm1fc2l6ZT0wOwotICAgIG1fZXRiX3EubV9zaXplPTA7Ci0gICAgbV9mdGJfcS5tX3JlYWQgPSBtX2Z0Yl9xLm1fd3JpdGUgPTA7Ci0gICAgbV9jbWRfcS5tX3JlYWQgPSBtX2NtZF9xLm1fd3JpdGUgPTA7Ci0gICAgbV9ldGJfcS5tX3JlYWQgPSBtX2V0Yl9xLm1fd3JpdGUgPTA7Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJDYWxsaW5nIHZlbmNfY2xvc2UoKSIpOwotICAgIGlmIChoYW5kbGUpIHsKLSAgICAgICAgaGFuZGxlLT52ZW5jX2Nsb3NlKCk7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkRlbGV0aW5nIEhBTkRMRVslcF0iLCBoYW5kbGUpOwotICAgICAgICBkZWxldGUgKGhhbmRsZSk7Ci0gICAgICAgIGhhbmRsZSA9IE5VTEw7Ci0gICAgfQotICAgIERFQlVHX1BSSU5UX0lORk8oIkNvbXBvbmVudCBEZWluaXQiKTsKLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLX0KLQotCi1PTVhfVTMyIG9teF92ZW5jOjpkZXZfc3RvcCggdm9pZCkKLXsKLSAgICByZXR1cm4gaGFuZGxlLT52ZW5jX3N0b3AoKTsKLX0KLQotCi1PTVhfVTMyIG9teF92ZW5jOjpkZXZfcGF1c2Uodm9pZCkKLXsKLSAgICByZXR1cm4gaGFuZGxlLT52ZW5jX3BhdXNlKCk7Ci19Ci0KLU9NWF9VMzIgb214X3ZlbmM6OmRldl9zdGFydCh2b2lkKQotewotICAgIHJldHVybiBoYW5kbGUtPnZlbmNfc3RhcnQoKTsKLX0KLQotT01YX1UzMiBvbXhfdmVuYzo6ZGV2X2ZsdXNoKHVuc2lnbmVkIHBvcnQpCi17Ci0gICAgcmV0dXJuIGhhbmRsZS0+dmVuY19mbHVzaChwb3J0KTsKLX0KLQotT01YX1UzMiBvbXhfdmVuYzo6ZGV2X3Jlc3VtZSh2b2lkKQotewotICAgIHJldHVybiBoYW5kbGUtPnZlbmNfcmVzdW1lKCk7Ci19Ci0KLU9NWF9VMzIgb214X3ZlbmM6OmRldl9zdGFydF9kb25lKHZvaWQpCi17Ci0gICAgcmV0dXJuIGhhbmRsZS0+dmVuY19zdGFydF9kb25lKCk7Ci19Ci0KLU9NWF9VMzIgb214X3ZlbmM6OmRldl9zZXRfbWVzc2FnZV90aHJlYWRfaWQocHRocmVhZF90IHRpZCkKLXsKLSAgICByZXR1cm4gaGFuZGxlLT52ZW5jX3NldF9tZXNzYWdlX3RocmVhZF9pZCh0aWQpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfdXNlX2J1Zih1bnNpZ25lZCBwb3J0KQotewotICAgIHJldHVybiBoYW5kbGUtPmFsbG9jYXRlX2V4dHJhZGF0YShwb3J0KTsKLX0KLQotYm9vbCBvbXhfdmVuYzo6ZGV2X2J1ZmZlcl9yZWFkeV90b19xdWV1ZShPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKQotewotICAgIGJvb2wgYlJldCA9IHRydWU7Ci0KLSAgICAvKiBkbyBub3QgZGVmZXIgdGhlIGJ1ZmZlciBpZiBtX1RpbWVTdGFtcCBpcyBub3QgaW5pdGlhbGl6ZWQgKi8KLSAgICBpZiAoIXRpbWVzdGFtcC5tX1RpbWVTdGFtcCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnRpbWVzdGFtcC5tX2xvY2spOwotCi0gICAgaWYgKChPTVhfVTY0KWJ1ZmZlci0+blRpbWVTdGFtcCA9PSAoT01YX1U2NCl0aW1lc3RhbXAubV9UaW1lU3RhbXApIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJFVEIgaXMgcmVhZHkgdG8gYmUgcXVldWVkIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSU5GTygiRVRCIGlzIGRlZmVmZmVkIGR1ZSB0byB0aW1lU3RhbXAgbWlzbWF0Y2giKTsKLSAgICAgICAgdGltZXN0YW1wLmlzX2J1ZmZlcl9wZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgdGltZXN0YW1wLnBlbmRpbmdfYnVmZmVyID0gYnVmZmVyOwotICAgICAgICBiUmV0ID0gZmFsc2U7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aW1lc3RhbXAubV9sb2NrKTsKLSAgICByZXR1cm4gYlJldDsKLX0KLQotYm9vbCBvbXhfdmVuYzo6ZGV2X2ZyZWVfYnVmKHZvaWQgKmJ1Zl9hZGRyLHVuc2lnbmVkIHBvcnQpCi17Ci0gICAgcmV0dXJuIGhhbmRsZS0+dmVuY19mcmVlX2J1ZihidWZfYWRkcixwb3J0KTsKLX0KLQotYm9vbCBvbXhfdmVuYzo6ZGV2X2VtcHR5X2J1Zih2b2lkICpidWZmZXIsIHZvaWQgKnBtZW1fZGF0YV9idWYsdW5zaWduZWQgaW5kZXgsdW5zaWduZWQgZmQpCi17Ci0gICAgYm9vbCBicmV0ID0gZmFsc2U7Ci0gICAgYnJldCA9IGhhbmRsZS0+dmVuY19lbXB0eV9idWYoYnVmZmVyLCBwbWVtX2RhdGFfYnVmLGluZGV4LGZkKTsKLSAgICBod19vdmVybG9hZCA9IGhhbmRsZS0+aHdfb3ZlcmxvYWQ7Ci0gICAgcmV0dXJuIGJyZXQ7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9maWxsX2J1Zih2b2lkICpidWZmZXIsIHZvaWQgKnBtZW1fZGF0YV9idWYsdW5zaWduZWQgaW5kZXgsdW5zaWduZWQgZmQpCi17Ci0gICAgcmV0dXJuIGhhbmRsZS0+dmVuY19maWxsX2J1ZihidWZmZXIsIHBtZW1fZGF0YV9idWYsaW5kZXgsZmQpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfZ2V0X3NlcV9oZHIodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCAqaGRybGVuKQotewotICAgIHJldHVybiBoYW5kbGUtPnZlbmNfZ2V0X3NlcV9oZHIoYnVmZmVyLCBzaXplLCBoZHJsZW4pOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfZ2V0X2NhcGFiaWxpdHlfbHRyY291bnQoT01YX1UzMiAqbWluLCBPTVhfVTMyICptYXgsIE9NWF9VMzIgKnN0ZXBfc2l6ZSkKLXsKLSAgICAodm9pZCkgbWluOwotICAgICh2b2lkKSBtYXg7Ci0gICAgKHZvaWQpIHN0ZXBfc2l6ZTsKLSAgICBERUJVR19QUklOVF9FUlJPUigiR2V0IENhcGFiaWxpdHkgTFRSIENvdW50IGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9nZXRfdnVpX3RpbWluZ19pbmZvKE9NWF9VMzIgKmVuYWJsZWQpCi17Ci0gICAgcmV0dXJuIGhhbmRsZS0+dmVuY19nZXRfdnVpX3RpbWluZ19pbmZvKGVuYWJsZWQpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfZ2V0X3ZxemlwX3NlaV9pbmZvKE9NWF9VMzIgKmVuYWJsZWQpCi17Ci0gICAgcmV0dXJuIGhhbmRsZS0+dmVuY19nZXRfdnF6aXBfc2VpX2luZm8oZW5hYmxlZCk7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9nZXRfcGVha19iaXRyYXRlKE9NWF9VMzIgKnBlYWtiaXRyYXRlKQotewotICAgIHJldHVybiBoYW5kbGUtPnZlbmNfZ2V0X3BlYWtfYml0cmF0ZShwZWFrYml0cmF0ZSk7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9nZXRfYmF0Y2hfc2l6ZShPTVhfVTMyICpzaXplKQotewotICAgIHJldHVybiBoYW5kbGUtPnZlbmNfZ2V0X2JhdGNoX3NpemUoc2l6ZSk7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9nZXRfdGVtcG9yYWxfbGF5ZXJfY2FwcyhPTVhfVTMyICpuTWF4TGF5ZXJzLAotICAgICAgICBPTVhfVTMyICpuTWF4QkxheWVycywgT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFICplU3VwcG9ydGVkUGF0dGVybikgewotICAgIHJldHVybiBoYW5kbGUtPnZlbmNfZ2V0X3RlbXBvcmFsX2xheWVyX2NhcHMobk1heExheWVycywgbk1heEJMYXllcnMsIGVTdXBwb3J0ZWRQYXR0ZXJuKTsKLX0KLQotYm9vbCBvbXhfdmVuYzo6ZGV2X2xvYWRlZF9zdGFydCgpCi17Ci0gICAgcmV0dXJuIGhhbmRsZS0+dmVuY19sb2FkZWRfc3RhcnQoKTsKLX0KLQotYm9vbCBvbXhfdmVuYzo6ZGV2X2xvYWRlZF9zdG9wKCkKLXsKLSAgICByZXR1cm4gaGFuZGxlLT52ZW5jX2xvYWRlZF9zdG9wKCk7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9sb2FkZWRfc3RhcnRfZG9uZSgpCi17Ci0gICAgcmV0dXJuIGhhbmRsZS0+dmVuY19sb2FkZWRfc3RhcnRfZG9uZSgpOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfbG9hZGVkX3N0b3BfZG9uZSgpCi17Ci0gICAgcmV0dXJuIGhhbmRsZS0+dmVuY19sb2FkZWRfc3RvcF9kb25lKCk7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9nZXRfYnVmX3JlcShPTVhfVTMyICptaW5fYnVmZl9jb3VudCwKLSAgICAgICAgT01YX1UzMiAqYWN0dWFsX2J1ZmZfY291bnQsCi0gICAgICAgIE9NWF9VMzIgKmJ1ZmZfc2l6ZSwKLSAgICAgICAgT01YX1UzMiBwb3J0KQotewotICAgIHJldHVybiBoYW5kbGUtPnZlbmNfZ2V0X2J1Zl9yZXEobWluX2J1ZmZfY291bnQsCi0gICAgICAgICAgICBhY3R1YWxfYnVmZl9jb3VudCwKLSAgICAgICAgICAgIGJ1ZmZfc2l6ZSwKLSAgICAgICAgICAgIHBvcnQpOwotCi19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9zZXRfYnVmX3JlcShPTVhfVTMyICptaW5fYnVmZl9jb3VudCwKLSAgICAgICAgT01YX1UzMiAqYWN0dWFsX2J1ZmZfY291bnQsCi0gICAgICAgIE9NWF9VMzIgKmJ1ZmZfc2l6ZSwKLSAgICAgICAgT01YX1UzMiBwb3J0KQotewotICAgIHJldHVybiBoYW5kbGUtPnZlbmNfc2V0X2J1Zl9yZXEobWluX2J1ZmZfY291bnQsCi0gICAgICAgICAgICBhY3R1YWxfYnVmZl9jb3VudCwKLSAgICAgICAgICAgIGJ1ZmZfc2l6ZSwKLSAgICAgICAgICAgIHBvcnQpOwotCi19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9pc192aWRlb19zZXNzaW9uX3N1cHBvcnRlZChPTVhfVTMyIHdpZHRoLCBPTVhfVTMyIGhlaWdodCkKLXsKLSAgICByZXR1cm4gaGFuZGxlLT52ZW5jX2lzX3ZpZGVvX3Nlc3Npb25fc3VwcG9ydGVkKHdpZHRoLGhlaWdodCk7Ci19Ci0KLWludCBvbXhfdmVuYzo6ZGV2X2hhbmRsZV9vdXRwdXRfZXh0cmFkYXRhKHZvaWQgKmJ1ZmZlciwgaW50IGluZGV4KQotewotICAgIHJldHVybiBoYW5kbGUtPmhhbmRsZV9vdXRwdXRfZXh0cmFkYXRhKGJ1ZmZlciwgaW5kZXgpOwotfQotCi1pbnQgb214X3ZlbmM6OmRldl9zZXRfZm9ybWF0KGludCBjb2xvcikKLXsKLSAgICByZXR1cm4gaGFuZGxlLT52ZW5jX3NldF9mb3JtYXQoY29sb3IpOwotfQotCi1pbnQgb214X3ZlbmM6OmFzeW5jX21lc3NhZ2VfcHJvY2VzcyAodm9pZCAqY29udGV4dCwgdm9pZCogbWVzc2FnZSkKLXsKLSAgICBvbXhfdmlkZW8qIG9teCA9IE5VTEw7Ci0gICAgc3RydWN0IHZlbmNfbXNnICptX3NWZW5jX21zZyA9IE5VTEw7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIG9teGhkciA9IE5VTEw7Ci0gICAgc3RydWN0IHZlbmNfYnVmZmVyICp0ZW1wX2J1ZmYgPSBOVUxMOwotICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBOVUxMOwotCi0gICAgaWYgKGNvbnRleHQgPT0gTlVMTCB8fCBtZXNzYWdlID09IE5VTEwpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBvbXhfdmVuYzo6YXN5bmNfbWVzc2FnZV9wcm9jZXNzIGludmFsaWQgaS9wIHBhcmFtcyIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG1fc1ZlbmNfbXNnID0gKHN0cnVjdCB2ZW5jX21zZyAqKW1lc3NhZ2U7Ci0KLSAgICBvbXggPSByZWludGVycHJldF9jYXN0PG9teF92aWRlbyo+KGNvbnRleHQpOwotCi0gICAgaWYgKG1fc1ZlbmNfbXNnLT5zdGF0dXNjb2RlICE9IFZFTl9TX1NVQ0NFU1MpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBhc3luY19tc2dfcHJvY2VzcygpIC0gRXJyb3Igc3RhdHVzY29kZSA9ICVsdSIsCi0gICAgICAgICAgICAgICAgbV9zVmVuY19tc2ctPnN0YXR1c2NvZGUpOwotICAgICAgICBpZihtX3NWZW5jX21zZy0+bXNnY29kZSA9PSBWRU5fTVNHX0hXX09WRVJMT0FEKSB7Ci0gICAgICAgICAgICBvbXgtPnBvc3RfZXZlbnQgKDAsIG1fc1ZlbmNfbXNnLT5zdGF0dXNjb2RlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9IQVJEV0FSRV9PVkVSTE9BRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvbXgtPnBvc3RfZXZlbnQgKDAsIG1fc1ZlbmNfbXNnLT5zdGF0dXNjb2RlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9IQVJEV0FSRV9FUlJPUik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIm9teF92ZW5jOjphc3luY19tZXNzYWdlX3Byb2Nlc3MtIG1zZ2NvZGUgPSAlbHUiLAotICAgICAgICAgICAgbV9zVmVuY19tc2ctPm1zZ2NvZGUpOwotICAgIHN3aXRjaCAobV9zVmVuY19tc2ctPm1zZ2NvZGUpIHsKLSAgICAgICAgY2FzZSBWRU5fTVNHX1NUQVJUOgotICAgICAgICAgICAgb214LT5wb3N0X2V2ZW50ICgwLG1fc1ZlbmNfbXNnLT5zdGF0dXNjb2RlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9TVEFSVF9ET05FKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZFTl9NU0dfU1RPUDoKLSAgICAgICAgICAgIG9teC0+cG9zdF9ldmVudCAoMCxtX3NWZW5jX21zZy0+c3RhdHVzY29kZSxcCi0gICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRfR0VORVJBVEVfU1RPUF9ET05FKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZFTl9NU0dfUkVTVU1FOgotICAgICAgICAgICAgb214LT5wb3N0X2V2ZW50ICgwLG1fc1ZlbmNfbXNnLT5zdGF0dXNjb2RlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9SRVNVTUVfRE9ORSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWRU5fTVNHX1BBVVNFOgotICAgICAgICAgICAgb214LT5wb3N0X2V2ZW50ICgwLG1fc1ZlbmNfbXNnLT5zdGF0dXNjb2RlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9QQVVTRV9ET05FKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZFTl9NU0dfRkxVU0hfSU5QVVRfRE9ORToKLQotICAgICAgICAgICAgb214LT5wb3N0X2V2ZW50ICgwLG1fc1ZlbmNfbXNnLT5zdGF0dXNjb2RlLFwKLSAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVF9HRU5FUkFURV9FVkVOVF9JTlBVVF9GTFVTSCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWRU5fTVNHX0ZMVVNIX09VUFVUX0RPTkU6Ci0gICAgICAgICAgICBvbXgtPnBvc3RfZXZlbnQgKDAsbV9zVmVuY19tc2ctPnN0YXR1c2NvZGUsXAotICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VWRU5UX09VVFBVVF9GTFVTSCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWRU5fTVNHX0lOUFVUX0JVRkZFUl9ET05FOgotICAgICAgICAgICAgb214aGRyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFKiApXAotICAgICAgICAgICAgICAgICAgICAgbV9zVmVuY19tc2ctPmJ1Zi5jbGllbnRkYXRhOwotCi0gICAgICAgICAgICBpZiAob214aGRyID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAgICAgKCgoT01YX1UzMikob214aGRyIC0gb214LT5tX2lucF9tZW1fcHRyKSA+IG9teC0+bV9zSW5Qb3J0RGVmLm5CdWZmZXJDb3VudEFjdHVhbCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICgoT01YX1UzMikob214aGRyIC0gb214LT5tZXRhX2J1ZmZlcl9oZHIpID4gb214LT5tX3NJblBvcnREZWYubkJ1ZmZlckNvdW50QWN0dWFsKSkpIHsKLSAgICAgICAgICAgICAgICBvbXhoZHIgPSBOVUxMOwotICAgICAgICAgICAgICAgIG1fc1ZlbmNfbXNnLT5zdGF0dXNjb2RlID0gVkVOX1NfRUZBSUw7Ci0gICAgICAgICAgICB9Ci0KLSNpZmRlZiBfQU5EUk9JRF9JQ1NfCi0gICAgICAgICAgICBvbXgtPm9teF9yZWxlYXNlX21ldGFfYnVmZmVyKG9teGhkcik7Ci0jZW5kaWYKLSAgICAgICAgICAgIG9teC0+cG9zdF9ldmVudCAoKHVuc2lnbmVkIGxvbmcpb214aGRyLG1fc1ZlbmNfbXNnLT5zdGF0dXNjb2RlLAotICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0VCRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWRU5fTVNHX09VVFBVVF9CVUZGRVJfRE9ORToKLSAgICAgICAgICAgIG9teGhkciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSopbV9zVmVuY19tc2ctPmJ1Zi5jbGllbnRkYXRhOwotCi0gICAgICAgICAgICBpZiAoIChvbXhoZHIgIT0gTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChPTVhfVTMyKShvbXhoZHIgLSBvbXgtPm1fb3V0X21lbV9wdHIpICA8IG9teC0+bV9zT3V0UG9ydERlZi5uQnVmZmVyQ291bnRBY3R1YWwpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvbXgtPmlzX3NlY3VyZV9zZXNzaW9uKCkgJiYgKG1fc1ZlbmNfbXNnLT5idWYubGVuIDw9ICBvbXhoZHItPm5BbGxvY0xlbikpIHsKLSAgICAgICAgICAgICAgICAgICAgb214aGRyLT5uRmlsbGVkTGVuID0gbV9zVmVuY19tc2ctPmJ1Zi5sZW47Ci0gICAgICAgICAgICAgICAgICAgIG9teGhkci0+bk9mZnNldCA9IG1fc1ZlbmNfbXNnLT5idWYub2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBvbXhoZHItPm5UaW1lU3RhbXAgPSBtX3NWZW5jX21zZy0+YnVmLnRpbWVzdGFtcDsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJvL3AgVFMgPSAldSIsICh1bnNpZ25lZCBpbnQpbV9zVmVuY19tc2ctPmJ1Zi50aW1lc3RhbXApOwotICAgICAgICAgICAgICAgICAgICBvbXhoZHItPm5GbGFncyA9IG1fc1ZlbmNfbXNnLT5idWYuZmxhZ3M7Ci0KLSAgICAgICAgICAgICAgICAgICAgLypVc2UgYnVmZmVyIGNhc2UqLwotICAgICAgICAgICAgICAgICAgICBpZiAob214LT5vdXRwdXRfdXNlX2J1ZmZlciAmJiAhb214LT5tX3VzZV9vdXRwdXRfcG1lbSAmJiAhb214LT5pc19zZWN1cmVfc2Vzc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIm1lbWNweSgpIGZvciBvL3AgSGVhcCBVc2VCdWZmZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShvbXhoZHItPnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3NWZW5jX21zZy0+YnVmLnB0cmJ1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc1ZlbmNfbXNnLT5idWYubGVuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob214LT5pc19zZWN1cmVfc2Vzc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvbXgtPmFsbG9jYXRlX25hdGl2ZV9oYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSAobmF0aXZlX2hhbmRsZV90ICopKG9teGhkci0+cEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuaC0+ZGF0YVsxXSA9IG1fc1ZlbmNfbXNnLT5idWYub2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgbmgtPmRhdGFbMl0gPSBtX3NWZW5jX21zZy0+YnVmLmxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teGhkci0+bkZpbGxlZExlbiA9IG1fc1ZlbmNfbXNnLT5idWYubGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgb214aGRyLT5uVGltZVN0YW1wID0gbV9zVmVuY19tc2ctPmJ1Zi50aW1lc3RhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbXhoZHItPm5GbGFncyA9IG1fc1ZlbmNfbXNnLT5idWYuZmxhZ3M7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfbWV0YWJ1ZmZlciAqbWV0YV9idWYgPSAob3V0cHV0X21ldGFidWZmZXIgKikob214aGRyLT5wQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBtZXRhX2J1Zi0+bmg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuaC0+ZGF0YVsxXSA9IG1fc1ZlbmNfbXNnLT5idWYub2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgbmgtPmRhdGFbMl0gPSBtX3NWZW5jX21zZy0+YnVmLmxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teGhkci0+bkZpbGxlZExlbiA9IHNpemVvZihvdXRwdXRfbWV0YWJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbXhoZHItPm5UaW1lU3RhbXAgPSBtX3NWZW5jX21zZy0+YnVmLnRpbWVzdGFtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teGhkci0+bkZsYWdzID0gbV9zVmVuY19tc2ctPmJ1Zi5mbGFnczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG9teGhkci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9teGhkciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgbV9zVmVuY19tc2ctPnN0YXR1c2NvZGUgPSBWRU5fU19FRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9teC0+cG9zdF9ldmVudCAoKHVuc2lnbmVkIGxvbmcpb214aGRyLG1fc1ZlbmNfbXNnLT5zdGF0dXNjb2RlLAotICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UX0dFTkVSQVRFX0ZCRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWRU5fTVNHX05FRURfT1VUUFVUX0JVRkZFUjoKLSAgICAgICAgICAgIC8vVEJEIHdoYXQgYWN0aW9uIG5lZWRzIHRvIGJlIGRvbmUgaGVyZT8/Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlVua25vd24gbXNnIHJlY2VpdmVkIDogJWx1IiwgbV9zVmVuY19tc2ctPm1zZ2NvZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1ib29sIG9teF92ZW5jOjpkZXZfY29sb3JfYWxpZ24oT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICBPTVhfVTMyIHdpZHRoLCBPTVhfVTMyIGhlaWdodCkKLXsKLSAgICBpZihzZWN1cmVfc2Vzc2lvbikgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiQ2Fubm90IGFsaWduIGNvbG9ycyBpbiBzZWN1cmUgc2Vzc2lvbi4iKTsKLSAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhbmRsZS0+dmVuY19jb2xvcl9hbGlnbihidWZmZXIsIHdpZHRoLGhlaWdodCk7Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmlzX3NlY3VyZV9zZXNzaW9uKCkKLXsKLSAgICByZXR1cm4gc2VjdXJlX3Nlc3Npb247Ci19Ci0KLWJvb2wgb214X3ZlbmM6OmRldl9nZXRfb3V0cHV0X2xvZ19mbGFnKCkKLXsKLSAgICByZXR1cm4gaGFuZGxlLT52ZW5jX2dldF9vdXRwdXRfbG9nX2ZsYWcoKTsKLX0KLQotaW50IG9teF92ZW5jOjpkZXZfb3V0cHV0X2xvZ19idWZmZXJzKGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcmxlbikKLXsKLSAgICByZXR1cm4gaGFuZGxlLT52ZW5jX291dHB1dF9sb2dfYnVmZmVycyhidWZmZXIsIGJ1ZmZlcmxlbik7Ci19Ci0KLWludCBvbXhfdmVuYzo6ZGV2X2V4dHJhZGF0YV9sb2dfYnVmZmVycyhjaGFyICpidWZmZXIpCi17Ci0gICAgcmV0dXJuIGhhbmRsZS0+dmVuY19leHRyYWRhdGFfbG9nX2J1ZmZlcnMoYnVmZmVyKTsKLX0KZGlmZiAtLWdpdCBhL3NkbTg0NS9tbS12aWRlby12NGwyL3ZpZGMvdmVuYy9zcmMvb214X3ZpZGVvX2V4dGVuc2lvbnMuaHBwIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL3NyYy9vbXhfdmlkZW9fZXh0ZW5zaW9ucy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZTA5MWUuLjAwMDAwMDAKLS0tIGEvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL3NyYy9vbXhfdmlkZW9fZXh0ZW5zaW9ucy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLU9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLUlGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIG9teF92aWRlbzo6aW5pdF92ZW5kb3JfZXh0ZW5zaW9ucyhWZW5kb3JFeHRlbnNpb25TdG9yZSAmc3RvcmUpIHsKLQotICAgIC8vVE9ETzogYWRkIGV4dGVuc2lvbnMgYmFzZWQgb24gQ29kZWMsIG1fcGxhdGZvcm0gYW5kL29yIG90aGVyIGNhcGFiaWxpdHkgcXVlcmllcwotCi0gICAgQUREX0VYVEVOU0lPTigicXRpLWV4dC1lbmMtcHJlcHJvY2Vzcy1yb3RhdGUiLCBPTVhfSW5kZXhDb25maWdDb21tb25Sb3RhdGUsIE9NWF9EaXJPdXRwdXQpCi0gICAgQUREX1BBUkFNX0VORCgiYW5nbGUiLCBPTVhfQW5kcm9pZFZlbmRvclZhbHVlSW50MzIpCi0KLSAgICBBRERfRVhURU5TSU9OKCJxdGktZXh0LWVuYy1hdmMtaW50cmEtcGVyaW9kIiwgT01YX0luZGV4Q29uZmlnVmlkZW9BVkNJbnRyYVBlcmlvZCwgT01YX0Rpck91dHB1dCkKLSAgICBBRERfUEFSQU0gICAgKCJuLXBmcmFtZXMiLCAgICBPTVhfQW5kcm9pZFZlbmRvclZhbHVlSW50MzIpCi0gICAgQUREX1BBUkFNX0VORCgibi1pZHItcGVyaW9kIiwgT01YX0FuZHJvaWRWZW5kb3JWYWx1ZUludDMyKQotCi0gICAgQUREX0VYVEVOU0lPTigicXRpLWV4dC1lbmMtZXJyb3ItY29ycmVjdGlvbiIsIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb24sIE9NWF9EaXJPdXRwdXQpCi0gICAgQUREX1BBUkFNX0VORCgicmVzeW5jLW1hcmtlci1zcGFjaW5nLWJpdHMiLCBPTVhfQW5kcm9pZFZlbmRvclZhbHVlSW50MzIpCi0KLSAgICBBRERfRVhURU5TSU9OKCJxdGktZXh0LWVuYy1jdXN0b20tcHJvZmlsZS1sZXZlbCIsIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50LCBPTVhfRGlyT3V0cHV0KQotICAgIEFERF9QQVJBTSAgICAoInByb2ZpbGUiLCBPTVhfQW5kcm9pZFZlbmRvclZhbHVlSW50MzIpCi0gICAgQUREX1BBUkFNX0VORCgibGV2ZWwiLCAgIE9NWF9BbmRyb2lkVmVuZG9yVmFsdWVJbnQzMikKLQotICAgIEFERF9FWFRFTlNJT04oInF0aS1leHQtZW5jLXRpbWVzdGFtcC1zb3VyY2UtYXZ0aW1lciIsIE9NWF9RVElJbmRleFBhcmFtRW5hYmxlQVZUaW1lclRpbWVzdGFtcHMsIE9NWF9EaXJJbnB1dCkKLSAgICBBRERfUEFSQU1fRU5EKCJlbmFibGUiLCBPTVhfQW5kcm9pZFZlbmRvclZhbHVlSW50MzIpCi19Ci0KLU9NWF9FUlJPUlRZUEUgb214X3ZpZGVvOjpnZXRfdmVuZG9yX2V4dGVuc2lvbl9jb25maWcoCi0gICAgICAgICAgICAgICAgT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9FWFRFTlNJT05UWVBFICpleHQpIHsKLSAgICBpZiAoZXh0LT5uSW5kZXggPj0gbVZlbmRvckV4dGVuc2lvblN0b3JlLnNpemUoKSkgewotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOwotICAgIH0KLQotICAgIGNvbnN0IFZlbmRvckV4dGVuc2lvbiYgdkV4dCA9IG1WZW5kb3JFeHRlbnNpb25TdG9yZVtleHQtPm5JbmRleF07Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJWZW5kb3JFeHQ6IGdldENvbmZpZzogaW5kZXg9JXUgKCVzKSIsIGV4dC0+bkluZGV4LCB2RXh0Lm5hbWUoKSk7Ci0KLSAgICB2RXh0LmNvcHlJbmZvVG8oZXh0KTsKLSAgICBpZiAoZXh0LT5uUGFyYW1TaXplVXNlZCA8IHZFeHQucGFyYW1Db3VudCgpKSB7Ci0gICAgICAgIC8vIHRoaXMgaGFwcGVucyBkdXJpbmcgaW5pdGlhbCBnZXRDb25maWcgdG8gcXVlcnkgb25seSBleHRlbnNpb24tbmFtZSBhbmQgcGFyYW0tY291bnQKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgLy8gV2Ugbm93IGhhdmUgc3VmZmljaWVudCBwYXJhbXMgYWxsb2NhdGVkIGluIGV4dGVuc2lvbiBkYXRhIHBhc3NlZC4KLSAgICAvLyBGb2xsb3dpbmcgY29kZSBpcyB0byBzZXQgdGhlIGV4dGVuc2lvbi1zcGVjaWZpYyBkYXRhCi0KLSAgICBib29sIHNldFN0YXR1cyA9IHRydWU7Ci0KLSAgICBzd2l0Y2ggKChPTVhfVTMyKXZFeHQuZXh0ZW5zaW9uSW5kZXgoKSkgewotICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZToKLSAgICAgICAgewotICAgICAgICAgICAgc2V0U3RhdHVzICY9IHZFeHQuc2V0UGFyYW1JbnQzMihleHQsICJhbmdsZSIsIG1fc0NvbmZpZ0ZyYW1lUm90YXRpb24ublJvdGF0aW9uKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9BVkNJbnRyYVBlcmlvZDoKLSAgICAgICAgewotICAgICAgICAgICAgc2V0U3RhdHVzICY9IHZFeHQuc2V0UGFyYW1JbnQzMihleHQsICJuLXBmcmFtZXMiLCBtX3NDb25maWdBVkNJRFJQZXJpb2QublBGcmFtZXMpOwotICAgICAgICAgICAgc2V0U3RhdHVzICY9IHZFeHQuc2V0UGFyYW1JbnQzMihleHQsICJuLWlkci1wZXJpb2QiLCBtX3NDb25maWdBVkNJRFJQZXJpb2QubklEUlBlcmlvZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vICJiaXRzIiBAMAotICAgICAgICAgICAgc2V0U3RhdHVzICY9IHZFeHQuc2V0UGFyYW1JbnQzMihleHQsCi0gICAgICAgICAgICAgICAgICAgICJyZXN5bmMtbWFya2VyLXNwYWNpbmctYml0cyIsIG1fc0Vycm9yQ29ycmVjdGlvbi5uUmVzeW5jaE1hcmtlclNwYWNpbmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudDoKLSAgICAgICAgewotICAgICAgICAgICAgc2V0U3RhdHVzICY9IHZFeHQuc2V0UGFyYW1JbnQzMihleHQsICJwcm9maWxlIiwgbV9zUGFyYW1Qcm9maWxlTGV2ZWwuZVByb2ZpbGUpOwotICAgICAgICAgICAgc2V0U3RhdHVzICY9IHZFeHQuc2V0UGFyYW1JbnQzMihleHQsICJsZXZlbCIsIG1fc1BhcmFtUHJvZmlsZUxldmVsLmVMZXZlbCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1FUSUluZGV4UGFyYW1FbmFibGVBVlRpbWVyVGltZXN0YW1wczoKLSAgICAgICAgewotICAgICAgICAgICAgc2V0U3RhdHVzICY9IHZFeHQuc2V0UGFyYW1JbnQzMihleHQsICJlbmFibGUiLCBtX3NQYXJhbUFWVGltZXJUaW1lc3RhbXBNb2RlLmJFbmFibGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vdEltcGxlbWVudGVkOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzZXRTdGF0dXMgPyBPTVhfRXJyb3JOb25lIDogT01YX0Vycm9yVW5kZWZpbmVkOwotfQotCi1PTVhfRVJST1JUWVBFIG9teF92aWRlbzo6c2V0X3ZlbmRvcl9leHRlbnNpb25fY29uZmlnKAotICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfRVhURU5TSU9OVFlQRSAqZXh0KSB7Ci0KLSAgICBBTE9HSSgic2V0X3ZlbmRvcl9leHRlbnNpb25fY29uZmlnIik7Ci0gICAgaWYgKGV4dC0+bkluZGV4ID49IG1WZW5kb3JFeHRlbnNpb25TdG9yZS5zaXplKCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInVucmVjb2duaXplZCB2ZW5kb3IgZXh0ZW5zaW9uIGluZGV4ICgldSkgbWF4KCV1KSIsCi0gICAgICAgICAgICAgICAgZXh0LT5uSW5kZXgsIG1WZW5kb3JFeHRlbnNpb25TdG9yZS5zaXplKCkpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGNvbnN0IFZlbmRvckV4dGVuc2lvbiYgdkV4dCA9IG1WZW5kb3JFeHRlbnNpb25TdG9yZVtleHQtPm5JbmRleF07Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJWZW5kb3JFeHQ6IHNldENvbmZpZzogaW5kZXg9JXUgKCVzKSIsIGV4dC0+bkluZGV4LCB2RXh0Lm5hbWUoKSk7Ci0KLSAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9FcnJvck5vbmU7Ci0gICAgZXJyID0gdkV4dC5pc0NvbmZpZ1ZhbGlkKGV4dCk7Ci0gICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gbWFyayB0aGlzIGFzIHNldCwgcmVnYXJkbGVzcyBvZiBzZXRfY29uZmlnIHN1Y2NlZWRpbmcvZmFpbGluZy4KLSAgICAvLyBBcHAgd2lsbCBrbm93IGJ5IGluY29uc2lzdGVudCB2YWx1ZXMgaW4gb3V0cHV0LWZvcm1hdAotICAgIHZFeHQuc2V0KCk7Ci0KLSAgICBib29sIHZhbHVlU2V0ID0gZmFsc2U7Ci0gICAgc3dpdGNoICgoT01YX1UzMil2RXh0LmV4dGVuc2lvbkluZGV4KCkpIHsKLSAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25Sb3RhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9DT05GSUdfUk9UQVRJT05UWVBFIHJvdGF0aW9uUGFyYW07Ci0gICAgICAgICAgICBtZW1jcHkoJnJvdGF0aW9uUGFyYW0sICZtX3NDb25maWdGcmFtZVJvdGF0aW9uLCBzaXplb2YoT01YX0NPTkZJR19ST1RBVElPTlRZUEUpKTsKLSAgICAgICAgICAgIHZhbHVlU2V0IHw9IHZFeHQucmVhZFBhcmFtSW50MzIoZXh0LCAiYW5nbGUiLCAmcm90YXRpb25QYXJhbS5uUm90YXRpb24pOwotICAgICAgICAgICAgaWYgKCF2YWx1ZVNldCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJWRU5ET1ItRVhUOiBzZXRfY29uZmlnOiBPTVhfSW5kZXhDb25maWdDb21tb25Sb3RhdGUgOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uUGFyYW0ublJvdGF0aW9uKTsKLQotICAgICAgICAgICAgZXJyID0gc2V0X2NvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlLCAmcm90YXRpb25QYXJhbSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigic2V0X2NvbmZpZzogT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlIGZhaWxlZCAhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvQVZDSW50cmFQZXJpb2Q6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0QgaWRyQ29uZmlnOwotICAgICAgICAgICAgbWVtY3B5KCZpZHJDb25maWcsICZtX3NDb25maWdBVkNJRFJQZXJpb2QsIHNpemVvZihPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EKSk7Ci0gICAgICAgICAgICB2YWx1ZVNldCB8PSB2RXh0LnJlYWRQYXJhbUludDMyKGV4dCwgIm4tcGZyYW1lcyIsIChPTVhfUzMyICopJihpZHJDb25maWcublBGcmFtZXMpKTsKLSAgICAgICAgICAgIHZhbHVlU2V0IHw9IHZFeHQucmVhZFBhcmFtSW50MzIoZXh0LCAibi1pZHItcGVyaW9kIiwgKE9NWF9TMzIgKikmKGlkckNvbmZpZy5uSURSUGVyaW9kKSk7Ci0gICAgICAgICAgICBpZiAoIXZhbHVlU2V0KSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlZFTkRPUi1FWFQ6IHNldF9jb25maWc6IEFWQy1pbnRyYS1wZXJpb2QgOiBuUD0lZCwgbklEUj0lZCIsCi0gICAgICAgICAgICAgICAgICAgIGlkckNvbmZpZy5uUEZyYW1lcywgaWRyQ29uZmlnLm5JRFJQZXJpb2QpOwotCi0gICAgICAgICAgICBlcnIgPSBzZXRfY29uZmlnKAotICAgICAgICAgICAgICAgICAgICBOVUxMLCBPTVhfSW5kZXhDb25maWdWaWRlb0FWQ0ludHJhUGVyaW9kLCAmaWRyQ29uZmlnKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfY29uZmlnOiBPTVhfSW5kZXhDb25maWdWaWRlb0FWQ0ludHJhUGVyaW9kIGZhaWxlZCAhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFIGVjUGFyYW07Ci0gICAgICAgICAgICBtZW1jcHkoJmVjUGFyYW0sICZtX3NFcnJvckNvcnJlY3Rpb24sIHNpemVvZihPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSkpOwotICAgICAgICAgICAgdmFsdWVTZXQgfD0gdkV4dC5yZWFkUGFyYW1JbnQzMihleHQsCi0gICAgICAgICAgICAgICAgICAgICJyZXN5bmMtbWFya2VyLXNwYWNpbmctYml0cyIsIChPTVhfUzMyICopJihlY1BhcmFtLm5SZXN5bmNoTWFya2VyU3BhY2luZykpOwotICAgICAgICAgICAgaWYgKCF2YWx1ZVNldCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJWRU5ET1ItRVhUOiBzZXRfY29uZmlnOiByZXN5bmMtbWFya2VyLXNwYWNpbmcgOiAlZCBiaXRzIiwKLSAgICAgICAgICAgICAgICAgICAgZWNQYXJhbS5uUmVzeW5jaE1hcmtlclNwYWNpbmcpOwotCi0gICAgICAgICAgICBlcnIgPSBzZXRfcGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICBOVUxMLCBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uLCAmZWNQYXJhbSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigic2V0X2NvbmZpZzogT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbiBmYWlsZWQgISIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudDoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgcHJvZmlsZVBhcmFtOwotICAgICAgICAgICAgbWVtY3B5KCZwcm9maWxlUGFyYW0sICZtX3NQYXJhbVByb2ZpbGVMZXZlbCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKSk7Ci0gICAgICAgICAgICB2YWx1ZVNldCB8PSB2RXh0LnJlYWRQYXJhbUludDMyKGV4dCwgInByb2ZpbGUiLCAoT01YX1MzMiAqKSYocHJvZmlsZVBhcmFtLmVQcm9maWxlKSk7Ci0gICAgICAgICAgICB2YWx1ZVNldCB8PSB2RXh0LnJlYWRQYXJhbUludDMyKGV4dCwgImxldmVsIiwgKE9NWF9TMzIgKikmKHByb2ZpbGVQYXJhbS5lTGV2ZWwpKTsKLSAgICAgICAgICAgIGlmICghdmFsdWVTZXQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiVkVORE9SLUVYVDogc2V0X2NvbmZpZzogY3VzdG9tLXByb2ZpbGUvbGV2ZWwgOiBwcm9maWxlPSV1IGxldmVsPSV1IiwKLSAgICAgICAgICAgICAgICAgICAgKE9NWF9VMzIpcHJvZmlsZVBhcmFtLmVQcm9maWxlLCAoT01YX1UzMilwcm9maWxlUGFyYW0uZUxldmVsKTsKLQotICAgICAgICAgICAgZXJyID0gc2V0X3BhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQsICZwcm9maWxlUGFyYW0pOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInNldF9jb25maWc6IE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50IGZhaWxlZCAhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1FUSUluZGV4UGFyYW1FbmFibGVBVlRpbWVyVGltZXN0YW1wczoKLSAgICAgICAgewotICAgICAgICAgICAgUU9NWF9FTkFCTEVUWVBFIGF2VGltZXJFbmFibGVQYXJhbTsKLSAgICAgICAgICAgIG1lbWNweSgmYXZUaW1lckVuYWJsZVBhcmFtLCAmbV9zUGFyYW1BVlRpbWVyVGltZXN0YW1wTW9kZSwgc2l6ZW9mKFFPTVhfRU5BQkxFVFlQRSkpOwotICAgICAgICAgICAgdmFsdWVTZXQgfD0gdkV4dC5yZWFkUGFyYW1JbnQzMihleHQsICJlbmFibGUiLCAoT01YX1MzMiAqKSYoYXZUaW1lckVuYWJsZVBhcmFtLmJFbmFibGUpKTsKLSAgICAgICAgICAgIGlmICghdmFsdWVTZXQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiVkVORE9SLUVYVDogQVYtdGltZXIgdGltZXN0YW1wIG1vZGUgZW5hYmxlPSV1IiwgYXZUaW1lckVuYWJsZVBhcmFtLmJFbmFibGUpOwotCi0gICAgICAgICAgICBlcnIgPSBzZXRfcGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICBOVUxMLCAoT01YX0lOREVYVFlQRSlPTVhfUVRJSW5kZXhQYXJhbUVuYWJsZUFWVGltZXJUaW1lc3RhbXBzLCAmYXZUaW1lckVuYWJsZVBhcmFtKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXRfcGFyYW06IE9NWF9RVElJbmRleFBhcmFtRW5hYmxlQVZUaW1lclRpbWVzdGFtcHMgZmFpbGVkICEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vdEltcGxlbWVudGVkOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvc3JjL3ZpZGVvX2VuY29kZXJfZGV2aWNlX3Y0bDIuY3BwIGIvc2RtODQ1L21tLXZpZGVvLXY0bDIvdmlkYy92ZW5jL3NyYy92aWRlb19lbmNvZGVyX2RldmljZV92NGwyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y5ZGNlMC4uMDAwMDAwMAotLS0gYS9zZG04NDUvbW0tdmlkZW8tdjRsMi92aWRjL3ZlbmMvc3JjL3ZpZGVvX2VuY29kZXJfZGV2aWNlX3Y0bDIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzIxMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTAtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vcgotICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgICAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLU9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL2V2ZW50ZmQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgInZpZGVvX2VuY29kZXJfZGV2aWNlX3Y0bDIuaCIKLSNpbmNsdWRlICJvbXhfdmlkZW9fZW5jb2Rlci5oIgotI2luY2x1ZGUgPG1lZGlhL21zbV92aWRjLmg+Ci0jaWZkZWYgVVNFX0lPTgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLSNlbmRpZgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fbWVkaWFfaW5mby5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLQotI2lmZGVmIF9BTkRST0lEXwotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+Ci0jaW5jbHVkZSA8Z3JhbGxvY19wcml2Lmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHFkTWV0YURhdGEuaD4KLQotI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfVklERU8KLSNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi0jZGVmaW5lIFlVVl9TVEFUU19MSUJSQVJZX05BTUUgImxpYmdwdXN0YXRzLnNvIiAvLyBVQldDIGNhc2U6IHVzZSBHUFUgbGlicmFyeQotCi0jdW5kZWYgQUxJR04KLSNkZWZpbmUgQUxJR04oeCwgdG9fYWxpZ24pICgoKCh1bnNpZ25lZCBsb25nKSB4KSArICh0b19hbGlnbiAtIDEpKSAmIH4odG9fYWxpZ24gLSAxKSkKLSNkZWZpbmUgRVhUUkFEQVRBX0lEWChfX251bV9wbGFuZXMpICgoX19udW1fcGxhbmVzKSA/IChfX251bV9wbGFuZXMpIC0gMSA6IDApCi0jZGVmaW5lIE1BWERQQiAxNgotI2RlZmluZSBNSU4oeCx5KSAoKCh4KSA8ICh5KSkgPyAoeCkgOiAoeSkpCi0jZGVmaW5lIE1BWCh4LHkpICgoKHgpID4gKHkpKSA/ICh4KSA6ICh5KSkKLSNkZWZpbmUgUk9VTkQoX19zeiwgX19hbGlnbikgKCgoX19zeikgKyAoKF9fYWxpZ24+PjEpKSkgJiAofihfX2FsaWduLTEpKSkKLSNkZWZpbmUgTUFYX1BST0ZJTEVfUEFSQU1TIDYKLSNkZWZpbmUgSEVWQ19NQUlOX1NUQVJUIDAKLSNkZWZpbmUgSEVWQ19NQUlOMTBfU1RBUlQgKEhFVkNfTUFJTl9TVEFSVCArIDEzKQotI2RlZmluZSBQT0xMX1RJTUVPVVQgMTAwMAotI2RlZmluZSBNQVhfU1VQUE9SVEVEX1NMSUNFU19QRVJfRlJBTUUgMjggLyogTWF4IHN1cHBvcnRlZCBzbGljZXMgd2l0aCAzMiBvdXRwdXQgYnVmZmVycyAqLwotCi0jZGVmaW5lIFNaXzRLIDB4MTAwMAotI2RlZmluZSBTWl8xTSAweDEwMDAwMAotCi0KLSNkZWZpbmUgTG9nMihudW1iZXIsIHBvd2VyKSAgeyBPTVhfVTMyIHRlbXAgPSBudW1iZXI7IHBvd2VyID0gMDsgd2hpbGUoICgwID09ICh0ZW1wICYgMHgxKSkgJiYgIHBvd2VyIDwgMTYpIHsgdGVtcCA+Pj0weDE7IHBvd2VyKys7IH0gfQotI2RlZmluZSBRMTZUb0ZyYWN0aW9uKHEsbnVtLGRlbikgeyBPTVhfVTMyIHBvd2VyOyBMb2cyKHEscG93ZXIpOyAgbnVtID0gcSA+PiBwb3dlcjsgZGVuID0gMHgxIDw8ICgxNiAtIHBvd2VyKTsgfQotCi0jZGVmaW5lIEJVRkZFUl9MT0dfTE9DICIvZGF0YS9taXNjL21lZGlhIgotCi0jZGVmaW5lIE9NWF9WSURFT19MRVZFTF9VTktOT1dOIDAKLQotI2RlZmluZSBWRU5DX0JGUkFNRV9NQVhfQ09VTlQgICAgICAgMQotI2RlZmluZSBWRU5DX0JGUkFNRV9NQVhfRlBTICAgICAgICAgNjAKLSNkZWZpbmUgVkVOQ19CRlJBTUVfTUFYX0hFSUdIVCAgICAgIDE5MjAKLSNkZWZpbmUgVkVOQ19CRlJBTUVfTUFYX1dJRFRIICAgICAgIDEwODgKLQotLy9jb25zdHJ1Y3RvcgotdmVuY19kZXY6OnZlbmNfZGV2KGNsYXNzIG9teF92ZW5jICp2ZW5jX2NsYXNzKQotewotICAgIC8vbm90aGluZyB0byBkbwotICAgIGludCBpID0gMDsKLSAgICB2ZW5jX2hhbmRsZSA9IHZlbmNfY2xhc3M7Ci0gICAgZXRiID0gZWJkID0gZnRiID0gZmJkID0gMDsKLSAgICBtX3BvbGxfZWZkID0gLTE7Ci0KLSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9QT1JUOyBpKyspCi0gICAgICAgIHN0cmVhbWluZ1tpXSA9IGZhbHNlOwotCi0gICAgc3RvcHBlZCA9IDE7Ci0gICAgcGF1c2VkID0gZmFsc2U7Ci0gICAgYXN5bmNfdGhyZWFkX2NyZWF0ZWQgPSBmYWxzZTsKLSAgICBhc3luY190aHJlYWRfZm9yY2Vfc3RvcCA9IGZhbHNlOwotICAgIGNvbG9yX2Zvcm1hdCA9IDA7Ci0gICAgaHdfb3ZlcmxvYWQgPSBmYWxzZTsKLSAgICBtQmF0Y2hTaXplID0gMDsKLSAgICBkZWludGVybGFjZV9lbmFibGVkID0gZmFsc2U7Ci0gICAgbV9yb2lfZW5hYmxlZCA9IGZhbHNlOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9yb2lsb2NrLCBOVUxMKTsKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJnBhdXNlX3Jlc3VtZV9tbG9jaywgTlVMTCk7Ci0gICAgcHRocmVhZF9jb25kX2luaXQoJnBhdXNlX3Jlc3VtZV9jb25kLCBOVUxMKTsKLSAgICBtZW1zZXQoJmlucHV0X2V4dHJhZGF0YV9pbmZvLCAwLCBzaXplb2YoaW5wdXRfZXh0cmFkYXRhX2luZm8pKTsKLSAgICBtZW1zZXQoJm91dHB1dF9leHRyYWRhdGFfaW5mbywgMCwgc2l6ZW9mKG91dHB1dF9leHRyYWRhdGFfaW5mbykpOwotICAgIG1lbXNldCgmaWRycGVyaW9kLCAwLCBzaXplb2YoaWRycGVyaW9kKSk7Ci0gICAgbWVtc2V0KCZtdWx0aXNsaWNlLCAwLCBzaXplb2YobXVsdGlzbGljZSkpOwotICAgIG1lbXNldCAoJnNsaWNlX21vZGUsIDAgLCBzaXplb2Yoc2xpY2VfbW9kZSkpOwotICAgIG1lbXNldCgmbV9zVmVuY19jZmcsIDAsIHNpemVvZihtX3NWZW5jX2NmZykpOwotICAgIG1lbXNldCgmcmF0ZV9jdHJsLCAwLCBzaXplb2YocmF0ZV9jdHJsKSk7Ci0gICAgbWVtc2V0KCZiaXRyYXRlLCAwLCBzaXplb2YoYml0cmF0ZSkpOwotICAgIG1lbXNldCgmaW50cmFfcGVyaW9kLCAwLCBzaXplb2YoaW50cmFfcGVyaW9kKSk7Ci0gICAgbWVtc2V0KCZjb2RlY19wcm9maWxlLCAwLCBzaXplb2YoY29kZWNfcHJvZmlsZSkpOwotICAgIG1lbXNldCgmc2V0X3BhcmFtLCAwLCBzaXplb2Yoc2V0X3BhcmFtKSk7Ci0gICAgbWVtc2V0KCZ0aW1lX2luYywgMCwgc2l6ZW9mKHRpbWVfaW5jKSk7Ci0gICAgbWVtc2V0KCZtX3NJbnB1dF9idWZmX3Byb3BlcnR5LCAwLCBzaXplb2YobV9zSW5wdXRfYnVmZl9wcm9wZXJ0eSkpOwotICAgIG1lbXNldCgmbV9zT3V0cHV0X2J1ZmZfcHJvcGVydHksIDAsIHNpemVvZihtX3NPdXRwdXRfYnVmZl9wcm9wZXJ0eSkpOwotICAgIG1lbXNldCgmc2Vzc2lvbl9xcCwgMCwgc2l6ZW9mKHNlc3Npb25fcXApKTsKLSAgICBtZW1zZXQoJnNlc3Npb25faXBiX3FwX3ZhbHVlcywgMCwgc2l6ZW9mKHNlc3Npb25faXBiX3FwX3ZhbHVlcykpOwotICAgIG1lbXNldCgmZW50cm9weSwgMCwgc2l6ZW9mKGVudHJvcHkpKTsKLSAgICBtZW1zZXQoJmRia2ZpbHRlciwgMCwgc2l6ZW9mKGRia2ZpbHRlcikpOwotICAgIG1lbXNldCgmaW50cmFfcmVmcmVzaCwgMCwgc2l6ZW9mKGludHJhX3JlZnJlc2gpKTsKLSAgICBtZW1zZXQoJmhlYywgMCwgc2l6ZW9mKGhlYykpOwotICAgIG1lbXNldCgmdm9wdGltZWNmZywgMCwgc2l6ZW9mKHZvcHRpbWVjZmcpKTsKLSAgICBtZW1zZXQoJmNhcGFiaWxpdHksIDAsIHNpemVvZihjYXBhYmlsaXR5KSk7Ci0gICAgbWVtc2V0KCZtX2RlYnVnLDAsc2l6ZW9mKG1fZGVidWcpKTsKLSAgICBpc19zZWFyY2hyYW5nZV9zZXQgPSBmYWxzZTsKLSAgICBlbmFibGVfbXZfbmFycm93X3NlYXJjaHJhbmdlID0gZmFsc2U7Ci0gICAgc3VwcG9ydGVkX3JjX21vZGVzID0gUkNfQUxMOwotICAgIG1lbXNldCgmdnF6aXBfc2VpX2luZm8sIDAsIHNpemVvZih2cXppcF9zZWlfaW5mbykpOwotICAgIG1lbXNldCgmbHRyaW5mbywgMCwgc2l6ZW9mKGx0cmluZm8pKTsKLSAgICBtZW1zZXQoJmZkX2xpc3QsIDAsIHNpemVvZihmZF9saXN0KSk7Ci0gICAgc2Vzc19wcmlvcml0eS5wcmlvcml0eSA9IDE7Ci0gICAgb3BlcmF0aW5nX3JhdGUgPSAwOwotICAgIG1lbXNldCgmY29sb3Jfc3BhY2UsIDB4MCwgc2l6ZW9mKGNvbG9yX3NwYWNlKSk7Ci0gICAgbWVtc2V0KCZ0ZW1wb3JhbF9sYXllcnNfY29uZmlnLCAweDAsIHNpemVvZih0ZW1wb3JhbF9sYXllcnNfY29uZmlnKSk7Ci0KLSAgICBjaGFyIHByb3BlcnR5X3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF0gPSB7MH07Ci0gICAgcHJvcGVydHlfZ2V0KCJ2aWRjLmVuYy5sb2cuaW4iLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBtX2RlYnVnLmluX2J1ZmZlcl9sb2cgPSBhdG9pKHByb3BlcnR5X3ZhbHVlKTsKLQotICAgIHByb3BlcnR5X2dldCgidmlkYy5lbmMubG9nLm91dCIsIHByb3BlcnR5X3ZhbHVlLCAiMCIpOwotICAgIG1fZGVidWcub3V0X2J1ZmZlcl9sb2cgPSBhdG9pKHByb3BlcnR5X3ZhbHVlKTsKLQotICAgIHByb3BlcnR5X2dldCgidmlkYy5lbmMubG9nLmV4dHJhZGF0YSIsIHByb3BlcnR5X3ZhbHVlLCAiMCIpOwotICAgIG1fZGVidWcuZXh0cmFkYXRhX2xvZyA9IGF0b2kocHJvcGVydHlfdmFsdWUpOwotCi0jaWZkZWYgX1VCV0NfCi0gICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5ncmFsbG9jLmdmeF91YndjX2Rpc2FibGUiLCBwcm9wZXJ0eV92YWx1ZSwgIjAiKTsKLSAgICBpZighKHN0cm5jbXAocHJvcGVydHlfdmFsdWUsICIxIiwgUFJPUEVSVFlfVkFMVUVfTUFYKSkgfHwKLSAgICAgICAgIShzdHJuY21wKHByb3BlcnR5X3ZhbHVlLCAidHJ1ZSIsIFBST1BFUlRZX1ZBTFVFX01BWCkpKSB7Ci0gICAgICAgIGlzX2dyYWxsb2Nfc291cmNlX3Vid2MgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlzX2dyYWxsb2Nfc291cmNlX3Vid2MgPSAxOwotICAgIH0KLSNlbHNlCi0gICAgaXNfZ3JhbGxvY19zb3VyY2VfdWJ3YyA9IDA7Ci0jZW5kaWYKLQotICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC52aWRjLmVuYy5jc2MuZW5hYmxlIiwgcHJvcGVydHlfdmFsdWUsICIwIik7Ci0gICAgaWYoIShzdHJuY21wKHByb3BlcnR5X3ZhbHVlLCAiMSIsIFBST1BFUlRZX1ZBTFVFX01BWCkpIHx8Ci0gICAgICAgICAgICAhKHN0cm5jbXAocHJvcGVydHlfdmFsdWUsICJ0cnVlIiwgUFJPUEVSVFlfVkFMVUVfTUFYKSkpIHsKLSAgICAgICAgaXNfY3NjX2VuYWJsZWQgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlzX2NzY19lbmFibGVkID0gMDsKLSAgICB9Ci0KLSNpZmRlZiBfUFFfCi0gICAgcHJvcGVydHlfZ2V0KCJ2aWRjLmVuYy5kaXNhYmxlLnBxIiwgcHJvcGVydHlfdmFsdWUsICIwIik7Ci0gICAgaWYoIShzdHJuY21wKHByb3BlcnR5X3ZhbHVlLCAiMSIsIFBST1BFUlRZX1ZBTFVFX01BWCkpIHx8Ci0gICAgICAgICEoc3RybmNtcChwcm9wZXJ0eV92YWx1ZSwgInRydWUiLCBQUk9QRVJUWV9WQUxVRV9NQVgpKSkgewotICAgICAgICBtX3BxLmlzX3BxX2ZvcmNlX2Rpc2FibGUgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcHEuaXNfcHFfZm9yY2VfZGlzYWJsZSA9IDA7Ci0gICAgfQotI2VuZGlmIC8vIF9QUV8KLQotICAgIHNucHJpbnRmKG1fZGVidWcubG9nX2xvYywgUFJPUEVSVFlfVkFMVUVfTUFYLAotICAgICAgICAgICAgICIlcyIsIEJVRkZFUl9MT0dfTE9DKTsKLQotICAgIG1Vc2VBVlRpbWVyVGltZXN0YW1wcyA9IGZhbHNlOwotfQotCi12ZW5jX2Rldjo6fnZlbmNfZGV2KCkKLXsKLSAgICBpZiAobV9yb2lfZW5hYmxlZCkgewotICAgICAgICBzdGQ6Omxpc3Q8cm9pZGF0YT46Oml0ZXJhdG9yIGl0ZXI7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9yb2lsb2NrKTsKLSAgICAgICAgZm9yIChpdGVyID0gbV9yb2lsaXN0LmJlZ2luKCk7IGl0ZXIgIT0gbV9yb2lsaXN0LmVuZCgpOyBpdGVyKyspIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInJvaWRhdGEgd2l0aCB0aW1lc3RhbXAgKCVsbGQpIHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCBhbHJlYWR5IiwKLSAgICAgICAgICAgICAgICBpdGVyLT50aW1lc3RhbXApOwotICAgICAgICAgICAgZnJlZShpdGVyLT5pbmZvLnBSb2lNQkluZm8pOwotICAgICAgICB9Ci0gICAgICAgIG1fcm9pbGlzdC5jbGVhcigpOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9yb2lsb2NrKTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtX3JvaWxvY2spOwotfQotCi12b2lkKiB2ZW5jX2Rldjo6YXN5bmNfdmVuY19tZXNzYWdlX3RocmVhZCAodm9pZCAqaW5wdXQpCi17Ci0gICAgc3RydWN0IHZlbmNfbXNnIHZlbmNfbXNnOwotICAgIG9teF92aWRlbyogb214X3ZlbmNfYmFzZSA9IE5VTEw7Ci0gICAgb214X3ZlbmMgKm9teCA9IHJlaW50ZXJwcmV0X2Nhc3Q8b214X3ZlbmMqPihpbnB1dCk7Ci0gICAgb214X3ZlbmNfYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8b214X3ZpZGVvKj4oaW5wdXQpOwotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBvbXhoZHIgPSBOVUxMOwotCi0gICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJWaWRlb0VuY0NhbGxCYWNrVGhyZWFkIiwgMCwgMCwgMCk7Ci0gICAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVbVklERU9fTUFYX1BMQU5FU107Ci0gICAgc3RydWN0IHBvbGxmZCBwZmRzWzJdOwotICAgIHN0cnVjdCB2NGwyX2J1ZmZlciB2NGwyX2J1ZjsKLSAgICBzdHJ1Y3QgdjRsMl9ldmVudCBkcWV2ZW50OwotICAgIHN0cnVjdCBzdGF0aXN0aWNzIHN0YXRzOwotICAgIHBmZHNbMF0uZXZlbnRzID0gUE9MTElOIHwgUE9MTFJETk9STSB8IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTFJEQkFORCB8IFBPTExQUkk7Ci0gICAgcGZkc1sxXS5ldmVudHMgPSBQT0xMSU4gfCBQT0xMRVJSOwotICAgIHBmZHNbMF0uZmQgPSBvbXgtPmhhbmRsZS0+bV9uRHJpdmVyX2ZkOwotICAgIHBmZHNbMV0uZmQgPSBvbXgtPmhhbmRsZS0+bV9wb2xsX2VmZDsKLSAgICBpbnQgZXJyb3JfY29kZSA9IDAscmM9MDsKLQotICAgIG1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0aXN0aWNzKSk7Ci0gICAgbWVtc2V0KCZ2NGwyX2J1ZiwgMCwgc2l6ZW9mKHY0bDJfYnVmKSk7Ci0KLSAgICB3aGlsZSAoIW9teC0+aGFuZGxlLT5hc3luY190aHJlYWRfZm9yY2Vfc3RvcCkgewotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm9teC0+aGFuZGxlLT5wYXVzZV9yZXN1bWVfbWxvY2spOwotCi0gICAgICAgIGlmIChvbXgtPmhhbmRsZS0+cGF1c2VkKSB7Ci0gICAgICAgICAgICB2ZW5jX21zZy5tc2djb2RlID0gVkVOX01TR19QQVVTRTsKLSAgICAgICAgICAgIHZlbmNfbXNnLnN0YXR1c2NvZGUgPSBWRU5fU19TVUNDRVNTOwotCi0gICAgICAgICAgICBpZiAob214LT5hc3luY19tZXNzYWdlX3Byb2Nlc3MoaW5wdXQsICZ2ZW5jX21zZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBGYWlsZWQgdG8gcHJvY2VzcyBwYXVzZSBtc2ciKTsKLSAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmb214LT5oYW5kbGUtPnBhdXNlX3Jlc3VtZV9tbG9jayk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEJsb2NrIGhlcmUgdW50aWwgdGhlIElMIGNsaWVudCByZXN1bWVzIHVzIGFnYWluICovCi0gICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmb214LT5oYW5kbGUtPnBhdXNlX3Jlc3VtZV9jb25kLAotICAgICAgICAgICAgICAgICAgICAmb214LT5oYW5kbGUtPnBhdXNlX3Jlc3VtZV9tbG9jayk7Ci0KLSAgICAgICAgICAgIHZlbmNfbXNnLm1zZ2NvZGUgPSBWRU5fTVNHX1JFU1VNRTsKLSAgICAgICAgICAgIHZlbmNfbXNnLnN0YXR1c2NvZGUgPSBWRU5fU19TVUNDRVNTOwotCi0gICAgICAgICAgICBpZiAob214LT5hc3luY19tZXNzYWdlX3Byb2Nlc3MoaW5wdXQsICZ2ZW5jX21zZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBGYWlsZWQgdG8gcHJvY2VzcyByZXN1bWUgbXNnIik7Ci0gICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm9teC0+aGFuZGxlLT5wYXVzZV9yZXN1bWVfbWxvY2spOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRpc3RpY3MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZvbXgtPmhhbmRsZS0+cGF1c2VfcmVzdW1lX21sb2NrKTsKLQotICAgICAgICByYyA9IHBvbGwocGZkcywgMiwgUE9MTF9USU1FT1VUKTsKLQotICAgICAgICBpZiAoIXJjKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJQb2xsIHRpbWVkb3V0LCBwaXBlbGluZSBzdGFsbGVkIGR1ZSB0byBjbGllbnQvZmlybXdhcmUgRVRCOiAlZCwgRUJEOiAlZCwgRlRCOiAlZCwgRkJEOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG9teC0+aGFuZGxlLT5ldGIsIG9teC0+aGFuZGxlLT5lYmQsIG9teC0+aGFuZGxlLT5mdGIsIG9teC0+aGFuZGxlLT5mYmQpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocmMgPCAwICYmIGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVycm9yIHdoaWxlIHBvbGxpbmc6ICVkLCBlcnJubyA9ICVkIiwgcmMsIGVycm5vKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChwZmRzWzFdLnJldmVudHMgJiBQT0xMSU4pIHx8IChwZmRzWzFdLnJldmVudHMgJiBQT0xMRVJSKSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImFzeW5jX3ZlbmNfbWVzc2FnZV90aHJlYWQgaW50ZXJydXB0ZWQgdG8gYmUgZXhpdGVkIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocGZkc1swXS5yZXZlbnRzICYgUE9MTElOKSB8fCAocGZkc1swXS5yZXZlbnRzICYgUE9MTFJETk9STSkpIHsKLSAgICAgICAgICAgIHY0bDJfYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgICAgICAgICAgdjRsMl9idWYubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICAgICAgICAgIHY0bDJfYnVmLmxlbmd0aCA9IG9teC0+aGFuZGxlLT5udW1fb3V0cHV0X3BsYW5lczsKLSAgICAgICAgICAgIHY0bDJfYnVmLm0ucGxhbmVzID0gcGxhbmU7Ci0KLSAgICAgICAgICAgIHdoaWxlICghaW9jdGwocGZkc1swXS5mZCwgVklESU9DX0RRQlVGLCAmdjRsMl9idWYpKSB7Ci0gICAgICAgICAgICAgICAgdmVuY19tc2cubXNnY29kZT1WRU5fTVNHX09VVFBVVF9CVUZGRVJfRE9ORTsKLSAgICAgICAgICAgICAgICB2ZW5jX21zZy5zdGF0dXNjb2RlPVZFTl9TX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgb214aGRyPW9teF92ZW5jX2Jhc2UtPm1fb3V0X21lbV9wdHIrdjRsMl9idWYuaW5kZXg7Ci0gICAgICAgICAgICAgICAgdmVuY19tc2cuYnVmLmxlbj0gdjRsMl9idWYubS5wbGFuZXMtPmJ5dGVzdXNlZDsKLSAgICAgICAgICAgICAgICB2ZW5jX21zZy5idWYub2Zmc2V0ID0gdjRsMl9idWYubS5wbGFuZXMtPmRhdGFfb2Zmc2V0OwotICAgICAgICAgICAgICAgIHZlbmNfbXNnLmJ1Zi5mbGFncyA9IDA7Ci0gICAgICAgICAgICAgICAgdmVuY19tc2cuYnVmLnB0cmJ1ZmZlciA9IChPTVhfVTggKilvbXhfdmVuY19iYXNlLT5tX3BPdXRwdXRfcG1lbVt2NGwyX2J1Zi5pbmRleF0uYnVmZmVyOwotICAgICAgICAgICAgICAgIHZlbmNfbXNnLmJ1Zi5jbGllbnRkYXRhPSh2b2lkKilvbXhoZHI7Ci0gICAgICAgICAgICAgICAgdmVuY19tc2cuYnVmLnRpbWVzdGFtcCA9ICh1aW50NjRfdCkgdjRsMl9idWYudGltZXN0YW1wLnR2X3NlYyAqICh1aW50NjRfdCkgMTAwMDAwMCArICh1aW50NjRfdCkgdjRsMl9idWYudGltZXN0YW1wLnR2X3VzZWM7Ci0KLSAgICAgICAgICAgICAgICAvKiBUT0RPOiBpZGVhbGx5IHJlcG9ydCBvdGhlciB0eXBlcyBvZiBmcmFtZXMgYXMgd2VsbAotICAgICAgICAgICAgICAgICAqIGZvciBub3cgaXQgZG9lc24ndCBsb29rIGxpa2UgSUwgY2xpZW50IGNhcmVzIGFib3V0Ci0gICAgICAgICAgICAgICAgICogb3RoZXIgdHlwZXMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAodjRsMl9idWYuZmxhZ3MgJiBWNEwyX1FDT01fQlVGX0ZMQUdfSURSRlJBTUUpCi0gICAgICAgICAgICAgICAgICAgIHZlbmNfbXNnLmJ1Zi5mbGFncyB8PSBRT01YX1ZJREVPX1BpY3R1cmVUeXBlSURSOwotCi0gICAgICAgICAgICAgICAgaWYgKHY0bDJfYnVmLmZsYWdzICYgVjRMMl9CVUZfRkxBR19LRVlGUkFNRSkKLSAgICAgICAgICAgICAgICAgICAgdmVuY19tc2cuYnVmLmZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRTsKLQotICAgICAgICAgICAgICAgIGlmICh2NGwyX2J1Zi5mbGFncyAmIFY0TDJfQlVGX0ZMQUdfUEZSQU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlbmNfbXNnLmJ1Zi5mbGFncyB8PSBPTVhfVklERU9fUGljdHVyZVR5cGVQOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodjRsMl9idWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0JGUkFNRSkgewotICAgICAgICAgICAgICAgICAgICB2ZW5jX21zZy5idWYuZmxhZ3MgfD0gT01YX1ZJREVPX1BpY3R1cmVUeXBlQjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodjRsMl9idWYuZmxhZ3MgJiBWNEwyX1FDT01fQlVGX0ZMQUdfQ09ERUNDT05GSUcpCi0gICAgICAgICAgICAgICAgICAgIHZlbmNfbXNnLmJ1Zi5mbGFncyB8PSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRzsKLQotICAgICAgICAgICAgICAgIGlmICh2NGwyX2J1Zi5mbGFncyAmIFY0TDJfUUNPTV9CVUZfRkxBR19FT1MpCi0gICAgICAgICAgICAgICAgICAgIHZlbmNfbXNnLmJ1Zi5mbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7Ci0KLSAgICAgICAgICAgICAgICBpZiAob214LT5oYW5kbGUtPm51bV9vdXRwdXRfcGxhbmVzID4gMSAmJiB2NGwyX2J1Zi5tLnBsYW5lcy0+Ynl0ZXN1c2VkKQotICAgICAgICAgICAgICAgICAgICB2ZW5jX21zZy5idWYuZmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRVhUUkFEQVRBOwotCi0gICAgICAgICAgICAgICAgaWYgKG9teGhkci0+bkZpbGxlZExlbikKLSAgICAgICAgICAgICAgICAgICAgdmVuY19tc2cuYnVmLmZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUU7Ci0KLSAgICAgICAgICAgICAgICBvbXgtPmhhbmRsZS0+ZmJkKys7Ci0gICAgICAgICAgICAgICAgc3RhdHMuYnl0ZXNfZ2VuZXJhdGVkICs9IHZlbmNfbXNnLmJ1Zi5sZW47Ci0KLSAgICAgICAgICAgICAgICBpZiAob214LT5hc3luY19tZXNzYWdlX3Byb2Nlc3MoaW5wdXQsJnZlbmNfbXNnKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBXcm9uZyBpb2N0bCBtZXNzYWdlIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocGZkc1swXS5yZXZlbnRzICYgUE9MTE9VVCkgfHwgKHBmZHNbMF0ucmV2ZW50cyAmIFBPTExXUk5PUk0pKSB7Ci0gICAgICAgICAgICB2NGwyX2J1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICAgICAgdjRsMl9idWYubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICAgICAgICAgIHY0bDJfYnVmLm0ucGxhbmVzID0gcGxhbmU7Ci0gICAgICAgICAgICB2NGwyX2J1Zi5sZW5ndGggPSBvbXgtPmhhbmRsZS0+bnVtX2lucHV0X3BsYW5lczsKLQotICAgICAgICAgICAgd2hpbGUgKCFpb2N0bChwZmRzWzBdLmZkLCBWSURJT0NfRFFCVUYsICZ2NGwyX2J1ZikpIHsKLSAgICAgICAgICAgICAgICB2ZW5jX21zZy5tc2djb2RlPVZFTl9NU0dfSU5QVVRfQlVGRkVSX0RPTkU7Ci0gICAgICAgICAgICAgICAgdmVuY19tc2cuc3RhdHVzY29kZT1WRU5fU19TVUNDRVNTOwotICAgICAgICAgICAgICAgIG9teC0+aGFuZGxlLT5lYmQrKzsKLQotICAgICAgICAgICAgICAgIGlmIChvbXgtPmhhbmRsZS0+bUJhdGNoU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgYnVmSW5kZXggPSBvbXgtPmhhbmRsZS0+bUJhdGNoSW5mby5yZXRyaWV2ZUJ1ZmZlckF0KHY0bDJfYnVmLmluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZkluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlJldHJpZXZlZCBpbnZhbGlkIGJ1ZmZlciAlZCIsIHY0bDJfYnVmLmluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvbXgtPmhhbmRsZS0+bUJhdGNoSW5mby5pc1BlbmRpbmcoYnVmSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIiBFQkQgZm9yICVkIFt2NGwyLWlkPSVkXS4uIGJhdGNoIHN0aWxsIHBlbmRpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZJbmRleCwgdjRsMl9idWYuaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9kbyBub3QgcmV0dXJuIHRvIGNsaWVudCB5ZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHY0bDJfYnVmLmluZGV4ID0gYnVmSW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvbXhfdmVuY19iYXNlLT5tVXNlUHJveHlDb2xvckZvcm1hdCAmJiAhb214X3ZlbmNfYmFzZS0+bVVzZXNDb2xvckNvbnZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgIG9teGhkciA9ICZvbXhfdmVuY19iYXNlLT5tZXRhX2J1ZmZlcl9oZHJbdjRsMl9idWYuaW5kZXhdOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgb214aGRyID0gJm9teF92ZW5jX2Jhc2UtPm1faW5wX21lbV9wdHJbdjRsMl9idWYuaW5kZXhdOwotCi0gICAgICAgICAgICAgICAgdmVuY19tc2cuYnVmLmNsaWVudGRhdGE9KHZvaWQqKW9teGhkcjsKLQotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2VuZGluZyBFQkQgJXAgW2lkPSVkXSIsIG9teGhkciwgdjRsMl9idWYuaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChvbXgtPmFzeW5jX21lc3NhZ2VfcHJvY2VzcyhpbnB1dCwmdmVuY19tc2cpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFdyb25nIGlvY3RsIG1lc3NhZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBmZHNbMF0ucmV2ZW50cyAmIFBPTExQUkkpIHsKLSAgICAgICAgICAgIHJjID0gaW9jdGwocGZkc1swXS5mZCwgVklESU9DX0RRRVZFTlQsICZkcWV2ZW50KTsKLQotICAgICAgICAgICAgaWYgKGRxZXZlbnQudHlwZSA9PSBWNEwyX0VWRU5UX01TTV9WSURDX0ZMVVNIX0RPTkUpIHsKLSAgICAgICAgICAgICAgICB2ZW5jX21zZy5tc2djb2RlID0gVkVOX01TR19GTFVTSF9JTlBVVF9ET05FOwotICAgICAgICAgICAgICAgIHZlbmNfbXNnLnN0YXR1c2NvZGUgPSBWRU5fU19TVUNDRVNTOwotCi0gICAgICAgICAgICAgICAgaWYgKG9teC0+YXN5bmNfbWVzc2FnZV9wcm9jZXNzKGlucHV0LCZ2ZW5jX21zZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogV3JvbmcgaW9jdGwgbWVzc2FnZSIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2ZW5jX21zZy5tc2djb2RlID0gVkVOX01TR19GTFVTSF9PVVBVVF9ET05FOwotICAgICAgICAgICAgICAgIHZlbmNfbXNnLnN0YXR1c2NvZGUgPSBWRU5fU19TVUNDRVNTOwotCi0gICAgICAgICAgICAgICAgaWYgKG9teC0+YXN5bmNfbWVzc2FnZV9wcm9jZXNzKGlucHV0LCZ2ZW5jX21zZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogV3JvbmcgaW9jdGwgbWVzc2FnZSIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRxZXZlbnQudHlwZSA9PSBWNEwyX0VWRU5UX01TTV9WSURDX0hXX09WRVJMT0FEKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkhXIE92ZXJsb2FkIHJlY2VpdmVkIik7Ci0gICAgICAgICAgICAgICAgdmVuY19tc2cuc3RhdHVzY29kZSA9IFZFTl9TX0VGQUlMOwotICAgICAgICAgICAgICAgIHZlbmNfbXNnLm1zZ2NvZGUgPSBWRU5fTVNHX0hXX09WRVJMT0FEOwotCi0gICAgICAgICAgICAgICAgaWYgKG9teC0+YXN5bmNfbWVzc2FnZV9wcm9jZXNzKGlucHV0LCZ2ZW5jX21zZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogV3JvbmcgaW9jdGwgbWVzc2FnZSIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRxZXZlbnQudHlwZSA9PSBWNEwyX0VWRU5UX01TTV9WSURDX1NZU19FUlJPUil7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBFbmNvZGVyIGlzIGluIGJhZCBzdGF0ZSIpOwotICAgICAgICAgICAgICAgIHZlbmNfbXNnLm1zZ2NvZGUgPSBWRU5fTVNHX0lORElDQVRJT047Ci0gICAgICAgICAgICAgICAgdmVuY19tc2cuc3RhdHVzY29kZT1WRU5fU19FRkFJTDsKLQotICAgICAgICAgICAgICAgIGlmIChvbXgtPmFzeW5jX21lc3NhZ2VfcHJvY2VzcyhpbnB1dCwmdmVuY19tc2cpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFdyb25nIGlvY3RsIG1lc3NhZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogY2FsYyBhdmcuIGZwcywgYml0cmF0ZSAqLwotICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICAgICAgZ2V0dGltZW9mZGF5KCZ0dixOVUxMKTsKLSAgICAgICAgT01YX1U2NCB0aW1lX2RpZmYgPSAoT01YX1UzMikoKHR2LnR2X3NlYyAqIDEwMDAwMDAgKyB0di50dl91c2VjKSAtCi0gICAgICAgICAgICAgICAgKHN0YXRzLnByZXZfdHYudHZfc2VjICogMTAwMDAwMCArIHN0YXRzLnByZXZfdHYudHZfdXNlYykpOwotICAgICAgICBpZiAodGltZV9kaWZmID49IDUwMDAwMDApIHsKLSAgICAgICAgICAgIGlmIChzdGF0cy5wcmV2X3R2LnR2X3NlYykgewotICAgICAgICAgICAgICAgIE9NWF9VMzIgbnVtX2ZiZCA9IG9teC0+aGFuZGxlLT5mYmQgLSBzdGF0cy5wcmV2X2ZiZDsKLSAgICAgICAgICAgICAgICBmbG9hdCBmcmFtZXJhdGUgPSBudW1fZmJkICogMTAwMDAwMC8oZmxvYXQpdGltZV9kaWZmOwotICAgICAgICAgICAgICAgIE9NWF9VMzIgYml0cmF0ZSA9IChzdGF0cy5ieXRlc19nZW5lcmF0ZWQgKiA4L251bV9mYmQpICogZnJhbWVyYXRlOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goInN0YXRzOiBhdmcuIGZwcyAlMC4yZiwgYml0cmF0ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lcmF0ZSwgYml0cmF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0cy5wcmV2X3R2ID0gdHY7Ci0gICAgICAgICAgICBzdGF0cy5ieXRlc19nZW5lcmF0ZWQgPSAwOwotICAgICAgICAgICAgc3RhdHMucHJldl9mYmQgPSBvbXgtPmhhbmRsZS0+ZmJkOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJvbXhfdmVuYzogQXN5bmMgVGhyZWFkIGV4aXQiKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGludCBldmVudF90eXBlW10gPSB7Ci0gICAgVjRMMl9FVkVOVF9NU01fVklEQ19GTFVTSF9ET05FLAotICAgIFY0TDJfRVZFTlRfTVNNX1ZJRENfU1lTX0VSUk9SCi19OwotCi1zdGF0aWMgT01YX0VSUk9SVFlQRSBzdWJzY3JpYmVfdG9fZXZlbnRzKGludCBmZCkKLXsKLSAgICBPTVhfRVJST1JUWVBFIGVSZXQgPSBPTVhfRXJyb3JOb25lOwotICAgIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiBzdWI7Ci0gICAgaW50IGFycmF5X3N6ID0gc2l6ZW9mKGV2ZW50X3R5cGUpL3NpemVvZihpbnQpOwotICAgIGludCBpLHJjOwotICAgIG1lbXNldCgmc3ViLCAwLCBzaXplb2Yoc3ViKSk7Ci0KLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgaW5wdXQ6ICVkIiwgZmQpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBhcnJheV9zejsgKytpKSB7Ci0gICAgICAgIG1lbXNldCgmc3ViLCAwLCBzaXplb2Yoc3ViKSk7Ci0gICAgICAgIHN1Yi50eXBlID0gZXZlbnRfdHlwZVtpXTsKLSAgICAgICAgcmMgPSBpb2N0bChmZCwgVklESU9DX1NVQlNDUklCRV9FVkVOVCwgJnN1Yik7Ci0KLSAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc3Vic2NyaWJlIGV2ZW50OiAweCV4Iiwgc3ViLnR5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaSA8IGFycmF5X3N6KSB7Ci0gICAgICAgIGZvciAoLS1pOyBpID49MCA7IGktLSkgewotICAgICAgICAgICAgbWVtc2V0KCZzdWIsIDAsIHNpemVvZihzdWIpKTsKLSAgICAgICAgICAgIHN1Yi50eXBlID0gZXZlbnRfdHlwZVtpXTsKLSAgICAgICAgICAgIHJjID0gaW9jdGwoZmQsIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVCwgJnN1Yik7Ci0KLSAgICAgICAgICAgIGlmIChyYykKLSAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gdW5zdWJzY3JpYmUgZXZlbnQ6IDB4JXgiLCBzdWIudHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBlUmV0ID0gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLWJvb2wgaW5saW5lIHZlbmNfZGV2Ojp2ZW5jX3F1ZXJ5X2NhcChzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgJmNhcCkgewotCi0gICAgaWYgKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1FVRVJZQ1RSTCwgJmNhcCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlF1ZXJ5IGNhcHMgZm9yIGlkID0gJXUgZmFpbGVkXG4iLCBjYXAuaWQpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIGlubGluZSB2ZW5jX2Rldjo6dmVuY192YWxpZGF0ZV9yYW5nZShPTVhfUzMyIGlkLCBPTVhfUzMyIHZhbCkgewotCi0gICAgc3RydWN0IHY0bDJfcXVlcnljdHJsIGNhcDsKLSAgICBtZW1zZXQoJmNhcCwgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCkpOwotCi0gICAgY2FwLmlkID0gaWQ7Ci0gICAgaWYgKHZlbmNfcXVlcnlfY2FwKGNhcCkpIHsKLSAgICAgICAgaWYgKHZhbCA+PSBjYXAubWluaW11bSAmJiB2YWwgPD0gY2FwLm1heGltdW0pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImlkID0gJXUsIHZhbHVlID0gJXUsIG1pbiA9ICV1LCBtYXggPSAldVxuIiwKLSAgICAgICAgICAgICAgICBjYXAuaWQsIHZhbCwgY2FwLm1pbmltdW0sIGNhcC5tYXhpbXVtKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgdmVuY19kZXY6OmdldF9yb2lfZm9yX3RpbWVzdGFtcChzdHJ1Y3Qgcm9pZGF0YSAmcm9pLCBPTVhfVElDS1MgdGltZXN0YW1wKQotewotICAgIHN0ZDo6bGlzdDxyb2lkYXRhPjo6aXRlcmF0b3IgaXRlcjsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0KLSAgICBtZW1zZXQoJnJvaSwgMCwgc2l6ZW9mKHN0cnVjdCByb2lkYXRhKSk7Ci0gICAgcm9pLmRpcnR5ID0gZmFsc2U7Ci0KLSAgICAvKgotICAgICAqIGxvb2sgZm9yIHRoZSByb2kgZGF0YSB3aGljaCBoYXMgdGltZXN0YW1wIG5lYXJlc3QgYW5kCi0gICAgICogbG93ZXIgdGhhbiB0aGUgZXRiIHRpbWVzdGFtcCwgd2Ugc2hvdWxkIG5vdCB0YWtlIHRoZQotICAgICAqIHJvaSBkYXRhIHdoaWNoIGhhcyB0aGUgdGltZXN0YW1wIGdyZWF0ZXIgdGhhbiBldGIgdGltZXN0YW1wLgotICAgICAqLwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9yb2lsb2NrKTsKLSAgICBpdGVyID0gbV9yb2lsaXN0LmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ZXIgIT0gbV9yb2lsaXN0LmVuZCgpKSB7Ci0gICAgICAgIGlmIChpdGVyLT50aW1lc3RhbXAgPD0gdGltZXN0YW1wKSB7Ci0gICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICAvKiB3ZSBmb3VuZCByb2lkYXRhIGluIHByZXZpb3VzIGl0ZXJhdGlvbiBhbHJlYWR5IGFuZCBnb3QgYW5vdGhlcgotICAgICAgICAgICAgICAgICAqIHJvaWRhdGEgaW4gdGhpcyBpdGVyYXRpb24sIHNvIHdlIHdpbGwgdXNlIHRoaXMgaXRlcmF0aW9uJ3MKLSAgICAgICAgICAgICAgICAgKiByb2lkYXRhIGFuZCBmcmVlIHRoZSBwcmV2aW91cyByb2lkYXRhIHdoaWNoIGlzIG5vIGxvbmdlciB1c2VkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZnJlZWluZyB1bnVzZWQgcm9pZGF0YSB3aXRoIHRpbWVzdGFtcCAlbGxkIHVzIiwgcm9pLnRpbWVzdGFtcCk7Ci0gICAgICAgICAgICAgICAgZnJlZShyb2kuaW5mby5wUm9pTUJJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIHJvaSA9ICppdGVyOwotICAgICAgICAgICAgLyogd2UgZ290IHJvaWRhdGEgc28gZXJhc2UgdGhlIGVsbWVudCBpbiB0aGUgcm9pIGxpc3QuCi0gICAgICAgICAgICAgKiBhZnRlciBsaXN0IGVyYXNlIGl0ZXJhdG9yIHdpbGwgcG9pbnQgdG8gbmV4dCBlbGVtZW50Ci0gICAgICAgICAgICAgKiBzbyB3ZSBkb24ndCBuZWVkIHRvIGluY3JlbWVudCBpdGVyIGFmdGVyIGVyYXNlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpdGVyID0gbV9yb2lsaXN0LmVyYXNlKGl0ZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaXRlcisrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChmb3VuZCkgewotICAgICAgICBERUJVR19QUklOVF9MT1coImZvdW5kIHJvaWRhdGEgd2l0aCB0aW1lc3RhbXAgJWxsZCB1cyIsIHJvaS50aW1lc3RhbXApOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9yb2lsb2NrKTsKLX0KLQotaW50IHZlbmNfZGV2OjphcHBlbmRfbWJpX2V4dHJhZGF0YSh2b2lkICpkc3QsIHN0cnVjdCBtc21fdmlkY19leHRyYWRhdGFfaGVhZGVyKiBzcmMpCi17Ci0gICAgT01YX1FDT01fRVhUUkFEQVRBX01CSU5GTyAqbWJpID0gKE9NWF9RQ09NX0VYVFJBREFUQV9NQklORk8gKilkc3Q7Ci0KLSAgICBpZiAoIWRzdCB8fCAhc3JjKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIFRPRE86IE9uY2UgVmVudXMgM1hYIHRhcmdldCBuYW1lcyBhcmUga25vd24sIG5Gb3JtYXQgc2hvdWxkIDIgZm9yIHRob3NlCi0gICAgICogdGFyZ2V0cywgc2luY2UgdGhlIHBheWxvYWQgZm9ybWF0IHdpbGwgYmUgZGlmZmVyZW50ICovCi0gICAgbWJpLT5uRm9ybWF0ID0gMjsKLSAgICBtYmktPm5EYXRhU2l6ZSA9IHNyYy0+ZGF0YV9zaXplOwotICAgIG1lbWNweSgmbWJpLT5kYXRhLCAmc3JjLT5kYXRhLCBzcmMtPmRhdGFfc2l6ZSk7Ci0KLSAgICByZXR1cm4gbWJpLT5uRGF0YVNpemUgKyBzaXplb2YoKm1iaSk7Ci19Ci0KLWlubGluZSBpbnQgZ2V0X3l1dl9zaXplKHVuc2lnbmVkIGxvbmcgZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICB1bnNpZ25lZCBpbnQgeV9zdHJpZGUsIHV2X3N0cmlkZSwgeV9zY2xpbmVzLAotICAgICAgICAgICAgICAgIHV2X3NjbGluZXMsIHlfcGxhbmUsIHV2X3BsYW5lOwotICAgIHVuc2lnbmVkIGludCB5X3Vid2NfcGxhbmUgPSAwLCB1dl91YndjX3BsYW5lID0gMDsKLSAgICB1bnNpZ25lZCBzaXplID0gMDsKLQotICAgIHlfc3RyaWRlID0gVkVOVVNfWV9TVFJJREUoZm10LCB3aWR0aCk7Ci0gICAgdXZfc3RyaWRlID0gVkVOVVNfVVZfU1RSSURFKGZtdCwgd2lkdGgpOwotICAgIHlfc2NsaW5lcyA9IFZFTlVTX1lfU0NBTkxJTkVTKGZtdCwgaGVpZ2h0KTsKLSAgICB1dl9zY2xpbmVzID0gVkVOVVNfVVZfU0NBTkxJTkVTKGZtdCwgaGVpZ2h0KTsKLQotICAgIHN3aXRjaCAoZm10KSB7Ci0gICAgICAgIGNhc2UgQ09MT1JfRk1UX05WMTI6Ci0gICAgICAgICAgICB5X3BsYW5lID0geV9zdHJpZGUgKiB5X3NjbGluZXM7Ci0gICAgICAgICAgICB1dl9wbGFuZSA9IHV2X3N0cmlkZSAqIHV2X3NjbGluZXM7Ci0gICAgICAgICAgICBzaXplID0gTVNNX01FRElBX0FMSUdOKHlfcGxhbmUgKyB1dl9wbGFuZSwgNDA5Nik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OmhhbmRsZV9pbnB1dF9leHRyYWRhdGEoc3RydWN0IHY0bDJfYnVmZmVyIGJ1ZikKLXsKLSAgICBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqcF9leHRyYSA9IE5VTEw7Ci0gICAgdW5zaWduZWQgaW50IGNvbnN1bWVkX2xlbiA9IDAsIGZpbGxlZF9sZW4gPSAwOwotICAgIHVuc2lnbmVkIGludCB5dXZfc2l6ZSA9IDAsIGluZGV4ID0gMDsKLSAgICBpbnQgZW5hYmxlID0gMCwgaSA9IDAsIHNpemUgPSAwOwotICAgIHVuc2lnbmVkIGNoYXIgKnBWaXJ0ID0gTlVMTDsKLSAgICBpbnQgaGVpZ2h0ID0gbV9zVmVuY19jZmcuaW5wdXRfaGVpZ2h0OwotICAgIGludCB3aWR0aCA9IG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoOwotICAgIE9NWF9USUNLUyBuVGltZVN0YW1wID0gYnVmLnRpbWVzdGFtcC50dl9zZWMgKiAxMDAwMDAwICsgYnVmLnRpbWVzdGFtcC50dl91c2VjOwotICAgIGludCBmZCA9IGJ1Zi5tLnBsYW5lc1swXS5yZXNlcnZlZFswXTsKLSAgICBib29sIHZxemlwX3NlaV9mb3VuZCA9IGZhbHNlOwotCi0gICAgaWYgKCFFWFRSQURBVEFfSURYKG51bV9pbnB1dF9wbGFuZXMpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiSW5wdXQgZXh0cmFkYXRhIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmICghaW5wdXRfZXh0cmFkYXRhX2luZm8udWFkZHIpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkV4dHJhZGF0YSBidWZmZXJzIG5vdCBhbGxvY2F0ZWRcbiIpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJQcm9jZXNzaW5nIEV4dHJhZGF0YSBmb3IgQnVmZmVyID0gJWxsZCIsIG5UaW1lU3RhbXApOyAvLyBVc2VmdWwgZm9yIGRlYnVnZ2luZwotCi0gICAgaWYgKG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0ID09IFY0TDJfUElYX0ZNVF9OVjEyIHx8IG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0ID09IFY0TDJfUElYX0ZNVF9OVjIxKSB7Ci0gICAgICAgIHNpemUgPSBWRU5VU19CVUZGRVJfU0laRShDT0xPUl9GTVRfTlYxMiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIHl1dl9zaXplID0gZ2V0X3l1dl9zaXplKENPTE9SX0ZNVF9OVjEyLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgcFZpcnQgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsTUFQX1NIQVJFRCwgZmQsIDApOwotICAgICAgICBpZiAocFZpcnQgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzIEZhaWxlZCB0byBtbWFwIixfX2Z1bmNfXyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcF9leHRyYSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKSAoKHVuc2lnbmVkIGxvbmcpKHBWaXJ0ICsgeXV2X3NpemUgKyAzKSYofjMpKTsKLSAgICB9Ci0KLSAgICBpbmRleCA9IHZlbmNfZ2V0X2luZGV4X2Zyb21fZmQoaW5wdXRfZXh0cmFkYXRhX2luZm8ubV9pb25fZGV2LGZkKTsKLSAgICBjaGFyICpwX2V4dHJhZGF0YSA9IGlucHV0X2V4dHJhZGF0YV9pbmZvLnVhZGRyICsgaW5kZXggKiBpbnB1dF9leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZTsKLSAgICBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqZGF0YSA9IChzdHJ1Y3QgT01YX09USEVSX0VYVFJBREFUQVRZUEUgKilwX2V4dHJhZGF0YTsKLSAgICBtZW1zZXQoKHZvaWQgKikoZGF0YSksIDAsIChpbnB1dF9leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZSkpOyAvLyBjbGVhciBzdGFsZSBkYXRhIGluIGN1cnJlbnQgYnVmZmVyCi0KLSAgICB3aGlsZSAocF9leHRyYSAmJiAoY29uc3VtZWRfbGVuICsgc2l6ZW9mKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFKSkgPD0gKHNpemUgLSB5dXZfc2l6ZSkKLSAgICAgICAgJiYgKGNvbnN1bWVkX2xlbiArIHBfZXh0cmEtPm5TaXplKSA8PSAoc2l6ZSAtIHl1dl9zaXplKQotICAgICAgICAmJiAoZmlsbGVkX2xlbiArIHNpemVvZihPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSkgPD0gaW5wdXRfZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemUpCi0gICAgICAgICYmIChmaWxsZWRfbGVuICsgcF9leHRyYS0+blNpemUgPD0gaW5wdXRfZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemUpCi0gICAgICAgICYmIChwX2V4dHJhLT5lVHlwZSAhPSAoT01YX0VYVFJBREFUQVRZUEUpTVNNX1ZJRENfRVhUUkFEQVRBX05PTkUpKSB7Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJFeHRyYWRhdGEgVHlwZSA9IDB4JXgiLCAoT01YX1FDT01fRVhUUkFEQVRBVFlQRSlwX2V4dHJhLT5lVHlwZSk7Ci0gICAgICAgIHN3aXRjaCAoKE9NWF9RQ09NX0VYVFJBREFUQVRZUEUpcF9leHRyYS0+ZVR5cGUpIHsKLSAgICAgICAgY2FzZSBPTVhfRXh0cmFEYXRhRnJhbWVEaW1lbnNpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cnVjdCBtc21fdmlkY19leHRyYWRhdGFfaW5kZXggKnBheWxvYWQ7Ci0gICAgICAgICAgICBPTVhfUUNPTV9FWFRSQURBVEFfRlJBTUVESU1FTlNJT04gKmZyYW1lZGltZW5zaW9uX2Zvcm1hdDsKLSAgICAgICAgICAgIGRhdGEtPm5TaXplID0gKHNpemVvZihPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSkgKyBzaXplb2Yoc3RydWN0IG1zbV92aWRjX2V4dHJhZGF0YV9pbmRleCkgKyAzKSYofjMpOwotICAgICAgICAgICAgZGF0YS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICAgICAgZGF0YS0+blBvcnRJbmRleCA9IDA7Ci0gICAgICAgICAgICBkYXRhLT5lVHlwZSA9IChPTVhfRVhUUkFEQVRBVFlQRSlNU01fVklEQ19FWFRSQURBVEFfSU5ERVg7Ci0gICAgICAgICAgICBkYXRhLT5uRGF0YVNpemUgPSBzaXplb2Yoc3RydWN0IG1zbV92aWRjX2lucHV0X2Nyb3BfcGF5bG9hZCk7Ci0gICAgICAgICAgICBmcmFtZWRpbWVuc2lvbl9mb3JtYXQgPSAoT01YX1FDT01fRVhUUkFEQVRBX0ZSQU1FRElNRU5TSU9OICopcF9leHRyYS0+ZGF0YTsKLSAgICAgICAgICAgIHBheWxvYWQgPSAoc3RydWN0IG1zbV92aWRjX2V4dHJhZGF0YV9pbmRleCAqKShkYXRhLT5kYXRhKTsKLSAgICAgICAgICAgIHBheWxvYWQtPnR5cGUgPSAobXNtX3ZpZGNfZXh0cmFkYXRhX3R5cGUpTVNNX1ZJRENfRVhUUkFEQVRBX0lOUFVUX0NST1A7Ci0gICAgICAgICAgICBwYXlsb2FkLT5pbnB1dF9jcm9wLmxlZnQgPSBmcmFtZWRpbWVuc2lvbl9mb3JtYXQtPm5EZWNXaWR0aDsKLSAgICAgICAgICAgIHBheWxvYWQtPmlucHV0X2Nyb3AudG9wID0gZnJhbWVkaW1lbnNpb25fZm9ybWF0LT5uRGVjSGVpZ2h0OwotICAgICAgICAgICAgcGF5bG9hZC0+aW5wdXRfY3JvcC53aWR0aCA9IGZyYW1lZGltZW5zaW9uX2Zvcm1hdC0+bkFjdHVhbFdpZHRoOwotICAgICAgICAgICAgcGF5bG9hZC0+aW5wdXRfY3JvcC5oZWlnaHQgPSBmcmFtZWRpbWVuc2lvbl9mb3JtYXQtPm5BY3R1YWxIZWlnaHQ7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkhlaWdodCA9ICVkIFdpZHRoID0gJWQgQWN0dWFsIEhlaWdodCA9ICVkIEFjdHVhbCBXaWR0aCA9ICVkIiwKLSAgICAgICAgICAgICAgICBmcmFtZWRpbWVuc2lvbl9mb3JtYXQtPm5EZWNXaWR0aCwgZnJhbWVkaW1lbnNpb25fZm9ybWF0LT5uRGVjSGVpZ2h0LAotICAgICAgICAgICAgICAgIGZyYW1lZGltZW5zaW9uX2Zvcm1hdC0+bkFjdHVhbFdpZHRoLCBmcmFtZWRpbWVuc2lvbl9mb3JtYXQtPm5BY3R1YWxIZWlnaHQpOwotICAgICAgICAgICAgZmlsbGVkX2xlbiArPSBkYXRhLT5uU2l6ZTsKLSAgICAgICAgICAgIGRhdGEgPSAoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKikoKGNoYXIgKilkYXRhICsgZGF0YS0+blNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfRXh0cmFEYXRhUVA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9RQ09NX0VYVFJBREFUQV9RUCAqIHFwX3BheWxvYWQgPSBOVUxMOwotICAgICAgICAgICAgc3RydWN0IG1zbV92aWRjX2ZyYW1lX3FwX3BheWxvYWQgKnBheWxvYWQ7Ci0gICAgICAgICAgICBkYXRhLT5uU2l6ZSA9IChzaXplb2YoT01YX09USEVSX0VYVFJBREFUQVRZUEUpICsgc2l6ZW9mKHN0cnVjdCBtc21fdmlkY19mcmFtZV9xcF9wYXlsb2FkKSArIDMpJih+Myk7Ci0gICAgICAgICAgICBkYXRhLT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgICAgICAgICBkYXRhLT5uUG9ydEluZGV4ID0gMDsKLSAgICAgICAgICAgIGRhdGEtPmVUeXBlID0gKE9NWF9FWFRSQURBVEFUWVBFKU1TTV9WSURDX0VYVFJBREFUQV9GUkFNRV9RUDsKLSAgICAgICAgICAgIGRhdGEtPm5EYXRhU2l6ZSA9IHNpemVvZihzdHJ1Y3QgIG1zbV92aWRjX2ZyYW1lX3FwX3BheWxvYWQpOwotICAgICAgICAgICAgcXBfcGF5bG9hZCA9IChPTVhfUUNPTV9FWFRSQURBVEFfUVAgKilwX2V4dHJhLT5kYXRhOwotICAgICAgICAgICAgcGF5bG9hZCA9IChzdHJ1Y3QgIG1zbV92aWRjX2ZyYW1lX3FwX3BheWxvYWQgKikoZGF0YS0+ZGF0YSk7Ci0gICAgICAgICAgICBwYXlsb2FkLT5mcmFtZV9xcCA9IHFwX3BheWxvYWQtPm5RUDsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiRnJhbWUgUVAgPSAlZCIsIHBheWxvYWQtPmZyYW1lX3FwKTsKLSAgICAgICAgICAgIGZpbGxlZF9sZW4gKz0gZGF0YS0+blNpemU7Ci0gICAgICAgICAgICBkYXRhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopKChjaGFyICopZGF0YSArIGRhdGEtPm5TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0V4dHJhRGF0YVZRWmlwU0VJOgotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJWUVpJUCBTRUkgRm91bmQgIik7Ci0gICAgICAgICAgICBpbnB1dF9leHRyYWRhdGFfaW5mby52cXppcF9zZWlfZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX0V4dHJhRGF0YUZyYW1lSW5mbzoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX1FDT01fRVhUUkFEQVRBX0ZSQU1FSU5GTyAqZnJhbWVfaW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICBmcmFtZV9pbmZvID0gKE9NWF9RQ09NX0VYVFJBREFUQV9GUkFNRUlORk8gKikocF9leHRyYS0+ZGF0YSk7Ci0gICAgICAgICAgICBpZiAoZnJhbWVfaW5mby0+ZVBpY1R5cGUgPT0gT01YX1ZJREVPX1BpY3R1cmVUeXBlSSkgewotICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF9pbnRyYV92b3BfcmVmcmVzaCgoT01YX0JPT0wpdHJ1ZSkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcyBFcnJvciBpbiByZXF1ZXN0aW5nIEkgRnJhbWUgIiwgX19mdW5jX18pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlVua25vd24gRXh0cmFkYXRhIDB4JXgiLCAoT01YX1FDT01fRVhUUkFEQVRBVFlQRSlwX2V4dHJhLT5lVHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN1bWVkX2xlbiArPSBwX2V4dHJhLT5uU2l6ZTsKLSAgICAgICAgcF9leHRyYSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKSgoY2hhciAqKXBfZXh0cmEgKyBwX2V4dHJhLT5uU2l6ZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgICAqIEJlbG93IGNvZGUgaXMgYmFzZWQgb24gdGhlc2UgcG9pbnRzLgotICAgICAgICogMSkgX1BRXyBub3QgZGVmaW5lZCA6Ci0gICAgICAgKiAgICAgYSkgU2VuZCBkYXRhIHRvIFZlbnVzIGFzIFJPSS4KLSAgICAgICAqICAgICBiKSBST0kgZW5hYmxlZCA6IFByb2Nlc3NlZCB1bmRlciB1bmxvY2tlZCBjb250ZXh0LgotICAgICAgICogICAgIGMpIFJPSSBkaXNhYmxlZCA6IE5vdGhpbmcgdG8gZmlsbC4KLSAgICAgICAqICAgICBkKSBwcSBlbmFibGVkIDogTm90IHBvc3NpYmxlLgotICAgICAgICogMikgX1BRXyBkZWZpbmVkLCBidXQgcHEgaXMgbm90IGVuYWJsZWQgOgotICAgICAgICogICAgIGEpIFNlbmQgZGF0YSB0byBWZW51cyBhcyBST0kuCi0gICAgICAgKiAgICAgYikgUk9JIGVuYWJsZWQgYW5kIGRpcnR5IDogQ29weSB0aGUgZGF0YSB0byBFeHRyYWRhdGEgYnVmZmVyIGhlcmUKLSAgICAgICAqICAgICBiKSBST0kgZW5hYmxlZCBhbmQgbm8gZGlydHkgOiBOb3RoaW5nIHRvIGZpbGwKLSAgICAgICAqICAgICBkKSBST0kgZGlzYWJsZWQgOiBOb3RoaW5nIHRvIGZpbGwKLSAgICAgICAqIDMpIF9QUV8gZGVmaW5lZCBhbmQgcHEgaXMgZW5hYmxlZCA6Ci0gICAgICAgKiAgICAgYSkgU2VuZCBkYXRhIHRvIFZlbnVzIGFzIFBRLgotICAgICAgICogICAgIGIpIFJPSSBlbmFibGVkIGFuZCBkaXJ0eSA6IENvcHkgdGhlIFJPSSBjb250ZW50cyB0byBwcV9yb2kgYnVmZmVyCi0gICAgICAgKiAgICAgYykgUk9JIGVuYWJsZWQgYW5kIG5vIGRpcnR5IDogcHFfcm9pIGlzIGFscmVhZHkgbWVtc2V0LiBIZW5jZSBub3RoaW5nIHRvIGRvIGhlcmUKLSAgICAgICAqICAgICBkKSBST0kgZGlzYWJsZWQgOiBKdXN0IFBRIGRhdGEgd2lsbCBiZSBmaWxsZWQgYnkgR1BVLgotICAgICAgICogNCkgTm9ybWFsIFJPSSBoYW5kbGluZyBpcyBpbiAjZWxzZSBwYXJ0IGFzIFBRIGNhbiBpbnRyb2R1Y2UgZGVsYXlzLgotICAgICAgICogICAgIEJ5IHRoaXMgdGltZSBpZiBjbGllbnQgc2V0cyBuZXh0IFJPSSwgdGhlbiB3ZSBzaG91bGRuJ3QgcHJvY2VzcyBuZXcgUk9JIGhlcmUuCi0gICAgICAgKi8KLQotICAgIHN0cnVjdCByb2lkYXRhIHJvaTsKLSAgICBtZW1zZXQoJnJvaSwgMCwgc2l6ZW9mKHN0cnVjdCByb2lkYXRhKSk7Ci0gICAgcm9pLmRpcnR5ID0gZmFsc2U7Ci0gICAgaWYgKG1fcm9pX2VuYWJsZWQpIHsKLSAgICAgICAgZ2V0X3JvaV9mb3JfdGltZXN0YW1wKHJvaSwgblRpbWVTdGFtcCk7Ci0gICAgfQotCi0jaWZkZWYgX1BRXwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9wcS5sb2NrKTsKLSAgICBpZiAobV9wcS5pc19wcV9lbmFibGVkKSB7Ci0gICAgICAgIGlmIChyb2kuZGlydHkpIHsKLSAgICAgICAgICAgIHN0cnVjdCBtc21fdmlkY19yb2lfcXBfcGF5bG9hZCAqcm9pRGF0YSA9Ci0gICAgICAgICAgICAgICAgKHN0cnVjdCBtc21fdmlkY19yb2lfcXBfcGF5bG9hZCAqKShtX3BxLnJvaV9leHRyYWRhdGFfaW5mby51YWRkcik7Ci0gICAgICAgICAgICByb2lEYXRhLT51cHBlcl9xcF9vZmZzZXQgPSByb2kuaW5mby5uVXBwZXJRcE9mZnNldDsKLSAgICAgICAgICAgIHJvaURhdGEtPmxvd2VyX3FwX29mZnNldCA9IHJvaS5pbmZvLm5Mb3dlclFwT2Zmc2V0OwotICAgICAgICAgICAgcm9pRGF0YS0+Yl9yb2lfaW5mbyA9IHJvaS5pbmZvLmJVc2VSb2lJbmZvOwotICAgICAgICAgICAgcm9pRGF0YS0+bWJpX2luZm9fc2l6ZSA9IHJvaS5pbmZvLm5Sb2lNQkluZm9TaXplOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiVXNpbmcgUFEgKyBST0kgUVAgbWFwOiBFbmFibGUgPSAlZCIsIHJvaURhdGEtPmJfcm9pX2luZm8pOwotICAgICAgICAgICAgbWVtY3B5KHJvaURhdGEtPmRhdGEsIHJvaS5pbmZvLnBSb2lNQkluZm8sIHJvaS5pbmZvLm5Sb2lNQkluZm9TaXplKTsKLSAgICAgICAgfQotICAgICAgICBmaWxsZWRfbGVuICs9IHNpemVvZihtc21fdmlkY19leHRyYWRhdGFfaGVhZGVyKSAtIHNpemVvZih1bnNpZ25lZCBpbnQpOwotICAgICAgICBkYXRhLT5uRGF0YVNpemUgPSBtX3BxLmZpbGxfcHFfc3RhdHMoYnVmLCBmaWxsZWRfbGVuKTsKLSAgICAgICAgZGF0YS0+blNpemUgPSBBTElHTihzaXplb2YobXNtX3ZpZGNfZXh0cmFkYXRhX2hlYWRlcikgKyAgZGF0YS0+bkRhdGFTaXplLCA0KTsKLSAgICAgICAgZGF0YS0+ZVR5cGUgPSAoT01YX0VYVFJBREFUQVRZUEUpTVNNX1ZJRENfRVhUUkFEQVRBX1BRX0lORk87Ci0gICAgICAgIGRhdGEgPSAoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKikoKGNoYXIgKilkYXRhICsgZGF0YS0+blNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChyb2kuZGlydHkpIHsKLSAgICAgICAgICAgIGRhdGEtPm5TaXplID0gQUxJR04oc2l6ZW9mKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFKSArCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbXNtX3ZpZGNfcm9pX3FwX3BheWxvYWQpICsKLSAgICAgICAgICAgICAgICAgICAgcm9pLmluZm8ublJvaU1CSW5mb1NpemUgLSAyICogc2l6ZW9mKHVuc2lnbmVkIGludCksIDQpOwotICAgICAgICAgICAgZGF0YS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICAgICAgZGF0YS0+blBvcnRJbmRleCA9IDA7Ci0gICAgICAgICAgICBkYXRhLT5lVHlwZSA9IChPTVhfRVhUUkFEQVRBVFlQRSlNU01fVklEQ19FWFRSQURBVEFfUk9JX1FQOwotICAgICAgICAgICAgZGF0YS0+bkRhdGFTaXplID0gc2l6ZW9mKHN0cnVjdCBtc21fdmlkY19yb2lfcXBfcGF5bG9hZCk7Ci0gICAgICAgICAgICBzdHJ1Y3QgbXNtX3ZpZGNfcm9pX3FwX3BheWxvYWQgKnJvaURhdGEgPQotICAgICAgICAgICAgICAgICAgICAoc3RydWN0IG1zbV92aWRjX3JvaV9xcF9wYXlsb2FkICopKGRhdGEtPmRhdGEpOwotICAgICAgICAgICAgcm9pRGF0YS0+dXBwZXJfcXBfb2Zmc2V0ID0gcm9pLmluZm8ublVwcGVyUXBPZmZzZXQ7Ci0gICAgICAgICAgICByb2lEYXRhLT5sb3dlcl9xcF9vZmZzZXQgPSByb2kuaW5mby5uTG93ZXJRcE9mZnNldDsKLSAgICAgICAgICAgIHJvaURhdGEtPmJfcm9pX2luZm8gPSByb2kuaW5mby5iVXNlUm9pSW5mbzsKLSAgICAgICAgICAgIHJvaURhdGEtPm1iaV9pbmZvX3NpemUgPSByb2kuaW5mby5uUm9pTUJJbmZvU2l6ZTsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIlVzaW5nIFJPSSBRUCBtYXA6IEVuYWJsZSA9ICVkIiwgcm9pRGF0YS0+Yl9yb2lfaW5mbyk7Ci0gICAgICAgICAgICBtZW1jcHkocm9pRGF0YS0+ZGF0YSwgcm9pLmluZm8ucFJvaU1CSW5mbywgcm9pLmluZm8ublJvaU1CSW5mb1NpemUpOwotICAgICAgICAgICAgZGF0YSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKSgoY2hhciAqKWRhdGEgKyBkYXRhLT5uU2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fcHEubG9jayk7Ci0jZWxzZSAvLyBfUFFfCi0gICAgaWYgKHJvaS5kaXJ0eSkgewotICAgICAgICBkYXRhLT5uU2l6ZSA9IEFMSUdOKHNpemVvZihPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSkgKwotICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBtc21fdmlkY19yb2lfcXBfcGF5bG9hZCkgKwotICAgICAgICAgICAgcm9pLmluZm8ublJvaU1CSW5mb1NpemUgLSAyICogc2l6ZW9mKHVuc2lnbmVkIGludCksIDQpOwotICAgICAgICBkYXRhLT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgICAgIGRhdGEtPm5Qb3J0SW5kZXggPSAwOwotICAgICAgICBkYXRhLT5lVHlwZSA9IChPTVhfRVhUUkFEQVRBVFlQRSlNU01fVklEQ19FWFRSQURBVEFfUk9JX1FQOwotICAgICAgICBkYXRhLT5uRGF0YVNpemUgPSBzaXplb2Yoc3RydWN0IG1zbV92aWRjX3JvaV9xcF9wYXlsb2FkKTsKLSAgICAgICAgc3RydWN0IG1zbV92aWRjX3JvaV9xcF9wYXlsb2FkICpyb2lEYXRhID0KLSAgICAgICAgICAgICAgICAoc3RydWN0IG1zbV92aWRjX3JvaV9xcF9wYXlsb2FkICopKGRhdGEtPmRhdGEpOwotICAgICAgICByb2lEYXRhLT51cHBlcl9xcF9vZmZzZXQgPSByb2kuaW5mby5uVXBwZXJRcE9mZnNldDsKLSAgICAgICAgcm9pRGF0YS0+bG93ZXJfcXBfb2Zmc2V0ID0gcm9pLmluZm8ubkxvd2VyUXBPZmZzZXQ7Ci0gICAgICAgIHJvaURhdGEtPmJfcm9pX2luZm8gPSByb2kuaW5mby5iVXNlUm9pSW5mbzsKLSAgICAgICAgcm9pRGF0YS0+bWJpX2luZm9fc2l6ZSA9IHJvaS5pbmZvLm5Sb2lNQkluZm9TaXplOwotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJVc2luZyBST0kgUVAgbWFwOiBFbmFibGUgPSAlZCIsIHJvaURhdGEtPmJfcm9pX2luZm8pOwotICAgICAgICBtZW1jcHkocm9pRGF0YS0+ZGF0YSwgcm9pLmluZm8ucFJvaU1CSW5mbywgcm9pLmluZm8ublJvaU1CSW5mb1NpemUpOwotICAgICAgICBkYXRhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopKChjaGFyICopZGF0YSArIGRhdGEtPm5TaXplKTsKLSAgICB9Ci0jZW5kaWYgLy8gX1BRXwotCi0gICAgaWYgKG1fcm9pX2VuYWJsZWQpIHsKLSAgICAgICAgaWYgKHJvaS5kaXJ0eSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJmcmVlIHJvaWRhdGEgd2l0aCB0aW1lc3RhbXAgJWxsZCB1cyIsIHJvaS50aW1lc3RhbXApOwotICAgICAgICAgICAgZnJlZShyb2kuaW5mby5wUm9pTUJJbmZvKTsKLSAgICAgICAgICAgIHJvaS5kaXJ0eSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0jaWZkZWYgX1ZRWklQXwotICAgIGlmICh2cXppcF9zZWlfaW5mby5lbmFibGVkICYmICFpbnB1dF9leHRyYWRhdGFfaW5mby52cXppcF9zZWlfZm91bmQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlZRWklQIGlzIGVuYWJsZWQsIEJ1dCBubyBWUVpJUCBTRUkgZm91bmQuIFJlamVjdGluZyB0aGUgc2Vzc2lvbiIpOwotICAgICAgICBpZiAocFZpcnQpCi0gICAgICAgICAgICBtdW5tYXAocFZpcnQsIHNpemUpOwotICAgICAgICByZXR1cm4gZmFsc2U7IC8vVGhpcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBmYXRhbCBlcnJvcgotICAgIH0KLSAgICBpZiAodnF6aXBfc2VpX2luZm8uZW5hYmxlZCAmJiBwVmlydCkgewotICAgICAgICBkYXRhLT5uU2l6ZSA9IChzaXplb2YoT01YX09USEVSX0VYVFJBREFUQVRZUEUpICsgIHNpemVvZihzdHJ1Y3QgVlFaaXBTdGF0cykgKyAzKSYofjMpOwotICAgICAgICBkYXRhLT5uVmVyc2lvbi5uVmVyc2lvbiA9IE9NWF9TUEVDX1ZFUlNJT047Ci0gICAgICAgIGRhdGEtPm5Qb3J0SW5kZXggPSAwOwotICAgICAgICBkYXRhLT5lVHlwZSA9IChPTVhfRVhUUkFEQVRBVFlQRSlNU01fVklEQ19FWFRSQURBVEFfWVVWU1RBVFNfSU5GTzsKLSAgICAgICAgZGF0YS0+bkRhdGFTaXplID0gc2l6ZW9mKHN0cnVjdCBWUVppcFN0YXRzKTsKLSAgICAgICAgdnF6aXAuZmlsbF9zdGF0c19kYXRhKCh2b2lkKilwVmlydCwgKHZvaWQqKSBkYXRhLT5kYXRhKTsKLSAgICAgICAgZGF0YSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKSgoY2hhciAqKWRhdGEgKyBkYXRhLT5uU2l6ZSk7Ci0gICAgfQotI2VuZGlmCi0gICAgICAgIGRhdGEtPm5TaXplID0gc2l6ZW9mKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFKTsKLSAgICAgICAgZGF0YS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICBkYXRhLT5lVHlwZSA9IE9NWF9FeHRyYURhdGFOb25lOwotICAgICAgICBkYXRhLT5uRGF0YVNpemUgPSAwOwotICAgICAgICBkYXRhLT5kYXRhWzBdID0gMDsKLQotICAgIGlmIChwVmlydCkKLSAgICAgICAgbXVubWFwKHBWaXJ0LCBzaXplKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2OjpoYW5kbGVfb3V0cHV0X2V4dHJhZGF0YSh2b2lkICpidWZmZXIsIGludCBpbmRleCkKLXsKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9idWZoZHIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKikgYnVmZmVyOwotICAgIE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICpwX2V4dHJhID0gTlVMTDsKLQotICAgIGlmICghb3V0cHV0X2V4dHJhZGF0YV9pbmZvLnVhZGRyKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFeHRyYWRhdGEgYnVmZmVycyBub3QgYWxsb2NhdGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHBfZXh0cmEgPSAoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKilBTElHTihwX2J1Zmhkci0+cEJ1ZmZlciArCi0gICAgICAgICAgICAgICAgcF9idWZoZHItPm5PZmZzZXQgKyBwX2J1Zmhkci0+bkZpbGxlZExlbiwgNCk7Ci0KLSAgICBpZiAob3V0cHV0X2V4dHJhZGF0YV9pbmZvLmJ1ZmZlcl9zaXplID4KLSAgICAgICAgICAgIHBfYnVmaGRyLT5uQWxsb2NMZW4gLSBBTElHTihwX2J1Zmhkci0+bk9mZnNldCArIHBfYnVmaGRyLT5uRmlsbGVkTGVuLCA0KSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSW5zdWZmaWNpZW50IGJ1ZmZlciBzaXplIGZvciBleHRyYWRhdGEiKTsKLSAgICAgICAgcF9leHRyYSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKHNpemVvZihtc21fdmlkY19leHRyYWRhdGFfaGVhZGVyKSAhPSBzaXplb2YoT01YX09USEVSX0VYVFJBREFUQVRZUEUpKSB7Ci0gICAgICAgIC8qIEEgbG90IG9mIHRoZSBjb2RlIGJlbG93IGFzc3VtZXMgdGhpcyBjb25kaXRpb24sIHNvIGVycm9yIG91dCBpZiBpdCdzIG5vdCBtZXQgKi8KLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkV4dHJhZGF0YSBBQkkgbWlzbWF0Y2giKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0cnVjdCBtc21fdmlkY19leHRyYWRhdGFfaGVhZGVyICpwX2V4dHJhZGF0YSA9IE5VTEw7Ci0gICAgZG8gewotICAgICAgICBwX2V4dHJhZGF0YSA9IChzdHJ1Y3QgbXNtX3ZpZGNfZXh0cmFkYXRhX2hlYWRlciAqKSAocF9leHRyYWRhdGEgPwotICAgICAgICAgICAgKChjaGFyICopcF9leHRyYWRhdGEpICsgcF9leHRyYWRhdGEtPnNpemUgOgotICAgICAgICAgICAgb3V0cHV0X2V4dHJhZGF0YV9pbmZvLnVhZGRyICsgaW5kZXggKiBvdXRwdXRfZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemUpOwotCi0gICAgICAgIHN3aXRjaCAocF9leHRyYWRhdGEtPnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTVNNX1ZJRENfRVhUUkFEQVRBX01FVEFEQVRBX01CSToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfVTMyIHBheWxvYWRTaXplID0gYXBwZW5kX21iaV9leHRyYWRhdGEoJnBfZXh0cmEtPmRhdGEsIHBfZXh0cmFkYXRhKTsKLSAgICAgICAgICAgICAgICBwX2V4dHJhLT5uU2l6ZSA9IEFMSUdOKHNpemVvZihPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSkgKyBwYXlsb2FkU2l6ZSwgNCk7Ci0gICAgICAgICAgICAgICAgcF9leHRyYS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICAgICAgICAgIHBfZXh0cmEtPm5Qb3J0SW5kZXggPSBPTVhfRGlyT3V0cHV0OwotICAgICAgICAgICAgICAgIHBfZXh0cmEtPmVUeXBlID0gKE9NWF9FWFRSQURBVEFUWVBFKU9NWF9FeHRyYURhdGFWaWRlb0VuY29kZXJNQkluZm87Ci0gICAgICAgICAgICAgICAgcF9leHRyYS0+bkRhdGFTaXplID0gcGF5bG9hZFNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1TTV9WSURDX0VYVFJBREFUQV9NRVRBREFUQV9MVFI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfZXh0cmEtPmRhdGEgPSAqcF9leHRyYWRhdGEtPmRhdGE7Ci0gICAgICAgICAgICAgICAgcF9leHRyYS0+blNpemUgPSBBTElHTihzaXplb2YoT01YX09USEVSX0VYVFJBREFUQVRZUEUpICsgcF9leHRyYWRhdGEtPmRhdGFfc2l6ZSwgNCk7Ci0gICAgICAgICAgICAgICAgcF9leHRyYS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICAgICAgICAgIHBfZXh0cmEtPm5Qb3J0SW5kZXggPSBPTVhfRGlyT3V0cHV0OwotICAgICAgICAgICAgICAgIHBfZXh0cmEtPmVUeXBlID0gKE9NWF9FWFRSQURBVEFUWVBFKSBPTVhfRXh0cmFEYXRhVmlkZW9MVFJJbmZvOwotICAgICAgICAgICAgICAgIHBfZXh0cmEtPm5EYXRhU2l6ZSA9IHBfZXh0cmFkYXRhLT5kYXRhX3NpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1TTV9WSURDX0VYVFJBREFUQV9OT05FOgotICAgICAgICAgICAgICAgIHBfZXh0cmEtPm5TaXplID0gQUxJR04oc2l6ZW9mKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFKSwgNCk7Ci0gICAgICAgICAgICAgICAgcF9leHRyYS0+blZlcnNpb24ublZlcnNpb24gPSBPTVhfU1BFQ19WRVJTSU9OOwotICAgICAgICAgICAgICAgIHBfZXh0cmEtPm5Qb3J0SW5kZXggPSBPTVhfRGlyT3V0cHV0OwotICAgICAgICAgICAgICAgIHBfZXh0cmEtPmVUeXBlID0gT01YX0V4dHJhRGF0YU5vbmU7Ci0gICAgICAgICAgICAgICAgcF9leHRyYS0+bkRhdGFTaXplID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogTm8gaWRlYSB3aGF0IHRoaXMgc3R1ZmYgaXMsIGp1c3Qgc2tpcCBvdmVyIGl0ICovCi0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRm91bmQgYW4gdW5yZWNvZ25pc2VkIGV4dHJhZGF0YSAoJXgpIGlnbm9yaW5nIGl0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZXh0cmFkYXRhLT50eXBlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHBfZXh0cmEgPSAoT01YX09USEVSX0VYVFJBREFUQVRZUEUgKikoKChjaGFyICopcF9leHRyYSkgKyBwX2V4dHJhLT5uU2l6ZSk7Ci0gICAgfSB3aGlsZSAocF9leHRyYWRhdGEtPnR5cGUgIT0gTVNNX1ZJRENfRVhUUkFEQVRBX05PTkUpOwotCi0gICAgLyogSnVzdCBmb3IgZGVidWdnaW5nOiBUcmF2ZXJzZSB0aGUgbGlzdCBvZiBleHRyYSBkYXRhcyAgYW5kIHNwaXQgaXQgb3V0IG9udG8gbG9nICovCi0gICAgcF9leHRyYSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKUFMSUdOKHBfYnVmaGRyLT5wQnVmZmVyICsKLSAgICAgICAgICAgICAgICBwX2J1Zmhkci0+bk9mZnNldCArIHBfYnVmaGRyLT5uRmlsbGVkTGVuLCA0KTsKLSAgICB3aGlsZShwX2V4dHJhLT5lVHlwZSAhPSBPTVhfRXh0cmFEYXRhTm9uZSkKLSAgICB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiWyVwLyV1XSBmb3VuZCBleHRyYWRhdGEgdHlwZSAleCBvZiBzaXplICV1ICgldSkgYXQgJXAiLAotICAgICAgICAgICAgICAgIHBfYnVmaGRyLT5wQnVmZmVyLCAodW5zaWduZWQgaW50KXBfYnVmaGRyLT5uRmlsbGVkTGVuLCBwX2V4dHJhLT5lVHlwZSwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBfZXh0cmEtPm5TaXplLCAodW5zaWduZWQgaW50KXBfZXh0cmEtPm5EYXRhU2l6ZSwgcF9leHRyYSk7Ci0KLSAgICAgICAgcF9leHRyYSA9IChPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqKSAoKChPTVhfVTggKikgcF9leHRyYSkgKwotICAgICAgICAgICAgICAgIHBfZXh0cmEtPm5TaXplKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IHZlbmNfZGV2Ojp2ZW5jX3NldF9mb3JtYXQoaW50IGZvcm1hdCkKLXsKLSAgICBpbnQgcmMgPSB0cnVlOwotCi0gICAgaWYgKGZvcm1hdCkgewotICAgICAgICBjb2xvcl9mb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICAgICAgc3dpdGNoIChjb2xvcl9mb3JtYXQpIHsKLSAgICAgICAgY2FzZSBOVjEyXzEyOG06Ci0gICAgICAgICAgICByZXR1cm4gdmVuY19zZXRfY29sb3JfZm9ybWF0KChPTVhfQ09MT1JfRk9STUFUVFlQRSlRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm0pOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBjb2xvcl9mb3JtYXQgPSAwOwotICAgICAgICByYyA9IGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiByYzsKLX0KLQotT01YX0VSUk9SVFlQRSB2ZW5jX2Rldjo6YWxsb2NhdGVfZXh0cmFkYXRhKHN0cnVjdCBleHRyYWRhdGFfYnVmZmVyX2luZm8gKmV4dHJhZGF0YV9pbmZvLCBpbnQgZmxhZ3MpCi17Ci0gICAgaWYgKGV4dHJhZGF0YV9pbmZvLT5hbGxvY2F0ZWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiMm5kIGFsbG9jYXRpb24gcmV0dXJuIGZvciBwb3J0ID0gJWQiLGV4dHJhZGF0YV9pbmZvLT5wb3J0X2luZGV4KTsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0jaWZkZWYgVVNFX0lPTgotCi0gICAgaWYgKGV4dHJhZGF0YV9pbmZvLT5idWZmZXJfc2l6ZSkgewotICAgICAgICBpZiAoZXh0cmFkYXRhX2luZm8tPmlvbi5pb25fYWxsb2NfZGF0YS5oYW5kbGUpIHsKLSAgICAgICAgICAgIG11bm1hcCgodm9pZCAqKWV4dHJhZGF0YV9pbmZvLT51YWRkciwgZXh0cmFkYXRhX2luZm8tPnNpemUpOwotICAgICAgICAgICAgY2xvc2UoZXh0cmFkYXRhX2luZm8tPmlvbi5mZF9pb25fZGF0YS5mZCk7Ci0gICAgICAgICAgICB2ZW5jX2hhbmRsZS0+ZnJlZV9pb25fbWVtb3J5KCZleHRyYWRhdGFfaW5mby0+aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGV4dHJhZGF0YV9pbmZvLT5zaXplID0gKGV4dHJhZGF0YV9pbmZvLT5zaXplICsgNDA5NSkgJiAofjQwOTUpOwotCi0gICAgICAgIGV4dHJhZGF0YV9pbmZvLT5pb24uaW9uX2RldmljZV9mZCA9IHZlbmNfaGFuZGxlLT5hbGxvY19tYXBfaW9uX21lbW9yeSgKLSAgICAgICAgICAgICAgICBleHRyYWRhdGFfaW5mby0+c2l6ZSwKLSAgICAgICAgICAgICAgICAmZXh0cmFkYXRhX2luZm8tPmlvbi5pb25fYWxsb2NfZGF0YSwKLSAgICAgICAgICAgICAgICAmZXh0cmFkYXRhX2luZm8tPmlvbi5mZF9pb25fZGF0YSwgZmxhZ3MpOwotCi0KLSAgICAgICAgaWYgKGV4dHJhZGF0YV9pbmZvLT5pb24uaW9uX2RldmljZV9mZCA8IDApIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2MgZXh0cmFkYXRhIG1lbW9yeVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgZXh0cmFkYXRhX2luZm8tPnVhZGRyID0gKGNoYXIgKiltbWFwKE5VTEwsCi0gICAgICAgICAgICAgICAgZXh0cmFkYXRhX2luZm8tPnNpemUsCi0gICAgICAgICAgICAgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCi0gICAgICAgICAgICAgICAgZXh0cmFkYXRhX2luZm8tPmlvbi5mZF9pb25fZGF0YS5mZCAsIDApOwotCi0gICAgICAgIGlmIChleHRyYWRhdGFfaW5mby0+dWFkZHIgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBtYXAgZXh0cmFkYXRhIG1lbW9yeVxuIik7Ci0gICAgICAgICAgICBjbG9zZShleHRyYWRhdGFfaW5mby0+aW9uLmZkX2lvbl9kYXRhLmZkKTsKLSAgICAgICAgICAgIHZlbmNfaGFuZGxlLT5mcmVlX2lvbl9tZW1vcnkoJmV4dHJhZGF0YV9pbmZvLT5pb24pOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKLSAgICAgICAgfQotICAgICAgICBleHRyYWRhdGFfaW5mby0+bV9pb25fZGV2ID0gb3BlbigiL2Rldi9pb24iLCBPX1JET05MWSk7Ci0gICAgfQotCi0jZW5kaWYKLSAgICBleHRyYWRhdGFfaW5mby0+YWxsb2NhdGVkID0gT01YX1RSVUU7Ci0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLXZvaWQgdmVuY19kZXY6OmZyZWVfZXh0cmFkYXRhKHN0cnVjdCBleHRyYWRhdGFfYnVmZmVyX2luZm8gKmV4dHJhZGF0YV9pbmZvKQotewotI2lmZGVmIFVTRV9JT04KLQotICAgIGlmIChleHRyYWRhdGFfaW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZXh0cmFkYXRhX2luZm8tPnVhZGRyKSB7Ci0gICAgICAgIG11bm1hcCgodm9pZCAqKWV4dHJhZGF0YV9pbmZvLT51YWRkciwgZXh0cmFkYXRhX2luZm8tPnNpemUpOwotICAgICAgICBleHRyYWRhdGFfaW5mby0+dWFkZHIgPSBOVUxMOwotICAgICAgICBjbG9zZShleHRyYWRhdGFfaW5mby0+aW9uLmZkX2lvbl9kYXRhLmZkKTsKLSAgICAgICAgdmVuY19oYW5kbGUtPmZyZWVfaW9uX21lbW9yeSgmZXh0cmFkYXRhX2luZm8tPmlvbik7Ci0gICAgfQotCi0gICAgaWYgKGV4dHJhZGF0YV9pbmZvLT5tX2lvbl9kZXYpCi0gICAgICAgIGNsb3NlKGV4dHJhZGF0YV9pbmZvLT5tX2lvbl9kZXYpOwotCi0gICAgbWVtc2V0KGV4dHJhZGF0YV9pbmZvLCAwLCBzaXplb2YoKmV4dHJhZGF0YV9pbmZvKSk7Ci0gICAgZXh0cmFkYXRhX2luZm8tPmlvbi5mZF9pb25fZGF0YS5mZCA9IC0xOwotICAgIGV4dHJhZGF0YV9pbmZvLT5hbGxvY2F0ZWQgPSBPTVhfRkFMU0U7Ci0KLSNlbmRpZiAvLyBVU0VfSU9OCi19Ci0KLXZvaWQgdmVuY19kZXY6OmZyZWVfZXh0cmFkYXRhX2FsbCgpCi17Ci0gICAgZnJlZV9leHRyYWRhdGEoJm91dHB1dF9leHRyYWRhdGFfaW5mbyk7Ci0gICAgZnJlZV9leHRyYWRhdGEoJmlucHV0X2V4dHJhZGF0YV9pbmZvKTsKLSNpZmRlZiBfUFFfCi0gICAgZnJlZV9leHRyYWRhdGEoJm1fcHEucm9pX2V4dHJhZGF0YV9pbmZvKTsKLSNlbmRpZiAvLyBfUFFfCi19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfZ2V0X291dHB1dF9sb2dfZmxhZygpCi17Ci0gICAgcmV0dXJuIChtX2RlYnVnLm91dF9idWZmZXJfbG9nID09IDEpOwotfQotCi1pbnQgdmVuY19kZXY6OnZlbmNfb3V0cHV0X2xvZ19idWZmZXJzKGNvbnN0IGNoYXIgKmJ1ZmZlcl9hZGRyLCBpbnQgYnVmZmVyX2xlbikKLXsKLSAgICBpZiAodmVuY19oYW5kbGUtPmlzX3NlY3VyZV9zZXNzaW9uKCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImxvZ2dpbmcgc2VjdXJlIG91dHB1dCBidWZmZXJzIGlzIG5vdCBhbGxvd2VkISIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKCFtX2RlYnVnLm91dGZpbGUpIHsKLSAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICBpZiAobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IMjY0KSB7Ci0gICAgICAgICAgIHNpemUgPSBzbnByaW50ZihtX2RlYnVnLm91dGZpbGVfbmFtZSwgUFJPUEVSVFlfVkFMVUVfTUFYLCAiJXMvb3V0cHV0X2VuY18lbHVfJWx1XyVwLjI2NCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RlYnVnLmxvZ19sb2MsIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoLCBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQsIHRoaXMpOwotICAgICAgICB9IGVsc2UgaWYobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IRVZDKSB7Ci0gICAgICAgICAgIHNpemUgPSBzbnByaW50ZihtX2RlYnVnLm91dGZpbGVfbmFtZSwgUFJPUEVSVFlfVkFMVUVfTUFYLCAiJXMvb3V0cHV0X2VuY18lbGRfJWxkXyVwLjI2NSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RlYnVnLmxvZ19sb2MsIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoLCBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQsIHRoaXMpOwotICAgICAgICB9IGVsc2UgaWYobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9WUDgpIHsKLSAgICAgICAgICAgc2l6ZSA9IHNucHJpbnRmKG1fZGVidWcub3V0ZmlsZV9uYW1lLCBQUk9QRVJUWV9WQUxVRV9NQVgsICIlcy9vdXRwdXRfZW5jXyVsdV8lbHVfJXAuaXZmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVidWcubG9nX2xvYywgbV9zVmVuY19jZmcuaW5wdXRfd2lkdGgsIG1fc1ZlbmNfY2ZnLmlucHV0X2hlaWdodCwgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChzaXplID4gUFJPUEVSVFlfVkFMVUVfTUFYKSAmJiAoc2l6ZSA8IDApKSB7Ci0gICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlOiAlcyBmb3IgbG9nZ2luZyBzaXplOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWJ1Zy5vdXRmaWxlX25hbWUsIHNpemUpOwotICAgICAgICB9Ci0gICAgICAgIG1fZGVidWcub3V0ZmlsZSA9IGZvcGVuKG1fZGVidWcub3V0ZmlsZV9uYW1lLCAiYWIiKTsKLSAgICAgICAgaWYgKCFtX2RlYnVnLm91dGZpbGUpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZTogJXMgZm9yIGxvZ2dpbmcgZXJybm86JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVidWcub3V0ZmlsZV9uYW1lLCBlcnJubyk7Ci0gICAgICAgICAgICBtX2RlYnVnLm91dGZpbGVfbmFtZVswXSA9ICdcMCc7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fZGVidWcub3V0ZmlsZSAmJiBidWZmZXJfbGVuKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiJXMgYnVmZmVyX2xlbjolZCIsIF9fZnVuY19fLCBidWZmZXJfbGVuKTsKLSAgICAgICAgZndyaXRlKGJ1ZmZlcl9hZGRyLCBidWZmZXJfbGVuLCAxLCBtX2RlYnVnLm91dGZpbGUpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHZlbmNfZGV2Ojp2ZW5jX2V4dHJhZGF0YV9sb2dfYnVmZmVycyhjaGFyICpidWZmZXJfYWRkcikKLXsKLSAgICBpZiAoIW1fZGVidWcuZXh0cmFkYXRhZmlsZSAmJiBtX2RlYnVnLmV4dHJhZGF0YV9sb2cpIHsKLSAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICBpZiAobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IMjY0KSB7Ci0gICAgICAgICAgIHNpemUgPSBzbnByaW50ZihtX2RlYnVnLmV4dHJhZGF0YWZpbGVfbmFtZSwgUFJPUEVSVFlfVkFMVUVfTUFYLCAiJXMvZXh0cmFkYXRhX2VuY18lbHVfJWx1XyVwLmJpbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RlYnVnLmxvZ19sb2MsIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoLCBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQsIHRoaXMpOwotICAgICAgICB9IGVsc2UgaWYobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IRVZDKSB7Ci0gICAgICAgICAgIHNpemUgPSBzbnByaW50ZihtX2RlYnVnLmV4dHJhZGF0YWZpbGVfbmFtZSwgUFJPUEVSVFlfVkFMVUVfTUFYLCAiJXMvZXh0cmFkYXRhX2VuY18lbHVfJWx1XyVwLmJpbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RlYnVnLmxvZ19sb2MsIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoLCBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQsIHRoaXMpOwotICAgICAgICB9IGVsc2UgaWYobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9WUDgpIHsKLSAgICAgICAgICAgc2l6ZSA9IHNucHJpbnRmKG1fZGVidWcuZXh0cmFkYXRhZmlsZV9uYW1lLCBQUk9QRVJUWV9WQUxVRV9NQVgsICIlcy9leHRyYWRhdGFfZW5jXyVsdV8lbHVfJXAuYmluIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVidWcubG9nX2xvYywgbV9zVmVuY19jZmcuaW5wdXRfd2lkdGgsIG1fc1ZlbmNfY2ZnLmlucHV0X2hlaWdodCwgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChzaXplID4gUFJPUEVSVFlfVkFMVUVfTUFYKSAmJiAoc2l6ZSA8IDApKSB7Ci0gICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBvcGVuIGV4dHJhZGF0YSBmaWxlOiAlcyBmb3IgbG9nZ2luZyBzaXplOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWJ1Zy5leHRyYWRhdGFmaWxlX25hbWUsIHNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9kZWJ1Zy5leHRyYWRhdGFmaWxlID0gZm9wZW4obV9kZWJ1Zy5leHRyYWRhdGFmaWxlX25hbWUsICJhYiIpOwotICAgICAgICBpZiAoIW1fZGVidWcuZXh0cmFkYXRhZmlsZSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBvcGVuIGV4dHJhZGF0YSBmaWxlOiAlcyBmb3IgbG9nZ2luZyBlcnJubzolZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWJ1Zy5leHRyYWRhdGFmaWxlX25hbWUsIGVycm5vKTsKLSAgICAgICAgICAgIG1fZGVidWcuZXh0cmFkYXRhZmlsZV9uYW1lWzBdID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtX2RlYnVnLmV4dHJhZGF0YWZpbGUgJiYgYnVmZmVyX2FkZHIpIHsKLSAgICAgICAgT01YX09USEVSX0VYVFJBREFUQVRZUEUgKnBfZXh0cmEgPSBOVUxMOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBwX2V4dHJhID0gKE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICopKCFwX2V4dHJhID8gYnVmZmVyX2FkZHIgOgotICAgICAgICAgICAgICAgICAgICAoKGNoYXIgKilwX2V4dHJhKSArIHBfZXh0cmEtPm5TaXplKTsKLSAgICAgICAgICAgIGZ3cml0ZShwX2V4dHJhLCBwX2V4dHJhLT5uU2l6ZSwgMSwgbV9kZWJ1Zy5leHRyYWRhdGFmaWxlKTsKLSAgICAgICAgfSB3aGlsZSAocF9leHRyYS0+ZVR5cGUgIT0gT01YX0V4dHJhRGF0YU5vbmUpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHZlbmNfZGV2Ojp2ZW5jX2lucHV0X2xvZ19idWZmZXJzKE9NWF9CVUZGRVJIRUFERVJUWVBFICpwYnVmZmVyLCBpbnQgZmQsIGludCBwbGFuZV9vZmZzZXQsCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgaW5wdXRmb3JtYXQpIHsKLSAgICBpZiAodmVuY19oYW5kbGUtPmlzX3NlY3VyZV9zZXNzaW9uKCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImxvZ2dpbmcgc2VjdXJlIGlucHV0IGJ1ZmZlcnMgaXMgbm90IGFsbG93ZWQhIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoIW1fZGVidWcuaW5maWxlKSB7Ci0gICAgICAgIGludCBzaXplID0gc25wcmludGYobV9kZWJ1Zy5pbmZpbGVfbmFtZSwgUFJPUEVSVFlfVkFMVUVfTUFYLCAiJXMvaW5wdXRfZW5jXyVsdV8lbHVfJXAueXV2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RlYnVnLmxvZ19sb2MsIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoLCBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQsIHRoaXMpOwotICAgICAgICBpZiAoKHNpemUgPiBQUk9QRVJUWV9WQUxVRV9NQVgpICYmIChzaXplIDwgMCkpIHsKLSAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGU6ICVzIGZvciBsb2dnaW5nIHNpemU6JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RlYnVnLmluZmlsZV9uYW1lLCBzaXplKTsKLSAgICAgICAgfQotICAgICAgICBtX2RlYnVnLmluZmlsZSA9IGZvcGVuIChtX2RlYnVnLmluZmlsZV9uYW1lLCAiYWIiKTsKLSAgICAgICAgaWYgKCFtX2RlYnVnLmluZmlsZSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIG9wZW4gaW5wdXQgZmlsZTogJXMgZm9yIGxvZ2dpbmciLCBtX2RlYnVnLmluZmlsZV9uYW1lKTsKLSAgICAgICAgICAgIG1fZGVidWcuaW5maWxlX25hbWVbMF0gPSAnXDAnOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1fZGVidWcuaW5maWxlICYmIHBidWZmZXIgJiYgcGJ1ZmZlci0+bkZpbGxlZExlbikgewotICAgICAgICBpbnQgc3RyaWRlLCBzY2FubGluZXM7Ci0gICAgICAgIGludCBjb2xvcl9mb3JtYXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaSwgbXNpemU7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnB2aXJ0ID0gTlVMTCwgKnB0ZW1wID0gTlVMTDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqdGVtcCA9ICh1bnNpZ25lZCBjaGFyICopcGJ1ZmZlci0+cEJ1ZmZlcjsKLQotICAgICAgICBzd2l0Y2ggKGlucHV0Zm9ybWF0KSB7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyOgotICAgICAgICAgICAgICAgIGNvbG9yX2Zvcm1hdCA9IENPTE9SX0ZNVF9OVjEyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMl9VQldDOgotICAgICAgICAgICAgICAgIGNvbG9yX2Zvcm1hdCA9IENPTE9SX0ZNVF9OVjEyX1VCV0M7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IzMjoKLSAgICAgICAgICAgICAgICBjb2xvcl9mb3JtYXQgPSBDT0xPUl9GTVRfUkdCQTg4ODg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0JBODg4OF9VQldDOgotICAgICAgICAgICAgICAgIGNvbG9yX2Zvcm1hdCA9IENPTE9SX0ZNVF9SR0JBODg4OF9VQldDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBjb2xvcl9mb3JtYXQgPSBDT0xPUl9GTVRfTlYxMjsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkRlZmF1bHQgZm9ybWF0IE5WMTIgaXMgc2V0IGZvciBsb2dnaW5nIFslbHVdIiwgaW5wdXRmb3JtYXQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbXNpemUgPSBWRU5VU19CVUZGRVJfU0laRShjb2xvcl9mb3JtYXQsIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoLCBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQpOwotICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgZXh0cmFfc2l6ZSA9IFZFTlVTX0VYVFJBREFUQV9TSVpFKG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoLCBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQpOwotCi0gICAgICAgIGlmIChtZXRhZGF0YW1vZGUgPT0gMSkgewotICAgICAgICAgICAgcHZpcnQ9ICh1bnNpZ25lZCBjaGFyICopbW1hcChOVUxMLCBtc2l6ZSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsTUFQX1NIQVJFRCwgZmQsIHBsYW5lX29mZnNldCk7Ci0gICAgICAgICAgICBpZiAocHZpcnQgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcyBtbWFwIGZhaWxlZCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdGVtcCA9IHB2aXJ0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHRlbXAgPSB0ZW1wOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbG9yX2Zvcm1hdCA9PSBDT0xPUl9GTVRfTlYxMikgewotICAgICAgICAgICAgc3RyaWRlID0gVkVOVVNfWV9TVFJJREUoY29sb3JfZm9ybWF0LCBtX3NWZW5jX2NmZy5pbnB1dF93aWR0aCk7Ci0gICAgICAgICAgICBzY2FubGluZXMgPSBWRU5VU19ZX1NDQU5MSU5FUyhjb2xvcl9mb3JtYXQsIG1fc1ZlbmNfY2ZnLmlucHV0X2hlaWdodCk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgICAgIGZ3cml0ZShwdGVtcCwgbV9zVmVuY19jZmcuaW5wdXRfd2lkdGgsIDEsIG1fZGVidWcuaW5maWxlKTsKLSAgICAgICAgICAgICAgICBwdGVtcCArPSBzdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGFtb2RlID09IDEpIHsKLSAgICAgICAgICAgICAgICBwdGVtcCA9IHB2aXJ0ICsgKHN0cmlkZSAqIHNjYW5saW5lcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHB0ZW1wID0gKHVuc2lnbmVkIGNoYXIgKilwYnVmZmVyLT5wQnVmZmVyICsgKHN0cmlkZSAqIHNjYW5saW5lcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9zVmVuY19jZmcuaW5wdXRfaGVpZ2h0LzI7IGkrKykgewotICAgICAgICAgICAgICAgIGZ3cml0ZShwdGVtcCwgbV9zVmVuY19jZmcuaW5wdXRfd2lkdGgsIDEsIG1fZGVidWcuaW5maWxlKTsKLSAgICAgICAgICAgICAgICBwdGVtcCArPSBzdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29sb3JfZm9ybWF0ID09IENPTE9SX0ZNVF9SR0JBODg4OCkgewotICAgICAgICAgICAgc3RyaWRlID0gVkVOVVNfUkdCX1NUUklERShjb2xvcl9mb3JtYXQsIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoKTsKLSAgICAgICAgICAgIHNjYW5saW5lcyA9IFZFTlVTX1JHQl9TQ0FOTElORVMoY29sb3JfZm9ybWF0LCBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9zVmVuY19jZmcuaW5wdXRfaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBmd3JpdGUocHRlbXAsIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoICogNCwgMSwgbV9kZWJ1Zy5pbmZpbGUpOwotICAgICAgICAgICAgICAgIHB0ZW1wICs9IHN0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjb2xvcl9mb3JtYXQgPT0gQ09MT1JfRk1UX05WMTJfVUJXQyB8fCBjb2xvcl9mb3JtYXQgPT0gQ09MT1JfRk1UX1JHQkE4ODg4X1VCV0MpIHsKLSAgICAgICAgICAgIGlmIChjb2xvcl9mb3JtYXQgPT0gQ09MT1JfRk1UX05WMTJfVUJXQykgewotICAgICAgICAgICAgICAgIG1zaXplIC09IDIgKiBleHRyYV9zaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZndyaXRlKHB0ZW1wLCBtc2l6ZSwgMSwgbV9kZWJ1Zy5pbmZpbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFkYXRhbW9kZSA9PSAxICYmIHB2aXJ0KSB7Ci0gICAgICAgICAgICBtdW5tYXAocHZpcnQsIG1zaXplKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX29wZW4oT01YX1UzMiBjb2RlYykKLXsKLSAgICBpbnQgciwgbWlucXAgPSAwLCBtYXhxcCA9IDEyNzsKLSAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50ID0gMCxidWZmZXJfc2l6ZSA9IDAsIHRlbXAgPTA7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIE9NWF9TVFJJTkcgZGV2aWNlX25hbWUgPSAoT01YX1NUUklORykiL2Rldi92aWRlbzMzIjsKLSAgICBjaGFyIHByb3BlcnR5X3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF0gPSB7MH07Ci0gICAgY2hhciBwbGF0Zm9ybV9uYW1lW1BST1BFUlRZX1ZBTFVFX01BWF0gPSB7MH07Ci0gICAgRklMRSAqc29jX2ZpbGUgPSBOVUxMOwotICAgIGNoYXIgYnVmZmVyWzEwXTsKLQotICAgIHByb3BlcnR5X2dldCgicm8uYm9hcmQucGxhdGZvcm0iLCBwbGF0Zm9ybV9uYW1lLCAiMCIpOwotICAgIHByb3BlcnR5X2dldCgidmlkYy5lbmMubmFycm93LnNlYXJjaHJhbmdlIiwgcHJvcGVydHlfdmFsdWUsICIwIik7Ci0gICAgZW5hYmxlX212X25hcnJvd19zZWFyY2hyYW5nZSA9IGF0b2kocHJvcGVydHlfdmFsdWUpOwotCi0gICAgaWYgKCFzdHJuY21wKHBsYXRmb3JtX25hbWUsICJtc204NjEwIiwgNykpIHsKLSAgICAgICAgZGV2aWNlX25hbWUgPSAoT01YX1NUUklORykiL2Rldi92aWRlby9xNl9lbmMiOwotICAgICAgICBzdXBwb3J0ZWRfcmNfbW9kZXMgPSAoUkNfQUxMICYgflJDX0NCUl9DRlIpOwotICAgIH0KLSAgICBtX25Ecml2ZXJfZmQgPSBvcGVuIChkZXZpY2VfbmFtZSwgT19SRFdSKTsKLSAgICBpZiAoKGludCltX25Ecml2ZXJfZmQgPCAwKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogT214X3ZlbmM6OkNvbXAgSW5pdCBSZXR1cm5pbmcgZmFpbHVyZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1fcG9sbF9lZmQgPSBldmVudGZkKDAsIDApOwotICAgIGlmIChtX3BvbGxfZWZkIDwgMCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIG9wZW4gZXZlbnQgZmQoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBERUJVR19QUklOVF9MT1coIm1fbkRyaXZlcl9mZCA9ICV1IiwgKHVuc2lnbmVkIGludCltX25Ecml2ZXJfZmQpOwotCi0gICAgLy8gc2V0IHRoZSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIHRoZSB2aWRlbyBlbmNvZGVyIGRyaXZlcgotICAgIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoID0gT01YX0NPUkVfUUNJRl9XSURUSDsKLSAgICBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQ9IE9NWF9DT1JFX1FDSUZfSEVJR0hUOwotICAgIG1fc1ZlbmNfY2ZnLmR2c193aWR0aCA9IE9NWF9DT1JFX1FDSUZfV0lEVEg7Ci0gICAgbV9zVmVuY19jZmcuZHZzX2hlaWdodCA9IE9NWF9DT1JFX1FDSUZfSEVJR0hUOwotICAgIG1fc1ZlbmNfY2ZnLmZwc19udW0gPSAzMDsKLSAgICBtX3NWZW5jX2NmZy5mcHNfZGVuID0gMTsKLSAgICBtX3NWZW5jX2NmZy50YXJnZXRiaXRyYXRlID0gNjQwMDA7Ci0gICAgbV9zVmVuY19jZmcuaW5wdXRmb3JtYXQ9IFY0TDJfREVGQVVMVF9PVVRQVVRfQ09MT1JfRk1UOwotICAgIG1fcm90YXRpb24ucm90YXRpb24gPSAwOwotICAgIG1fY29kZWMgPSBjb2RlYzsKLQotICAgIGlmIChjb2RlYyA9PSBPTVhfVklERU9fQ29kaW5nQVZDKSB7Ci0gICAgICAgIG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9IFY0TDJfUElYX0ZNVF9IMjY0OwotICAgICAgICBjb2RlY19wcm9maWxlLnByb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0JBU0VMSU5FOwotICAgICAgICBwcm9maWxlX2xldmVsLmxldmVsID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8wOwotICAgICAgICBtaW5xcCA9IDA7Ci0gICAgICAgIG1heHFwID0gNTE7Ci0gICAgfSBlbHNlIGlmIChjb2RlYyA9PSBPTVhfVklERU9fQ29kaW5nVlA4KSB7Ci0gICAgICAgIG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9IFY0TDJfUElYX0ZNVF9WUDg7Ci0gICAgICAgIGNvZGVjX3Byb2ZpbGUucHJvZmlsZSA9IFY0TDJfTVBFR19WSURDX1ZJREVPX1ZQOF9VTlVTRUQ7Ci0gICAgICAgIHByb2ZpbGVfbGV2ZWwubGV2ZWwgPSBWNEwyX01QRUdfVklEQ19WSURFT19WUDhfVkVSU0lPTl8wOwotICAgICAgICBtaW5xcCA9IDA7Ci0gICAgICAgIG1heHFwID0gMTI3OwotICAgIH0gZWxzZSBpZiAoY29kZWMgPT0gT01YX1ZJREVPX0NvZGluZ0hFVkMpIHsKLSAgICAgICAgbV9zVmVuY19jZmcuY29kZWN0eXBlID0gVjRMMl9QSVhfRk1UX0hFVkM7Ci0gICAgICAgIG1pbnFwID0gMDsKLSAgICAgICAgbWF4cXAgPSA1MTsKLSAgICAgICAgY29kZWNfcHJvZmlsZS5wcm9maWxlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19QUk9GSUxFX01BSU47Ci0gICAgICAgIHByb2ZpbGVfbGV2ZWwubGV2ZWwgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX01BSU5fVElFUl9MRVZFTF8xOwotICAgIH0KLSAgICBzZXNzaW9uX2lwYl9xcF92YWx1ZXMubWluX2lfcXAgPSBtaW5xcDsKLSAgICBzZXNzaW9uX2lwYl9xcF92YWx1ZXMubWF4X2lfcXAgPSBtYXhxcDsKLSAgICBzZXNzaW9uX2lwYl9xcF92YWx1ZXMubWluX3BfcXAgPSBtaW5xcDsKLSAgICBzZXNzaW9uX2lwYl9xcF92YWx1ZXMubWF4X3BfcXAgPSBtYXhxcDsKLSAgICBzZXNzaW9uX2lwYl9xcF92YWx1ZXMubWluX2JfcXAgPSBtaW5xcDsKLSAgICBzZXNzaW9uX2lwYl9xcF92YWx1ZXMubWF4X2JfcXAgPSBtYXhxcDsKLQotICAgIGludCByZXQ7Ci0gICAgcmV0ID0gc3Vic2NyaWJlX3RvX2V2ZW50cyhtX25Ecml2ZXJfZmQpOwotCi0gICAgaWYgKHJldCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU3Vic2NyaWJlIEV2ZW50IEZhaWxlZCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RydWN0IHY0bDJfZm10ZGVzYyBmZGVzYzsKLSAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm10OwotICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIGJ1ZnJlcTsKLSAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcDsKLQotICAgIHJldCA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1FVRVJZQ0FQLCAmY2FwKTsKLQotICAgIGlmIChyZXQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBxdWVyeSBjYXBhYmlsaXRpZXMiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9MT1coIkNhcGFiaWxpdGllczogZHJpdmVyX25hbWUgPSAlcywgY2FyZCA9ICVzLCBidXNfaW5mbyA9ICVzLCIKLSAgICAgICAgICAgICAgICAiIHZlcnNpb24gPSAlZCwgY2FwYWJpbGl0aWVzID0gJXgiLCBjYXAuZHJpdmVyLCBjYXAuY2FyZCwKLSAgICAgICAgICAgICAgICBjYXAuYnVzX2luZm8sIGNhcC52ZXJzaW9uLCBjYXAuY2FwYWJpbGl0aWVzKTsKLSAgICB9Ci0KLSAgICByZXQ9MDsKLSAgICBmZGVzYy50eXBlPVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgZmRlc2MuaW5kZXg9MDsKLQotICAgIHdoaWxlIChpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19FTlVNX0ZNVCwgJmZkZXNjKSA9PSAwKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiZm10OiBkZXNjcmlwdGlvbjogJXMsIGZtdDogJXgsIGZsYWdzID0gJXgiLCBmZGVzYy5kZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICBmZGVzYy5waXhlbGZvcm1hdCwgZmRlc2MuZmxhZ3MpOwotICAgICAgICBmZGVzYy5pbmRleCsrOwotICAgIH0KLQotICAgIGZkZXNjLnR5cGU9VjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgIGZkZXNjLmluZGV4PTA7Ci0KLSAgICB3aGlsZSAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfRU5VTV9GTVQsICZmZGVzYykgPT0gMCkgewotICAgICAgICBERUJVR19QUklOVF9MT1coImZtdDogZGVzY3JpcHRpb246ICVzLCBmbXQ6ICV4LCBmbGFncyA9ICV4IiwgZmRlc2MuZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgZmRlc2MucGl4ZWxmb3JtYXQsIGZkZXNjLmZsYWdzKTsKLSAgICAgICAgZmRlc2MuaW5kZXgrKzsKLSAgICB9Ci0KLSAgICBpc190aHVsaXVtX3YxID0gZmFsc2U7Ci0gICAgc29jX2ZpbGU9IGZvcGVuKCIvc3lzL2RldmljZXMvc29jMC9zb2NfaWQiLCAiciIpOwotICAgIGlmIChzb2NfZmlsZSkgewotICAgICAgICBmcmVhZChidWZmZXIsIDEsIDQsIHNvY19maWxlKTsKLSAgICAgICAgZmNsb3NlKHNvY19maWxlKTsKLSAgICAgICAgaWYgKGF0b2koYnVmZmVyKSA9PSAyNDYpIHsKLSAgICAgICAgICAgIHNvY19maWxlID0gZm9wZW4oIi9zeXMvZGV2aWNlcy9zb2MwL3JldmlzaW9uIiwgInIiKTsKLSAgICAgICAgICAgIGlmIChzb2NfZmlsZSkgewotICAgICAgICAgICAgICAgIGZyZWFkKGJ1ZmZlciwgMSwgNCwgc29jX2ZpbGUpOwotICAgICAgICAgICAgICAgIGZjbG9zZShzb2NfZmlsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0b2koYnVmZmVyKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzX3RodWxpdW1fdjEgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJpc190aHVsaXVtX3YxID0gVFJVRSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh2ZW5jX2hhbmRsZS0+aXNfc2VjdXJlX3Nlc3Npb24oKSkgewotICAgICAgICBtX3NPdXRwdXRfYnVmZl9wcm9wZXJ0eS5hbGlnbm1lbnQgPSBTWl8xTTsKLSAgICAgICAgbV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5hbGlnbm1lbnQgID0gU1pfMU07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9zT3V0cHV0X2J1ZmZfcHJvcGVydHkuYWxpZ25tZW50ID0gU1pfNEs7Ci0gICAgICAgIG1fc0lucHV0X2J1ZmZfcHJvcGVydHkuYWxpZ25tZW50ICA9IFNaXzRLOwotICAgIH0KLQotICAgIG1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7Ci0gICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgIGZtdC5mbXQucGl4X21wLmhlaWdodCA9IG1fc1ZlbmNfY2ZnLmR2c19oZWlnaHQ7Ci0gICAgZm10LmZtdC5waXhfbXAud2lkdGggPSBtX3NWZW5jX2NmZy5kdnNfd2lkdGg7Ci0gICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBtX3NWZW5jX2NmZy5jb2RlY3R5cGU7Ci0KLSAgICAvKlRPRE86IFJldHVybiB2YWx1ZXMgbm90IGhhbmRsZWQgcHJvcGVybHkgaW4gdGhpcyBmdW5jdGlvbiBhbnl3aGVyZS4KLSAgICAgKiBOZWVkIHRvIGhhbmRsZSB0aG9zZS4qLwotICAgIHJldCA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfRk1ULCAmZm10KTsKLQotICAgIGlmIChyZXQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgZm9ybWF0IG9uIGNhcHR1cmUgcG9ydCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbV9zT3V0cHV0X2J1ZmZfcHJvcGVydHkuZGF0YXNpemU9Zm10LmZtdC5waXhfbXAucGxhbmVfZm10WzBdLnNpemVpbWFnZTsKLQotICAgIG1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7Ci0gICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7Ci0gICAgZm10LmZtdC5waXhfbXAuaGVpZ2h0ID0gbV9zVmVuY19jZmcuaW5wdXRfaGVpZ2h0OwotICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gbV9zVmVuY19jZmcuaW5wdXRfd2lkdGg7Ci0gICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX0RFRkFVTFRfT1VUUFVUX0NPTE9SX0ZNVDsKLSAgICBmbXQuZm10LnBpeF9tcC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7Ci0KLSAgICByZXQgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0ZNVCwgJmZtdCk7Ci0gICAgbV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5kYXRhc2l6ZT1mbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlOwotCi0gICAgYnVmcmVxLm1lbW9yeSA9IFY0TDJfTUVNT1JZX1VTRVJQVFI7Ci0gICAgYnVmcmVxLmNvdW50ID0gMjsKLQotICAgIGJ1ZnJlcS50eXBlPVY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgICByZXQgPSBpb2N0bChtX25Ecml2ZXJfZmQsVklESU9DX1JFUUJVRlMsICZidWZyZXEpOwotICAgIG1fc0lucHV0X2J1ZmZfcHJvcGVydHkubWluY291bnQgPSBtX3NJbnB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50ID0gYnVmcmVxLmNvdW50OwotCi0gICAgYnVmcmVxLnR5cGU9VjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICBidWZyZXEuY291bnQgPSAyOwotICAgIHJldCA9IGlvY3RsKG1fbkRyaXZlcl9mZCxWSURJT0NfUkVRQlVGUywgJmJ1ZnJlcSk7Ci0gICAgbV9zT3V0cHV0X2J1ZmZfcHJvcGVydHkubWluY291bnQgPSBtX3NPdXRwdXRfYnVmZl9wcm9wZXJ0eS5hY3R1YWxjb3VudCA9IGJ1ZnJlcS5jb3VudDsKLQotICAgIGlmKHZlbmNfaGFuZGxlLT5pc19zZWN1cmVfc2Vzc2lvbigpKSB7Ci0gICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fU0VDVVJFOwotICAgICAgICBjb250cm9sLnZhbHVlID0gMTsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiaW9jdGw6IG9wZW4gc2VjdXJlIGRldmljZSIpOwotICAgICAgICByZXQ9aW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCZjb250cm9sKTsKLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImlvY3RsOiBvcGVuIHNlY3VyZSBkZXYgZmFpbCwgcmMgJWQiLCByZXQpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmVzdW1lX2luX3N0b3BwZWQgPSAwOwotICAgIG1ldGFkYXRhbW9kZSA9IDA7Ci0KLSAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IRUFERVJfTU9ERTsKLSAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0hFQURFUl9NT0RFX1NFUEFSQVRFOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHRvIGRpc2FibGUgc2VxX2hkciBpbiBzeW5jX2ZyYW1lIGlkPSVkLCB2YWw9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLQotICAgIGlmIChpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSkKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgY29udHJvbCIpOwotCi0gICAgc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gZnJtc2l6ZTsKLQotICAgIC8vR2V0IHRoZSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMKLSAgICBtZW1zZXQoKHZvaWQgKikmZnJtc2l6ZSwwLHNpemVvZihmcm1zaXplKSk7Ci0gICAgZnJtc2l6ZS5pbmRleCA9IDA7Ci0gICAgZnJtc2l6ZS5waXhlbF9mb3JtYXQgPSBtX3NWZW5jX2NmZy5jb2RlY3R5cGU7Ci0gICAgcmV0ID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfRU5VTV9GUkFNRVNJWkVTLCAmZnJtc2l6ZSk7Ci0KLSAgICBpZiAocmV0IHx8IGZybXNpemUudHlwZSAhPSBWNEwyX0ZSTVNJWkVfVFlQRV9TVEVQV0lTRSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIGdldCBmcmFtZXNpemVzIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoZnJtc2l6ZS50eXBlID09IFY0TDJfRlJNU0laRV9UWVBFX1NURVBXSVNFKSB7Ci0gICAgICAgIGNhcGFiaWxpdHkubWluX3dpZHRoID0gZnJtc2l6ZS5zdGVwd2lzZS5taW5fd2lkdGg7Ci0gICAgICAgIGNhcGFiaWxpdHkubWF4X3dpZHRoID0gZnJtc2l6ZS5zdGVwd2lzZS5tYXhfd2lkdGg7Ci0gICAgICAgIGNhcGFiaWxpdHkubWluX2hlaWdodCA9IGZybXNpemUuc3RlcHdpc2UubWluX2hlaWdodDsKLSAgICAgICAgY2FwYWJpbGl0eS5tYXhfaGVpZ2h0ID0gZnJtc2l6ZS5zdGVwd2lzZS5tYXhfaGVpZ2h0OwotICAgIH0KLQotICAgIC8vSW5pdGlhbGl6ZSBub24tZGVmYXVsdCBwYXJhbWV0ZXJzCi0gICAgaWYgKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfVlA4KSB7Ci0gICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fTlVNX1BfRlJBTUVTOwotICAgICAgICBjb250cm9sLnZhbHVlID0gMHg3ZmZmZmZmZjsKLSAgICAgICAgaWYgKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKQotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX05VTV9QX0ZSQU1FXG4iKTsKLSAgICB9Ci0KLSNpZmRlZiBfUFFfCi0gICAgaWYgKGNvZGVjID09IE9NWF9WSURFT19Db2RpbmdBVkMgJiYgIW1fcHEuaXNfcHFfZm9yY2VfZGlzYWJsZSkgewotICAgICAgICBtX3BxLmluaXQoVjRMMl9ERUZBVUxUX09VVFBVVF9DT0xPUl9GTVQpOwotICAgICAgICBtX3BxLmdldF9jYXBzKCk7Ci0gICAgfQotI2VuZGlmIC8vIF9QUV8KLQotICAgIC8qIEVuYWJsZSBMb3cgcG93ZXIgbW9kZSBieSBkZWZhdWx0IGZvciBiZXR0ZXIgcG93ZXIgKi8KLQotICAgIGlucHV0X2V4dHJhZGF0YV9pbmZvLnBvcnRfaW5kZXggPSBPVVRQVVRfUE9SVDsKLSAgICBvdXRwdXRfZXh0cmFkYXRhX2luZm8ucG9ydF9pbmRleCA9IENBUFRVUkVfUE9SVDsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgT01YX0VSUk9SVFlQRSB1bnN1YnNjcmliZV90b19ldmVudHMoaW50IGZkKQotewotICAgIE9NWF9FUlJPUlRZUEUgZVJldCA9IE9NWF9FcnJvck5vbmU7Ci0gICAgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uIHN1YjsKLSAgICBpbnQgYXJyYXlfc3ogPSBzaXplb2YoZXZlbnRfdHlwZSkvc2l6ZW9mKGludCk7Ci0gICAgaW50IGkscmM7Ci0KLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgaW5wdXQ6ICVkIiwgZmQpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBhcnJheV9zejsgKytpKSB7Ci0gICAgICAgIG1lbXNldCgmc3ViLCAwLCBzaXplb2Yoc3ViKSk7Ci0gICAgICAgIHN1Yi50eXBlID0gZXZlbnRfdHlwZVtpXTsKLSAgICAgICAgcmMgPSBpb2N0bChmZCwgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5ULCAmc3ViKTsKLQotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byB1bnN1YnNjcmliZSBldmVudDogMHgleCIsIHN1Yi50eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVSZXQ7Ci19Ci0KLXZvaWQgdmVuY19kZXY6OnZlbmNfY2xvc2UoKQotewotICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19jbG9zZTogZmQgPSAldSIsICh1bnNpZ25lZCBpbnQpbV9uRHJpdmVyX2ZkKTsKLQotICAgIGlmICgoaW50KW1fbkRyaXZlcl9mZCA+PSAwKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goInZlbmNfY2xvc2UgRSIpOwotCi0gICAgICAgIGlmKGV2ZW50ZmRfd3JpdGUobV9wb2xsX2VmZCwgMSkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJldmVudGZkX3dyaXRlIGZhaWxlZCBmb3IgZmQ6ICVkLCBlcnJubyA9ICVkLCBmb3JjZSBzdG9wIGFzeW5jX3RocmVhZCIsIG1fcG9sbF9lZmQsIGVycm5vKTsKLSAgICAgICAgICAgIGFzeW5jX3RocmVhZF9mb3JjZV9zdG9wID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhc3luY190aHJlYWRfY3JlYXRlZCkKLSAgICAgICAgICAgIHB0aHJlYWRfam9pbihtX3RpZCxOVUxMKTsKLQotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJ2ZW5jX2Nsb3NlIFgiKTsKLSAgICAgICAgdW5zdWJzY3JpYmVfdG9fZXZlbnRzKG1fbkRyaXZlcl9mZCk7Ci0gICAgICAgIGNsb3NlKG1fcG9sbF9lZmQpOwotICAgICAgICBjbG9zZShtX25Ecml2ZXJfZmQpOwotICAgICAgICBtX25Ecml2ZXJfZmQgPSAtMTsKLSAgICB9Ci0KLSNpZmRlZiBfUFFfCi0gICAgbV9wcS5kZWluaXQoKTsKLSNlbmRpZiAvLyBfUFFfCi0KLSNpZmRlZiBfVlFaSVBfCi0gICAgdnF6aXAuZGVpbml0KCk7Ci0jZW5kaWYKLQotICAgIGlmIChtX2RlYnVnLmluZmlsZSkgewotICAgICAgICBmY2xvc2UobV9kZWJ1Zy5pbmZpbGUpOwotICAgICAgICBtX2RlYnVnLmluZmlsZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1fZGVidWcub3V0ZmlsZSkgewotICAgICAgICBmY2xvc2UobV9kZWJ1Zy5vdXRmaWxlKTsKLSAgICAgICAgbV9kZWJ1Zy5vdXRmaWxlID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobV9kZWJ1Zy5leHRyYWRhdGFmaWxlKSB7Ci0gICAgICAgIGZjbG9zZShtX2RlYnVnLmV4dHJhZGF0YWZpbGUpOwotICAgICAgICBtX2RlYnVnLmV4dHJhZGF0YWZpbGUgPSBOVUxMOwotICAgIH0KLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19zZXRfYnVmX3JlcShPTVhfVTMyICptaW5fYnVmZl9jb3VudCwKLSAgICAgICAgT01YX1UzMiAqYWN0dWFsX2J1ZmZfY291bnQsCi0gICAgICAgIE9NWF9VMzIgKmJ1ZmZfc2l6ZSwKLSAgICAgICAgT01YX1UzMiBwb3J0KQotewotICAgICh2b2lkKW1pbl9idWZmX2NvdW50LCAodm9pZClidWZmX3NpemU7Ci0gICAgdW5zaWduZWQgbG9uZyB0ZW1wX2NvdW50ID0gMDsKLQotICAgIGlmIChwb3J0ID09IDApIHsKLSAgICAgICAgaWYgKCphY3R1YWxfYnVmZl9jb3VudCA+IG1fc0lucHV0X2J1ZmZfcHJvcGVydHkubWluY291bnQpIHsKLSAgICAgICAgICAgIHRlbXBfY291bnQgPSBtX3NJbnB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50OwotICAgICAgICAgICAgbV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5hY3R1YWxjb3VudCA9ICphY3R1YWxfYnVmZl9jb3VudDsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiSS9QIENvdW50IHNldCB0byAldSIsICh1bnNpZ25lZCBpbnQpKmFjdHVhbF9idWZmX2NvdW50KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgqYWN0dWFsX2J1ZmZfY291bnQgPiBtX3NPdXRwdXRfYnVmZl9wcm9wZXJ0eS5taW5jb3VudCkgewotICAgICAgICAgICAgdGVtcF9jb3VudCA9IG1fc091dHB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50OwotICAgICAgICAgICAgbV9zT3V0cHV0X2J1ZmZfcHJvcGVydHkuYWN0dWFsY291bnQgPSAqYWN0dWFsX2J1ZmZfY291bnQ7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIk8vUCBDb3VudCBzZXQgdG8gJXUiLCAodW5zaWduZWQgaW50KSphY3R1YWxfYnVmZl9jb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLQotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX2xvYWRlZF9zdGFydCgpCi17Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfbG9hZGVkX3N0b3AoKQotewotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX2xvYWRlZF9zdGFydF9kb25lKCkKLXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19sb2FkZWRfc3RvcF9kb25lKCkKLXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19nZXRfc2VxX2hkcih2b2lkICpidWZmZXIsCi0gICAgICAgIHVuc2lnbmVkIGJ1ZmZlcl9zaXplLCB1bnNpZ25lZCAqaGVhZGVyX2xlbikKLXsKLSAgICAodm9pZCkgYnVmZmVyLCAodm9pZCkgYnVmZmVyX3NpemUsICh2b2lkKSBoZWFkZXJfbGVuOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX2dldF9kaW1lbnNpb25zKE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfVTMyICp3LCBPTVhfVTMyICpoKSB7Ci0gICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKLSAgICBtZW1zZXQoJmZtdCwgMCwgc2l6ZW9mKGZtdCkpOwotICAgIGZtdC50eXBlID0gcG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUID8gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSA6Ci0gICAgICAgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7Ci0KLSAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfR19GTVQsICZmbXQpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gZ2V0IGZvcm1hdCBvbiAlcyBwb3J0IiwKLSAgICAgICAgICAgICAgICBwb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQgPyAiY2FwdHVyZSIgOiAib3V0cHV0Iik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgKncgPSBmbXQuZm10LnBpeF9tcC53aWR0aDsKLSAgICAqaCA9IGZtdC5mbXQucGl4X21wLmhlaWdodDsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19nZXRfYnVmX3JlcShPTVhfVTMyICptaW5fYnVmZl9jb3VudCwKLSAgICAgICAgT01YX1UzMiAqYWN0dWFsX2J1ZmZfY291bnQsCi0gICAgICAgIE9NWF9VMzIgKmJ1ZmZfc2l6ZSwKLSAgICAgICAgT01YX1UzMiBwb3J0KQotewotICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7Ci0gICAgdW5zaWduZWQgaW50IGJ1Zl9zaXplID0gMCwgZXh0cmFfZGF0YV9zaXplID0gMCwgY2xpZW50X2V4dHJhX2RhdGFfc2l6ZSA9IDA7Ci0gICAgaW50IHJldDsKLSAgICBpbnQgZXh0cmFfaWR4ID0gMDsKLSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0gICAgdW5zaWduZWQgaW50IG1pbkNvdW50ID0gMDsKLQotICAgIG1lbXNldCgmY29udHJvbCwgMCwgc2l6ZW9mKGNvbnRyb2wpKTsKLSAgICBtZW1zZXQoJmZtdCwgMCwgc2l6ZW9mKGZtdCkpOwotCi0gICAgaWYgKHBvcnQgPT0gMCkgewotICAgICAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgICAgICAgZm10LmZtdC5waXhfbXAuaGVpZ2h0ID0gbV9zVmVuY19jZmcuaW5wdXRfaGVpZ2h0OwotICAgICAgICBmbXQuZm10LnBpeF9tcC53aWR0aCA9IG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoOwotICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0OwotICAgICAgICBmbXQuZm10LnBpeF9tcC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7Ci0gICAgICAgIHJldCA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmZm10KTsKLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInNldCBmb3JtYXQgZmFpbGVkLCB0eXBlICVkLCB3eGggJWR4JWQsIGZvcm1hdCAlI3gsIGNvbG9yc3BhY2UgJWRcbiIsCi0gICAgICAgICAgICAgICAgZm10LnR5cGUsIGZtdC5mbXQucGl4X21wLndpZHRoLCBmbXQuZm10LnBpeF9tcC5oZWlnaHQsCi0gICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQsIGZtdC5mbXQucGl4X21wLmNvbG9yc3BhY2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1fc0lucHV0X2J1ZmZfcHJvcGVydHkuZGF0YXNpemU9Zm10LmZtdC5waXhfbXAucGxhbmVfZm10WzBdLnNpemVpbWFnZTsKLQotICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX09VVFBVVDsKLSAgICAgICAgcmV0ID0gaW9jdGwobV9uRHJpdmVyX2ZkLCAgVklESU9DX0dfQ1RSTCwgJmNvbnRyb2wpOwotICAgICAgICBpZiAocmV0IHx8ICh1bnNpZ25lZCBpbnQpY29udHJvbC52YWx1ZSA+IE1BWF9WNEwyX0JVRlMpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJEcml2ZXIgcmV0dXJuZWQgaW52YWxpZCBkYXRhLCBwb3J0ID0gJWQgcmV0ID0gJWQgQ291bnQgPSAlZCIsCi0gICAgICAgICAgICAgICAgcG9ydCwgcmV0LCAodW5zaWduZWQgaW50KWNvbnRyb2wudmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5jcmVhc2UgYnVmZmVyLWhlYWRlciBjb3VudCBmb3IgbWV0YWRhdGEtbW9kZSBvbiBpbnB1dCBwb3J0Ci0gICAgICAgIC8vIHRvIGltcHJvdmUgYnVmZmVyaW5nIGFuZCByZWR1Y2UgYm90dGxlbmVja3MgaW4gY2xpZW50cwotICAgICAgICBpZiAobWV0YWRhdGFtb2RlKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkZXIHJldHVybmVkIGJ1ZmZlciBjb3VudCA9ICVkICwgb3ZlcndyaXRpbmcgd2l0aCA5IiwKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgICAgIG1pbkNvdW50ID0gOTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQgKiBtX3NWZW5jX2NmZy5pbnB1dF93aWR0aCA+PSAzODQwKjIxNjApIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiSW5jcmVhc2luZyBidWZmZXIgY291bnQgPSAlZCB0byAxMSIsIG1pbkNvdW50KTsKLSAgICAgICAgICAgIG1pbkNvdW50ID0gMTE7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXF1ZXN0IE1BWF9WNEwyX0JVRlMgZnJvbSBWNEwyIGluIGJhdGNoIG1vZGUuCi0gICAgICAgIC8vIEtlZXAgdGhlIG9yaWdpbmFsIGNvdW50IGZvciB0aGUgY2xpZW50Ci0gICAgICAgIGlmIChtZXRhZGF0YW1vZGUgJiYgbUJhdGNoU2l6ZSkgewotICAgICAgICAgICAgbWluQ291bnQgPSBNQVhfVjRMMl9CVUZTOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXQgYnVmZmVyIGNvdW50ID0gJWQgYXMgbWV0YWRhdGEgbW9kZSBhbmQgYmF0Y2htb2RlIGVuYWJsZWQiLCBtaW5Db3VudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtaW5Db3VudCA9IE1BWCgodW5zaWduZWQgaW50KWNvbnRyb2wudmFsdWUsIG1pbkNvdW50KTsKLSAgICAgICAgbV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5taW5jb3VudCA9IG1pbkNvdW50OwotCi0gICAgICAgIGZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICBmbXQuZm10LnBpeF9tcC5oZWlnaHQgPSBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQ7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gbV9zVmVuY19jZmcuaW5wdXRfd2lkdGg7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gbV9zVmVuY19jZmcuaW5wdXRmb3JtYXQ7Ci0gICAgICAgIHJldCA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmZm10KTsKLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImdldCBmb3JtYXQgZmFpbGVkLCB0eXBlICVkLCB3eGggJWR4JWQsIGZvcm1hdCAlI3hcbiIsCi0gICAgICAgICAgICAgICAgZm10LnR5cGUsIGZtdC5mbXQucGl4X21wLndpZHRoLCBmbXQuZm10LnBpeF9tcC5oZWlnaHQsCi0gICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1fc0lucHV0X2J1ZmZfcHJvcGVydHkuZGF0YXNpemU9Zm10LmZtdC5waXhfbXAucGxhbmVfZm10WzBdLnNpemVpbWFnZTsKLQotICAgICAgICBpZiAobV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5hY3R1YWxjb3VudCA8IG1fc0lucHV0X2J1ZmZfcHJvcGVydHkubWluY291bnQpCi0gICAgICAgICAgICBtX3NJbnB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50ID0gbV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5taW5jb3VudDsKLQotICAgICAgICAqbWluX2J1ZmZfY291bnQgPSBtX3NJbnB1dF9idWZmX3Byb3BlcnR5Lm1pbmNvdW50OwotICAgICAgICAqYWN0dWFsX2J1ZmZfY291bnQgPSBtX3NJbnB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50OwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgLy8gRm9yIElPTiBtZW1vcnkgYWxsb2NhdGlvbnMgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIgc2l6ZQotICAgICAgICAvLyBtdXN0IGJlIDRrIGFsaWduZWQsIGhlbmNlIGFsaWduaW5nIHRoZSBpbnB1dCBidWZmZXIKLSAgICAgICAgLy8gc2l6ZSB0byA0ay4KLSAgICAgICAgbV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5kYXRhc2l6ZSA9IEFMSUdOKG1fc0lucHV0X2J1ZmZfcHJvcGVydHkuZGF0YXNpemUsIFNaXzRLKTsKLSNlbmRpZgotICAgICAgICAqYnVmZl9zaXplID0gbV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5kYXRhc2l6ZTsKLSAgICAgICAgbnVtX2lucHV0X3BsYW5lcyA9IGZtdC5mbXQucGl4X21wLm51bV9wbGFuZXM7Ci0gICAgICAgIGV4dHJhX2lkeCA9IEVYVFJBREFUQV9JRFgobnVtX2lucHV0X3BsYW5lcyk7Ci0KLSAgICAgICAgaWYgKGV4dHJhX2lkeCAmJiAoZXh0cmFfaWR4IDwgVklERU9fTUFYX1BMQU5FUykpIHsKLSAgICAgICAgICAgIGV4dHJhX2RhdGFfc2l6ZSA9ICBmbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbZXh0cmFfaWR4XS5zaXplaW1hZ2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXh0cmFfaWR4ID49IFZJREVPX01BWF9QTEFORVMpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFeHRyYWRhdGEgaW5kZXggaXMgbW9yZSB0aGFuIGFsbG93ZWQ6ICVkXG4iLCBleHRyYV9pZHgpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgICAgICBpbnB1dF9leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZSA9ICBBTElHTihleHRyYV9kYXRhX3NpemUsIFNaXzRLKTsKLSAgICAgICAgaW5wdXRfZXh0cmFkYXRhX2luZm8uY291bnQgPSBNQVhfVjRMMl9CVUZTOwotICAgICAgICBpbnB1dF9leHRyYWRhdGFfaW5mby5zaXplID0gaW5wdXRfZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemUgKiBpbnB1dF9leHRyYWRhdGFfaW5mby5jb3VudDsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBleHRyYV9pZHggPSAwOwotICAgICAgICBtZW1zZXQoJmZtdCwgMCwgc2l6ZW9mKGZtdCkpOwotICAgICAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLmhlaWdodCA9IG1fc1ZlbmNfY2ZnLmR2c19oZWlnaHQ7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gbV9zVmVuY19jZmcuZHZzX3dpZHRoOwotICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZTsKLQotICAgICAgICByZXQgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0ZNVCwgJmZtdCk7Ci0gICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXQgZm9ybWF0IGZhaWxlZCwgdHlwZSAlZCwgd3hoICVkeCVkLCBmb3JtYXQgJSN4XG4iLAotICAgICAgICAgICAgICAgIGZtdC50eXBlLCBmbXQuZm10LnBpeF9tcC53aWR0aCwgZm10LmZtdC5waXhfbXAuaGVpZ2h0LAotICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0KTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1fc091dHB1dF9idWZmX3Byb3BlcnR5LmRhdGFzaXplPWZtdC5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5zaXplaW1hZ2U7Ci0gICAgICAgIGZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICAgICAgZm10LmZtdC5waXhfbXAuaGVpZ2h0ID0gbV9zVmVuY19jZmcuZHZzX2hlaWdodDsKLSAgICAgICAgZm10LmZtdC5waXhfbXAud2lkdGggPSBtX3NWZW5jX2NmZy5kdnNfd2lkdGg7Ci0gICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gbV9zVmVuY19jZmcuY29kZWN0eXBlOwotCi0gICAgICAgIHJldCA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX0dfRk1ULCAmZm10KTsKLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoImdldCBmb3JtYXQgZmFpbGVkLCB0eXBlICVkLCB3eGggJWR4JWQsIGZvcm1hdCAlI3hcbiIsCi0gICAgICAgICAgICAgICAgZm10LnR5cGUsIGZtdC5mbXQucGl4X21wLndpZHRoLCBmbXQuZm10LnBpeF9tcC5oZWlnaHQsCi0gICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1fc091dHB1dF9idWZmX3Byb3BlcnR5LmRhdGFzaXplPWZtdC5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5zaXplaW1hZ2U7Ci0KLSAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9DQVBUVVJFOwotCi0gICAgICAgIHJldCA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgIFZJRElPQ19HX0NUUkwsICZjb250cm9sKTsKLSAgICAgICAgaWYgKHJldCB8fCAodW5zaWduZWQgaW50KWNvbnRyb2wudmFsdWUgPiBNQVhfVjRMMl9CVUZTKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRHJpdmVyIHJldHVybmVkIGludmFsaWQgZGF0YSBwb3J0ID0gJWQgcmV0ID0gJWQgQ291bnQgPSAlZCIsCi0gICAgICAgICAgICAgICAgcG9ydCwgcmV0LCAodW5zaWduZWQgaW50KWNvbnRyb2wudmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1pbkNvdW50ID0gY29udHJvbC52YWx1ZTsKLQotICAgICAgICBpZiAobUJhdGNoU2l6ZSkgewotICAgICAgICAgICAgLy8gSWYgd2UncmUgaW4gYmF0Y2ggbW9kZSwgd2UnZCBsaWtlIHRvIGVuZCB1cCBpbiBhIHNpdHVhdGlvbiB3aGVyZQotICAgICAgICAgICAgLy8gZHJpdmVyIGlzIGFibGUgdG8gb3duIG1CYXRjaFNpemUgYnVmZmVycyBhbmQgd2UnZCBhbHNvIG93biBhdGxlYXN0Ci0gICAgICAgICAgICAvLyBtQmF0Y2hTaXplIGJ1ZmZlcnMKLSAgICAgICAgICAgIG1pbkNvdW50ID0gTUFYKCh1bnNpZ25lZCBpbnQpY29udHJvbC52YWx1ZSwgbUJhdGNoU2l6ZSkgKyBtQmF0Y2hTaXplOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJzZXQgbWluIGNvdW50ICVkIGFzIG1CYXRjaFNpemUgJWQiLCBtaW5Db3VudCwgbUJhdGNoU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9zT3V0cHV0X2J1ZmZfcHJvcGVydHkubWluY291bnQgPSBtaW5Db3VudDsKLQotICAgICAgICBpZiAobV9zT3V0cHV0X2J1ZmZfcHJvcGVydHkuYWN0dWFsY291bnQgPCBtX3NPdXRwdXRfYnVmZl9wcm9wZXJ0eS5taW5jb3VudCkKLSAgICAgICAgICAgIG1fc091dHB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50ID0gbV9zT3V0cHV0X2J1ZmZfcHJvcGVydHkubWluY291bnQ7Ci0KLSAgICAgICAgKm1pbl9idWZmX2NvdW50ID0gbV9zT3V0cHV0X2J1ZmZfcHJvcGVydHkubWluY291bnQ7Ci0gICAgICAgICphY3R1YWxfYnVmZl9jb3VudCA9IG1fc091dHB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50OwotICAgICAgICAqYnVmZl9zaXplID0gbV9zT3V0cHV0X2J1ZmZfcHJvcGVydHkuZGF0YXNpemU7Ci0gICAgICAgIG51bV9vdXRwdXRfcGxhbmVzID0gZm10LmZtdC5waXhfbXAubnVtX3BsYW5lczsKLSAgICAgICAgZXh0cmFfaWR4ID0gRVhUUkFEQVRBX0lEWChudW1fb3V0cHV0X3BsYW5lcyk7Ci0KLSAgICAgICAgaWYgKGV4dHJhX2lkeCAmJiAoZXh0cmFfaWR4IDwgVklERU9fTUFYX1BMQU5FUykpIHsKLSAgICAgICAgICAgIGV4dHJhX2RhdGFfc2l6ZSA9ICBmbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbZXh0cmFfaWR4XS5zaXplaW1hZ2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXh0cmFfaWR4ID49IFZJREVPX01BWF9QTEFORVMpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFeHRyYWRhdGEgaW5kZXggaXMgbW9yZSB0aGFuIGFsbG93ZWQ6ICVkIiwgZXh0cmFfaWR4KTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRwdXRfZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemUgPSBleHRyYV9kYXRhX3NpemU7Ci0gICAgICAgIG91dHB1dF9leHRyYWRhdGFfaW5mby5jb3VudCA9IG1fc091dHB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50OwotICAgICAgICBvdXRwdXRfZXh0cmFkYXRhX2luZm8uc2l6ZSA9IG91dHB1dF9leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZSAqIG91dHB1dF9leHRyYWRhdGFfaW5mby5jb3VudDsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJ2ZW5jX2dldF9idWZfcmVxOiBwb3J0ICVkLCB3eGggJWR4JWQsIGZvcm1hdCAlI3gsIGRyaXZlciBtaW4gY291bnQgJWQsICIKLSAgICAgICAgInVwZGF0ZWQgbWluIGNvdW50ICVkLCBhY3QgY291bnQgJWQsIHNpemUgJWQsIG51bSBwbGFuZXMgJWQiLAotICAgICAgICBwb3J0LCBmbXQuZm10LnBpeF9tcC53aWR0aCwgZm10LmZtdC5waXhfbXAuaGVpZ2h0LCBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCwKLSAgICAgICAgY29udHJvbC52YWx1ZSwgKm1pbl9idWZmX2NvdW50LCAqYWN0dWFsX2J1ZmZfY291bnQsICpidWZmX3NpemUsIGZtdC5mbXQucGl4X21wLm51bV9wbGFuZXMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X3BhcmFtKHZvaWQgKnBhcmFtRGF0YSwgT01YX0lOREVYVFlQRSBpbmRleCkKLXsKLSAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3BhcmFtIGluZGV4IDB4JXgiLCBpbmRleCk7Ci0gICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKLSAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyBidWZyZXE7Ci0gICAgaW50IHJldDsKLSAgICBib29sIGlzQ0JSOwotCi0gICAgc3dpdGNoICgoaW50KWluZGV4KSB7Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmbjsKLSAgICAgICAgICAgICAgICBwb3J0RGVmbiA9IChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopIHBhcmFtRGF0YTsKLQotICAgICAgICAgICAgICAgIGlmIChwb3J0RGVmbi0+blBvcnRJbmRleCA9PSBQT1JUX0lOREVYX0lOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfZW5jb2RlX2ZyYW1lcmF0ZShwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBfUFFfCi0gICAgICAgICAgICAgICAgICAgIHZlbmNfdHJ5X2VuYWJsZV9wcSgpOwotICNlbmRpZiAvLyBfUFFfCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZV9tdl9uYXJyb3dfc2VhcmNocmFuZ2UgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChtX3NWZW5jX2NmZy5pbnB1dF93aWR0aCAqIG1fc1ZlbmNfY2ZnLmlucHV0X2hlaWdodCkgPj0KLSAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfQ09SRV8xMDgwUF9XSURUSCAqIE9NWF9DT1JFXzEwODBQX0hFSUdIVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF9zZWFyY2hyYW5nZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBGYWlsZWQgdG8gc2V0IHNlYXJjaCByYW5nZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnB1dGZvcm1hdCA9IHZlbmNfZ2V0X2NvbG9yX2Zvcm1hdChwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fc1ZlbmNfY2ZnLmlucHV0X2hlaWdodCAhPSBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoICE9IHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NJbnB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50ICE9IHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NWZW5jX2NmZy5pbnB1dGZvcm1hdCAhPSBpbnB1dGZvcm1hdCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3BhcmFtOiBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiBwb3J0OiAldSwgV3hIICVsdXglbHUgLS0+ICV1eCV1LCBjb3VudCAlbHUgLS0+ICV1LCBmb3JtYXQgJSNseCAtLT4gJSNseCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydERlZm4tPm5Qb3J0SW5kZXgsIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoLCBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwgcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5hY3R1YWxjb3VudCwgcG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NWZW5jX2NmZy5pbnB1dGZvcm1hdCwgaW5wdXRmb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCA8IG1fc0lucHV0X2J1ZmZfcHJvcGVydHkubWluY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkFjdHVhbCBjb3VudCAldSBpcyBsZXNzIHRoYW4gZHJpdmVyIG1pbmNvdW50ICVsdSBvbiBwb3J0ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCwgbV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5taW5jb3VudCwgcG9ydERlZm4tPm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgbV9zVmVuY19jZmcuaW5wdXRfaGVpZ2h0ID0gcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3NWZW5jX2NmZy5pbnB1dF93aWR0aCA9IHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3NWZW5jX2NmZy5pbnB1dGZvcm1hdCA9IGlucHV0Zm9ybWF0OwotICAgICAgICAgICAgICAgICAgICAgICAgbV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5hY3R1YWxjb3VudCA9IHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLmhlaWdodCA9IG1fc1ZlbmNfY2ZnLmlucHV0X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gbV9zVmVuY19jZmcuaW5wdXRfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfRk1ULCAmZm10KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzZXQgZm9ybWF0IGZhaWxlZCwgdHlwZSAlZCwgd3hoICVkeCVkLCBwaXhlbGZvcm1hdCAlI3gsIGNvbG9yc3BhY2UgJSN4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC50eXBlLCBmbXQuZm10LnBpeF9tcC53aWR0aCwgZm10LmZtdC5waXhfbXAuaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQsIGZtdC5mbXQucGl4X21wLmNvbG9yc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3X292ZXJsb2FkID0gZXJybm8gPT0gRUJVU1k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbV9zSW5wdXRfYnVmZl9wcm9wZXJ0eS5kYXRhc2l6ZT1mbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBidWZyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnJlcS5jb3VudCA9IHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZyZXEudHlwZT1WNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLFZJRElPQ19SRVFCVUZTLCAmYnVmcmVxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJyZXFidWZzIGZhaWxlZCwgdHlwZSAlZCwgY291bnQgJWQiLCBidWZyZXEudHlwZSwgYnVmcmVxLmNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1faW5wdXRfcGxhbmVzID4gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9leHRyYWRhdGFfaW5mby5jb3VudCA9IG1fc0lucHV0X2J1ZmZfcHJvcGVydHkuYWN0dWFsY291bnQgKyAxOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3BhcmFtOiBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiBwYXJhbWV0ZXJzIG5vdCBjaGFuZ2VkIG9uIHBvcnQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9ydERlZm4tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQpIHsKLQotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvZGVjdHlwZSA9IHZlbmNfZ2V0X2NvZGVjdHlwZShwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fc1ZlbmNfY2ZnLmR2c19oZWlnaHQgIT0gcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NWZW5jX2NmZy5kdnNfd2lkdGggIT0gcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc091dHB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50ICE9IHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NWZW5jX2NmZy5jb2RlY3R5cGUgIT0gY29kZWN0eXBlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfcGFyYW06IE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb246IHBvcnQ6ICV1LCBXeEggJWx1eCVsdSAtLT4gJXV4JXUsIGNvdW50ICVsdSAtLT4gJXUsIGZvcm1hdCAlI2x4IC0tPiAlI2x4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0RGVmbi0+blBvcnRJbmRleCwgbV9zVmVuY19jZmcuZHZzX3dpZHRoLCBtX3NWZW5jX2NmZy5kdnNfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsIHBvcnREZWZuLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc0lucHV0X2J1ZmZfcHJvcGVydHkuYWN0dWFsY291bnQsIHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zVmVuY19jZmcuY29kZWN0eXBlLCBjb2RlY3R5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydERlZm4tPm5CdWZmZXJDb3VudEFjdHVhbCA8IG1fc091dHB1dF9idWZmX3Byb3BlcnR5Lm1pbmNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJBY3R1YWwgY291bnQgJXUgaXMgbGVzcyB0aGFuIGRyaXZlciBtaW5jb3VudCAlbHUgb24gcG9ydCAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uQnVmZmVyQ291bnRBY3R1YWwsIG1fc091dHB1dF9idWZmX3Byb3BlcnR5Lm1pbmNvdW50LCBwb3J0RGVmbi0+blBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3NWZW5jX2NmZy5kdnNfaGVpZ2h0ID0gcG9ydERlZm4tPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3NWZW5jX2NmZy5kdnNfd2lkdGggPSBwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9zVmVuY19jZmcuY29kZWN0eXBlID0gY29kZWN0eXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9zT3V0cHV0X2J1ZmZfcHJvcGVydHkuYWN0dWFsY291bnQgPSBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJmZtdCwgMCwgc2l6ZW9mKGZtdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAuaGVpZ2h0ID0gbV9zVmVuY19jZmcuZHZzX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gbV9zVmVuY19jZmcuZHZzX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBtX3NWZW5jX2NmZy5jb2RlY3R5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19GTVQsICZmbXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInNldCBmb3JtYXQgZmFpbGVkLCB0eXBlICVkLCB3eGggJWR4JWQsIHBpeGVsZm9ybWF0ICUjeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQudHlwZSwgZm10LmZtdC5waXhfbXAud2lkdGgsIGZtdC5mbXQucGl4X21wLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBod19vdmVybG9hZCA9IGVycm5vID09IEVCVVNZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fc091dHB1dF9idWZmX3Byb3BlcnR5LmRhdGFzaXplID0gZm10LmZtdC5waXhfbXAucGxhbmVfZm10WzBdLnNpemVpbWFnZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2ZW5jX3NldF90YXJnZXRfYml0cmF0ZShwb3J0RGVmbi0+Zm9ybWF0LnZpZGVvLm5CaXRyYXRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgYnVmcmVxLm1lbW9yeSA9IFY0TDJfTUVNT1JZX1VTRVJQVFI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZyZXEuY291bnQgPSBwb3J0RGVmbi0+bkJ1ZmZlckNvdW50QWN0dWFsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVmcmVxLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKG1fbkRyaXZlcl9mZCxWSURJT0NfUkVRQlVGUywgJmJ1ZnJlcSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigicmVxYnVmcyBmYWlsZWQsIHR5cGUgJWQsIGNvdW50ICVkIiwgYnVmcmVxLnR5cGUsIGJ1ZnJlcS5jb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtX291dHB1dF9wbGFuZXMgPiAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9leHRyYWRhdGFfaW5mby5jb3VudCA9IG1fc091dHB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50OwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3BhcmFtOiBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiBwYXJhbWV0ZXJzIG5vdCBjaGFuZ2VkIG9uIHBvcnQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnREZWZuLT5uUG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogSW52YWxpZCBQb3J0IEluZGV4ICglZCkgZm9yIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24iLCBwb3J0RGVmbi0+blBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpwb3J0Rm10OwotICAgICAgICAgICAgICAgIHBvcnRGbXQgPShPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX3NldF9wYXJhbTogT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQiKTsKLQotICAgICAgICAgICAgICAgIGlmIChwb3J0Rm10LT5uUG9ydEluZGV4ID09IChPTVhfVTMyKSBQT1JUX0lOREVYX0lOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfY29sb3JfZm9ybWF0KHBvcnRGbXQtPmVDb2xvckZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9ydEZtdC0+blBvcnRJbmRleCA9PSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF2ZW5jX3NldF9lbmNvZGVfZnJhbWVyYXRlKHBvcnRGbXQtPnhGcmFtZXJhdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEludmFsaWQgUG9ydCBJbmRleCBmb3IgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgX1BRXwotICAgICAgICAgICAgICAgIHZlbmNfdHJ5X2VuYWJsZV9wcSgpOwotI2VuZGlmIC8vIF9QUV8KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUqIHBQYXJhbTsKLSAgICAgICAgICAgICAgICBwUGFyYW0gPSAoT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX3NldF9wYXJhbTogT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUiKTsKLQotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfdGFyZ2V0X2JpdHJhdGUocFBhcmFtLT5uVGFyZ2V0Qml0cmF0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVGFyZ2V0IEJpdCBSYXRlIHNldHRpbmcgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXZlbmNfc2V0X3JhdGVjdHJsX2NmZyhwUGFyYW0tPmVDb250cm9sUmF0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogUmF0ZSBDb250cm9sIHNldHRpbmcgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBfUFFfCi0gICAgICAgICAgICAgICAgICAgIHZlbmNfdHJ5X2VuYWJsZV9wcSgpOwotI2VuZGlmIC8vIF9QUV8KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEludmFsaWQgUG9ydCBJbmRleCBmb3IgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfcGFyYW06T01YX0luZGV4UGFyYW1WaWRlb0F2YyIpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKiBwUGFyYW0gPSAoT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBPTVhfVTMyIGJGcmFtZXMgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+blBvcnRJbmRleCA9PSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJwUGFyYW0tPmVQcm9maWxlIDolZCAscFBhcmFtLT5lTGV2ZWwgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+ZVByb2ZpbGUscFBhcmFtLT5lTGV2ZWwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfcHJvZmlsZSAocFBhcmFtLT5lUHJvZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVW5zdWNjZXNzZnVsIGluIHVwZGF0aW5nIFByb2ZpbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmVQcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocFBhcmFtLT5lUHJvZmlsZSAhPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUGFyYW0tPmVQcm9maWxlICE9IChPTVhfVklERU9fQVZDUFJPRklMRVRZUEUpIE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFBhcmFtLT5lUHJvZmlsZSAhPSAoT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFKSBRT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5CRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGcmFtZXMgPSBwUGFyYW0tPm5CRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+bkJGcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIldhcm5pbmc6IEIgZnJhbWVzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZyYW1lcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIXZlbmNfc2V0X2xldmVsKE9NWF9WSURFT19MRVZFTF9VTktOT1dOKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBVbnN1Y2Nlc3NmdWwgaW4gdXBkYXRpbmcgbGV2ZWwgdG8gdW5rbm93biIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCF2ZW5jX3NldF9pbnRyYV9wZXJpb2QgKHBQYXJhbS0+blBGcmFtZXMsIGJGcmFtZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFJlcXVlc3QgZm9yIHNldHRpbmcgaW50cmEgcGVyaW9kIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCF2ZW5jX3NldF9lbnRyb3B5X2NvbmZpZyAocFBhcmFtLT5iRW50cm9weUNvZGluZ0NBQkFDLCBwUGFyYW0tPm5DYWJhY0luaXRJZGMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFJlcXVlc3QgZm9yIHNldHRpbmcgRW50cm9weSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfaW5sb29wX2ZpbHRlciAocFBhcmFtLT5lTG9vcEZpbHRlck1vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFJlcXVlc3QgZm9yIHNldHRpbmcgSW5sb29wIGZpbHRlciBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfbXVsdGlzbGljZV9jZmcoVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NJQ0VfTU9ERV9NQVhfTUIsIHBQYXJhbS0+blNsaWNlSGVhZGVyU3BhY2luZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJXQVJOSU5HOiBVbnN1Y2Nlc3NmdWwgaW4gdXBkYXRpbmcgc2xpY2VfY29uZmlnIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEludmFsaWQgUG9ydCBJbmRleCBmb3IgT01YX0luZGV4UGFyYW1WaWRlb0F2YyIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vVEJELCBsb3Qgb2Ygb3RoZXIgdmFyaWFibGVzIHRvIGJlIHVwZGF0ZWQsIHlldCB0byBkZWNpZGUKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbVZpZGVvVnA4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfcGFyYW06T01YX0luZGV4UGFyYW1WaWRlb1ZwOCIpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9WUDhUWVBFKiBwUGFyYW0gPSAoT01YX1ZJREVPX1BBUkFNX1ZQOFRZUEUqKXBhcmFtRGF0YTsKLQotICAgICAgICAgICAgICAgIC8vVE9ETzogU2V0IFZQOCBsZXZlbC9wcm9maWxlIGN1cnJlbnRseSBiYXNlZCBvbiBkcml2ZXIgY2hhbmdlCi0gICAgICAgICAgICAgICAgaWYgKCF2ZW5jX3NldF9wcm9maWxlIChwUGFyYW0tPmVQcm9maWxlKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFVuc3VjY2Vzc2Z1bCBpbiB1cGRhdGluZyBQcm9maWxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmVQcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXZlbmNfc2V0X2xldmVsIChPTVhfVklERU9fTEVWRUxfVU5LTk9XTikpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBVbnN1Y2Nlc3NmdWwgaW4gdXBkYXRpbmcgbGV2ZWwgdG8gdW5rbm93biIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHZlbmNfc2V0X3ZweF9lcnJvcl9yZXNpbGllbmNlKHBQYXJhbS0+YkVycm9yUmVzaWxpZW50TW9kZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBGYWlsZWQgdG8gc2V0IHZweCBlcnJvciByZXNpbGllbmNlIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9IZXZjOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfcGFyYW06T01YX0luZGV4UGFyYW1WaWRlb0hldmMiKTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fSEVWQ1RZUEUqIHBQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fSEVWQ1RZUEUqKXBhcmFtRGF0YTsKLQotICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfcHJvZmlsZSAocFBhcmFtLT5lUHJvZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBVbnN1Y2Nlc3NmdWwgaW4gdXBkYXRpbmcgUHJvZmlsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5lUHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCF2ZW5jX3NldF9sZXZlbCAoT01YX1ZJREVPX0xFVkVMX1VOS05PV04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVW5zdWNjZXNzZnVsIGluIHVwZGF0aW5nIGxldmVsIHRvIHVua25vd24iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXZlbmNfc2V0X2lubG9vcF9maWx0ZXIoT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGUpKQotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJXQVJOOiBSZXF1ZXN0IGZvciBzZXR0aW5nIElubG9vcCBmaWx0ZXIgZmFpbGVkIGZvciBIRVZDIGVuY29kZXIiKTsKLQotICAgICAgICAgICAgICAgIE9NWF9VMzIgZnBzID0gbV9zVmVuY19jZmcuZnBzX251bSA/IG1fc1ZlbmNfY2ZnLmZwc19udW0gLyBtX3NWZW5jX2NmZy5mcHNfZGVuIDogMzA7Ci0gICAgICAgICAgICAgICAgT01YX1UzMiBuUEZyYW1lcyA9IHBQYXJhbS0+bktleUZyYW1lSW50ZXJ2YWwgPiAwID8gcFBhcmFtLT5uS2V5RnJhbWVJbnRlcnZhbCAtIDEgOiBmcHMgLSAxOwotICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfaW50cmFfcGVyaW9kIChuUEZyYW1lcywgMCAvKiBuQkZyYW1lcyAqLykpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBSZXF1ZXN0IGZvciBzZXR0aW5nIGludHJhIHBlcmlvZCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvSW50cmFSZWZyZXNoOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfcGFyYW06T01YX0luZGV4UGFyYW1WaWRlb0ludHJhUmVmcmVzaCIpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFICppbnRyYV9yZWZyZXNoID0KLSAgICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFICopcGFyYW1EYXRhOwotCi0gICAgICAgICAgICAgICAgaWYgKGludHJhX3JlZnJlc2gtPm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF9pbnRyYV9yZWZyZXNoKGludHJhX3JlZnJlc2gtPmVSZWZyZXNoTW9kZSwgaW50cmFfcmVmcmVzaC0+bkNpck1CcykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBJbnRyYSByZWZyZXNoIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJbnZhbGlkIFBvcnQgSW5kZXggZm9yIE9NWF9JbmRleFBhcmFtVmlkZW9JbnRyYVJlZnJlc2giKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfcGFyYW06T01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbiIpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICplcnJvcl9yZXNpbGllbmNlID0KLSAgICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICopcGFyYW1EYXRhOwotCi0gICAgICAgICAgICAgICAgaWYgKGVycm9yX3Jlc2lsaWVuY2UtPm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF9lcnJvcl9yZXNpbGllbmNlKGVycm9yX3Jlc2lsaWVuY2UpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgSW50cmEgcmVmcmVzaCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogSW52YWxpZCBQb3J0IEluZGV4IGZvciBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX3NldF9wYXJhbTpPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudCIpOwotICAgICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwcm9maWxlX2xldmVsID0KLSAgICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcGFyYW1EYXRhOwotCi0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVfbGV2ZWwtPm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfcHJvZmlsZShwcm9maWxlX2xldmVsLT5lUHJvZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJXQVJOSU5HOiBVbnN1Y2Nlc3NmdWwgaW4gdXBkYXRpbmcgUHJvZmlsZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfbGV2ZWwocHJvZmlsZV9sZXZlbC0+ZUxldmVsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIldBUk5JTkc6IFVuc3VjY2Vzc2Z1bCBpbiB1cGRhdGluZyBsZXZlbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJbnZhbGlkIFBvcnQgSW5kZXggZm9yIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50Iik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1F1YW50aXphdGlvbjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3BhcmFtOk9NWF9JbmRleFBhcmFtVmlkZW9RdWFudGl6YXRpb24iKTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSAqc2Vzc2lvbl9xcCA9Ci0gICAgICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSAqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbl9xcC0+blBvcnRJbmRleCA9PSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZlbmNfc2V0X3FwKHNlc3Npb25fcXAtPm5RcEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25fcXAtPm5RcFAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25fcXAtPm5RcEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9JX1FQIHwgRU5BQkxFX1BfUVAgfCBFTkFCTEVfQl9RUCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBTZXNzaW9uIFFQIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJbnZhbGlkIFBvcnQgSW5kZXggZm9yIE9NWF9JbmRleFBhcmFtVmlkZW9RdWFudGl6YXRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBRT01YX0luZGV4UGFyYW1WaWRlb0luaXRpYWxRcDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3BhcmFtOlFPTVhfSW5kZXhQYXJhbVZpZGVvSW5pdGlhbFFwIik7Ci0gICAgICAgICAgICAgICAgUU9NWF9FWFROSU5ERVhfVklERU9fSU5JVElBTFFQICppbml0aWFsX3FwID0KLSAgICAgICAgICAgICAgICAgICAgKFFPTVhfRVhUTklOREVYX1ZJREVPX0lOSVRJQUxRUCAqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbF9xcC0+blBvcnRJbmRleCA9PSAoT01YX1UzMikgUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZlbmNfc2V0X3FwKGluaXRpYWxfcXAtPm5RcEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfcXAtPm5RcFAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfcXAtPm5RcEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfcXAtPmJFbmFibGVJbml0UXApID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgSW5pdGlhbCBRUCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogSW52YWxpZCBQb3J0IEluZGV4IGZvciBRT01YX0luZGV4UGFyYW1WaWRlb0luaXRpYWxRcCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvSVBCUVBSYW5nZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3BhcmFtOk9NWF9RY29tSW5kZXhQYXJhbVZpZGVvSVBCUVBSYW5nZSIpOwotICAgICAgICAgICAgICAgIE9NWF9RQ09NX1ZJREVPX1BBUkFNX0lQQl9RUFJBTkdFVFlQRSAqc2Vzc2lvbl9xcF9yYW5nZSA9Ci0gICAgICAgICAgICAgICAgICAgIChPTVhfUUNPTV9WSURFT19QQVJBTV9JUEJfUVBSQU5HRVRZUEUgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgaWYoc2Vzc2lvbl9xcF9yYW5nZS0+blBvcnRJbmRleCA9PSAoT01YX1UzMilQT1JUX0lOREVYX09VVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIHZlbmNfc2V0X3Nlc3Npb25fcXBfcmFuZ2UgKHNlc3Npb25fcXBfcmFuZ2UpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgUVAgcmFuZ2UgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4RW5hYmxlU2xpY2VEZWxpdmVyeU1vZGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU9NWF9FWFROSU5ERVhfUEFSQU1UWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAoUU9NWF9FWFROSU5ERVhfUEFSQU1UWVBFKilwYXJhbURhdGE7Ci0KLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF9zbGljZV9kZWxpdmVyeV9tb2RlKHBQYXJhbS0+YkVuYWJsZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXR0aW5nIHNsaWNlIGRlbGl2ZXJ5IG1vZGUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiT01YX1Fjb21JbmRleEVuYWJsZVNsaWNlRGVsaXZlcnlNb2RlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGVkIG9uIHdyb25nIHBvcnQoJXUpIiwgKHVuc2lnbmVkIGludClwUGFyYW0tPm5Qb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0V4dHJhRGF0YUZyYW1lRGltZW5zaW9uOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfcGFyYW06IE9NWF9FeHRyYURhdGFGcmFtZURpbWVuc2lvbiIpOwotICAgICAgICAgICAgICAgIE9NWF9CT09MIGV4dHJhX2RhdGEgPSAqKE9NWF9CT09MICopKHBhcmFtRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodmVuY19zZXRfZXh0cmFkYXRhKE9NWF9FeHRyYURhdGFGcmFtZURpbWVuc2lvbiwgZXh0cmFfZGF0YSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nIE9NWF9FeHRyYURhdGFGcmFtZURpbWVuc2lvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGV4dHJhZGF0YSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0V4dHJhRGF0YVZpZGVvRW5jb2RlclNsaWNlSW5mbzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3BhcmFtOiBPTVhfRXh0cmFEYXRhVmlkZW9FbmNvZGVyU2xpY2VJbmZvIik7Ci0gICAgICAgICAgICAgICAgT01YX0JPT0wgZXh0cmFfZGF0YSA9ICooT01YX0JPT0wgKikocGFyYW1EYXRhKTsKLQotICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF9leHRyYWRhdGEoT01YX0V4dHJhRGF0YVZpZGVvRW5jb2RlclNsaWNlSW5mbywgZXh0cmFfZGF0YSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nIE9NWF9FeHRyYURhdGFWaWRlb0VuY29kZXJTbGljZUluZm8gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBleHRyYWRhdGEgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9FeHRyYURhdGFWaWRlb0VuY29kZXJNQkluZm86Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX3NldF9wYXJhbTogT01YX0V4dHJhRGF0YVZpZGVvRW5jb2Rlck1CSW5mbyIpOwotICAgICAgICAgICAgICAgIE9NWF9CT09MIGV4dHJhX2RhdGEgPSAgKihPTVhfQk9PTCAqKShwYXJhbURhdGEpOwotCi0gICAgICAgICAgICAgICAgaWYgKHZlbmNfc2V0X2V4dHJhZGF0YShPTVhfRXh0cmFEYXRhVmlkZW9FbmNvZGVyTUJJbmZvLCBleHRyYV9kYXRhKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgT01YX0V4dHJhRGF0YVZpZGVvRW5jb2Rlck1CSW5mbyBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGV4dHJhZGF0YSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtU2VxdWVuY2VIZWFkZXJXaXRoSURSOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFByZXBlbmRTUFNQUFNUb0lEUkZyYW1lc1BhcmFtcyAqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgIChQcmVwZW5kU1BTUFBTVG9JRFJGcmFtZXNQYXJhbXMgKilwYXJhbURhdGE7Ci0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInNldCBpbmJhbmQgc3BzL3BwczogJWQiLCBwUGFyYW0tPmJFbmFibGUpOwotICAgICAgICAgICAgICAgIGlmKHZlbmNfc2V0X2luYmFuZF92aWRlb19oZWFkZXIocFBhcmFtLT5iRW5hYmxlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHNldCBpbmJhbmQgc3BzL3BwcyBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbUFVRGVsaW1pdGVyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9RQ09NX1ZJREVPX0NPTkZJR19BVUQgKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAoT01YX1FDT01fVklERU9fQ09ORklHX0FVRCAqKXBhcmFtRGF0YTsKLQotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0IEFVIERlbGltaXRlcnM6ICVkIiwgcFBhcmFtLT5iRW5hYmxlKTsKLSAgICAgICAgICAgICAgICBpZih2ZW5jX3NldF9hdV9kZWxpbWl0ZXIocFBhcmFtLT5iRW5hYmxlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHNldCBBVSBkZWxpbWl0ZXIgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4Q29uZmlnSDI2NEVudHJvcHlDb2RpbmdDYWJhYzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRT01YX1ZJREVPX0gyNjRFTlRST1BZQ09ESU5HVFlQRSAqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgIChRT01YX1ZJREVPX0gyNjRFTlRST1BZQ09ESU5HVFlQRSAqKXBhcmFtRGF0YTsKLQotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygic2V0IEVudHJvcHkgaW5mbyA6ICVkIiwgcFBhcmFtLT5iQ2FiYWMpOwotICAgICAgICAgICAgICAgIGlmKHZlbmNfc2V0X2VudHJvcHlfY29uZmlnIChwUGFyYW0tPmJDYWJhYywgMCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBzZXQgRW50cm9weSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbUgyNjRWVUlUaW1pbmdJbmZvOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9RQ09NX1ZJREVPX1BBUkFNX1ZVSV9USU1JTkdfSU5GTyAqcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUUNPTV9WSURFT19QQVJBTV9WVUlfVElNSU5HX0lORk8gKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXQgVlVJIHRpbWluZyBpbmZvOiAlZCIsIHBQYXJhbS0+YkVuYWJsZSk7Ci0gICAgICAgICAgICAgICAgaWYodmVuY19zZXRfdnVpX3RpbWluZ19pbmZvKHBQYXJhbS0+YkVuYWJsZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBGYWlsZWQgdG8gc2V0IHZ1aSB0aW1pbmcgaW5mbyB0byAlZCIsIHBQYXJhbS0+YkVuYWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2dWlfdGltaW5nX2luZm8uZW5hYmxlZCA9ICh1bnNpZ25lZCBpbnQpIHBQYXJhbS0+YkVuYWJsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1FUSUluZGV4UGFyYW1WUVpJUFNFSVR5cGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX1FUSV9WSURFT19QQVJBTV9WUVpJUF9TRUlfVFlQRSpwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9RVElfVklERU9fUEFSQU1fVlFaSVBfU0VJX1RZUEUgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJFbmFibGUgVlFaSVAgU0VJOiAlZCIsIHBQYXJhbS0+YkVuYWJsZSk7Ci0gICAgICAgICAgICAgICAgaWYodmVuY19zZXRfdnF6aXBfc2VpX3R5cGUocFBhcmFtLT5iRW5hYmxlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEZhaWxlZCB0byBzZXQgVlFaSVAgU0VJIHR5cGUgJWQiLCBwUGFyYW0tPmJFbmFibGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVBlYWtCaXRyYXRlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9RQ09NX1ZJREVPX1BBUkFNX1BFQUtfQklUUkFURSAqcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUUNPTV9WSURFT19QQVJBTV9QRUFLX0JJVFJBVEUgKilwYXJhbURhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXQgcGVhayBiaXRyYXRlOiAldSIsICh1bnNpZ25lZCBpbnQpcFBhcmFtLT5uUGVha0JpdHJhdGUpOwotICAgICAgICAgICAgICAgIGlmKHZlbmNfc2V0X3BlYWtfYml0cmF0ZShwUGFyYW0tPm5QZWFrQml0cmF0ZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBGYWlsZWQgdG8gc2V0IHBlYWsgYml0cmF0ZSB0byAldSIsICh1bnNpZ25lZCBpbnQpcFBhcmFtLT5uUGVha0JpdHJhdGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGVha19iaXRyYXRlLnBlYWtiaXRyYXRlID0gKHVuc2lnbmVkIGludCkgcFBhcmFtLT5uUGVha0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtU2V0TVZTZWFyY2hyYW5nZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfY29uZmlnOiBPTVhfUWNvbUluZGV4UGFyYW1TZXRNVlNlYXJjaHJhbmdlIik7Ci0gICAgICAgICAgICAgICBpc19zZWFyY2hyYW5nZV9zZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgaWYgKCF2ZW5jX3NldF9zZWFyY2hyYW5nZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBGYWlsZWQgdG8gc2V0IHNlYXJjaCByYW5nZSIpOwotICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhQYXJhbVZpZGVvTFRSQ291bnQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX3NldF9wYXJhbTogT01YX1Fjb21JbmRleFBhcmFtVmlkZW9MVFJDb3VudCIpOwotICAgICAgICAgICAgICAgIE9NWF9RQ09NX1ZJREVPX1BBUkFNX0xUUkNPVU5UX1RZUEUqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoT01YX1FDT01fVklERU9fUEFSQU1fTFRSQ09VTlRfVFlQRSopcGFyYW1EYXRhOwotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Db3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZlbmNfc2V0X2x0cm1vZGUoMSwgcFBhcmFtLT5uQ291bnQpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEVuYWJsZSBMVFIgbW9kZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF9sdHJtb2RlKDAsIDApID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IERpc2FibGUgTFRSIG1vZGUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtVmlkZW9IeWJyaWRIaWVycE1vZGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU9NWF9FWFROSU5ERVhfVklERU9fSFlCUklEX0hQX01PREUqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoUU9NWF9FWFROSU5ERVhfVklERU9fSFlCUklEX0hQX01PREUqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSBwVGVtcG9yYWxQYXJhbXM7Ci0gICAgICAgICAgICAgICAgT01YX1UzMiBpID0gMCwgY3VtdWxhdGl2ZUJpdHJhdGUgPSAwLCBjdW11bGF0aXZlUmF0aW8gPSAwOwotICAgICAgICAgICAgICAgIE9NWF9RQ09NX1ZJREVPX1BBUkFNX0lQQl9RUFJBTkdFVFlQRSBxcF9yYW5nZTsKLQotICAgICAgICAgICAgICAgIGlmKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfSDI2NCAmJiAhdmVuY19jaGVja19mb3JfaHlicmlkX2hwKE9NWF9WSURFT19BbmRyb2lkVGVtcG9yYWxMYXllcmluZ1BhdHRlcm5BbmRyb2lkKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiQ2Fubm90IHNldCBIeWJyaWRIUCBpbnZhbGlkIFJDIHNldHRpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSAhPSBWNEwyX1BJWF9GTVRfSDI2NCAmJiBtX3NWZW5jX2NmZy5jb2RlY3R5cGUgIT0gVjRMMl9QSVhfRk1UX0hFVkMpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk9ubHkgSDI2NC9IRVZDIHN1cHBvcnRlZCBmb3IgdGhpcyBzZXR0aW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZW1zZXQoJnBUZW1wb3JhbFBhcmFtcywgMCwgc2l6ZW9mKHBUZW1wb3JhbFBhcmFtcykpOwotICAgICAgICAgICAgICAgIHBUZW1wb3JhbFBhcmFtcy5uUExheWVyQ291bnRBY3R1YWwgPSBwUGFyYW0tPm5IcExheWVyczsKLSAgICAgICAgICAgICAgICBwVGVtcG9yYWxQYXJhbXMuZVBhdHRlcm4gPSBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuQW5kcm9pZDsKLQotICAgICAgICAgICAgICAgIC8vSW4gdGhpcyBBUEkgYml0cmF0ZSByZWNlaXZlZCBpcyBub3QgaW4gJSBidXQgdmVuY19zZXRfdGVtcG9yYWxfbGF5ZXJzIGV4cGVjdHMgaXQgaW4gJS4gQ29udmVydCBpdC4KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIiBDb252ZXJ0aW5nIGxheWVyZWQgYml0cmF0ZSB0byBwZXJjZW50IGJpdHJhdGVcbiIpOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwVGVtcG9yYWxQYXJhbXMublBMYXllckNvdW50QWN0dWFsOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY3VtdWxhdGl2ZUJpdHJhdGUgKz0gcFBhcmFtLT5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIiBDdW11bGF0aXZlYml0cmF0ZSBpczoldVxuIixjdW11bGF0aXZlQml0cmF0ZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBUZW1wb3JhbFBhcmFtcy5uUExheWVyQ291bnRBY3R1YWw7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBwVGVtcG9yYWxQYXJhbXMubkJpdHJhdGVSYXRpb3NbaV0gPSAoKHBQYXJhbS0+blRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0gKiAxMDApL2N1bXVsYXRpdmVCaXRyYXRlKSArIGN1bXVsYXRpdmVSYXRpbzsKLSAgICAgICAgICAgICAgICAgICAgY3VtdWxhdGl2ZVJhdGlvID0gcFRlbXBvcmFsUGFyYW1zLm5CaXRyYXRlUmF0aW9zW2ldOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIiBMYXllciAldSBiaXRyYXRlICV1IHBlcmNlbnQgJXVcbiIsaSxwUGFyYW0tPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW2ldLHBUZW1wb3JhbFBhcmFtcy5uQml0cmF0ZVJhdGlvc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcFRlbXBvcmFsUGFyYW1zLmJCaXRyYXRlUmF0aW9zU3BlY2lmaWVkID0gT01YX1RSVUU7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbmNfc2V0X3RlbXBvcmFsX2xheWVycygmcFRlbXBvcmFsUGFyYW1zKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU2V0dGluZyBPTVhfUWNvbUluZGV4UGFyYW1WaWRlb0h5YnJpZEhpZXJwTW9kZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfaW50cmFfcGVyaW9kKHBQYXJhbS0+bktleUZyYW1lSW50ZXJ2YWwsIDApKSB7Ci0gICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgSW50cmFwZXJpb2Q6ICVkIiwgcFBhcmFtLT5uS2V5RnJhbWVJbnRlcnZhbCk7Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5LZXlGcmFtZUludGVydmFsID0gaW50cmFfcGVyaW9kLm51bV9wZnJhbWVzOwotCi0gICAgICAgICAgICAgICAgcXBfcmFuZ2UubWluSVFQID0gcFBhcmFtLT5uTWluUXVhbnRpemVyOwotICAgICAgICAgICAgICAgIHFwX3JhbmdlLm1heElRUCA9IHBQYXJhbS0+bk1heFF1YW50aXplcjsKLSAgICAgICAgICAgICAgICBxcF9yYW5nZS5taW5QUVAgPSBwUGFyYW0tPm5NaW5RdWFudGl6ZXI7Ci0gICAgICAgICAgICAgICAgcXBfcmFuZ2UubWF4UFFQID0gcFBhcmFtLT5uTWF4UXVhbnRpemVyOwotICAgICAgICAgICAgICAgIHFwX3JhbmdlLm1pbkJRUCA9IHBQYXJhbS0+bk1pblF1YW50aXplcjsKLSAgICAgICAgICAgICAgICBxcF9yYW5nZS5tYXhCUVAgPSBwUGFyYW0tPm5NYXhRdWFudGl6ZXI7Ci0gICAgICAgICAgICAgICAgaWYoIXZlbmNfc2V0X3Nlc3Npb25fcXBfcmFuZ2UgKCZxcF9yYW5nZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nIFFQIFJhbmdlIGZvciBoeWJyaWRIUCBbJXUgJXVdIGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBQYXJhbS0+bk1pblF1YW50aXplciwgKHVuc2lnbmVkIGludClwUGFyYW0tPm5NYXhRdWFudGl6ZXIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRlbXBvcmFsX2xheWVyc19jb25maWcubk1pblF1YW50aXplciA9IHBQYXJhbS0+bk1pblF1YW50aXplcjsKLSAgICAgICAgICAgICAgICB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5NYXhRdWFudGl6ZXIgPSBwUGFyYW0tPm5NYXhRdWFudGl6ZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtQmF0Y2hTaXplOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9VMzJUWVBFKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAoT01YX1BBUkFNX1UzMlRZUEUqKXBhcmFtRGF0YTsKLQotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZvciB0aGUgbW9tZW50LCBjbGllbnQtZHJpdmVuIGJhdGNoaW5nIG5vdCBzdXBwb3J0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvbiBvdXRwdXQgcG9ydCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCF2ZW5jX3NldF9iYXRjaF9zaXplKHBQYXJhbS0+blUzMikpIHsKLSAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgc2V0dGluZyBiYXRjaCBzaXplIGFzICVkIiwgcFBhcmFtLT5uVTMyKTsKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleFBhcmFtVmVuY0FzcGVjdFJhdGlvOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfYXNwZWN0cmF0aW8ocGFyYW1EYXRhKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgT01YX1Fjb21JbmRleFBhcmFtVmVuY0FzcGVjdFJhdGlvIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RVElJbmRleFBhcmFtVmlkZW9FbmFibGVSb2lJbmZvOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICAgICAgICAgICAgICBPTVhfUVRJX1ZJREVPX1BBUkFNX0VOQUJMRV9ST0lJTkZPICpwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAoT01YX1FUSV9WSURFT19QQVJBTV9FTkFCTEVfUk9JSU5GTyAqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5iRW5hYmxlUm9pSW5mbyA9PSBPTVhfRkFMU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSU5GTygiT01YX1FUSUluZGV4UGFyYW1WaWRlb0VuYWJsZVJvaUluZm86IGJFbmFibGVSb2lJbmZvIGlzIGZhbHNlIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9zVmVuY19jZmcuY29kZWN0eXBlICE9IFY0TDJfUElYX0ZNVF9IMjY0ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3NWZW5jX2NmZy5jb2RlY3R5cGUgIT0gVjRMMl9QSVhfRk1UX0hFVkMpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk9NWF9RVElJbmRleFBhcmFtVmlkZW9FbmFibGVSb2lJbmZvIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICVsdSBjb2RlYyIsIG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19FWFRSQURBVEE7Ci0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX0VYVFJBREFUQV9ST0lfUVA7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXR0aW5nIHBhcmFtIE9NWF9RVElJbmRleFBhcmFtVmlkZW9FbmFibGVSb2lJbmZvIik7Ci0gICAgICAgICAgICAgICAgaWYgKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBPTVhfUVRJSW5kZXhQYXJhbVZpZGVvRW5hYmxlUm9pSW5mbyBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3JvaV9lbmFibGVkID0gdHJ1ZTsKLSNpZmRlZiBfUFFfCi0gICAgICAgICAgICAgICAgbV9wcS5wQ29uZmlnLmFfcXAucm9pX2VuYWJsZWQgPSAoT01YX1UzMil0cnVlOwotICAgICAgICAgICAgICAgIGFsbG9jYXRlX2V4dHJhZGF0YSgmbV9wcS5yb2lfZXh0cmFkYXRhX2luZm8sIElPTl9GTEFHX0NBQ0hFRCk7Ci0gICAgICAgICAgICAgICAgbV9wcS5jb25maWd1cmUobV9zVmVuY19jZmcuaW5wdXRfd2lkdGgsIG1fc1ZlbmNfY2ZnLmlucHV0X2hlaWdodCk7Ci0jZW5kaWYgLy8gX1BRXwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RVElJbmRleFBhcmFtTG93TGF0ZW5jeU1vZGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU9NWF9FWFROSU5ERVhfVklERU9fTE9XX0xBVEVOQ1lfTU9ERSAqcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgKFFPTVhfRVhUTklOREVYX1ZJREVPX0xPV19MQVRFTkNZX01PREUqKXBhcmFtRGF0YTsKLQotICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfbG93bGF0ZW5jeV9tb2RlKHBQYXJhbS0+YkVuYWJsZUxvd0xhdGVuY3lNb2RlKSkgewotICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlNldHRpbmcgbG93IGxhdGVuY3kgbW9kZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BbmRyb2lkVmlkZW9UZW1wb3JhbExheWVyaW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF90ZW1wb3JhbF9sYXllcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1RZUEUqKXBhcmFtRGF0YSkgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigic2V0X3BhcmFtOiBGYWlsZWQgdG8gY29uZmlndXJlIHRlbXBvcmFsIGxheWVycyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RVElJbmRleFBhcmFtRGlzYWJsZVBROgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFPTVhfRElTQUJMRVRZUEUgKiBwUGFyYW0gPSAoUU9NWF9ESVNBQkxFVFlQRSAqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3BhcmFtOiBPTVhfUVRJSW5kZXhQYXJhbURpc2FibGVQUTogJWQiLCBwUGFyYW0tPmJEaXNhYmxlKTsKLSNpZmRlZiBfUFFfCi0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbS0+YkRpc2FibGUpCi0gICAgICAgICAgICAgICAgICAgIG1fcHEuaXNfcHFfZm9yY2VfZGlzYWJsZSA9IHRydWU7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhQYXJhbUlmcmFtZVNpemVUeXBlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFPTVhfVklERU9fSUZSQU1FU0laRSogcFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgKFFPTVhfVklERU9fSUZSQU1FU0laRSAqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBpc0NCUiA9IHJhdGVfY3RybC5yY21vZGUgPT0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JBVEVfQ09OVFJPTF9DQlJfVkZSIHx8Ci0gICAgICAgICAgICAgICAgICAgIHJhdGVfY3RybC5yY21vZGUgPT0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JBVEVfQ09OVFJPTF9DQlJfQ0ZSOwotICAgICAgICAgICAgICAgIGlmICghaXNDQlIpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInZlbmNfc2V0X3BhcmFtOiBPTVhfUVRJSW5kZXhQYXJhbUlmcmFtZVNpemVUeXBlIG5vdCBhbGxvd2VkIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24gaXNDQlIoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQ0JSKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXZlbmNfc2V0X2lmcmFtZXNpemVfdHlwZShwUGFyYW0tPmVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgT01YX1FUSUluZGV4UGFyYW1JZnJhbWVTaXplVHlwZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhQYXJhbUVuYWJsZUFWVGltZXJUaW1lc3RhbXBzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFPTVhfRU5BQkxFVFlQRSAqcFBhcmFtID0gKFFPTVhfRU5BQkxFVFlQRSAqKXBhcmFtRGF0YTsKLSAgICAgICAgICAgICAgICBtVXNlQVZUaW1lclRpbWVzdGFtcHMgPSBwUGFyYW0tPmJFbmFibGUgPT0gT01YX1RSVUU7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSU5GTygiQVZUaW1lciB0aW1lc3RhbXBzIGVuYWJsZWQiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVW5zdXBwb3J0ZWQgcGFyYW1ldGVyIGluIHZlbmNfc2V0X3BhcmFtOiAldSIsCi0gICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9jb25maWcodm9pZCAqY29uZmlnRGF0YSwgT01YX0lOREVYVFlQRSBpbmRleCkKLXsKLQotICAgIERFQlVHX1BSSU5UX0xPVygiSW5zaWRlIHZlbmNfc2V0X2NvbmZpZyIpOwotCi0gICAgc3dpdGNoICgoaW50KWluZGV4KSB7Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9CaXRyYXRlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgKmJpdF9yYXRlID0gKE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgKikKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X2NvbmZpZzogT01YX0luZGV4Q29uZmlnVmlkZW9CaXRyYXRlIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYml0X3JhdGUtPm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZlbmNfc2V0X3RhcmdldF9iaXRyYXRlKGJpdF9yYXRlLT5uRW5jb2RlQml0cmF0ZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBUYXJnZXQgQml0IHJhdGUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEludmFsaWQgUG9ydCBJbmRleCBmb3IgT01YX0luZGV4Q29uZmlnVmlkZW9CaXRyYXRlIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9GcmFtZXJhdGU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFICpmcmFtZV9yYXRlID0gKE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRSAqKQotICAgICAgICAgICAgICAgICAgICBjb25maWdEYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfY29uZmlnOiBPTVhfSW5kZXhDb25maWdWaWRlb0ZyYW1lcmF0ZSIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGZyYW1lX3JhdGUtPm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpUE9SVF9JTkRFWF9PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZlbmNfc2V0X2VuY29kZV9mcmFtZXJhdGUoZnJhbWVfcmF0ZS0+eEVuY29kZUZyYW1lcmF0ZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBFbmNvZGUgRnJhbWVyYXRlIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgX1BRXwotICAgICAgICAgICAgICAgICAgICB2ZW5jX3RyeV9lbmFibGVfcHEoKTsKLSNlbmRpZiAvLyBfUFFfCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJbnZhbGlkIFBvcnQgSW5kZXggZm9yIE9NWF9JbmRleENvbmZpZ1ZpZGVvRnJhbWVyYXRlIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUU9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFwZXJpb2Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX3NldF9wYXJhbTpRT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYXBlcmlvZCIpOwotICAgICAgICAgICAgICAgIFFPTVhfVklERU9fSU5UUkFQRVJJT0RUWVBFICppbnRyYXBlcmlvZCA9Ci0gICAgICAgICAgICAgICAgICAgIChRT01YX1ZJREVPX0lOVFJBUEVSSU9EVFlQRSAqKWNvbmZpZ0RhdGE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW50cmFwZXJpb2QtPm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpIFBPUlRfSU5ERVhfT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF9pbnRyYV9wZXJpb2QoaW50cmFwZXJpb2QtPm5QRnJhbWVzLCBpbnRyYXBlcmlvZC0+bkJGcmFtZXMpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFJlcXVlc3QgZm9yIHNldHRpbmcgaW50cmEgcGVyaW9kIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2g6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFICppbnRyYV92b3BfcmVmcmVzaCA9IChPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEUgKikKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X2NvbmZpZzogT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2giKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbnRyYV92b3BfcmVmcmVzaC0+blBvcnRJbmRleCA9PSAoT01YX1UzMilQT1JUX0lOREVYX09VVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodmVuY19zZXRfaW50cmFfdm9wX3JlZnJlc2goaW50cmFfdm9wX3JlZnJlc2gtPkludHJhUmVmcmVzaFZPUCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBFbmNvZGUgRnJhbWVyYXRlIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJbnZhbGlkIFBvcnQgSW5kZXggZm9yIE9NWF9JbmRleENvbmZpZ1ZpZGVvRnJhbWVyYXRlIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfUk9UQVRJT05UWVBFICpjb25maWdfcm90YXRpb24gPQotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9DT05GSUdfUk9UQVRJT05UWVBFKj4oY29uZmlnRGF0YSk7Ci0gICAgICAgICAgICAgICAgT01YX1UzMiBuRnJhbWVXaWR0aDsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ19yb3RhdGlvbikgewotICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRydWUgPT0gZGVpbnRlcmxhY2VfZW5hYmxlZCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFJvdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBkZWludGVybGFjaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYodmVuY19zZXRfdnBlX3JvdGF0aW9uKGNvbmZpZ19yb3RhdGlvbi0+blJvdGF0aW9uKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IERpbWVuc2lvbiBDaGFuZ2UgZm9yIFJvdGF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9BVkNJbnRyYVBlcmlvZDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EICphdmNfaXBlcmlvZCA9IChPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EKikgY29uZmlnRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3BhcmFtOiBPTVhfSW5kZXhDb25maWdWaWRlb0FWQ0ludHJhUGVyaW9kIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAodmVuY19zZXRfaWRyX3BlcmlvZChhdmNfaXBlcmlvZC0+blBGcmFtZXMsIGF2Y19pcGVyaW9kLT5uSURSUGVyaW9kKQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBTZXR0aW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT01YX0luZGV4Q29uZmlnVmlkZW9BVkNJbnRyYVBlcmlvZCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb1ZwOFJlZmVyZW5jZUZyYW1lOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9WSURFT19WUDhSRUZFUkVOQ0VGUkFNRVRZUEUqIHZwOHJlZmZyYW1lID0gKE9NWF9WSURFT19WUDhSRUZFUkVOQ0VGUkFNRVRZUEUqKSBjb25maWdEYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfY29uZmlnOiBPTVhfSW5kZXhDb25maWdWaWRlb1ZwOFJlZmVyZW5jZUZyYW1lIik7Ci0gICAgICAgICAgICAgICAgaWYgKCh2cDhyZWZmcmFtZS0+blBvcnRJbmRleCA9PSAoT01YX1UzMilQT1JUX0lOREVYX0lOKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKHZwOHJlZmZyYW1lLT5iVXNlR29sZGVuRnJhbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHZlbmNfc2V0X3VzZWx0cigweDEpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHVzZSBnb2xkZW5mcmFtZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZigodnA4cmVmZnJhbWUtPm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpUE9SVF9JTkRFWF9JTikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICh2cDhyZWZmcmFtZS0+YkdvbGRlbkZyYW1lUmVmcmVzaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYodmVuY19zZXRfbWFya2x0cigweDEpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFNldHRpbmcgZ29sZGVuZnJhbWUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IEludmFsaWQgUG9ydCBJbmRleCBmb3IgT01YX0luZGV4Q29uZmlnVmlkZW9WcDhSZWZlcmVuY2VGcmFtZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUWNvbUluZGV4Q29uZmlnVmlkZW9MVFJVc2U6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX1FDT01fVklERU9fQ09ORklHX0xUUlVTRV9UWVBFKiBwUGFyYW0gPSAoT01YX1FDT01fVklERU9fQ09ORklHX0xUUlVTRV9UWVBFKiljb25maWdEYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfY29uZmlnOiBPTVhfUWNvbUluZGV4Q29uZmlnVmlkZW9MVFJVc2UiKTsKLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtLT5uUG9ydEluZGV4ID09IChPTVhfVTMyKVBPUlRfSU5ERVhfSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZlbmNfc2V0X3VzZWx0cihwUGFyYW0tPm5JRCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVXNlIExUUiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogSW52YWxpZCBQb3J0IEluZGV4IGZvciBPTVhfUWNvbUluZGV4Q29uZmlnVmlkZW9MVFJVc2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleENvbmZpZ1ZpZGVvTFRSTWFyazoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfUUNPTV9WSURFT19DT05GSUdfTFRSTUFSS19UWVBFKiBwUGFyYW0gPSAoT01YX1FDT01fVklERU9fQ09ORklHX0xUUk1BUktfVFlQRSopY29uZmlnRGF0YTsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X2NvbmZpZzogT01YX1Fjb21JbmRleENvbmZpZ1ZpZGVvTFRSTWFyayIpOwotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0tPm5Qb3J0SW5kZXggPT0gKE9NWF9VMzIpUE9SVF9JTkRFWF9JTikgewotICAgICAgICAgICAgICAgICAgICBpZiAodmVuY19zZXRfbWFya2x0cihwUGFyYW0tPm5JRCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogTWFyayBMVFIgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJbnZhbGlkIFBvcnQgSW5kZXggZm9yIE9NWF9RY29tSW5kZXhDb25maWdWaWRlb0xUUk1hcmsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQW5kcm9pZFZpZGVvVGVtcG9yYWxMYXllcmluZzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fQ09ORklHX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1RZUEUgKnBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgIChPTVhfVklERU9fQ09ORklHX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1RZUEUgKikgY29uZmlnRGF0YTsKLSAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSBwVGVtcG9yYWxQYXJhbXM7Ci0gICAgICAgICAgICAgICAgT01YX1UzMiBpID0gMDsKLQotICAgICAgICAgICAgICAgIGlmKHRlbXBvcmFsX2xheWVyc19jb25maWcuaGllcl9tb2RlID09IEhJRVJfUF9IWUJSSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkh5YnJpZCBIUCBpcyBlbmFibGVkLiBSdW4gdGltZSBsYXllciBjaGFuZ2UgaXMgbm90IGFsbG93ZWQuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKHBQYXJhbS0+blBMYXllckNvdW50QWN0dWFsID4gdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uTWF4TGF5ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJIUCA6IFJlcXVlc3RlZCBtb3JlIGxheWVycyB0aGFuIG1heCBsYXllcnMgc2V0LiBSZXF1ZXN0ZWQgOiAldSBTZXQ6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5uUExheWVyQ291bnRBY3R1YWwsIHRlbXBvcmFsX2xheWVyc19jb25maWcubk1heExheWVycyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZW1zZXQoJnBUZW1wb3JhbFBhcmFtcywgMCwgc2l6ZW9mKHBUZW1wb3JhbFBhcmFtcykpOwotICAgICAgICAgICAgICAgIHBUZW1wb3JhbFBhcmFtcy5uUExheWVyQ291bnRBY3R1YWwgPSBwUGFyYW0tPm5QTGF5ZXJDb3VudEFjdHVhbDsKLSAgICAgICAgICAgICAgICBwVGVtcG9yYWxQYXJhbXMuYkJpdHJhdGVSYXRpb3NTcGVjaWZpZWQgPSBwUGFyYW0tPmJCaXRyYXRlUmF0aW9zU3BlY2lmaWVkOwotICAgICAgICAgICAgICAgIHBUZW1wb3JhbFBhcmFtcy5lUGF0dGVybiA9IHBQYXJhbS0+ZVBhdHRlcm47Ci0gICAgICAgICAgICAgICAgcFRlbXBvcmFsUGFyYW1zLm5MYXllckNvdW50TWF4ID0gdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uTWF4TGF5ZXJzOwotCi0gICAgICAgICAgICAgICAgZm9yICg7IGkgPCBwVGVtcG9yYWxQYXJhbXMublBMYXllckNvdW50QWN0dWFsOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgcFRlbXBvcmFsUGFyYW1zLm5CaXRyYXRlUmF0aW9zW2ldID0gcFBhcmFtLT5uQml0cmF0ZVJhdGlvc1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodmVuY19zZXRfdGVtcG9yYWxfbGF5ZXJzKCZwVGVtcG9yYWxQYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJTZXR0aW5nIE9NWF9JbmRleENvbmZpZ0FuZHJvaWRWaWRlb1RlbXBvcmFsTGF5ZXJpbmcgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleENvbmZpZ0Jhc2VMYXllcklkOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9TS1lQRV9WSURFT19DT05GSUdfQkFTRUxBWUVSUElEKiBwUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAoT01YX1NLWVBFX1ZJREVPX0NPTkZJR19CQVNFTEFZRVJQSUQqKSBjb25maWdEYXRhOwotICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF9iYXNlbGF5ZXJpZChwUGFyYW0tPm5QSUQpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IE9NWF9RY29tSW5kZXhDb25maWdCYXNlTGF5ZXJJZCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BbmRyb2lkVmlkZW9UZW1wb3JhbExheWVyaW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJUZW1wb3JhbExheWVyOiBDaGFuZ2luZyBsYXllci1jb25maWd1cmF0aW9uIGR5bmFtaWNhbGx5IGlzIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RY29tSW5kZXhDb25maWdRcDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfUUNPTV9WSURFT19DT05GSUdfUVAqIHBQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgIChPTVhfUUNPTV9WSURFT19DT05GSUdfUVAqKSBjb25maWdEYXRhOwotICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF9xcChwUGFyYW0tPm5RUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5uUVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+blFQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfSV9RUCB8IEVOQUJMRV9QX1FQIHwgRU5BQkxFX0JfUVAgKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBPTVhfUWNvbUluZGV4Q29uZmlnUXAgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ByaW9yaXR5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9VMzJUWVBFICpwcmlvcml0eSA9IChPTVhfUEFSQU1fVTMyVFlQRSAqKWNvbmZpZ0RhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXRfY29uZmlnOiBwcmlvcml0eSAlZCIscHJpb3JpdHktPm5VMzIpOwotICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfcHJpb3JpdHkocHJpb3JpdHktPm5VMzIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHByaW9yaXR5Iik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnT3BlcmF0aW5nUmF0ZToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhfUEFSQU1fVTMyVFlQRSAqcmF0ZSA9IChPTVhfUEFSQU1fVTMyVFlQRSAqKWNvbmZpZ0RhdGE7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXRfY29uZmlnOiBvcGVyYXRpbmcgcmF0ZSAlZCIsIHJhdGUtPm5VMzIpOwotICAgICAgICAgICAgICAgIGlmICghdmVuY19zZXRfb3BlcmF0aW5ncmF0ZShyYXRlLT5uVTMyKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBvcGVyYXRpbmcgcmF0ZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0FuZHJvaWRJbnRyYVJlZnJlc2g6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX0lOVFJBUkVGUkVTSFRZUEUgKmludHJhX3JlZnJlc2ggPSAoT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX0lOVFJBUkVGUkVTSFRZUEUgKiljb25maWdEYXRhOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiT01YX0luZGV4Q29uZmlnQW5kcm9pZEludHJhUmVmcmVzaCA6IG51bSBmcmFtZXMgPSAlZCIsIGludHJhX3JlZnJlc2gtPm5SZWZyZXNoUGVyaW9kKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbnRyYV9yZWZyZXNoLT5uUG9ydEluZGV4ID09IChPTVhfVTMyKSBQT1JUX0lOREVYX09VVCkgewotICAgICAgICAgICAgICAgICAgICBPTVhfVTMyIG1iX3NpemUgPSAxNjsKLSAgICAgICAgICAgICAgICAgICAgT01YX1UzMiBudW1fbWJzX3Blcl9mcmFtZSA9IChBTElHTihtX3NWZW5jX2NmZy5kdnNfaGVpZ2h0LCBtYl9zaXplKS9tYl9zaXplKSAqIChBTElHTihtX3NWZW5jX2NmZy5kdnNfd2lkdGgsIG1iX3NpemUpL21iX3NpemUpOwotICAgICAgICAgICAgICAgICAgICBPTVhfVTMyIG51bV9pbnRyYV9yZWZyZXNoX21icyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbnRyYV9yZWZyZXNoLT5uUmVmcmVzaFBlcmlvZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2ludHJhX3JlZnJlc2hfbWJzID0gY2VpbChudW1fbWJzX3Blcl9mcmFtZSAvIGludHJhX3JlZnJlc2gtPm5SZWZyZXNoUGVyaW9kKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh2ZW5jX3NldF9pbnRyYV9yZWZyZXNoKE9NWF9WSURFT19JbnRyYVJlZnJlc2hSYW5kb20sIG51bV9pbnRyYV9yZWZyZXNoX21icykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogU2V0dGluZyBJbnRyYSByZWZyZXNoIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJbnZhbGlkIFBvcnQgSW5kZXggZm9yIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFSZWZyZXNoVHlwZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPTVhfUVRJSW5kZXhDb25maWdWaWRlb0JsdXJSZXNvbHV0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICAgT01YX1FUSV9WSURFT19DT05GSUdfQkxVUklORk8gKmJsdXIgPSAoT01YX1FUSV9WSURFT19DT05GSUdfQkxVUklORk8gKiljb25maWdEYXRhOwotICAgICAgICAgICAgIGlmIChibHVyLT5uUG9ydEluZGV4ID09IChPTVhfVTMyKVBPUlRfSU5ERVhfSU4pIHsKLSAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXRfY29uZmlnOiBibHVyIHJlc29sdXRpb246ICVkIiwgYmx1ci0+ZVRhcmdldFJlc29sKTsKLSAgICAgICAgICAgICAgICAgaWYoIXZlbmNfc2V0X2JsdXJfcmVzb2x1dGlvbihibHVyKSkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBCbHVyIFJlc29sdXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogSW52YWxpZCBQb3J0IEluZGV4IGZvciBPTVhfUVRJSW5kZXhDb25maWdWaWRlb0JsdXJSZXNvbHV0aW9uIik7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1Fjb21JbmRleENvbmZpZ0gyNjRUcmFuc2Zvcm04eDg6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgKnBFbmFibGUgPSAoT01YX0NPTkZJR19CT09MRUFOVFlQRSAqKSBjb25maWdEYXRhOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX3NldF9jb25maWc6IE9NWF9RY29tSW5kZXhDb25maWdIMjY0VHJhbnNmb3JtOHg4Iik7Ci0gICAgICAgICAgICBpZiAodmVuY19oMjY0X3RyYW5zZm9ybV84eDgocEVuYWJsZS0+YkVuYWJsZWQpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgT01YX1Fjb21JbmRleENvbmZpZ0gyNjRUcmFuc2Zvcm04eDgiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE9NWF9RVElJbmRleENvbmZpZ0Rlc2NyaWJlQ29sb3JBc3BlY3RzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERlc2NyaWJlQ29sb3JBc3BlY3RzUGFyYW1zICpwYXJhbXMgPSAoRGVzY3JpYmVDb2xvckFzcGVjdHNQYXJhbXMgKiljb25maWdEYXRhOwotCi0gICAgICAgICAgICAgICAgT01YX1UzMiBjb2xvcl9zcGFjZSA9IE1TTV9WSURDX0JUNjAxXzZfNjI1OwotICAgICAgICAgICAgICAgIE9NWF9VMzIgZnVsbF9yYW5nZSA9IDA7Ci0gICAgICAgICAgICAgICAgT01YX1UzMiBtYXRyaXhfY29lZmZzID0gTVNNX1ZJRENfTUFUUklYXzYwMV82XzYyNTsKLSAgICAgICAgICAgICAgICBPTVhfVTMyIHRyYW5zZmVyX2NoYXJzID0gTVNNX1ZJRENfVFJBTlNGRVJfNjAxXzZfNjI1OwotCi0gICAgICAgICAgICAgICAgc3dpdGNoKChDb2xvckFzcGVjdHM6OlByaW1hcmllcykocGFyYW1zLT5zQXNwZWN0cy5tUHJpbWFyaWVzKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ3MDlfNToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3NwYWNlID0gTVNNX1ZJRENfQlQ3MDlfNTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ0NzBfNk06Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9zcGFjZSA9IE1TTV9WSURDX0JUNDcwXzZfTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ2MDFfNl82MjU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9zcGFjZSA9IE1TTV9WSURDX0JUNjAxXzZfNjI1OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDYwMV82XzUyNToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3NwYWNlID0gTVNNX1ZJRENfQlQ2MDFfNl81MjU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb2xvckFzcGVjdHM6OlByaW1hcmllc0dlbmVyaWNGaWxtOgotICAgICAgICAgICAgICAgICAgICAgICAgY29sb3Jfc3BhY2UgPSBNU01fVklEQ19HRU5FUklDX0ZJTE07Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUMjAyMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3NwYWNlID0gTVNNX1ZJRENfQlQyMDIwOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9zcGFjZSA9IE1TTV9WSURDX0JUNjAxXzZfNjI1OwotICAgICAgICAgICAgICAgICAgICAgICAgLy9wYXJhbXMtPnNBc3BlY3RzLm1QcmltYXJpZXMgPSBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNjAxXzZfNjI1OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN3aXRjaCgoQ29sb3JBc3BlY3RzOjpSYW5nZSlwYXJhbXMtPnNBc3BlY3RzLm1SYW5nZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQXNwZWN0czo6UmFuZ2VGdWxsOgotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9yYW5nZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb2xvckFzcGVjdHM6OlJhbmdlTGltaXRlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfcmFuZ2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3dpdGNoKChDb2xvckFzcGVjdHM6OlRyYW5zZmVyKXBhcmFtcy0+c0FzcGVjdHMubVRyYW5zZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNNUFRFMTcwTToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX2NoYXJzID0gTVNNX1ZJRENfVFJBTlNGRVJfNjAxXzZfNTI1OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkOgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfY2hhcnMgPSBNU01fVklEQ19UUkFOU0ZFUl9VTlNQRUNJRklFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQXNwZWN0czo6VHJhbnNmZXJHYW1tYTIyOgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfY2hhcnMgPSBNU01fVklEQ19UUkFOU0ZFUl9CVF80NzBfNl9NOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckdhbW1hMjg6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl9jaGFycyA9IE1TTV9WSURDX1RSQU5TRkVSX0JUXzQ3MF82X0JHOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNNUFRFMjQwTToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX2NoYXJzID0gTVNNX1ZJRENfVFJBTlNGRVJfU01QVEVfMjQwTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQXNwZWN0czo6VHJhbnNmZXJMaW5lYXI6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl9jaGFycyA9IE1TTV9WSURDX1RSQU5TRkVSX0xJTkVBUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQXNwZWN0czo6VHJhbnNmZXJYdllDQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX2NoYXJzID0gTVNNX1ZJRENfVFJBTlNGRVJfSUVDXzYxOTY2OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckJUMTM2MToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX2NoYXJzID0gTVNNX1ZJRENfVFJBTlNGRVJfQlRfMTM2MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTUkdCOgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfY2hhcnMgPSBNU01fVklEQ19UUkFOU0ZFUl9TUkdCOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3BhcmFtcy0+c0FzcGVjdHMubVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNNUFRFMTcwTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX2NoYXJzID0gTVNNX1ZJRENfVFJBTlNGRVJfNjAxXzZfNjI1OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN3aXRjaCgoQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMpcGFyYW1zLT5zQXNwZWN0cy5tTWF0cml4Q29lZmZzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JBc3BlY3RzOjpNYXRyaXhVbnNwZWNpZmllZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeF9jb2VmZnMgPSBNU01fVklEQ19NQVRSSVhfVU5TUEVDSUZJRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUNzA5XzU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhfY29lZmZzID0gTVNNX1ZJRENfTUFUUklYX0JUXzcwOV81OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDQ3MF82TToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeF9jb2VmZnMgPSBNU01fVklEQ19NQVRSSVhfRkNDXzQ3OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDYwMV82OgotICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4X2NvZWZmcyA9IE1TTV9WSURDX01BVFJJWF82MDFfNl81MjU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb2xvckFzcGVjdHM6Ok1hdHJpeFNNUFRFMjQwTToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX2NoYXJzID0gTVNNX1ZJRENfTUFUUklYX1NNUFRFXzI0ME07Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUMjAyMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeF9jb2VmZnMgPSBNU01fVklEQ19NQVRSSVhfQlRfMjAyMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQXNwZWN0czo6TWF0cml4QlQyMDIwQ29uc3RhbnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhfY29lZmZzID0gTVNNX1ZJRENfTUFUUklYX0JUXzIwMjBfQ09OU1Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcGFyYW1zLT5zQXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDYwMV82OwotICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4X2NvZWZmcyA9IE1TTV9WSURDX01BVFJJWF82MDFfNl82MjU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCF2ZW5jX3NldF9jb2xvcnNwYWNlKGNvbG9yX3NwYWNlLCBmdWxsX3JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX2NoYXJzLCBtYXRyaXhfY29lZmZzKSkgewotCi0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IG9wZXJhdGluZyByYXRlIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT01YX1FUSUluZGV4Q29uZmlnVmlkZW9Sb2lJbmZvOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZighdmVuY19zZXRfcm9pX3FwX2luZm8oKE9NWF9RVElfVklERU9fQ09ORklHX1JPSUlORk8gKiljb25maWdEYXRhKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IFJPSSBRUCBpbmZvIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJVbnN1cHBvcnRlZCBjb25maWcgaW5kZXggPSAldSIsIGluZGV4KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi11bnNpZ25lZCB2ZW5jX2Rldjo6dmVuY19zdG9wKCB2b2lkKQotewotICAgIHN0cnVjdCB2ZW5jX21zZyB2ZW5jX21zZzsKLSAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyBidWZyZXE7Ci0gICAgaW50IHJjID0gMCwgcmV0ID0gMDsKLQotICAgIGlmICghc3RvcHBlZCkgewotICAgICAgICBlbnVtIHY0bDJfYnVmX3R5cGUgY2FwX3R5cGU7Ci0KLSAgICAgICAgaWYgKHN0cmVhbWluZ1tPVVRQVVRfUE9SVF0pIHsKLSAgICAgICAgICAgIGNhcF90eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICAgICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TVFJFQU1PRkYsICZjYXBfdHlwZSk7Ci0KLSAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gY2FsbCBzdHJlYW1vZmYgb24gZHJpdmVyOiBjYXBhYmlsaXR5OiAlZCwgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgY2FwX3R5cGUsIHJjKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHN0cmVhbWluZ1tPVVRQVVRfUE9SVF0gPSBmYWxzZTsKLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJSZWxlYXNpbmcgcmVnaXN0ZXJlZCBidWZmZXJzIGZyb20gZHJpdmVyIG9uIG8vcCBwb3J0Iik7Ci0gICAgICAgICAgICBidWZyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICAgICAgICAgIGJ1ZnJlcS5jb3VudCA9IDA7Ci0gICAgICAgICAgICBidWZyZXEudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgICAgICAgICAgIHJldCA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1JFUUJVRlMsICZidWZyZXEpOwotCi0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBWSURJT0NfUkVRQlVGUyBPVVRQVVQgTVBMQU5FIEZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcmMgJiYgc3RyZWFtaW5nW0NBUFRVUkVfUE9SVF0pIHsKLSAgICAgICAgICAgIGNhcF90eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICAgICAgICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU1RSRUFNT0ZGLCAmY2FwX3R5cGUpOwotCi0gICAgICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIGNhbGwgc3RyZWFtb2ZmIG9uIGRyaXZlcjogY2FwYWJpbGl0eTogJWQsICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcF90eXBlLCByYyk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBzdHJlYW1pbmdbQ0FQVFVSRV9QT1JUXSA9IGZhbHNlOwotCi0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlJlbGVhc2luZyByZWdpc3RlcmVkIGJ1ZmZlcnMgZnJvbSBkcml2ZXIgb24gY2FwdHVyZSBwb3J0Iik7Ci0gICAgICAgICAgICBidWZyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICAgICAgICAgIGJ1ZnJlcS5jb3VudCA9IDA7Ci0gICAgICAgICAgICBidWZyZXEudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgICAgICAgICByZXQgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19SRVFCVUZTLCAmYnVmcmVxKTsKLQotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogVklESU9DX1JFUUJVRlMgQ0FQVFVSRSBNUExBTkUgRmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyYyAmJiAhcmV0KSB7Ci0gICAgICAgICAgICB2ZW5jX3N0b3BfZG9uZSgpOwotICAgICAgICAgICAgc3RvcHBlZCA9IDE7Ci0gICAgICAgICAgICAvKnNldCBmbGFnIHRvIHJlLWNvbmZpZ3VyZSB3aGVuIHN0YXJ0ZWQgYWdhaW4qLwotICAgICAgICAgICAgcmVzdW1lX2luX3N0b3BwZWQgPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJjOwotfQotCi11bnNpZ25lZCB2ZW5jX2Rldjo6dmVuY19wYXVzZSh2b2lkKQotewotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcGF1c2VfcmVzdW1lX21sb2NrKTsKLSAgICBwYXVzZWQgPSB0cnVlOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwYXVzZV9yZXN1bWVfbWxvY2spOwotICAgIHJldHVybiAwOwotfQotCi11bnNpZ25lZCB2ZW5jX2Rldjo6dmVuY19yZXN1bWUodm9pZCkKLXsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnBhdXNlX3Jlc3VtZV9tbG9jayk7Ci0gICAgcGF1c2VkID0gZmFsc2U7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBhdXNlX3Jlc3VtZV9tbG9jayk7Ci0KLSAgICByZXR1cm4gcHRocmVhZF9jb25kX3NpZ25hbCgmcGF1c2VfcmVzdW1lX2NvbmQpOwotfQotCi11bnNpZ25lZCB2ZW5jX2Rldjo6dmVuY19zdGFydF9kb25lKHZvaWQpCi17Ci0gICAgc3RydWN0IHZlbmNfbXNnIHZlbmNfbXNnOwotICAgIHZlbmNfbXNnLm1zZ2NvZGUgPSBWRU5fTVNHX1NUQVJUOwotICAgIHZlbmNfbXNnLnN0YXR1c2NvZGUgPSBWRU5fU19TVUNDRVNTOwotICAgIHZlbmNfaGFuZGxlLT5hc3luY19tZXNzYWdlX3Byb2Nlc3ModmVuY19oYW5kbGUsJnZlbmNfbXNnKTsKLSAgICByZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgdmVuY19kZXY6OnZlbmNfc3RvcF9kb25lKHZvaWQpCi17Ci0gICAgc3RydWN0IHZlbmNfbXNnIHZlbmNfbXNnOwotICAgIGZyZWVfZXh0cmFkYXRhX2FsbCgpOwotICAgIHZlbmNfbXNnLm1zZ2NvZGU9VkVOX01TR19TVE9QOwotICAgIHZlbmNfbXNnLnN0YXR1c2NvZGU9VkVOX1NfU1VDQ0VTUzsKLSAgICB2ZW5jX2hhbmRsZS0+YXN5bmNfbWVzc2FnZV9wcm9jZXNzKHZlbmNfaGFuZGxlLCZ2ZW5jX21zZyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIHZlbmNfZGV2Ojp2ZW5jX3NldF9tZXNzYWdlX3RocmVhZF9pZChwdGhyZWFkX3QgdGlkKQotewotICAgIGFzeW5jX3RocmVhZF9jcmVhdGVkID0gdHJ1ZTsKLSAgICBtX3RpZD10aWQ7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X3ZxemlwX2RlZmF1bHRzKCkKLXsKLSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0gICAgaW50IHJjID0gMCwgbnVtX21ic19wZXJfZnJhbWU7Ci0KLSAgICBudW1fbWJzX3Blcl9mcmFtZSA9IG1fc1ZlbmNfY2ZnLmlucHV0X2hlaWdodCAqIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoOwotCi0gICAgc3dpdGNoIChudW1fbWJzX3Blcl9mcmFtZSkgewotICAgIGNhc2UgT01YX0NPUkVfNzIwUF9XSURUSCAgKiBPTVhfQ09SRV83MjBQX0hFSUdIVDoKLSAgICBjYXNlIE9NWF9DT1JFXzEwODBQX1dJRFRIICogT01YX0NPUkVfMTA4MFBfSEVJR0hUOgotICAgIGNhc2UgT01YX0NPUkVfNEtVSERfV0lEVEggKiBPTVhfQ09SRV80S1VIRF9IRUlHSFQ6Ci0gICAgY2FzZSBPTVhfQ09SRV80S0RDSV9XSURUSCAqIE9NWF9DT1JFXzRLRENJX0hFSUdIVDoKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlZRWklQIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgcmVzb3VsdGlvbiA6ICVsdSBYICVsdSIsCi0gICAgICAgICAgICBtX3NWZW5jX2NmZy5pbnB1dF93aWR0aCwgbV9zVmVuY19jZmcuaW5wdXRfaGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUkFURV9DT05UUk9MOwotICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUkFURV9DT05UUk9MX09GRjsKLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotICAgIGlmIChyYykKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgUmF0ZSBDb250cm9sIE9GRiBmb3IgVlFaSVAiKTsKLSAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX05VTV9QX0ZSQU1FUzsKLSAgICBjb250cm9sLnZhbHVlID0gSU5UX01BWDsKLQotICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0gICAgaWYgKHJjKQotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBQIGZyYW1lIHBlcmlvZCBmb3IgVlFaSVAiKTsKLQotICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fTlVNX0JfRlJBTUVTOwotICAgIGNvbnRyb2wudmFsdWUgPSAwOwotCi0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLSAgICBpZiAocmMpCi0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IEIgZnJhbWUgcGVyaW9kIGZvciBWUVpJUCIpOwotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19JRFJfUEVSSU9EOwotICAgIGNvbnRyb2wudmFsdWUgPSAxOwotCi0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLSAgICBpZiAocmMpCi0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IElEUiBwZXJpb2QgZm9yIFZRWklQIik7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdW5zaWduZWQgdmVuY19kZXY6OnZlbmNfc3RhcnQodm9pZCkKLXsKLSAgICBlbnVtIHY0bDJfYnVmX3R5cGUgYnVmX3R5cGU7Ci0gICAgaW50IHJldCwgcjsKLSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0KLSAgICBtZW1zZXQoJmNvbnRyb2wsIDAsIHNpemVvZihjb250cm9sKSk7Ci0KLSNpZmRlZiBfUFFfCi0gICAvKgotICAgICogTWFrZSBzdXJlIHRoYXQgUFEgaXMgc3RpbGwgYXBwbGljYWJsZSBmb3IgZ2l2ZW4gY29uZmlndXJhdGlvbi4KLSAgICAqIFRoaXMgY2FsbCBtYWlubHkgZGlzYWJsZXMgUFEgaWYgY3VycmVudCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KLSAgICAqIGRvZXNuJ3Qgc3VwcG9ydCBQUS4gUFEgY2Fubid0IGVuYWJsZWQgaGVyZSBhcyBidWZmZXIgYWxsb2NhdGlvbgotICAgICogaXMgYWxyZWFkeSBkb25lIGJ5IHRoaXMgdGltZS4KLSAgICAqLwotICAgIHZlbmNfdHJ5X2VuYWJsZV9wcSgpOwotI2VuZGlmIC8vIF9QUV8KLQotICAgIGlmICh2cXppcF9zZWlfaW5mby5lbmFibGVkICYmICF2ZW5jX3NldF92cXppcF9kZWZhdWx0cygpKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGlmICghdmVuY19yZWNvbmZpZ3VyZV9pbnRyYV9wZXJpb2QoKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiUmVjb25maWd1cmluZyBpbnRyYSBwZXJpb2QgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIHJlLWNvbmZpZ3VyZSB0aGUgdGVtcG9yYWwgbGF5ZXJzIGFzIFJDLW1vZGUgYW5kIGtleS1mcmFtZSBpbnRlcnZhbAotICAgIC8vIG1pZ2h0IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2xpZW50IGxhc3QgY29uZmlndXJlZCB0aGUgbGF5ZXJzLgotICAgIGlmICh0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5QTGF5ZXJzID4gMSkgewotICAgICAgICBpZiAodmVuY19zZXRfdGVtcG9yYWxfbGF5ZXJzX2ludGVybmFsKCkgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlJlLWNvbmZpZ3VyaW5nIHRlbXBvcmFsIGxheWVycyBmYWlsZWQgISIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmVxdWVzdCBidWZmZXJzIG9uIGNhcHR1cmUgcG9ydCBhZ2FpbiBzaW5jZSBpbnRlcm5hbCAoc2NyYXRjaCktCi0gICAgICAgICAgICAvLyBidWZmZXIgcmVxdWlyZW1lbnRzIG1heSBjaGFuZ2UgKGkuZSBpZiB3ZSBzd2l0Y2ggZnJvbSBub24taHlicmlkCi0gICAgICAgICAgICAvLyB0byBoeWJyaWQgbW9kZSBhbmQgdmljZS12ZXJzYSkKLSAgICAgICAgICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIGJ1ZnJlcTsKLQotICAgICAgICAgICAgYnVmcmVxLm1lbW9yeSA9IFY0TDJfTUVNT1JZX1VTRVJQVFI7Ci0gICAgICAgICAgICBidWZyZXEuY291bnQgPSBtX3NPdXRwdXRfYnVmZl9wcm9wZXJ0eS5hY3R1YWxjb3VudDsKLSAgICAgICAgICAgIGJ1ZnJlcS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICAgICAgICAgIGlmIChpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19SRVFCVUZTLCAmYnVmcmVxKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJSZXF1ZXN0IGJ1ZnMgZmFpbGVkIHdoaWxlIHJlY29uZmlndXJpbmcgbGF5ZXJzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2ZW5jX2NvbmZpZ19wcmludCgpOwotCi0gICAgLyogc2V0IGJ1ZmZlcmNvdW50IGJlZm9yZSBzdGFydCAqLwotICAgIHZlbmNfcmVjb25maWdfcmVxYnVmcygpOwotICAgIHJlc3VtZV9pbl9zdG9wcGVkID0gMDsKLQotICAgIC8qIENoZWNrIGlmIHNsaWNlX2RlbGl2ZXJ5IG1vZGUgaXMgZW5hYmxlZCAmIG1heCBzbGljZXMgaXMgc3VmZmljaWVudCBmb3IgZW5jb2RpbmcgY29tcGxldGUgZnJhbWUgKi8KLSAgICBpZiAoc2xpY2VfbW9kZS5lbmFibGUgJiYgbXVsdGlzbGljZS5tc2xpY2Vfc2l6ZSAmJgotICAgICAgICAgICAgKG1fc1ZlbmNfY2ZnLmR2c193aWR0aCAqICBtX3NWZW5jX2NmZy5kdnNfaGVpZ2h0KS8oMjU2ICogbXVsdGlzbGljZS5tc2xpY2Vfc2l6ZSkgPj0gTUFYX1NVUFBPUlRFRF9TTElDRVNfUEVSX0ZSQU1FKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJzbGljZV9tb2RlOiAlbHUsIG1heCBzbGljZXMgKCVsdSkgc2hvdWxkIGJlIGxlc3MgdGhhbiAoJWQpIiwgc2xpY2VfbW9kZS5lbmFibGUsCi0gICAgICAgICAgICAgICAgKG1fc1ZlbmNfY2ZnLmR2c193aWR0aCAqICBtX3NWZW5jX2NmZy5kdnNfaGVpZ2h0KS8oMjU2ICogbXVsdGlzbGljZS5tc2xpY2Vfc2l6ZSksCi0gICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9TTElDRVNfUEVSX0ZSQU1FKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgYnVmX3R5cGU9VjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICBERUJVR19QUklOVF9MT1coInNlbmRfY29tbWFuZF9wcm94eSgpOiBJZGxlLS0+RXhlY3V0aW5nIik7Ci0gICAgcmV0PWlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NUUkVBTU9OLCZidWZfdHlwZSk7Ci0KLSAgICBpZiAocmV0KQotICAgICAgICByZXR1cm4gMTsKLQotICAgIHN0cmVhbWluZ1tDQVBUVVJFX1BPUlRdID0gdHJ1ZTsKLQotICAgIHN0b3BwZWQgPSAwOwotICAgIHJldHVybiAwOwotfQotCi1pbmxpbmUgY29uc3QgY2hhciogaGllcm1vZGVfc3RyaW5nKGludCB2YWwpCi17Ci0gICAgc3dpdGNoKHZhbCkKLSAgICB7Ci0gICAgY2FzZSBISUVSX05PTkU6Ci0gICAgICAgIHJldHVybiAiTm8gSGllciI7Ci0gICAgY2FzZSBISUVSX1A6Ci0gICAgICAgIHJldHVybiAiSGllci1QIjsKLSAgICBjYXNlIEhJRVJfQjoKLSAgICAgICAgcmV0dXJuICJIaWVyLUIiOwotICAgIGNhc2UgSElFUl9QX0hZQlJJRDoKLSAgICAgICAgcmV0dXJuICJIeWJyaWQgSGllci1QIjsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gIk5vIGhpZXIiOwotICAgIH0KLX0KLQotaW5saW5lIGNvbnN0IGNoYXIqIGJpdHJhdGVfdHlwZV9zdHJpbmcoaW50IHZhbCkKLXsKLSAgICBzd2l0Y2godmFsKQotICAgIHsKLSAgICBjYXNlIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19WRU5DX0JJVFJBVEVfRElTQUJMRToKLSAgICAgICAgcmV0dXJuICJDVU1VTEFUSVZFIjsKLSAgICBjYXNlIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19WRU5DX0JJVFJBVEVfRU5BQkxFOgotICAgICAgICByZXR1cm4gIkxBWUVSIFdJU0UiOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAiVW5rbm93biBCaXRyYXRlIFR5cGUiOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvZGVjX2FzX3N0cmluZyh1bnNpZ25lZCBsb25nIGNvZGVjKSB7Ci0gICAgc3dpdGNoIChjb2RlYykgewotICAgIGNhc2UgVjRMMl9QSVhfRk1UX0gyNjQ6Ci0gICAgICAgIHJldHVybiAiSDI2NCI7Ci0gICAgY2FzZSBWNEwyX1BJWF9GTVRfSEVWQzoKLSAgICAgICAgcmV0dXJuICJIRVZDIjsKLSAgICBjYXNlIFY0TDJfUElYX0ZNVF9WUDg6Ci0gICAgICAgIHJldHVybiAiVlA4IjsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gIlVOS09XTiI7Ci0gICAgfQotfQotCi12b2lkIHZlbmNfZGV2Ojp2ZW5jX2NvbmZpZ19wcmludCgpCi17Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJFTkNfQ09ORklHOiBDb2RlYzogJXMsIFByb2ZpbGUgJWxkLCBsZXZlbCA6ICVsZCIsCi0gICAgICAgICAgICBjb2RlY19hc19zdHJpbmcobV9zVmVuY19jZmcuY29kZWN0eXBlKSwgY29kZWNfcHJvZmlsZS5wcm9maWxlLCBwcm9maWxlX2xldmVsLmxldmVsKTsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goIkVOQ19DT05GSUc6IElucHV0IFdpZHRoOiAlbGQsIEhlaWdodDolbGQsIEZwczogJWxkIiwKLSAgICAgICAgICAgIG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoLCBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQsCi0gICAgICAgICAgICBtX3NWZW5jX2NmZy5mcHNfbnVtL21fc1ZlbmNfY2ZnLmZwc19kZW4pOwotCi0gICAgREVCVUdfUFJJTlRfSElHSCgiRU5DX0NPTkZJRzogT3V0cHV0IFdpZHRoOiAlbGQsIEhlaWdodDolbGQsIEZwczogJWxkIiwKLSAgICAgICAgICAgIG1fc1ZlbmNfY2ZnLmR2c193aWR0aCwgbV9zVmVuY19jZmcuZHZzX2hlaWdodCwKLSAgICAgICAgICAgIG1fc1ZlbmNfY2ZnLmZwc19udW0vbV9zVmVuY19jZmcuZnBzX2Rlbik7Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJFTkNfQ09ORklHOiBDb2xvciBTcGFjZTogUHJpbWFyaWVzID0gJXUsIFJhbmdlID0gJXUsIFRyYW5zZmVyIENoYXJzID0gJXUsIE1hdHJpeCBDb2VmZnMgPSAldSIsCi0gICAgICAgICAgICBjb2xvcl9zcGFjZS5wcmltYXJpZXMsIGNvbG9yX3NwYWNlLnJhbmdlLCBjb2xvcl9zcGFjZS50cmFuc2Zlcl9jaGFycywgY29sb3Jfc3BhY2UubWF0cml4X2NvZWZmcyk7Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJFTkNfQ09ORklHOiBCaXRyYXRlOiAlbGQsIFJDOiAlbGQsIFAgLSBGcmFtZXMgOiAlbGQsIEIgLSBGcmFtZXMgPSAlbGQiLAotICAgICAgICAgICAgYml0cmF0ZS50YXJnZXRfYml0cmF0ZSwgcmF0ZV9jdHJsLnJjbW9kZSwgaW50cmFfcGVyaW9kLm51bV9wZnJhbWVzLCBpbnRyYV9wZXJpb2QubnVtX2JmcmFtZXMpOwotCi0gICAgREVCVUdfUFJJTlRfSElHSCgiRU5DX0NPTkZJRzogcXBJOiAlbGQsIHFwUDogJWxkLCBxcGI6ICVsZCBlbmFibGVxcCA6ICVsZCIsCi0gICAgICAgICAgICBzZXNzaW9uX3FwLmlmcmFtZXFwLCBzZXNzaW9uX3FwLnBmcmFtZXFwLCBzZXNzaW9uX3FwLmJmcmFtZXFwLCBzZXNzaW9uX3FwLmVuYWJsZXFwKTsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goIkVOQ19DT05GSUc6IG1pbklRUDogJWx1LCBtYXhJUVA6ICVsdSBtaW5QUVAgOiAlbHUgbWF4UFFQIDogJWx1IG1pbkJRUCA6ICVsdSBtYXhCUVAgOiAlbHUiLAotICAgICAgICAgICAgc2Vzc2lvbl9pcGJfcXBfdmFsdWVzLm1pbl9pX3FwLCBzZXNzaW9uX2lwYl9xcF92YWx1ZXMubWF4X2lfcXAsCi0gICAgICAgICAgICBzZXNzaW9uX2lwYl9xcF92YWx1ZXMubWluX3BfcXAsIHNlc3Npb25faXBiX3FwX3ZhbHVlcy5tYXhfcF9xcCwKLSAgICAgICAgICAgIHNlc3Npb25faXBiX3FwX3ZhbHVlcy5taW5fYl9xcCwgc2Vzc2lvbl9pcGJfcXBfdmFsdWVzLm1heF9iX3FwKTsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goIkVOQ19DT05GSUc6IFZPUF9SZXNvbHV0aW9uOiAlbGQsIFNsaWNlLU1vZGU6ICVsZCwgU2xpemVfU2l6ZTogJWxkIiwKLSAgICAgICAgICAgIHZvcHRpbWVjZmcudm9wdGltZV9yZXNvbHV0aW9uLCBtdWx0aXNsaWNlLm1zbGljZV9tb2RlLAotICAgICAgICAgICAgbXVsdGlzbGljZS5tc2xpY2Vfc2l6ZSk7Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJFTkNfQ09ORklHOiBFbnRyb3B5TW9kZTogJWQsIENhYmFjTW9kZWw6ICVsZCIsCi0gICAgICAgICAgICBlbnRyb3B5LmxvbmdlbnRyb3B5c2VsLCBlbnRyb3B5LmNhYmFjbW9kZWwpOwotCi0gICAgREVCVUdfUFJJTlRfSElHSCgiRU5DX0NPTkZJRzogREItTW9kZTogJWxkLCBhbHBoYTogJWxkLCBCZXRhOiAlbGQiLAotICAgICAgICAgICAgZGJrZmlsdGVyLmRiX21vZGUsIGRia2ZpbHRlci5zbGljZWFscGhhX29mZnNldCwKLSAgICAgICAgICAgIGRia2ZpbHRlci5zbGljZWJldGFfb2Zmc2V0KTsKLQotICAgIERFQlVHX1BSSU5UX0hJR0goIkVOQ19DT05GSUc6IEhFQzogJWxkLCBJRFIgUGVyaW9kOiAlbGQiLAotICAgICAgICAgICAgaGVjLmhlYWRlcl9leHRlbnNpb24sIGlkcnBlcmlvZC5pZHJwZXJpb2QpOwotCi0gICAgREVCVUdfUFJJTlRfSElHSCgiRU5DX0NPTkZJRzogTFRSIEVuYWJsZWQ6ICVkLCBDb3VudDogJWQiLAotICAgICAgICAgICAgbHRyaW5mby5lbmFibGVkLCBsdHJpbmZvLmNvdW50KTsKLQotICAgIGlmICh0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5QTGF5ZXJzKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkVOQ19DT05GSUc6IFRlbXBvcmFsIGxheWVyczogUC1sYXllcnM6ICV1LCBCLWxheWVyczogJXUsIEFkanVzdGVkIEktZnJhbWUtaW50ZXJ2YWw6ICVsdSIsCi0gICAgICAgICAgICAgICAgdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uUExheWVycywgdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uQkxheWVycywKLSAgICAgICAgICAgICAgICBpbnRyYV9wZXJpb2QubnVtX3BmcmFtZXMgKyBpbnRyYV9wZXJpb2QubnVtX2JmcmFtZXMgKyAxKTsKLQotICAgICAgICBmb3IgKE9NWF9VMzIgbCA9IDA7IHRlbXBvcmFsX2xheWVyc19jb25maWcuYklzQml0cmF0ZVJhdGlvVmFsaWQKLSAgICAgICAgICAgICAgICAmJiAobCA8IHRlbXBvcmFsX2xheWVyc19jb25maWcublBMYXllcnMgKyB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5CTGF5ZXJzKTsgKytsKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJFTkNfQ09ORklHOiBUZW1wb3JhbCBsYXllcnM6IGxheWVyWyVkXSBiaXRyYXRlICUlID0gJXUlJSIsCi0gICAgICAgICAgICAgICAgICAgIGwsIHRlbXBvcmFsX2xheWVyc19jb25maWcublRlbXBvcmFsTGF5ZXJCaXRyYXRlRnJhY3Rpb25bbF0pOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJFTkNfQ09ORklHOiBIaWVyIGxheWVyczogJWQsIEhpZXIgTW9kZTogJXMgVlBYX0Vycm9yUmVzaWxpZW5jZTogJWQiLAotICAgICAgICAgICAgICAgIHRlbXBvcmFsX2xheWVyc19jb25maWcublBMYXllcnMsIGhpZXJtb2RlX3N0cmluZyh0ZW1wb3JhbF9sYXllcnNfY29uZmlnLmhpZXJfbW9kZSksIHZweF9lcnJfcmVzaWxpZW5jZS5lbmFibGUpOwotCi0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkVOQ19DT05GSUc6IEhpZXIgcGFyYW1zOiBGcmFtZSBJbnRlcnZhbCA6ICVkLCBNaW5RUDogJWQsIE1heF9RUDogJWQiLAotICAgICAgICAgICAgICAgIHRlbXBvcmFsX2xheWVyc19jb25maWcubktleUZyYW1lSW50ZXJ2YWwsIHRlbXBvcmFsX2xheWVyc19jb25maWcubk1pblF1YW50aXplciwgdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uTWF4UXVhbnRpemVyKTsKLQotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJFTkNfQ09ORklHOiBIeWJyaWRfSFAgUEFSQU1TOiBMYXllcjA6ICVkLCBMYXllcjE6ICVkLCBMYXRlcjI6ICVkLCBMYXllcjM6ICVkLCBMYXllcjQ6ICVkLCBMYXllcjU6ICVkIiwKLSAgICAgICAgICAgICAgICB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzBdLCB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzFdLAotICAgICAgICAgICAgICAgIHRlbXBvcmFsX2xheWVyc19jb25maWcublRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMl0sIHRlbXBvcmFsX2xheWVyc19jb25maWcublRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bM10sCi0gICAgICAgICAgICAgICAgdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1s0XSwgdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1s1XSk7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfSElHSCgiRU5DX0NPTkZJRzogVlVJIHRpbWluZyBpbmZvIGVuYWJsZWQ6ICVkIiwgdnVpX3RpbWluZ19pbmZvLmVuYWJsZWQpOwotCi0gICAgREVCVUdfUFJJTlRfSElHSCgiRU5DX0NPTkZJRzogUGVhayBiaXRyYXRlOiAlZCIsIHBlYWtfYml0cmF0ZS5wZWFrYml0cmF0ZSk7Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJFTkNfQ09ORklHOiBTZXNzaW9uIFByaW9yaXR5OiAldSIsIHNlc3NfcHJpb3JpdHkucHJpb3JpdHkpOwotCi0gICAgREVCVUdfUFJJTlRfSElHSCgiRU5DX0NPTkZJRzogUk9JIDogJXUiLCBtX3JvaV9lbmFibGVkKTsKLSNpZmRlZiBfUFFfCi0gICAgREVCVUdfUFJJTlRfSElHSCgiRU5DX0NPTkZJRzogQWRhcHRpdmUgUVAgKFBRKTogJXUiLCBtX3BxLmlzX3BxX2VuYWJsZWQpOwotI2VuZGlmIC8vIF9QUV8KLQotICAgIERFQlVHX1BSSU5UX0hJR0goIkVOQ19DT05GSUc6IE9wZXJhdGluZyBSYXRlOiAldSIsIG9wZXJhdGluZ19yYXRlKTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19yZWNvbmZpZ19yZXFidWZzKCkKLXsKLSAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyBidWZyZXE7Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJ2ZW5jX3JlY29uZmlnX3JlcWJ1ZnM6IG91dHB1dF9tcGxhbmUgJWx1LCBjYXB0dXJlX21wbGFuZSAlbHUiLAotICAgICAgICBtX3NJbnB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50LCBtX3NPdXRwdXRfYnVmZl9wcm9wZXJ0eS5hY3R1YWxjb3VudCk7Ci0KLSAgICBidWZyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICBidWZyZXEuY291bnQgPSBtX3NJbnB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50OwotICAgIGJ1ZnJlcS50eXBlPVY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgICBpZihpb2N0bChtX25Ecml2ZXJfZmQsVklESU9DX1JFUUJVRlMsICZidWZyZXEpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJWSURJT0NfUkVRQlVGUzogT1VUUFVUX01QTEFORSAoY291bnQgJWQpIGZhaWxlZCIsIGJ1ZnJlcS5jb3VudCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBidWZyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICBidWZyZXEuY291bnQgPSBtX3NPdXRwdXRfYnVmZl9wcm9wZXJ0eS5hY3R1YWxjb3VudDsKLSAgICBidWZyZXEudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgaWYoaW9jdGwobV9uRHJpdmVyX2ZkLFZJRElPQ19SRVFCVUZTLCAmYnVmcmVxKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiVklESU9DX1JFUUJVRlM6IENBUFRVUkVfTVBMQU5FIChjb3VudCAlZCkgZmFpbGVkIiwgYnVmcmVxLmNvdW50KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdW5zaWduZWQgdmVuY19kZXY6OnZlbmNfZmx1c2goIHVuc2lnbmVkIHBvcnQpCi17Ci0gICAgc3RydWN0IHY0bDJfZW5jb2Rlcl9jbWQgZW5jOwotICAgIERFQlVHX1BSSU5UX0xPVygiaW4gJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgICB1bnNpZ25lZCBpbnQgY29va2llID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IChzaXplb2YoZmRfbGlzdCkvc2l6ZW9mKGZkX2xpc3RbMF0pKTsgaSsrKSB7Ci0gICAgICAgIGNvb2tpZSA9IGZkX2xpc3RbaV07Ci0gICAgICAgIGlmIChjb29raWUgIT0gMCkgewotICAgICAgICAgICAgaWYgKCFpb2N0bChpbnB1dF9leHRyYWRhdGFfaW5mby5tX2lvbl9kZXYsIElPTl9JT0NfRlJFRSwgJmNvb2tpZSkpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJGcmVlZCBoYW5kbGUgPSAldSIsIGNvb2tpZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmZF9saXN0W2ldID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVuYy5jbWQgPSBWNEwyX1FDT01fQ01EX0ZMVVNIOwotICAgIGVuYy5mbGFncyA9IFY0TDJfUUNPTV9DTURfRkxVU0hfT1VUUFVUIHwgVjRMMl9RQ09NX0NNRF9GTFVTSF9DQVBUVVJFOwotCi0gICAgaWYgKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX0VOQ09ERVJfQ01ELCAmZW5jKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmx1c2ggUG9ydCAoJWQpIEZhaWxlZCAiLCBwb3J0KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vL2FsbG9jYXRpbmcgSS9QIG1lbW9yeSBmcm9tIHBtZW0gYW5kIHJlZ2lzdGVyIHdpdGggdGhlIGRldmljZQotYm9vbCB2ZW5jX2Rldjo6YWxsb2NhdGVfZXh0cmFkYXRhKHVuc2lnbmVkIHBvcnQpCi17Ci0gICAgaW50IHJjID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgZXh0cmFfaWR4ID0gMDsKLQotICAgIC8vIFBPUlRfSU5ERVhfSU4gPSAwCi0gICAgLy8gUE9SVF9JTkRFWF9PVVQgPSAxCi0gICAgc3RydWN0IHBvcnRfaW5mb19zIHsKLSAgICAgICAgaW50IG51bV9wbGFuZXM7Ci0gICAgICAgIHN0cnVjdCBleHRyYWRhdGFfYnVmZmVyX2luZm8gKmV4dHJhZGF0YV9pbmZvOwotICAgICAgICBpbnQgZmxhZzsKLSAgICB9cG9ydF9pbmZvWzJdID0gewotICAgICAgICB7Ci0gICAgICAgICAgICAubnVtX3BsYW5lcyA9IG51bV9pbnB1dF9wbGFuZXMsCi0gICAgICAgICAgICAuZXh0cmFkYXRhX2luZm8gPSAmaW5wdXRfZXh0cmFkYXRhX2luZm8sCi0gICAgICAgICAgICAuZmxhZyA9IElPTl9GTEFHX0NBQ0hFRAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAubnVtX3BsYW5lcyA9IG51bV9vdXRwdXRfcGxhbmVzLAotICAgICAgICAgICAgLmV4dHJhZGF0YV9pbmZvID0gJm91dHB1dF9leHRyYWRhdGFfaW5mbywKLSAgICAgICAgICAgIC5mbGFnID0gMAotICAgICAgICB9Ci0gICAgfTsKLQotICAgIGlmIChwb3J0ICE9IFBPUlRfSU5ERVhfSU4gJiYgcG9ydCAhPSBQT1JUX0lOREVYX09VVCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHZlbmNfdXNlX2J1ZjpJbnZhbGlkIFBvcnQgSW5kZXggIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBleHRyYV9pZHggPSBFWFRSQURBVEFfSURYKHBvcnRfaW5mb1twb3J0XS5udW1fcGxhbmVzKTsKLSAgICBpZiAoKHBvcnRfaW5mb1twb3J0XS5udW1fcGxhbmVzID4gMSkgJiYgKGV4dHJhX2lkeCkpIHsKLSAgICAgICAgcmMgPSBhbGxvY2F0ZV9leHRyYWRhdGEocG9ydF9pbmZvW3BvcnRdLmV4dHJhZGF0YV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X2luZm9bcG9ydF0uZmxhZyk7Ci0gICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBleHRyYWRhdGE6ICVkXG4iLCByYyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19mcmVlX2J1Zih2b2lkICpidWZfYWRkciwgdW5zaWduZWQgcG9ydCkKLXsKLSAgICBzdHJ1Y3QgcG1lbSAqcG1lbV90bXA7Ci0gICAgc3RydWN0IHZlbmNfYnVmZmVycGF5bG9hZCBkZXZfYnVmZmVyOwotCi0gICAgbWVtc2V0KCZkZXZfYnVmZmVyLCAwLCBzaXplb2YoZGV2X2J1ZmZlcikpOwotICAgIHBtZW1fdG1wID0gKHN0cnVjdCBwbWVtICopYnVmX2FkZHI7Ci0KLSAgICBpZiAocG9ydCA9PSBQT1JUX0lOREVYX0lOKSB7Ci0gICAgICAgIGRldl9idWZmZXIucGJ1ZmZlciA9IChPTVhfVTggKilwbWVtX3RtcC0+YnVmZmVyOwotICAgICAgICBkZXZfYnVmZmVyLmZkICA9IHBtZW1fdG1wLT5mZDsKLSAgICAgICAgZGV2X2J1ZmZlci5tYXBlZF9zaXplID0gcG1lbV90bXAtPnNpemU7Ci0gICAgICAgIGRldl9idWZmZXIuc3ogPSBwbWVtX3RtcC0+c2l6ZTsKLSAgICAgICAgZGV2X2J1ZmZlci5vZmZzZXQgPSBwbWVtX3RtcC0+b2Zmc2V0OwotICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfZnJlZV9idWY6cGJ1ZmZlciA9ICVwLGZkID0gJXgsIG9mZnNldCA9ICVkLCBtYXBlZF9zaXplID0gJWQiLCBcCi0gICAgICAgICAgICAgICAgZGV2X2J1ZmZlci5wYnVmZmVyLCBcCi0gICAgICAgICAgICAgICAgZGV2X2J1ZmZlci5mZCwgXAotICAgICAgICAgICAgICAgIGRldl9idWZmZXIub2Zmc2V0LCBcCi0gICAgICAgICAgICAgICAgZGV2X2J1ZmZlci5tYXBlZF9zaXplKTsKLQotICAgIH0gZWxzZSBpZiAocG9ydCA9PSBQT1JUX0lOREVYX09VVCkgewotICAgICAgICBkZXZfYnVmZmVyLnBidWZmZXIgPSAoT01YX1U4ICopcG1lbV90bXAtPmJ1ZmZlcjsKLSAgICAgICAgZGV2X2J1ZmZlci5mZCAgPSBwbWVtX3RtcC0+ZmQ7Ci0gICAgICAgIGRldl9idWZmZXIuc3ogPSBwbWVtX3RtcC0+c2l6ZTsKLSAgICAgICAgZGV2X2J1ZmZlci5tYXBlZF9zaXplID0gcG1lbV90bXAtPnNpemU7Ci0gICAgICAgIGRldl9idWZmZXIub2Zmc2V0ID0gcG1lbV90bXAtPm9mZnNldDsKLQotICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfZnJlZV9idWY6cGJ1ZmZlciA9ICVwLGZkID0gJXgsIG9mZnNldCA9ICVkLCBtYXBlZF9zaXplID0gJWQiLCBcCi0gICAgICAgICAgICAgICAgZGV2X2J1ZmZlci5wYnVmZmVyLCBcCi0gICAgICAgICAgICAgICAgZGV2X2J1ZmZlci5mZCwgXAotICAgICAgICAgICAgICAgIGRldl9idWZmZXIub2Zmc2V0LCBcCi0gICAgICAgICAgICAgICAgZGV2X2J1ZmZlci5tYXBlZF9zaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHZlbmNfZnJlZV9idWY6SW52YWxpZCBQb3J0IEluZGV4ICIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfY29sb3JfYWxpZ24oT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciwKLSAgICAgICAgT01YX1UzMiB3aWR0aCwgT01YX1UzMiBoZWlnaHQpCi17Ci0gICAgT01YX1UzMiB5X3N0cmlkZSA9IFZFTlVTX1lfU1RSSURFKENPTE9SX0ZNVF9OVjEyLCB3aWR0aCksCi0gICAgICAgICAgICB5X3NjYW5saW5lcyA9IFZFTlVTX1lfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyLCBoZWlnaHQpLAotICAgICAgICAgICAgdXZfc3RyaWRlID0gVkVOVVNfVVZfU1RSSURFKENPTE9SX0ZNVF9OVjEyLCB3aWR0aCksCi0gICAgICAgICAgICB1dl9zY2FubGluZXMgPSBWRU5VU19VVl9TQ0FOTElORVMoQ09MT1JfRk1UX05WMTIsIGhlaWdodCksCi0gICAgICAgICAgICBzcmNfY2hyb21hX29mZnNldCA9IHdpZHRoICogaGVpZ2h0OwotCi0gICAgaWYgKGJ1ZmZlci0+bkFsbG9jTGVuID49IFZFTlVTX0JVRkZFUl9TSVpFKENPTE9SX0ZNVF9OVjEyLCB3aWR0aCwgaGVpZ2h0KSkgewotICAgICAgICBPTVhfVTgqIHNyY19idWYgPSBidWZmZXItPnBCdWZmZXIsICpkc3RfYnVmID0gYnVmZmVyLT5wQnVmZmVyOwotICAgICAgICAvL0RvIGNocm9tYSBmaXJzdCwgc28gdGhhdCB3ZSBjYW4gY29udmVydCBpdCBpbi1wbGFjZQotICAgICAgICBzcmNfYnVmICs9IHdpZHRoICogaGVpZ2h0OwotICAgICAgICBkc3RfYnVmICs9IHlfc3RyaWRlICogeV9zY2FubGluZXM7Ci0gICAgICAgIGZvciAoaW50IGxpbmUgPSBoZWlnaHQgLyAyIC0gMTsgbGluZSA+PSAwOyAtLWxpbmUpIHsKLSAgICAgICAgICAgIG1lbW1vdmUoZHN0X2J1ZiArIGxpbmUgKiB1dl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgIHNyY19idWYgKyBsaW5lICogd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRzdF9idWYgPSBzcmNfYnVmID0gYnVmZmVyLT5wQnVmZmVyOwotICAgICAgICAvL0NvcHkgdGhlIFkgbmV4dAotICAgICAgICBmb3IgKGludCBsaW5lID0gaGVpZ2h0IC0gMTsgbGluZSA+IDA7IC0tbGluZSkgewotICAgICAgICAgICAgbWVtbW92ZShkc3RfYnVmICsgbGluZSAqIHlfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICBzcmNfYnVmICsgbGluZSAqIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIGFsaWduIENocm9tYS4gZnJvbSAldSB0byAldSA6IFwKLSAgICAgICAgICAgICAgICBJbnN1ZmZpY2llbnQgYnVmZmVyTGVuPSV1IHYvcyBSZXF1aXJlZD0ldSIsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkod2lkdGgqaGVpZ2h0KSwgKHVuc2lnbmVkIGludClzcmNfY2hyb21hX29mZnNldCwgKHVuc2lnbmVkIGludClidWZmZXItPm5BbGxvY0xlbiwKLSAgICAgICAgICAgICAgICBWRU5VU19CVUZGRVJfU0laRShDT0xPUl9GTVRfTlYxMiwgd2lkdGgsIGhlaWdodCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfZ2V0X3Z1aV90aW1pbmdfaW5mbyhPTVhfVTMyICplbmFibGVkKQotewotICAgIGlmICghZW5hYmxlZCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiTnVsbCBwb2ludGVyIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICAqZW5hYmxlZCA9IHZ1aV90aW1pbmdfaW5mby5lbmFibGVkOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfZ2V0X3ZxemlwX3NlaV9pbmZvKE9NWF9VMzIgKmVuYWJsZWQpCi17Ci0gICAgaWYgKCFlbmFibGVkKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJOdWxsIHBvaW50ZXIgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICplbmFibGVkID0gdnF6aXBfc2VpX2luZm8uZW5hYmxlZDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX2dldF9wZWFrX2JpdHJhdGUoT01YX1UzMiAqcGVha2JpdHJhdGUpCi17Ci0gICAgaWYgKCFwZWFrYml0cmF0ZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiTnVsbCBwb2ludGVyIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcGVha2JpdHJhdGUgPSBwZWFrX2JpdHJhdGUucGVha2JpdHJhdGU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19nZXRfYmF0Y2hfc2l6ZShPTVhfVTMyICpzaXplKQotewotICAgIGlmICghc2l6ZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiTnVsbCBwb2ludGVyIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICAqc2l6ZSA9IG1CYXRjaFNpemU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19lbXB0eV9idWYodm9pZCAqYnVmZmVyLCB2b2lkICpwbWVtX2RhdGFfYnVmLCB1bnNpZ25lZCBpbmRleCwgdW5zaWduZWQgZmQpCi17Ci0gICAgc3RydWN0IHBtZW0gKnRlbXBfYnVmZmVyOwotICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWY7Ci0gICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgYnVmcmVxOwotICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lW1ZJREVPX01BWF9QTEFORVNdOwotICAgIGludCByYyA9IDAsIGV4dHJhX2lkeDsKLSAgICBzdHJ1Y3QgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmhkcjsKLSAgICBMRUdBQ1lfQ0FNX01FVEFEQVRBX1RZUEUgKiBtZXRhX2J1ZiA9IE5VTEw7Ci0gICAgdGVtcF9idWZmZXIgPSAoc3RydWN0IHBtZW0gKilidWZmZXI7Ci0KLSAgICBtZW1zZXQgKCZidWYsIDAsIHNpemVvZihidWYpKTsKLSAgICBtZW1zZXQgKCZwbGFuZSwgMCwgc2l6ZW9mKHBsYW5lKSk7Ci0KLSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiB2ZW5jX2V0YjogYnVmZmVyIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJ1ZmhkciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKWJ1ZmZlcjsKLSAgICBidWZyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICBidWZyZXEuY291bnQgPSBtX3NJbnB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50OwotICAgIGJ1ZnJlcS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJJbnB1dCBidWZmZXIgbGVuZ3RoICV1LCBUaW1lc3RhbXAgPSAlbGxkIiwgKHVuc2lnbmVkIGludClidWZoZHItPm5GaWxsZWRMZW4sIGJ1Zmhkci0+blRpbWVTdGFtcCk7Ci0KLSAgICBpZiAocG1lbV9kYXRhX2J1ZikgewotICAgICAgICBERUJVR19QUklOVF9MT1coIlxuIEludGVybmFsIFBNRU0gYWRkciBmb3IgaS9wIEhlYXAgVXNlQnVmOiAlcCIsIHBtZW1fZGF0YV9idWYpOwotICAgICAgICBwbGFuZVswXS5tLnVzZXJwdHIgPSAodW5zaWduZWQgbG9uZylwbWVtX2RhdGFfYnVmOwotICAgICAgICBwbGFuZVswXS5kYXRhX29mZnNldCA9IGJ1Zmhkci0+bk9mZnNldDsKLSAgICAgICAgcGxhbmVbMF0ubGVuZ3RoID0gYnVmaGRyLT5uQWxsb2NMZW47Ci0gICAgICAgIHBsYW5lWzBdLmJ5dGVzdXNlZCA9IGJ1Zmhkci0+bkZpbGxlZExlbjsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBbVXNhZ2VdICAgICAgICAgICAgIFttZXRhZGF0YW1vZGVdIFtUeXBlXSAgICAgICAgW2NvbG9yX2Zvcm1hdF0gW1doZXJlIGlzIGJ1ZmZlciBpbmZvXQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQ2FtZXJhLTIgICAgICAgICAgICAgIDEgICAgICAgICAgICBDYW1lcmFTb3VyY2UgICAwICAgICAgICAgICAgICBtZXRhLWhhbmRsZQotICAgICAgICAvLyBDYW1lcmEtMyAgICAgICAgICAgICAgMSAgICAgICAgICAgIEdyYWxsb2NTb3VyY2UgIDAgICAgICAgICAgICAgIGdyYWxsb2MtcHJpdmF0ZS1oYW5kbGUKLSAgICAgICAgLy8gc3VyZmFjZSBlbmNvZGUgKFJCRykgIDEgICAgICAgICAgICBHcmFsbG9jU291cmNlICAxICAgICAgICAgICAgICBidWZoZHIgKGNvbG9yLWNvbnZlcnRlZCkKLSAgICAgICAgLy8gQ1BVIChFZzogTWVkaWFDb2RlYykgIDAgICAgICAgICAgICAtLSAgICAgICAgICAgICAwICAgICAgICAgICAgICBidWZoZHIKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGlmIChtZXRhZGF0YW1vZGUpIHsKLSAgICAgICAgICAgIHBsYW5lWzBdLm0udXNlcnB0ciA9IGluZGV4OwotICAgICAgICAgICAgbWV0YV9idWYgPSAoTEVHQUNZX0NBTV9NRVRBREFUQV9UWVBFICopYnVmaGRyLT5wQnVmZmVyOwotCi0gICAgICAgICAgICBpZiAoIW1ldGFfYnVmKSB7Ci0gICAgICAgICAgICAgICAgLy9lbXB0eSBFT1MgYnVmZmVyCi0gICAgICAgICAgICAgICAgaWYgKCFidWZoZHItPm5GaWxsZWRMZW4gJiYgKGJ1Zmhkci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgewotICAgICAgICAgICAgICAgICAgICBwbGFuZVswXS5kYXRhX29mZnNldCA9IGJ1Zmhkci0+bk9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgcGxhbmVbMF0ubGVuZ3RoID0gYnVmaGRyLT5uQWxsb2NMZW47Ci0gICAgICAgICAgICAgICAgICAgIHBsYW5lWzBdLmJ5dGVzdXNlZCA9IGJ1Zmhkci0+bkZpbGxlZExlbjsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX2VtcHR5X2J1ZjogZW1wdHkgRU9TIGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFjb2xvcl9mb3JtYXQpIHsKLQotICAgICAgICAgICAgICAgIGlmIChtZXRhX2J1Zi0+YnVmZmVyX3R5cGUgPT0gTEVHQUNZX0NBTV9TT1VSQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpobmQgPSAobmF0aXZlX2hhbmRsZV90KiltZXRhX2J1Zi0+bWV0YV9oYW5kbGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaG5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IHZlbmNfZXRiOiBoYW5kbGUgaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCB1c2FnZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHVzYWdlID0gTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KGhuZCwgMCwgTWV0YUJ1ZmZlclV0aWw6OklOVF9VU0FHRSk7Ci0gICAgICAgICAgICAgICAgICAgIHVzYWdlID0gdXNhZ2UgPiAwID8gdXNhZ2UgOiAwOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtaW5nW09VVFBVVF9QT1JUXSAmJiAhKG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0ID09IFY0TDJfUElYX0ZNVF9SR0IzMiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbV9zVmVuY19jZmcuaW5wdXRmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1JHQkE4ODg4X1VCV0MpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvcl9mb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9mb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KGhuZCwgMCwgTWV0YUJ1ZmZlclV0aWw6OklOVF9DT0xPUkZPUk1BVCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNhZ2UgJiBwcml2YXRlX2hhbmRsZV90OjpQUklWX0ZMQUdTX0lUVV9SXzcwOSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSAmIHByaXZhdGVfaGFuZGxlX3Q6OlBSSVZfRkxBR1NfSVRVX1JfNjAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkNhbWVyYSBidWZmZXIgY29sb3IgZm9ybWF0IGlzIG5vdCA2MDFfRlIuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiBUaGlzIGxlYWRzIHRvIHVua25vd24gY29sb3Igc3BhY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2FnZSAmIHByaXZhdGVfaGFuZGxlX3Q6OlBSSVZfRkxBR1NfSVRVX1JfNjAxX0ZSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2NzY19lbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19WUEVfQ1NDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1ZQRV9DU0NfRU5BQkxFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJ2ZW5jX2VtcHR5X2J1ZjogRmFpbGVkIHRvIHNldCBWUEUgQ1NDIGZvciA2MDFfdG9fNzA5Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9JTkZPKCJ2ZW5jX2VtcHR5X2J1ZjogV2lsbCBjb252ZXJ0IDYwMS1GUiB0byA3MDkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuY19zZXRfY29sb3JzcGFjZShNU01fVklEQ19CVDcwOV81LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU01fVklEQ19UUkFOU0ZFUl9CVDcwOV81LCBNU01fVklEQ19NQVRSSVhfQlRfNzA5XzUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuY19zZXRfY29sb3JzcGFjZShNU01fVklEQ19CVDYwMV82XzUyNSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU01fVklEQ19UUkFOU0ZFUl82MDFfNl81MjUsIE1TTV9WSURDX01BVFJJWF82MDFfNl81MjUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3NWZW5jX2NmZy5pbnB1dGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9OVjEyOwotICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAuaGVpZ2h0ID0gbV9zVmVuY19jZmcuaW5wdXRfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAud2lkdGggPSBtX3NWZW5jX2NmZy5pbnB1dF93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2FnZSAmIHByaXZhdGVfaGFuZGxlX3Q6OlBSSVZfRkxBR1NfVUJXQ19BTElHTkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zVmVuY19jZmcuaW5wdXRmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYxMl9VQldDOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JfZm9ybWF0ID4gMCAmJiAhdmVuY19zZXRfY29sb3JfZm9ybWF0KGNvbG9yX2Zvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHNldHRpbmcgY29sb3IgZm9ybWF0IGluIENhbWVyYXNvdXJjZSAlbHgiLCBtX3NWZW5jX2NmZy5pbnB1dGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihpb2N0bChtX25Ecml2ZXJfZmQsVklESU9DX1JFUUJVRlMsICZidWZyZXEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlZJRElPQ19SRVFCVUZTIE9VVFBVVF9NUExBTkUgRmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2V0dGluZyBiYXRjaCBtb2RlIGlzIHN0aWNreS4gV2UgZG8gbm90IGV4cGVjdCBjYW1lcmEgdG8gY2hhbmdlCi0gICAgICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gYmF0Y2ggYW5kIG5vcm1hbCBtb2RlcyBhdCBydW50aW1lLgotICAgICAgICAgICAgICAgICAgICBpZiAobUJhdGNoU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpTWV0YUJ1ZmZlclV0aWw6OmdldEJhdGNoU2l6ZShobmQpICE9IG1CYXRjaFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRG9uJ3Qgc3VwcG9ydCBkeW5hbWljIGJhdGNoIHNpemVzIChjaGFuZ2VkIGZyb20gJWQtPiVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0Y2hTaXplLCBNZXRhQnVmZmVyVXRpbDo6Z2V0QmF0Y2hTaXplKGhuZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlbmNfZW1wdHlfYmF0Y2ggKChPTVhfQlVGRkVSSEVBREVSVFlQRSopYnVmZmVyLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KGhuZCwgMCwgTWV0YUJ1ZmZlclV0aWw6OklOVF9PRkZTRVQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KGhuZCwgMCwgTWV0YUJ1ZmZlclV0aWw6OklOVF9TSVpFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgbGVuZ3RoIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgbWV0YSBidWZmZXIgaGFuZGxlISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBsYW5lWzBdLmRhdGFfb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBwbGFuZVswXS5sZW5ndGggPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIHBsYW5lWzBdLmJ5dGVzdXNlZCA9IGxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX2VtcHR5X2J1ZjogY2FtZXJhIGJ1ZjogZmQgPSAlZCBmaWxsZWQgJWQgb2YgJWQgZmxhZyAweCV4IGZvcm1hdCAweCVseCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIHBsYW5lWzBdLmJ5dGVzdXNlZCwgcGxhbmVbMF0ubGVuZ3RoLCBidWYuZmxhZ3MsIG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGFfYnVmLT5idWZmZXJfdHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICBWaWRlb0dyYWxsb2NNZXRhZGF0YSAqbWV0YV9idWYgPSAoVmlkZW9HcmFsbG9jTWV0YWRhdGEgKilidWZoZHItPnBCdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIHByaXZhdGVfaGFuZGxlX3QgKmhhbmRsZSA9IChwcml2YXRlX2hhbmRsZV90ICopbWV0YV9idWYtPnBIYW5kbGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCIlcyA6IGhhbmRsZSBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobVVzZUFWVGltZXJUaW1lc3RhbXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBhdlRpbWVyVGltZXN0YW1wTnMgPSBidWZoZHItPm5UaW1lU3RhbXAgKiAxMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldE1ldGFEYXRhKGhhbmRsZSwgR0VUX1ZUX1RJTUVTVEFNUCwgJmF2VGltZXJUaW1lc3RhbXBOcykgPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhdlRpbWVyVGltZXN0YW1wTnMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmaGRyLT5uVGltZVN0YW1wID0gYXZUaW1lclRpbWVzdGFtcE5zIC8gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkFWVGltZXIgVFMgOiAlbGx1IHVzIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylidWZoZHItPm5UaW1lU3RhbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1pbmdbT1VUUFVUX1BPUlRdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3Jfc3BhY2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW9tZW50IG9mIHRydXRoLi4uIGFjdHVhbCBjb2xvcnNwYWNlIGlzIGtub3duIGhlcmUuLgotICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZV90IGNvbG9yU3BhY2UgPSBJVFVfUl82MDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TWV0YURhdGEoaGFuZGxlLCBHRVRfQ09MT1JfU1BBQ0UsICZjb2xvclNwYWNlKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSU5GTygiRU5DX0NPTkZJRzogZ3JhbGxvYyBDb2xvclNwYWNlID0gJWQgKDYwMT0lZCA2MDFfRlI9JWQgNzA5PSVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclNwYWNlLCBJVFVfUl82MDEsIElUVV9SXzYwMV9GUiwgSVRVX1JfNzA5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1VCV0MgPSAoaGFuZGxlLT5mbGFncyAmIHByaXZhdGVfaGFuZGxlX3Q6OlBSSVZfRkxBR1NfVUJXQ19BTElHTkVEKSAmJiBpc19ncmFsbG9jX3NvdXJjZV91YndjOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfTlYxMl9FTkNPREVBQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zVmVuY19jZmcuaW5wdXRmb3JtYXQgPSBpc1VCV0MgPyBWNEwyX1BJWF9GTVRfTlYxMl9VQldDIDogVjRMMl9QSVhfRk1UX05WMTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSU5GTygiRU5DX0NPTkZJRzogSW5wdXQgQ29sb3IgPSBOVjEyICVzIiwgaXNVQldDID8gIlVCV0MiIDogIkxpbmVhciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGUtPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgUkdCLCBjb252ZXJzaW9uIHRvIFlVViBpcyBoYW5kbGVkIHdpdGhpbiBlbmNvZGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc3JlZ2FyZCB0aGUgQ29sb3JzcGFjZSBpbiBncmFsbG9jLWhhbmRsZSBpbiBjYXNlIG9mIFJHQiBhbmQgdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBbYV0gNjAxIGZvciBub24tVUJXQyBjYXNlIDogQzJEIG91dHB1dCBpcyAoYXBwYXJlbnRseSkgNjAxLUxSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBbYl0gNjAxIGZvciBVQldDIGNhc2UgICAgIDogVmVudXMgY2FuIGNvbnZlcnQgdG8gNjAxLUxSIG9yIEZSLiB1c2UgTFIgZm9yIG5vdy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclNwYWNlID0gSVRVX1JfNjAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0ID0gaXNVQldDID8gVjRMMl9QSVhfRk1UX1JHQkE4ODg4X1VCV0MgOiBWNEwyX1BJWF9GTVRfUkdCMzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSU5GTygiRU5DX0NPTkZJRzogSW5wdXQgQ29sb3IgPSBSR0JBODg4OCAlcyIsIGlzVUJXQyA/ICJVQldDIiA6ICJMaW5lYXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlLT5mb3JtYXQgPT0gUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zVmVuY19jZmcuaW5wdXRmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYxMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9JTkZPKCJFTkNfQ09ORklHOiBJbnB1dCBDb2xvciA9IE5WMTIgTGluZWFyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGRldmljZSByZWNvbW1lbmRhdGlvbiAocGVyc2lzdC52aWRjLmVuYy5jc2MuZW5hYmxlKSBpcyB0byB1c2UgNzA5LCBmb3JjZSBDU0MKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvclNwYWNlID09IElUVV9SXzYwMV9GUiAmJiBpc19jc2NfZW5hYmxlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1ZQRV9DU0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19WUEVfQ1NDX0VOQUJMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInZlbmNfZW1wdHlfYnVmOiBGYWlsZWQgdG8gc2V0IFZQRSBDU0MgZm9yIDYwMV90b183MDkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9JTkZPKCJ2ZW5jX2VtcHR5X2J1ZjogV2lsbCBjb252ZXJ0IDYwMS1GUiB0byA3MDkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IElUVV9SXzcwOTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1zbV92aWRjX2gyNjRfY29sb3JfcHJpbWFyaWVzX3ZhbHVlcyBwcmltYXJ5OwotICAgICAgICAgICAgICAgICAgICAgICAgbXNtX3ZpZGNfaDI2NF90cmFuc2Zlcl9jaGFyc192YWx1ZXMgdHJhbnNmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtc21fdmlkY19oMjY0X21hdHJpeF9jb2VmZl92YWx1ZXMgbWF0cml4OwotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiByYW5nZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2xvclNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJVFVfUl82MDFfRlI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5ID0gTVNNX1ZJRENfQlQ2MDFfNl81MjU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gMTsgLy8gZnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciA9IE1TTV9WSURDX1RSQU5TRkVSXzYwMV82XzUyNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4ID0gTVNNX1ZJRENfTUFUUklYXzYwMV82XzUyNTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElUVV9SXzcwOToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgPSBNU01fVklEQ19CVDcwOV81OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IDA7IC8vIGxpbWl0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIgPSBNU01fVklEQ19UUkFOU0ZFUl9CVDcwOV81OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXggPSBNU01fVklEQ19NQVRSSVhfQlRfNzA5XzU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9SRUM3MDk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNjAxIG9yIHNvbWV0aGluZyBlbHNlID8gYXNzdW1lIDYwMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5ID0gTVNNX1ZJRENfQlQ2MDFfNl82MjU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gMDsgLy9saW1pdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyID0gTVNNX1ZJRENfVFJBTlNGRVJfNjAxXzZfNjI1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXggPSBNU01fVklEQ19NQVRSSVhfNjAxXzZfNjI1OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfSU5GTygiRU5DX0NPTkZJRzogc2VsZWN0ZWQgQ29sb3JTcGFjZSA9ICVkICg2MDE9JWQgNjAxX0ZSPSVkIDcwOT0lZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZSwgSVRVX1JfNjAxLCBJVFVfUl82MDFfRlIsIElUVV9SXzcwOSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ZW5jX3NldF9jb2xvcnNwYWNlKHByaW1hcnksIHJhbmdlLCB0cmFuc2ZlciwgbWF0cml4KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBtX3NWZW5jX2NmZy5pbnB1dGZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLmhlaWdodCA9IG1fc1ZlbmNfY2ZnLmlucHV0X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gbV9zVmVuY19jZmcuaW5wdXRfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19GTVQsICZmbXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCBzZXR0aW5nIGNvbG9yIGZvcm1hdCBpbiBHcmFsbG9jc291cmNlICVseCIsIG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihpb2N0bChtX25Ecml2ZXJfZmQsVklESU9DX1JFUUJVRlMsICZidWZyZXEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlZJRElPQ19SRVFCVUZTIE9VVFBVVF9NUExBTkUgRmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZmQgPSBoYW5kbGUtPmZkOwotICAgICAgICAgICAgICAgICAgICBwbGFuZVswXS5kYXRhX29mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBsYW5lWzBdLmxlbmd0aCA9IGhhbmRsZS0+c2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgcGxhbmVbMF0uYnl0ZXN1c2VkID0gaGFuZGxlLT5zaXplOwotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfZW1wdHlfYnVmOiBPcGFxdWUgY2FtZXJhIGJ1ZjogZmQgPSAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IGZpbGxlZCAlZCBvZiAlZCBmb3JtYXQgMHglbHgiLCBmZCwgcGxhbmVbMF0uYnl0ZXN1c2VkLCBwbGFuZVswXS5sZW5ndGgsIG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBsYW5lWzBdLm0udXNlcnB0ciA9ICh1bnNpZ25lZCBsb25nKSBidWZoZHItPnBCdWZmZXI7Ci0gICAgICAgICAgICAgICAgcGxhbmVbMF0uZGF0YV9vZmZzZXQgPSBidWZoZHItPm5PZmZzZXQ7Ci0gICAgICAgICAgICAgICAgcGxhbmVbMF0ubGVuZ3RoID0gYnVmaGRyLT5uQWxsb2NMZW47Ci0gICAgICAgICAgICAgICAgcGxhbmVbMF0uYnl0ZXN1c2VkID0gYnVmaGRyLT5uRmlsbGVkTGVuOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19lbXB0eV9idWY6IE9wYXF1ZSBub24tY2FtZXJhIGJ1ZjogZmQgPSAlZCBmaWxsZWQgJWQgb2YgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZmQsIHBsYW5lWzBdLmJ5dGVzdXNlZCwgcGxhbmVbMF0ubGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBsYW5lWzBdLm0udXNlcnB0ciA9ICh1bnNpZ25lZCBsb25nKSBidWZoZHItPnBCdWZmZXI7Ci0gICAgICAgICAgICBwbGFuZVswXS5kYXRhX29mZnNldCA9IGJ1Zmhkci0+bk9mZnNldDsKLSAgICAgICAgICAgIHBsYW5lWzBdLmxlbmd0aCA9IGJ1Zmhkci0+bkFsbG9jTGVuOwotICAgICAgICAgICAgcGxhbmVbMF0uYnl0ZXN1c2VkID0gYnVmaGRyLT5uRmlsbGVkTGVuOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX2VtcHR5X2J1Zjogbm9uLWNhbWVyYSBidWY6IGZkID0gJWQgZmlsbGVkICVkIG9mICVkIiwKLSAgICAgICAgICAgICAgICAgICAgZmQsIHBsYW5lWzBdLmJ5dGVzdXNlZCwgcGxhbmVbMF0ubGVuZ3RoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGV4dHJhX2lkeCA9IEVYVFJBREFUQV9JRFgobnVtX2lucHV0X3BsYW5lcyk7Ci0KLSAgICBpZiAoZXh0cmFfaWR4ICYmIChleHRyYV9pZHggPCBWSURFT19NQVhfUExBTkVTKSkgewotICAgICAgICBpbnQgZXh0cmFkYXRhX2luZGV4ID0gdmVuY19nZXRfaW5kZXhfZnJvbV9mZChpbnB1dF9leHRyYWRhdGFfaW5mby5tX2lvbl9kZXYsZmQpOwotICAgICAgICBpZiAoZXh0cmFkYXRhX2luZGV4IDwgMCApIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRXh0cmFkYXRhIGluZGV4IGNhbGN1bGF0aW9uIHdlbnQgd3JvbmcgZm9yIGZkID0gJWQiLCBmZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBwbGFuZVtleHRyYV9pZHhdLmJ5dGVzdXNlZCA9IDA7Ci0gICAgICAgIHBsYW5lW2V4dHJhX2lkeF0ubGVuZ3RoID0gaW5wdXRfZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemU7Ci0gICAgICAgIHBsYW5lW2V4dHJhX2lkeF0ubS51c2VycHRyID0gKHVuc2lnbmVkIGxvbmcpIChpbnB1dF9leHRyYWRhdGFfaW5mby51YWRkciArIGV4dHJhZGF0YV9pbmRleCAqIGlucHV0X2V4dHJhZGF0YV9pbmZvLmJ1ZmZlcl9zaXplKTsKLSNpZmRlZiBVU0VfSU9OCi0gICAgICAgIHBsYW5lW2V4dHJhX2lkeF0ucmVzZXJ2ZWRbMF0gPSBpbnB1dF9leHRyYWRhdGFfaW5mby5pb24uZmRfaW9uX2RhdGEuZmQ7Ci0jZW5kaWYKLSAgICAgICAgcGxhbmVbZXh0cmFfaWR4XS5yZXNlcnZlZFsxXSA9IGlucHV0X2V4dHJhZGF0YV9pbmZvLmJ1ZmZlcl9zaXplICogZXh0cmFkYXRhX2luZGV4OwotICAgICAgICBwbGFuZVtleHRyYV9pZHhdLnJlc2VydmVkWzJdID0gaW5wdXRfZXh0cmFkYXRhX2luZm8uc2l6ZTsKLSAgICAgICAgcGxhbmVbZXh0cmFfaWR4XS5kYXRhX29mZnNldCA9IDA7Ci0gICAgfSBlbHNlIGlmIChleHRyYV9pZHggPj0gVklERU9fTUFYX1BMQU5FUykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRXh0cmFkYXRhIGluZGV4IGhpZ2hlciB0aGFuIGV4cGVjdGVkOiAlZFxuIiwgZXh0cmFfaWR4KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmZGVmIF9QUV8KLSAgICBpZiAoIXN0cmVhbWluZ1tPVVRQVVRfUE9SVF0pIHsKLSAgICAgICAgbV9wcS5pc19ZVVZfZm9ybWF0X3VuY2VydGFpbiA9IGZhbHNlOwotICAgICAgICBpZih2ZW5jX2NoZWNrX2Zvcl9wcSgpKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgYWxsIHBhcmFtZXRlcnMgZm9yIGRlY2lkaW5nCi0gICAgICAgICAgICAgKiBQUSBlbmFibGVtZW50IGFyZSBhdmFpbGFibGUuIEV2YWx1YXRlIFBRIGZvciB0aGUgZmluYWwgdGltZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbV9wcS5yZWluaXQobV9zVmVuY19jZmcuaW5wdXRmb3JtYXQpOwotICAgICAgICAgICAgdmVuY19jb25maWd1cmVfcHEoKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZiAvLyBfUFFfCi0KLSAgICBidWYuaW5kZXggPSBpbmRleDsKLSAgICBidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgICBidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAgICBwbGFuZVswXS5yZXNlcnZlZFswXSA9IGZkOwotICAgIHBsYW5lWzBdLnJlc2VydmVkWzFdID0gMDsKLSAgICBidWYubS5wbGFuZXMgPSBwbGFuZTsKLSAgICBidWYubGVuZ3RoID0gbnVtX2lucHV0X3BsYW5lczsKLSAgICBidWYudGltZXN0YW1wLnR2X3NlYyA9IGJ1Zmhkci0+blRpbWVTdGFtcCAvIDEwMDAwMDA7Ci0gICAgYnVmLnRpbWVzdGFtcC50dl91c2VjID0gKGJ1Zmhkci0+blRpbWVTdGFtcCAlIDEwMDAwMDApOwotCi0gICAgaWYgKCFoYW5kbGVfaW5wdXRfZXh0cmFkYXRhKGJ1ZikpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzIEZhaWxlZCB0byBoYW5kbGUgaW5wdXQgZXh0cmFkYXRhIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFZJRENfVFJBQ0VfSU5UX0xPVygiRVRCLVRTIiwgYnVmaGRyLT5uVGltZVN0YW1wIC8gMTAwMCk7Ci0KLSAgICBpZiAoYnVmaGRyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCi0gICAgICAgIGJ1Zi5mbGFncyB8PSBWNEwyX1FDT01fQlVGX0ZMQUdfRU9TOwotCi0gICAgaWYgKG1fZGVidWcuaW5fYnVmZmVyX2xvZykgewotICAgICAgICB2ZW5jX2lucHV0X2xvZ19idWZmZXJzKGJ1ZmhkciwgZmQsIHBsYW5lWzBdLmRhdGFfb2Zmc2V0LCBtX3NWZW5jX2NmZy5pbnB1dGZvcm1hdCk7Ci0gICAgfQotICAgIGlmIChtX2RlYnVnLmV4dHJhZGF0YV9sb2cgJiYgZXh0cmFfaWR4ICYmIChleHRyYV9pZHggPCBWSURFT19NQVhfUExBTkVTKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRXh0cmFkYXRhIEFkZHIgMHglbGx4LCBCdWZmZXIgQWRkciA9IDB4JXgiLCAoT01YX1U2NClpbnB1dF9leHRyYWRhdGFfaW5mby51YWRkciwgKHVuc2lnbmVkIGludClwbGFuZVtleHRyYV9pZHhdLm0udXNlcnB0cik7Ci0gICAgICAgIHZlbmNfZXh0cmFkYXRhX2xvZ19idWZmZXJzKChjaGFyICopcGxhbmVbZXh0cmFfaWR4XS5tLnVzZXJwdHIpOwotICAgIH0KLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1FCVUYsICZidWYpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gcWJ1ZiAoZXRiKSB0byBkcml2ZXIiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGV0YisrOwotCi0gICAgaWYgKCFzdHJlYW1pbmdbT1VUUFVUX1BPUlRdKSB7Ci0gICAgICAgIGVudW0gdjRsMl9idWZfdHlwZSBidWZfdHlwZTsKLSAgICAgICAgYnVmX3R5cGU9VjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICBpbnQgcmV0OwotCi0gICAgICAgIHJldCA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NUUkVBTU9OLCAmYnVmX3R5cGUpOwotCi0gICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gY2FsbCBzdHJlYW1vbiIpOwotICAgICAgICAgICAgaWYgKGVycm5vID09IEVCVVNZKSB7Ci0gICAgICAgICAgICAgICAgaHdfb3ZlcmxvYWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RyZWFtaW5nW09VVFBVVF9QT1JUXSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19lbXB0eV9iYXRjaChPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmaGRyLCB1bnNpZ25lZCBpbmRleCkKLXsKLSAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmOwotICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lW1ZJREVPX01BWF9QTEFORVNdOwotICAgIGludCByYyA9IDAsIGV4dHJhX2lkeCwgbnVtQnVmczsKLSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0gICAgTEVHQUNZX0NBTV9NRVRBREFUQV9UWVBFICogbWV0YV9idWYgPSBOVUxMOwotICAgIG5hdGl2ZV9oYW5kbGVfdCAqaG5kID0gTlVMTDsKLQotICAgIGlmIChidWZoZHIgPT0gTlVMTCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6ICVzOiBidWZmZXIgaXMgTlVMTCIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLSAgICBpZiAobWV0YWRhdGFtb2RlKSB7Ci0gICAgICAgIHBsYW5lWzBdLm0udXNlcnB0ciA9IGluZGV4OwotICAgICAgICBtZXRhX2J1ZiA9IChMRUdBQ1lfQ0FNX01FVEFEQVRBX1RZUEUgKilidWZoZHItPnBCdWZmZXI7Ci0KLSAgICAgICAgaWYgKCFjb2xvcl9mb3JtYXQpIHsKLSAgICAgICAgICAgIGlmIChtZXRhX2J1Zi0+YnVmZmVyX3R5cGUgPT0gTEVHQUNZX0NBTV9TT1VSQ0UpIHsKLSAgICAgICAgICAgICAgICBobmQgPSAobmF0aXZlX2hhbmRsZV90KiltZXRhX2J1Zi0+bWV0YV9oYW5kbGU7Ci0gICAgICAgICAgICAgICAgaWYgKCFobmQpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInZlbmNfZW1wdHlfYmF0Y2g6IGludmFsaWQgaGFuZGxlICEiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWV0YUJ1ZmZlclV0aWw6OmdldEJhdGNoU2l6ZShobmQpID4ga01heEJ1ZmZlcnNJbkJhdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJ2ZW5jX2VtcHR5X2JhdGNoOiBUb28gbWFueSBidWZmZXJzICglZCkgaW4gYmF0Y2guICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4ID0gJWQiLCBNZXRhQnVmZmVyVXRpbDo6Z2V0QmF0Y2hTaXplKGhuZCksIGtNYXhCdWZmZXJzSW5CYXRjaCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coInZlbmNfZW1wdHlfYmF0Y2g6IEJhdGNoIG9mICVkIGJ1ZnMiLCBNZXRhQnVmZmVyVXRpbDo6Z2V0QmF0Y2hTaXplKGhuZCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiQmF0Y2ggc3VwcG9ydGVkIGZvciBDYW1lcmFTb3VyY2UgYnVmZmVycyBvbmx5ICEiKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJCYXRjaCBzdXBwb3J0ZWQgZm9yIENhbWVyYSBidWZmZXJzIG9ubHkgISIpOwotICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiQmF0Y2ggc3VwcG9ydGVkIGZvciBtZXRhYnVmZmVyIG1vZGUgb25seSAhIik7Ci0gICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgT01YX1RJQ0tTIGJ1ZlRpbWVTdGFtcCA9IDBsbDsKLSAgICAgICAgaW50IG51bUJ1ZnMgPSBNZXRhQnVmZmVyVXRpbDo6Z2V0QmF0Y2hTaXplKGhuZCk7Ci0gICAgICAgIGludCB2NGwySWRzW2tNYXhCdWZmZXJzSW5CYXRjaF0gPSB7LTF9OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ1ZnM7ICsraSkgewotICAgICAgICAgICAgdjRsMklkc1tpXSA9IG1CYXRjaEluZm8ucmVnaXN0ZXJCdWZmZXIoaW5kZXgpOwotICAgICAgICAgICAgaWYgKHY0bDJJZHNbaV0gPCAwKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBidWZmZXIiKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHRoZSBtYXAgYW5kIHB1cmdlIGFsbCBzbG90cyBvZiBjdXJyZW50IGluZGV4Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CdWZzOyArK2kpIHsKLSAgICAgICAgICAgIGludCB2NGwySWQgPSB2NGwySWRzW2ldOwotICAgICAgICAgICAgaW50IHVzYWdlID0gMDsKLQotICAgICAgICAgICAgbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgIG1lbXNldCgmcGxhbmUsIDAsIHNpemVvZihwbGFuZSkpOwotCi0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIkJhdGNoOiByZWdpc3RlcmluZyAlZCBhcyAlZCIsIGluZGV4LCB2NGwySWQpOwotICAgICAgICAgICAgYnVmLmluZGV4ID0gKHVuc2lnbmVkKXY0bDJJZDsKLSAgICAgICAgICAgIGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgICAgICAgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX1VTRVJQVFI7Ci0gICAgICAgICAgICBwbGFuZVswXS5yZXNlcnZlZFswXSA9IE1ldGFCdWZmZXJVdGlsOjpnZXRGZEF0KGhuZCwgaSk7Ci0gICAgICAgICAgICBwbGFuZVswXS5yZXNlcnZlZFsxXSA9IDA7Ci0gICAgICAgICAgICBwbGFuZVswXS5kYXRhX29mZnNldCA9IE1ldGFCdWZmZXJVdGlsOjpnZXRJbnRBdChobmQsIGksIE1ldGFCdWZmZXJVdGlsOjpJTlRfT0ZGU0VUKTsKLSAgICAgICAgICAgIHBsYW5lWzBdLm0udXNlcnB0ciA9ICh1bnNpZ25lZCBsb25nKW1ldGFfYnVmOwotICAgICAgICAgICAgcGxhbmVbMF0ubGVuZ3RoID0gcGxhbmVbMF0uYnl0ZXN1c2VkID0gTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KGhuZCwgaSwgTWV0YUJ1ZmZlclV0aWw6OklOVF9TSVpFKTsKLSAgICAgICAgICAgIGJ1Zi5tLnBsYW5lcyA9IHBsYW5lOwotICAgICAgICAgICAgYnVmLmxlbmd0aCA9IG51bV9pbnB1dF9wbGFuZXM7Ci0KLSAgICAgICAgICAgIHVzYWdlID0gTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KGhuZCwgaSwgTWV0YUJ1ZmZlclV0aWw6OklOVF9VU0FHRSk7Ci0gICAgICAgICAgICB1c2FnZSA9IHVzYWdlID4gMCA/IHVzYWdlIDogMDsKLQotICAgICAgICAgICAgZXh0cmFfaWR4ID0gRVhUUkFEQVRBX0lEWChudW1faW5wdXRfcGxhbmVzKTsKLQotICAgICAgICAgICAgaWYgKGV4dHJhX2lkeCAmJiAoZXh0cmFfaWR4IDwgVklERU9fTUFYX1BMQU5FUykpIHsKLSAgICAgICAgICAgICAgICBpbnQgZmQgPSBwbGFuZVswXS5yZXNlcnZlZFswXTsKLSAgICAgICAgICAgICAgICBpbnQgZXh0cmFkYXRhX2luZGV4ID0gdmVuY19nZXRfaW5kZXhfZnJvbV9mZChpbnB1dF9leHRyYWRhdGFfaW5mby5tX2lvbl9kZXYsIGZkKTsKLSAgICAgICAgICAgICAgICBpZiAoZXh0cmFkYXRhX2luZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRXh0cmFkYXRhIGluZGV4IGNhbGN1bGF0aW9uIHdlbnQgd3JvbmcgZm9yIGZkID0gJWQiLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGxhbmVbZXh0cmFfaWR4XS5ieXRlc3VzZWQgPSAwOwotICAgICAgICAgICAgICAgIHBsYW5lW2V4dHJhX2lkeF0ubGVuZ3RoID0gaW5wdXRfZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemU7Ci0gICAgICAgICAgICAgICAgcGxhbmVbZXh0cmFfaWR4XS5tLnVzZXJwdHIgPSAodW5zaWduZWQgbG9uZykgKGlucHV0X2V4dHJhZGF0YV9pbmZvLnVhZGRyICsgZXh0cmFkYXRhX2luZGV4ICogaW5wdXRfZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemUpOwotICAgICAgICAgICAgICAgIHBsYW5lW2V4dHJhX2lkeF0ucmVzZXJ2ZWRbMF0gPSBpbnB1dF9leHRyYWRhdGFfaW5mby5pb24uZmRfaW9uX2RhdGEuZmQ7Ci0gICAgICAgICAgICAgICAgcGxhbmVbZXh0cmFfaWR4XS5yZXNlcnZlZFsxXSA9IGlucHV0X2V4dHJhZGF0YV9pbmZvLmJ1ZmZlcl9zaXplICogZXh0cmFkYXRhX2luZGV4OwotICAgICAgICAgICAgICAgIHBsYW5lW2V4dHJhX2lkeF0ucmVzZXJ2ZWRbMl0gPSBpbnB1dF9leHRyYWRhdGFfaW5mby5zaXplOwotICAgICAgICAgICAgICAgIHBsYW5lW2V4dHJhX2lkeF0uZGF0YV9vZmZzZXQgPSAwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHRyYV9pZHggPj0gVklERU9fTUFYX1BMQU5FUykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFeHRyYWRhdGEgaW5kZXggaGlnaGVyIHRoYW4gZXhwZWN0ZWQ6ICVkXG4iLCBleHRyYV9pZHgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotI2lmZGVmIF9QUV8KLSAgICAgICAgICAgIGlmICghc3RyZWFtaW5nW09VVFBVVF9QT1JUXSkgewotICAgICAgICAgICAgICAgIG1fcHEuaXNfWVVWX2Zvcm1hdF91bmNlcnRhaW4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZih2ZW5jX2NoZWNrX2Zvcl9wcSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcHEucmVpbml0KG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgdmVuY19jb25maWd1cmVfcHEoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jZW5kaWYgLy8gX1BRXwotCi0gICAgICAgICAgICBpZiAoYnVmaGRyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCi0gICAgICAgICAgICAgICAgYnVmLmZsYWdzIHw9IFY0TDJfUUNPTV9CVUZfRkxBR19FT1M7Ci0gICAgICAgICAgICBpZiAoaSAhPSBudW1CdWZzIC0gMSkgewotICAgICAgICAgICAgICAgIGJ1Zi5mbGFncyB8PSBWNEwyX01TTV9CVUZfRkxBR19ERUZFUjsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9MT1coImZvciBidWZmZXIgJWQgKGV0YiAjJWQpIGluIGJhdGNoIG9mICVkLCBtYXJraW5nIGFzIGRlZmVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIGV0YiArIDEsIG51bUJ1ZnMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0aW1lc3RhbXAgZGlmZmVyZW5jZXMgZnJvbSBjYW1lcmEgYXJlIGluIG5hbm8tc2Vjb25kcwotICAgICAgICAgICAgYnVmVGltZVN0YW1wID0gYnVmaGRyLT5uVGltZVN0YW1wICsgTWV0YUJ1ZmZlclV0aWw6OmdldEludEF0KGhuZCwgaSwgTWV0YUJ1ZmZlclV0aWw6OklOVF9USU1FU1RBTVApIC8gMTAwMDsKLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCIgUSBCYXRjaCBbJWQgb2YgJWRdIDogYnVmPSVwIGZkPSVkIGxlbj0lZCBUUz0lbGxkIiwKLSAgICAgICAgICAgICAgICBpLCBudW1CdWZzLCBidWZoZHIsIHBsYW5lWzBdLnJlc2VydmVkWzBdLCBwbGFuZVswXS5sZW5ndGgsIGJ1ZlRpbWVTdGFtcCk7Ci0gICAgICAgICAgICBidWYudGltZXN0YW1wLnR2X3NlYyA9IGJ1ZlRpbWVTdGFtcCAvIDEwMDAwMDA7Ci0gICAgICAgICAgICBidWYudGltZXN0YW1wLnR2X3VzZWMgPSAoYnVmVGltZVN0YW1wICUgMTAwMDAwMCk7Ci0KLSAgICAgICAgICAgIGlmICghaGFuZGxlX2lucHV0X2V4dHJhZGF0YShidWYpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIiVzIEZhaWxlZCB0byBoYW5kbGUgaW5wdXQgZXh0cmFkYXRhIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFZJRENfVFJBQ0VfSU5UX0xPVygiRVRCLVRTIiwgYnVmVGltZVN0YW1wIC8gMTAwMCk7Ci0KLSAgICAgICAgICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfUUJVRiwgJmJ1Zik7Ci0gICAgICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiJXM6IEZhaWxlZCB0byBxYnVmIChldGIpIHRvIGRyaXZlciIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGV0YisrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAmJiAhc3RyZWFtaW5nW09VVFBVVF9QT1JUXSkgewotICAgICAgICBlbnVtIHY0bDJfYnVmX3R5cGUgYnVmX3R5cGU7Ci0gICAgICAgIGJ1Zl90eXBlPVY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgICAgICAgaW50IHJldDsKLSAgICAgICAgcmV0ID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU1RSRUFNT04sICZidWZfdHlwZSk7Ci0gICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gY2FsbCBzdHJlYW1vbiIpOwotICAgICAgICAgICAgaWYgKGVycm5vID09IEVCVVNZKSB7Ci0gICAgICAgICAgICAgICAgaHdfb3ZlcmxvYWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdHJlYW1pbmdbT1VUUFVUX1BPUlRdID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfZmlsbF9idWYodm9pZCAqYnVmZmVyLCB2b2lkICpwbWVtX2RhdGFfYnVmLHVuc2lnbmVkIGluZGV4LHVuc2lnbmVkIGZkKQotewotICAgIHN0cnVjdCBwbWVtICp0ZW1wX2J1ZmZlciA9IE5VTEw7Ci0gICAgc3RydWN0IHZlbmNfYnVmZmVyICBmcmFtZWluZm87Ci0gICAgc3RydWN0IHY0bDJfYnVmZmVyIGJ1ZjsKLSAgICBzdHJ1Y3QgdjRsMl9wbGFuZSBwbGFuZVtWSURFT19NQVhfUExBTkVTXTsKLSAgICBpbnQgcmMgPSAwOwotICAgIHVuc2lnbmVkIGludCBleHRyYV9pZHg7Ci0gICAgc3RydWN0IE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZoZHI7Ci0KLSAgICBpZiAoYnVmZmVyID09IE5VTEwpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJ1ZmhkciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKWJ1ZmZlcjsKLQotICAgIGlmIChwbWVtX2RhdGFfYnVmKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiSW50ZXJuYWwgUE1FTSBhZGRyIGZvciBvL3AgSGVhcCBVc2VCdWY6ICVwIiwgcG1lbV9kYXRhX2J1Zik7Ci0gICAgICAgIHBsYW5lWzBdLm0udXNlcnB0ciA9ICh1bnNpZ25lZCBsb25nKXBtZW1fZGF0YV9idWY7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTaGFyZWQgUE1FTSBhZGRyIGZvciBvL3AgUE1FTSBVc2VCdWYvQWxsb2NhdGVCdWY6ICVwIiwgYnVmaGRyLT5wQnVmZmVyKTsKLSAgICAgICAgcGxhbmVbMF0ubS51c2VycHRyID0gKHVuc2lnbmVkIGxvbmcpYnVmaGRyLT5wQnVmZmVyOwotICAgIH0KLQotICAgIG1lbXNldCgmYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0gICAgbWVtc2V0KCZwbGFuZSwgMCwgc2l6ZW9mKHBsYW5lKSk7Ci0KLSAgICBidWYuaW5kZXggPSBpbmRleDsKLSAgICBidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX1VTRVJQVFI7Ci0gICAgcGxhbmVbMF0ubGVuZ3RoID0gYnVmaGRyLT5uQWxsb2NMZW47Ci0gICAgcGxhbmVbMF0uYnl0ZXN1c2VkID0gYnVmaGRyLT5uRmlsbGVkTGVuOwotICAgIHBsYW5lWzBdLnJlc2VydmVkWzBdID0gZmQ7Ci0gICAgcGxhbmVbMF0ucmVzZXJ2ZWRbMV0gPSAwOwotICAgIHBsYW5lWzBdLmRhdGFfb2Zmc2V0ID0gYnVmaGRyLT5uT2Zmc2V0OwotICAgIGJ1Zi5tLnBsYW5lcyA9IHBsYW5lOwotICAgIGJ1Zi5sZW5ndGggPSBudW1fb3V0cHV0X3BsYW5lczsKLSAgICBidWYuZmxhZ3MgPSAwOwotCi0gICAgaWYgKHZlbmNfaGFuZGxlLT5pc19zZWN1cmVfc2Vzc2lvbigpKSB7Ci0gICAgICAgIGlmICh2ZW5jX2hhbmRsZS0+YWxsb2NhdGVfbmF0aXZlX2hhbmRsZSkgewotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGVfdCA9IChuYXRpdmVfaGFuZGxlX3QgKikoYnVmaGRyLT5wQnVmZmVyKTsKLSAgICAgICAgICAgIHBsYW5lWzBdLmxlbmd0aCA9IGhhbmRsZV90LT5kYXRhWzNdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0cHV0X21ldGFidWZmZXIgKm1ldGFfYnVmID0gKG91dHB1dF9tZXRhYnVmZmVyICopKGJ1Zmhkci0+cEJ1ZmZlcik7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZV90ID0gbWV0YV9idWYtPm5oOwotICAgICAgICAgICAgcGxhbmVbMF0ubGVuZ3RoID0gaGFuZGxlX3QtPmRhdGFbM107Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUJhdGNoU2l6ZSkgewotICAgICAgICAvLyBTaG91bGQgYWx3YXlzIG1hcmsgZmlyc3QgYnVmZmVyIGFzIERFRkVSLCBzaW5jZSAwICUgYW55dGhpbmcgaXMgMCwganVzdCBvZmZzZXQgYnkgMQotICAgICAgICAvLyBUaGlzIHJlc3VsdHMgaW4gdGhlIGZpcnN0IGJhdGNoIGJlaW5nIG9mIHNpemUgbUJhdGNoU2l6ZSArIDEsIGJ1dCB0aGF0cyBnb29kIGJlY2F1c2UKLSAgICAgICAgLy8gd2UgbmVlZCBhbiBleHRyYSBGVEIgZm9yIHRoZSBjb2RlYyBzcGVjaWZpYyBkYXRhLgotCi0gICAgICAgIGlmICghZnRiIHx8IGZ0YiAlIG1CYXRjaFNpemUpIHsKLSAgICAgICAgICAgIGJ1Zi5mbGFncyB8PSBWNEwyX01TTV9CVUZfRkxBR19ERUZFUjsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiZm9yIGZ0YiBidWZmZXIgJWQgbWFya2luZyBhcyBkZWZlciIsIGZ0YiArIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXh0cmFfaWR4ID0gRVhUUkFEQVRBX0lEWChudW1fb3V0cHV0X3BsYW5lcyk7Ci0KLSAgICBpZiAoZXh0cmFfaWR4ICYmIChleHRyYV9pZHggPCBWSURFT19NQVhfUExBTkVTKSkgewotICAgICAgICBwbGFuZVtleHRyYV9pZHhdLmJ5dGVzdXNlZCA9IDA7Ci0gICAgICAgIHBsYW5lW2V4dHJhX2lkeF0ubGVuZ3RoID0gb3V0cHV0X2V4dHJhZGF0YV9pbmZvLmJ1ZmZlcl9zaXplOwotICAgICAgICBwbGFuZVtleHRyYV9pZHhdLm0udXNlcnB0ciA9ICh1bnNpZ25lZCBsb25nKSAob3V0cHV0X2V4dHJhZGF0YV9pbmZvLnVhZGRyICsgaW5kZXggKiBvdXRwdXRfZXh0cmFkYXRhX2luZm8uYnVmZmVyX3NpemUpOwotI2lmZGVmIFVTRV9JT04KLSAgICAgICAgcGxhbmVbZXh0cmFfaWR4XS5yZXNlcnZlZFswXSA9IG91dHB1dF9leHRyYWRhdGFfaW5mby5pb24uZmRfaW9uX2RhdGEuZmQ7Ci0jZW5kaWYKLSAgICAgICAgcGxhbmVbZXh0cmFfaWR4XS5yZXNlcnZlZFsxXSA9IG91dHB1dF9leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZSAqIGluZGV4OwotICAgICAgICBwbGFuZVtleHRyYV9pZHhdLmRhdGFfb2Zmc2V0ID0gMDsKLSAgICB9IGVsc2UgaWYgKGV4dHJhX2lkeCA+PSBWSURFT19NQVhfUExBTkVTKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFeHRyYWRhdGEgaW5kZXggaGlnaGVyIHRoYW4gZXhwZWN0ZWQ6ICVkIiwgZXh0cmFfaWR4KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfUUJVRiwgJmJ1Zik7Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBxYnVmIChmdGIpIHRvIGRyaXZlciIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZnRiKys7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X2luYmFuZF92aWRlb19oZWFkZXIoT01YX0JPT0wgZW5hYmxlKQotewotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLQotICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFOwotICAgIGlmKGVuYWJsZSkgewotICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0hFQURFUl9NT0RFX0pPSU5FRF9XSVRIXzFTVF9GUkFNRTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0hFQURFUl9NT0RFX1NFUEFSQVRFOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0hJR0goIlNldCBpbmJhbmQgc3BzL3BwczogJWQiLCBlbmFibGUpOwotICAgIGlmKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpIDwgMCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiUmVxdWVzdCBmb3IgaW5iYW5kIHNwcy9wcHMgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X2F1X2RlbGltaXRlcihPTVhfQk9PTCBlbmFibGUpCi17Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19BVV9ERUxJTUlURVI7Ci0gICAgaWYoZW5hYmxlKSB7Ci0gICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19BVV9ERUxJTUlURVJfRU5BQkxFRDsKLSAgICB9IGVsc2UgewotICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fQVVfREVMSU1JVEVSX0RJU0FCTEVEOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0hJR0goIlNldCBBVSBkZWxpbWl0ZXJzOiAlZCIsIGVuYWJsZSk7Ci0gICAgaWYoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkgPCAwKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJSZXF1ZXN0IGZvciBBVSBkZWxpbWl0ZXJzIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgdmVuY19kZXY6OnZlbmNfZ2V0X2luZGV4X2Zyb21fZmQoT01YX1UzMiBpb25fZmQsIE9NWF9VMzIgYnVmZmVyX2ZkKQotewotICAgIHVuc2lnbmVkIGludCBjb29raWUgPSBidWZmZXJfZmQ7Ci0gICAgc3RydWN0IGlvbl9mZF9kYXRhIGZkRGF0YTsKLQotICAgIG1lbXNldCgmZmREYXRhLCAwLCBzaXplb2YoZmREYXRhKSk7Ci0gICAgZmREYXRhLmZkID0gYnVmZmVyX2ZkOwotICAgIGlmIChpb25fZmQgJiYgIWlvY3RsKGlvbl9mZCwgSU9OX0lPQ19JTVBPUlQsICZmZERhdGEpKSB7Ci0gICAgICAgIGNvb2tpZSA9IGZkRGF0YS5oYW5kbGU7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZEID0gJXUgaW1wb3J0ZWQgaGFuZGxlID0gJXUiLCBmZERhdGEuZmQsIGZkRGF0YS5oYW5kbGUpOwotICAgIH0KLQotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgKHNpemVvZihmZF9saXN0KS9zaXplb2YoZmRfbGlzdFswXSkpOyBpKyspIHsKLSAgICAgICAgaWYgKGZkX2xpc3RbaV0gPT0gY29va2llKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJGRCBpcyBwcmVzZW50IGF0IGluZGV4ID0gJWQiLCBpKTsKLSAgICAgICAgICAgIGlmIChpb25fZmQgJiYgIWlvY3RsKGlvbl9mZCwgSU9OX0lPQ19GUkVFLCAmZmREYXRhLmhhbmRsZSkpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJmcmVlZCBoYW5kbGUgPSAldSIsIGNvb2tpZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgKHNpemVvZihmZF9saXN0KS9zaXplb2YoZmRfbGlzdFswXSkpOyBpKyspCi0gICAgICAgIGlmIChmZF9saXN0W2ldID09IDApIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkZEIGFkZGVkIGF0IGluZGV4ID0gJWQiLCBpKTsKLSAgICAgICAgICAgIGZkX2xpc3RbaV0gPSBjb29raWU7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF92cXppcF9zZWlfdHlwZShPTVhfQk9PTCBlbmFibGUpCi17Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBzZWlfY29udHJvbCA9IHswLDB9LCB5dXZzdGF0c19jb250cm9sID0gezAsMH07Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJTZXQgVlFaSVAgU0VJOiAlZCIsIGVuYWJsZSk7Ci0gICAgc2VpX2NvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fVlFaSVBfU0VJOwotICAgIHl1dnN0YXRzX2NvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRVhUUkFEQVRBOwotCi0gICAgaWYoZW5hYmxlKSB7Ci0gICAgICAgIHNlaV9jb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1ZRWklQX1NFSV9FTkFCTEU7Ci0gICAgICAgIHl1dnN0YXRzX2NvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfWVVWX1NUQVRTOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlaV9jb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1ZRWklQX1NFSV9ESVNBQkxFOwotICAgIH0KLQotICAgIGlmIChpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZzZWlfY29udHJvbCkgPCAwKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIk5vbi1GYXRhbDogUmVxdWVzdCB0byBzZXQgU0VJIGZhaWxlZCIpOwotICAgIH0KLQotICAgIGlmIChpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZ5dXZzdGF0c19jb250cm9sKSA8IDApIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiTm9uLUZhdGFsOiBSZXF1ZXN0IHRvIHNldCBZVVZTVEFUUyBmYWlsZWQiKTsKLSAgICB9Ci0jaWZkZWYgX1ZRWklQXwotICAgIHZxemlwLnBDb25maWcubldpZHRoID0gQUxJR04obV9zVmVuY19jZmcuaW5wdXRfd2lkdGgsIDE2KTsKLSAgICB2cXppcC5wQ29uZmlnLm5IZWlnaHQgPSBBTElHTihtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQsIDE2KTsKLSAgICB2cXppcC5pbml0KCk7Ci0gICAgdnF6aXBfc2VpX2luZm8uZW5hYmxlZCA9IHRydWU7Ci0jZW5kaWYKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9leHRyYWRhdGEoT01YX1UzMiBleHRyYV9kYXRhLCBPTVhfQk9PTCBlbmFibGUpCi17Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotCi0gICAgREVCVUdfUFJJTlRfSElHSCgidmVuY19zZXRfZXh0cmFkYXRhOjogJXgiLCAoaW50KSBleHRyYV9kYXRhKTsKLQotICAgIGlmIChlbmFibGUgPT0gT01YX0ZBTFNFKSB7Ci0gICAgICAgIC8qIE5vIGVhc3kgd2F5IHRvIHR1cm4gb2ZmIGV4dHJhZGF0YSB0byB0aGUgZHJpdmVyCi0gICAgICAgICAqIGF0IHRoZSBtb21lbnQgKi8KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRVhUUkFEQVRBOwotICAgIHN3aXRjaCAoZXh0cmFfZGF0YSkgewotICAgICAgICBjYXNlIE9NWF9FeHRyYURhdGFWaWRlb0VuY29kZXJTbGljZUluZm86Ci0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfRVhUUkFEQVRBX01VTFRJU0xJQ0VfSU5GTzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9FeHRyYURhdGFWaWRlb0VuY29kZXJNQkluZm86Ci0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfRVhUUkFEQVRBX01FVEFEQVRBX01CSTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9FeHRyYURhdGFGcmFtZURpbWVuc2lvbjoKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19FWFRSQURBVEFfSU5QVVRfQ1JPUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9FeHRyYURhdGFFbmNvZGVyT3ZlcnJpZGVRUEluZm86Ci0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfRVhUUkFEQVRBX1BRX0lORk87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJVbnJlY29nbml6ZWQgZXh0cmFkYXRhIGluZGV4IDB4JXgiLCAodW5zaWduZWQgaW50KWV4dHJhX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFJlcXVlc3QgZm9yIHNldHRpbmcgZXh0cmFkYXRhICgleCkgZmFpbGVkICVkIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWV4dHJhX2RhdGEsIGVycm5vKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9zbGljZV9kZWxpdmVyeV9tb2RlKE9NWF9VMzIgZW5hYmxlKQotewotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLQotICAgIGlmIChlbmFibGUpIHsKLSAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfREVMSVZFUllfTU9ERTsKLSAgICAgICAgY29udHJvbC52YWx1ZSA9IDE7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiU2V0IHNsaWNlX2RlbGl2ZXJ5X21vZGU6ICVkIiwgY29udHJvbC52YWx1ZSk7Ci0KLSAgICAgICAgaWYgKG11bHRpc2xpY2UubXNsaWNlX21vZGUgPT0gVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NJQ0VfTU9ERV9NQVhfTUIgJiYgbV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IMjY0KSB7Ci0gICAgICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiUmVxdWVzdCBmb3Igc2V0dGluZyBzbGljZSBkZWxpdmVyeSBtb2RlIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTdWNjZXNzZnVsbHkgc2V0IFNsaWNlIGRlbGl2ZXJ5IG1vZGUgaWQ6ICVkLCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgICAgICAgICAgICAgIHNsaWNlX21vZGUuZW5hYmxlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHNsaWNlIGRlbGl2ZXJ5IG1vZGUsIHNsaWNlX21vZGUgWyVsdV0gIgotICAgICAgICAgICAgICAgICAgICAiaXMgbm90IE1CIEJBU0VEIG9yIFslbHVdIGlzIG5vdCBIMjY0IGNvZGVjICIsIG11bHRpc2xpY2UubXNsaWNlX21vZGUsCi0gICAgICAgICAgICAgICAgICAgIG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiU2xpY2VfREVMSVZFUllfTU9ERSBub3QgZW5hYmxlZCIpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9jb2xvcnNwYWNlKE9NWF9VMzIgcHJpbWFyaWVzLCBPTVhfVTMyIHJhbmdlLAotICAgIE9NWF9VMzIgdHJhbnNmZXJfY2hhcnMsIE9NWF9VMzIgbWF0cml4X2NvZWZmcykKLXsKLSAgICBpbnQgcmM7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJTZXR0aW5nIGNvbG9yIHNwYWNlIDogUHJpbWFyaWVzID0gJWQsIFJhbmdlID0gJWQsIFRyYW5zID0gJWQsIE1hdHJpeCA9ICVkIiwKLSAgICAgICAgcHJpbWFyaWVzLCByYW5nZSwgdHJhbnNmZXJfY2hhcnMsIG1hdHJpeF9jb2VmZnMpOwotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19DT0xPUl9TUEFDRTsKLSAgICBjb250cm9sLnZhbHVlID0gcHJpbWFyaWVzOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLQotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBjb250cm9sIDogVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0NPTE9SX1NQQUNFIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotCi0gICAgY29sb3Jfc3BhY2UucHJpbWFyaWVzID0gY29udHJvbC52YWx1ZTsKLQotICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRlVMTF9SQU5HRTsKLSAgICBjb250cm9sLnZhbHVlID0gcmFuZ2U7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkNhbGxpbmcgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWw9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNvbnRyb2wgOiBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRlVMTF9SQU5HRSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJTdWNjZXNzIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsdWU9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLQotICAgIGNvbG9yX3NwYWNlLnJhbmdlID0gY29udHJvbC52YWx1ZTsKLQotICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fVFJBTlNGRVJfQ0hBUlM7Ci0gICAgY29udHJvbC52YWx1ZSA9IHRyYW5zZmVyX2NoYXJzOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLQotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBjb250cm9sIDogVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1RSQU5TRkVSX0NIQVJTIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotCi0gICAgY29sb3Jfc3BhY2UudHJhbnNmZXJfY2hhcnMgPSBjb250cm9sLnZhbHVlOwotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19NQVRSSVhfQ09FRkZTOwotICAgIGNvbnRyb2wudmFsdWUgPSBtYXRyaXhfY29lZmZzOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLQotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBjb250cm9sIDogVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX01BVFJJWF9DT0VGRlMiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiU3VjY2VzcyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbHVlPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0KLSAgICBjb2xvcl9zcGFjZS5tYXRyaXhfY29lZmZzID0gY29udHJvbC52YWx1ZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9xcChPTVhfVTMyIGlfZnJhbWVfcXAsIE9NWF9VMzIgcF9mcmFtZV9xcCxPTVhfVTMyIGJfZnJhbWVfcXAsIE9NWF9VMzIgZW5hYmxlKQotewotICAgIGludCByYzsKLSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0KLSAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0lfRlJBTUVfUVA7Ci0gICAgY29udHJvbC52YWx1ZSA9IGlfZnJhbWVfcXA7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkNhbGxpbmcgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWw9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNvbnRyb2wsIGlkICUjeCwgdmFsdWUgJWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgIHNlc3Npb25fcXAuaWZyYW1lcXAgPSBjb250cm9sLnZhbHVlOwotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19QX0ZSQU1FX1FQOwotICAgIGNvbnRyb2wudmFsdWUgPSBwX2ZyYW1lX3FwOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLQotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBjb250cm9sLCBpZCAlI3gsIHZhbHVlICVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJTdWNjZXNzIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsdWU9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICBzZXNzaW9uX3FwLnBmcmFtZXFwID0gY29udHJvbC52YWx1ZTsKLQotICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fQl9GUkFNRV9RUDsKLSAgICBjb250cm9sLnZhbHVlID0gYl9mcmFtZV9xcDsKLSAgICBERUJVR19QUklOVF9MT1coIkNhbGxpbmcgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWw9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLQotICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNvbnRyb2wsIGlkICUjeCwgdmFsdWUgJWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgIHNlc3Npb25fcXAuYmZyYW1lcXAgPSBjb250cm9sLnZhbHVlOwotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19RUF9NQVNLOwotICAgIGNvbnRyb2wudmFsdWUgPSBlbmFibGU7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkNhbGxpbmcgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWw9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNvbnRyb2wsIGlkICUjeCwgdmFsdWUgJWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgIHNlc3Npb25fcXAuZW5hYmxlcXAgPSBjb250cm9sLnZhbHVlOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X3Nlc3Npb25fcXBfcmFuZ2UoT01YX1FDT01fVklERU9fUEFSQU1fSVBCX1FQUkFOR0VUWVBFKiBxcF9yYW5nZSkKLXsKLSAgICBpbnQgcmM7Ci0gICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgY3RybFs3XTsKLSAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgY29udHJvbHM7Ci0KLSAgICBjdHJsWzBdLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0xBWUVSX0lEOwotICAgIGN0cmxbMF0udmFsdWUgPSBNU01fVklEQ19BTExfTEFZRVJfSUQ7Ci0KLSAgICBjdHJsWzFdLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0lfRlJBTUVfUVBfTUlOOwotICAgIGN0cmxbMV0udmFsdWUgPSBxcF9yYW5nZS0+bWluSVFQOwotCi0gICAgY3RybFsyXS5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19JX0ZSQU1FX1FQX01BWDsKLSAgICBjdHJsWzJdLnZhbHVlID0gcXBfcmFuZ2UtPm1heElRUDsKLQotICAgIGN0cmxbM10uaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUF9GUkFNRV9RUF9NSU47Ci0gICAgY3RybFszXS52YWx1ZSA9IHFwX3JhbmdlLT5taW5QUVA7Ci0KLSAgICBjdHJsWzRdLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1BfRlJBTUVfUVBfTUFYOwotICAgIGN0cmxbNF0udmFsdWUgPSBxcF9yYW5nZS0+bWF4UFFQOwotCi0gICAgY3RybFs1XS5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19CX0ZSQU1FX1FQX01JTjsKLSAgICBjdHJsWzVdLnZhbHVlID0gcXBfcmFuZ2UtPm1pbkJRUDsKLQotICAgIGN0cmxbNl0uaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fQl9GUkFNRV9RUF9NQVg7Ci0gICAgY3RybFs2XS52YWx1ZSA9IHFwX3JhbmdlLT5tYXhCUVA7Ci0KLSAgICBjb250cm9scy5jb3VudCA9IDc7Ci0gICAgY29udHJvbHMuY3RybF9jbGFzcyA9IFY0TDJfQ1RSTF9DTEFTU19NUEVHOwotICAgIGNvbnRyb2xzLmNvbnRyb2xzID0gY3RybDsKLQotICAgIGlmKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfRVhUX0NUUkxTLCAmY29udHJvbHMpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IFFQIHJhbmdlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2Vzc2lvbl9pcGJfcXBfdmFsdWVzLm1pbl9pX3FwID0gcXBfcmFuZ2UtPm1pbklRUDsKLSAgICBzZXNzaW9uX2lwYl9xcF92YWx1ZXMubWF4X2lfcXAgPSBxcF9yYW5nZS0+bWF4SVFQOwotICAgIHNlc3Npb25faXBiX3FwX3ZhbHVlcy5taW5fcF9xcCA9IHFwX3JhbmdlLT5taW5QUVA7Ci0gICAgc2Vzc2lvbl9pcGJfcXBfdmFsdWVzLm1heF9wX3FwID0gcXBfcmFuZ2UtPm1heFBRUDsKLSAgICBzZXNzaW9uX2lwYl9xcF92YWx1ZXMubWluX2JfcXAgPSBxcF9yYW5nZS0+bWluQlFQOwotICAgIHNlc3Npb25faXBiX3FwX3ZhbHVlcy5tYXhfYl9xcCA9IHFwX3JhbmdlLT5tYXhCUVA7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X3Byb2ZpbGUoT01YX1UzMiBlUHJvZmlsZSkKLXsKLSAgICBpbnQgcmM7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX3NldF9wcm9maWxlOjogZVByb2ZpbGUgPSAldSIsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KWVQcm9maWxlKTsKLQotICAgIGlmIChtX3NWZW5jX2NmZy5jb2RlY3R5cGUgPT0gVjRMMl9QSVhfRk1UX0gyNjQpIHsKLSAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFOwotICAgICAgICBpZiAoZVByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSkgewotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQkFTRUxJTkU7Ci0gICAgICAgIH0gZWxzZSBpZihlUHJvZmlsZSA9PSBRT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lIHx8Ci0gICAgICAgICAgICAgICAgICBlUHJvZmlsZSA9PSBPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUpIHsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0NPTlNUUkFJTkVEX0JBU0VMSU5FOwotICAgICAgICB9IGVsc2UgaWYoZVByb2ZpbGUgPT0gUU9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoIHx8Ci0gICAgICAgICAgICAgICAgICBlUHJvZmlsZSA9PSBPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCkgewotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ09OU1RSQUlORURfSElHSDsKLSAgICAgICAgfSBlbHNlIGlmIChlUHJvZmlsZSA9PSBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4pIHsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01BSU47Ci0gICAgICAgIH0gZWxzZSBpZiAoZVByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoKSB7Ci0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJFUlJPUjogVW5zdXBwb3J0ZWQgSC4yNjQgcHJvZmlsZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfVlA4KSB7Ci0gICAgICAgIC8vVE9ETzogU2V0IFZQOCBsZXZlbC9wcm9maWxlIGN1cnJlbnRseSBiYXNlZCBvbiBkcml2ZXIgY2hhbmdlCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gIGVsc2UgaWYgKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfSEVWQykgewotICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0hFVkNfUFJPRklMRTsKLSAgICAgICAgaWYgKGVQcm9maWxlID09IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4pIHsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX1BST0ZJTEVfTUFJTjsKLSAgICAgICAgfSBlbHNlIGlmKGVQcm9maWxlID09IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4xMCkgewotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX1ZJREVPX0hFVkNfUFJPRklMRV9NQUlOMTA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFVuc3VwcG9ydGVkIEhFVkMgcHJvZmlsZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiV3JvbmcgQ09ERUMiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiQ2FsbGluZyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbD0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgY29udHJvbCwgaWQgJSN4LCB2YWx1ZSAlZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJTdWNjZXNzIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsdWU9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLQotICAgIGNvZGVjX3Byb2ZpbGUucHJvZmlsZSA9IGNvbnRyb2wudmFsdWU7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19zZXRfbGV2ZWwoT01YX1UzMiBlTGV2ZWwpCi17Ci0gICAgaW50IHJjOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLQotICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfbGV2ZWw6OiBlTGV2ZWwgPSAldSIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZUxldmVsKTsKLQotICAgIGlmIChtX3NWZW5jX2NmZy5jb2RlY3R5cGUgPT0gVjRMMl9QSVhfRk1UX0gyNjQpIHsKLSAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTDsKLSAgICAgICAgc3dpdGNoKGVMZXZlbCkgewotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxOgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDFiOgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xQjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTE6Ci0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTI6Ci0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTM6Ci0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjoKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMjoKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzOgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMxOgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMyOgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQ6Ci0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDE6Ci0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDI6Ci0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1MToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1MjoKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWxNYXg6Ci0gICAgICAgICAgICBjYXNlIE9NWF9WSURFT19MRVZFTF9VTktOT1dOOgotICAgICAgICAgICAgZGVmYXVsdDogLy9TZXQgbWF4IGxldmVsIHBvc3NpYmxlIGFzIGRlZmF1bHQgc28gdGhhdCBpbnZhbGlkIGxldmVscyBhcmUgbm9uLWZhdGFsCi0gICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMX1VOS05PV047Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfVlA4KSB7Ci0gICAgICAgIC8vVE9ETzogU2V0IFZQOCBsZXZlbC9wcm9maWxlIGN1cnJlbnRseSBiYXNlZCBvbiBkcml2ZXIgY2hhbmdlCi0gICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fVlA4X1BST0ZJTEVfTEVWRUw7Ci0gICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19WUDhfVU5VU0VEOwotICAgIH0gZWxzZSBpZiAobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IRVZDKSB7Ci0gICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fSEVWQ19USUVSX0xFVkVMOwotICAgICAgICBzd2l0Y2ggKGVMZXZlbCkgewotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwxOgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX01BSU5fVElFUl9MRVZFTF8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWwxOgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX0hJR0hfVElFUl9MRVZFTF8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwyOgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX01BSU5fVElFUl9MRVZFTF8yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWwyOgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX0hJR0hfVElFUl9MRVZFTF8yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwyMToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfMl8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWwyMToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfMl8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwzOgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX01BSU5fVElFUl9MRVZFTF8zOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWwzOgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX0hJR0hfVElFUl9MRVZFTF8zOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwzMToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfM18xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWwzMToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfM18xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0OgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX01BSU5fVElFUl9MRVZFTF80OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw0OgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX0hJR0hfVElFUl9MRVZFTF80OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0MToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNF8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw0MToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfNF8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1OgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX01BSU5fVElFUl9MRVZFTF81OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw1OgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX0hJR0hfVElFUl9MRVZFTF81OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNV8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw1MToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfNV8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MjoKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNV8yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw1MjoKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfNV8yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw2OgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX01BSU5fVElFUl9MRVZFTF82OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw2OgotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX0hJR0hfVElFUl9MRVZFTF82OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw2MToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNl8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw2MToKLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfNl8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0xldmVsTWF4OgotICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fTEVWRUxfVU5LTk9XTjoKLSAgICAgICAgICAgIGRlZmF1bHQ6IC8vU2V0IG1heCBsZXZlbCBwb3NzaWJsZSBhcyBkZWZhdWx0IHNvIHRoYXQgaW52YWxpZCBsZXZlbHMgYXJlIG5vbi1mYXRhbAotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX0xFVkVMX1VOS05PV047Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9ICBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIldyb25nIENPREVDIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkNhbGxpbmcgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWw9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNvbnRyb2wsIGlkICUjeCwgdmFsdWUgJWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiU3VjY2VzcyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbHVlPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0KLSAgICBwcm9maWxlX2xldmVsLmxldmVsID0gY29udHJvbC52YWx1ZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF92b3B0aW1pbmdfY2ZnKCBPTVhfVTMyIFRpbWVJbmNSZXMpCi17Ci0KLSAgICBzdHJ1Y3QgdmVuY192b3B0aW1pbmdjZmcgdm9wX3RpbWluZ19jZmc7Ci0KLSAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3ZvcHRpbWluZ19jZmc6IFRpbWVSZXMgPSAldSIsCi0gICAgICAgICAgICAodW5zaWduZWQgaW50KVRpbWVJbmNSZXMpOwotCi0gICAgdm9wX3RpbWluZ19jZmcudm9wdGltZV9yZXNvbHV0aW9uID0gVGltZUluY1JlczsKLQotICAgIHZvcHRpbWVjZmcudm9wdGltZV9yZXNvbHV0aW9uID0gdm9wX3RpbWluZ19jZmcudm9wdGltZV9yZXNvbHV0aW9uOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3JlY29uZmlndXJlX2ludHJhX3BlcmlvZCgpCi17Ci0gICAgaW50ICByYzsKLSAgICBib29sIGlzVmFsaWRSZXNvbHV0aW9uICAgPSBmYWxzZTsKLSAgICBib29sIGlzVmFsaWRGcHMgICAgICAgICAgPSBmYWxzZTsKLSAgICBib29sIGlzVmFsaWRQcm9maWxlTGV2ZWwgPSBmYWxzZTsKLSAgICBib29sIGlzVmFsaWRMYXllckNvdW50ICAgPSBmYWxzZTsKLSAgICBib29sIGVuYWJsZUJmcmFtZXMgICAgICAgPSBmYWxzZTsKLSAgICBib29sIGlzVmFsaWRMdHJTZXR0aW5nICAgPSBmYWxzZTsKLSAgICBib29sIGlzVmFsaWRSY01vZGUgICAgICAgPSBmYWxzZTsKLSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0KLSAgICBERUJVR19QUklOVF9MT1coInZlbmNfcmVjb25maWd1cmVfaW50cmFfcGVyaW9kIik7Ci0KLSAgICBpZiAoKG1fc1ZlbmNfY2ZnLmlucHV0X3dpZHRoIDw9IFZFTkNfQkZSQU1FX01BWF9XSURUSCAmJiBtX3NWZW5jX2NmZy5pbnB1dF93aWR0aCA8PSBWRU5DX0JGUkFNRV9NQVhfSEVJR0hUKSB8fAotICAgICAgICAobV9zVmVuY19jZmcuaW5wdXRfd2lkdGggPD0gVkVOQ19CRlJBTUVfTUFYX0hFSUdIVCAmJiBtX3NWZW5jX2NmZy5pbnB1dF93aWR0aCA8PSBWRU5DX0JGUkFNRV9NQVhfV0lEVEgpKSB7Ci0gICAgICAgIGlzVmFsaWRSZXNvbHV0aW9uID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoKG1fc1ZlbmNfY2ZnLmZwc19udW0gLyBtX3NWZW5jX2NmZy5mcHNfZGVuKSA8PSBWRU5DX0JGUkFNRV9NQVhfRlBTKSB7Ci0gICAgICAgIGlzVmFsaWRGcHMgPSB0cnVlOwotICAgIH0KLQotICAgIGlmICgoY29kZWNfcHJvZmlsZS5wcm9maWxlID09IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTUFJTikgICAgICAgICAgICAgfHwKLSAgICAgICAgKGNvZGVjX3Byb2ZpbGUucHJvZmlsZSA9PSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX1BST0ZJTEVfTUFJTikgICAgICAgIHx8Ci0gICAgICAgIChjb2RlY19wcm9maWxlLnByb2ZpbGUgPT0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19QUk9GSUxFX01BSU4xMCkgICAgICB8fAotICAgICAgICAoY29kZWNfcHJvZmlsZS5wcm9maWxlID09IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSCkpICAgewotICAgICAgICBpc1ZhbGlkUHJvZmlsZUxldmVsID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAodGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uUExheWVycyA8PSAxKSB7Ci0gICAgICAgIGlzVmFsaWRMYXllckNvdW50ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoKHJhdGVfY3RybC5yY21vZGUgPT0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JBVEVfQ09OVFJPTF9WQlJfQ0ZSKSB8fAotICAgICAgICAocmF0ZV9jdHJsLnJjbW9kZSA9PSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUkFURV9DT05UUk9MX1ZCUl9WRlIpIHx8Ci0gICAgICAgIChyYXRlX2N0cmwucmNtb2RlID09IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19SQVRFX0NPTlRST0xfTUJSX0NGUikgfHwKLSAgICAgICAgKHJhdGVfY3RybC5yY21vZGUgPT0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JBVEVfQ09OVFJPTF9NQlJfVkZSKSkgewotICAgICAgICAgICAgaXNWYWxpZFJjTW9kZSA9IHRydWU7Ci0gICAgfQotCi0gICAgaXNWYWxpZEx0clNldHRpbmcgPSBsdHJpbmZvLmVuYWJsZWQgPyBmYWxzZSA6IHRydWU7Ci0KLSAgICBlbmFibGVCZnJhbWVzID0gaXNWYWxpZFJlc29sdXRpb24gICAmJgotICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkRnBzICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgIGlzVmFsaWRQcm9maWxlTGV2ZWwgJiYKLSAgICAgICAgICAgICAgICAgICAgaXNWYWxpZExheWVyQ291bnQgICAmJgotICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkTHRyU2V0dGluZyAgICYmCi0gICAgICAgICAgICAgICAgICAgIGlzVmFsaWRSY01vZGU7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkItZnJhbWUgZW5hYmxlbWVudCA9ICV1OyBDb25kaXRpb25zIGZvciBSZXNvbHV0aW9uID0gJXUsIEZQUyA9ICV1LCBQcm9maWxlL0xldmVsID0gJXUiCi0gICAgICAgICAgICAgICAgICAgICAiIExheWVyIGNvbmRpdGlvbiA9ICV1LCBMVFIgPSAldSwgUkMgPSAldVxuIiwKLSAgICAgICAgZW5hYmxlQmZyYW1lcywgaXNWYWxpZFJlc29sdXRpb24sIGlzVmFsaWRGcHMsIGlzVmFsaWRQcm9maWxlTGV2ZWwsCi0gICAgICAgIGlzVmFsaWRMYXllckNvdW50LCBpc1ZhbGlkTHRyU2V0dGluZywgaXNWYWxpZFJjTW9kZSk7Ci0KLSAgICBpZiAoZW5hYmxlQmZyYW1lcyAmJiBpbnRyYV9wZXJpb2QubnVtX2JmcmFtZXMgPT0gMCkgewotICAgICAgICBpbnRyYV9wZXJpb2QubnVtX2JmcmFtZXMgPSBWRU5DX0JGUkFNRV9NQVhfQ09VTlQ7Ci0gICAgICAgIGludHJhX3BlcmlvZC5udW1fcGZyYW1lcyA9IGludHJhX3BlcmlvZC5udW1fcGZyYW1lcyAvICgxICsgaW50cmFfcGVyaW9kLm51bV9iZnJhbWVzKTsKLSAgICB9IGVsc2UgaWYgKCFlbmFibGVCZnJhbWVzICYmIGludHJhX3BlcmlvZC5udW1fYmZyYW1lcyA+IDApIHsKLSAgICAgICAgaW50cmFfcGVyaW9kLm51bV9wZnJhbWVzID0gaW50cmFfcGVyaW9kLm51bV9wZnJhbWVzICsgKGludHJhX3BlcmlvZC5udW1fcGZyYW1lcyAqIGludHJhX3BlcmlvZC5udW1fYmZyYW1lcyk7Ci0gICAgICAgIGludHJhX3BlcmlvZC5udW1fYmZyYW1lcyA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVmFsdWVzIGFscmVhZHkgc2V0IGZvciBuUC9CIGZyYW1lcyBhcmUgY29ycmVjdAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIXZlbmNfY2FsaWJyYXRlX2dvcCgpKQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgc2V0dGluZ3MsIEh5YnJpZCBIUCBlbmFibGVkIHdpdGggTFRSIE9SIEhpZXItcExheWVycyBPUiBiZnJhbWVzIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb250cm9sLmlkICAgID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX05VTV9QX0ZSQU1FUzsKLSAgICBjb250cm9sLnZhbHVlID0gaW50cmFfcGVyaW9kLm51bV9wZnJhbWVzOwotCi0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLQotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBjb250cm9sIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19OVU1fUF9GUkFNRVMiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiU3VjY2VzcyBJT0NUTCBzZXQgY29udHJvbCBmb3IgVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX05VTV9QX0ZSQU1FUyB2YWx1ZT0lZCIsIGNvbnRyb2wudmFsdWUpOwotCi0gICAgY29udHJvbC5pZCAgICA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19OVU1fQl9GUkFNRVM7Ci0gICAgY29udHJvbC52YWx1ZSA9IGludHJhX3BlcmlvZC5udW1fYmZyYW1lczsKLQotICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgY29udHJvbCBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fTlVNX0JfRlJBTUVTIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19OVU1fQl9GUkFNRVMgdmFsdWU9JWx1IiwgaW50cmFfcGVyaW9kLm51bV9iZnJhbWVzKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9pbnRyYV9wZXJpb2QoT01YX1UzMiBuUEZyYW1lcywgT01YX1UzMiBuQkZyYW1lcykKLXsKLQotICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfaW50cmFfcGVyaW9kOiBuUEZyYW1lcyA9ICV1LCBuQkZyYW1lczogJXUiLCAodW5zaWduZWQgaW50KW5QRnJhbWVzLCAodW5zaWduZWQgaW50KW5CRnJhbWVzKTsKLSAgICBpbnQgcmM7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIGludCBwZnJhbWUgPSAwLCBiZnJhbWUgPSAwOwotICAgIGNoYXIgcHJvcGVydHlfdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLQotICAgIGlmICgoc3RyZWFtaW5nW09VVFBVVF9QT1JUXSB8fCBzdHJlYW1pbmdbQ0FQVFVSRV9QT1JUXSkgJiYgKGludHJhX3BlcmlvZC5udW1fYmZyYW1lcyAhPSBuQkZyYW1lcykpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgc2V0dGluZ3MsIENhbm5vdCBjaGFuZ2UgQiBmcmFtZSBjb3VudCBkeW5hbWljYWxseSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKChjb2RlY19wcm9maWxlLnByb2ZpbGUgIT0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQURWQU5DRURfU0lNUExFKSAmJgotICAgICAgICAoY29kZWNfcHJvZmlsZS5wcm9maWxlICE9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTUFJTikgICAgICAgICAgICAgJiYKLSAgICAgICAgKGNvZGVjX3Byb2ZpbGUucHJvZmlsZSAhPSBWNEwyX01QRUdfVklEQ19WSURFT19IRVZDX1BST0ZJTEVfTUFJTikgICAgICAgICYmCi0gICAgICAgIChjb2RlY19wcm9maWxlLnByb2ZpbGUgIT0gVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19QUk9GSUxFX01BSU4xMCkgICAgICAmJgotICAgICAgICAoY29kZWNfcHJvZmlsZS5wcm9maWxlICE9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSCkpIHsKLSAgICAgICAgbkJGcmFtZXM9MDsKLSAgICB9Ci0KLSAgICBpZiAodGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uUExheWVycyA+IDEgJiYgbkJGcmFtZXMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgc2V0dGluZ3MsIGJmcmFtZXMgY2Fubm90IGJlIGVuYWJsZWQgd2l0aCBIUC4gUmVzZXR0aW5nIGl0IHRvIDAiKTsKLSAgICAgICAgbkJGcmFtZXMgPSAwOwotICAgIH0KLQotICAgIGlmICghdmVuY192YWxpZGF0ZV9yYW5nZShWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fTlVNX0JfRlJBTUVTLCBuQkZyYW1lcykgfHwgKG5CRnJhbWVzID4gVkVOQ19CRlJBTUVfTUFYX0NPVU5UKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSW52YWxpZCBzZXR0aW5ncywgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0ICV1IGJmcmFtZXMiLCBuQkZyYW1lcyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnRyYV9wZXJpb2QubnVtX3BmcmFtZXMgPSBuUEZyYW1lczsKLSAgICBpbnRyYV9wZXJpb2QubnVtX2JmcmFtZXMgPSBuQkZyYW1lczsKLQotICAgIGlmICghdmVuY19jYWxpYnJhdGVfZ29wKCkgJiYgIWlzX3RodWxpdW1fdjEpCi0gICAgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSW52YWxpZCBzZXR0aW5ncywgSHlicmlkIEhQIGVuYWJsZWQgd2l0aCBMVFIgT1IgSGllci1wTGF5ZXJzIE9SIGJmcmFtZXMiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fTlVNX1BfRlJBTUVTOwotICAgIGNvbnRyb2wudmFsdWUgPSBpbnRyYV9wZXJpb2QubnVtX3BmcmFtZXM7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLQotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBjb250cm9sLCBpZCAlI3gsIHZhbHVlICVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19OVU1fQl9GUkFNRVM7Ci0gICAgY29udHJvbC52YWx1ZSA9IGludHJhX3BlcmlvZC5udW1fYmZyYW1lczsKLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNvbnRyb2wsIGlkICUjeCwgdmFsdWUgJWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiU3VjY2VzcyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbHVlPSVsdSIsIGNvbnRyb2wuaWQsIGludHJhX3BlcmlvZC5udW1fYmZyYW1lcyk7Ci0KLSAgICBpZiAobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IMjY0IHx8Ci0gICAgICAgIG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfSEVWQykgewotICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0lEUl9QRVJJT0Q7Ci0gICAgICAgIGNvbnRyb2wudmFsdWUgPSAxOwotCi0gICAgICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0KLSAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNvbnRyb2wsIGlkICUjeCwgdmFsdWUgJWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZHJwZXJpb2QuaWRycGVyaW9kID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X2lkcl9wZXJpb2QoT01YX1UzMiBuUEZyYW1lcywgT01YX1UzMiBuSURSUGVyaW9kKQotewotICAgIGludCByYyA9IDA7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfaWRyX3BlcmlvZDogblBGcmFtZXMgPSAldSwgbklEUlBlcmlvZDogJXUiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGludCluUEZyYW1lcywgKHVuc2lnbmVkIGludCluSURSUGVyaW9kKTsKLQotICAgIGlmIChtX3NWZW5jX2NmZy5jb2RlY3R5cGUgIT0gVjRMMl9QSVhfRk1UX0gyNjQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBJRFIgcGVyaW9kIHZhbGlkIGZvciBIMjY0IG9ubHkhISIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHZlbmNfc2V0X2ludHJhX3BlcmlvZCAoblBGcmFtZXMsIGludHJhX3BlcmlvZC5udW1fYmZyYW1lcykgPT0gZmFsc2UpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkVSUk9SOiBSZXF1ZXN0IGZvciBzZXR0aW5nIGludHJhIHBlcmlvZCBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghaW50cmFfcGVyaW9kLm51bV9iZnJhbWVzKQotICAgICAgICBpbnRyYV9wZXJpb2QubnVtX3BmcmFtZXMgPSBuUEZyYW1lczsKLSAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0lEUl9QRVJJT0Q7Ci0gICAgY29udHJvbC52YWx1ZSA9IG5JRFJQZXJpb2Q7Ci0KLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNvbnRyb2wsIGlkICUjeCwgdmFsdWUgJWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlkcnBlcmlvZC5pZHJwZXJpb2QgPSBuSURSUGVyaW9kOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9lbnRyb3B5X2NvbmZpZyhPTVhfQk9PTCBlbmFibGUsIE9NWF9VMzIgaV9jYWJhY19sZXZlbCkKLXsKLSAgICBpbnQgcmMgPSAwOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLQotICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfZW50cm9weV9jb25maWc6IENBQkFDID0gJXUgbGV2ZWw6ICV1IiwgZW5hYmxlLCAodW5zaWduZWQgaW50KWlfY2FiYWNfbGV2ZWwpOwotCi0gICAgaWYgKGVuYWJsZSAmJiAoY29kZWNfcHJvZmlsZS5wcm9maWxlICE9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQkFTRUxJTkUpICYmCi0gICAgICAgICAgICAoY29kZWNfcHJvZmlsZS5wcm9maWxlICE9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ09OU1RSQUlORURfQkFTRUxJTkUpKSB7Ci0KLSAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERV9DQUJBQzsKLSAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREU7Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0KLSAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBjb250cm9sLCBpZCAlI3gsIHZhbHVlICVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgICAgICBlbnRyb3B5LmxvbmdlbnRyb3B5c2VsID0gY29udHJvbC52YWx1ZTsKLQotICAgICAgICBpZiAoaV9jYWJhY19sZXZlbCA9PSAwKSB7Ci0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0gyNjRfQ0FCQUNfTU9ERUxfMDsKLSAgICAgICAgfSBlbHNlIGlmIChpX2NhYmFjX2xldmVsID09IDEpIHsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fSDI2NF9DQUJBQ19NT0RFTF8xOwotICAgICAgICB9IGVsc2UgaWYgKGlfY2FiYWNfbGV2ZWwgPT0gMikgewotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19IMjY0X0NBQkFDX01PREVMXzI7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0gyNjRfQ0FCQUNfTU9ERUw7Ci0gICAgICAgIC8vY29udHJvbC52YWx1ZSA9IGVudHJvcHlfY2ZnLmNhYmFjbW9kZWw7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiQ2FsbGluZyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbD0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgICAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotCi0gICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgY29udHJvbCwgaWQgJSN4LCB2YWx1ZSAlZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTdWNjZXNzIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsdWU9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgZW50cm9weS5jYWJhY21vZGVsPWNvbnRyb2wudmFsdWU7Ci0gICAgfSBlbHNlIGlmICghZW5hYmxlKSB7Ci0gICAgICAgIGNvbnRyb2wudmFsdWUgPSAgVjRMMl9NUEVHX1ZJREVPX0gyNjRfRU5UUk9QWV9NT0RFX0NBVkxDOwotICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERTsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0KLSAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBjb250cm9sLCBpZCAlI3gsIHZhbHVlICVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgICAgICBlbnRyb3B5LmxvbmdlbnRyb3B5c2VsPWNvbnRyb2wudmFsdWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgRW50cm9weSBtb2RlIGZvciBCYXNlbGluZSBQcm9maWxlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19zZXRfbXVsdGlzbGljZV9jZmcoT01YX1UzMiBuU2xpY2Vtb2RlLCBPTVhfVTMyIG5TbGljZXNpemUpCi17Ci0gICAgaW50IHJjOwotICAgIGludCBzbGljZV9pZCA9IDA7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLQotICAgIGlmIChtX3NWZW5jX2NmZy5jb2RlY3R5cGUgPT0gVjRMMl9QSVhfRk1UX0gyNjMgfHwgblNsaWNlc2l6ZSA9PSAwKSB7Ci0gICAgICAgIG5TbGljZW1vZGUgPSBWNEwyX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERV9TSU5HTEU7Ci0gICAgICAgIG5TbGljZXNpemUgPSAwOwotICAgIH0KLQotICAgIGlmIChuU2xpY2Vtb2RlID09IFY0TDJfTVBFR19WSURFT19NVUxUSV9TSUNFX01PREVfTUFYX01CKSB7Ci0gICAgICAgIGlmICghdmVuY192YWxpZGF0ZV9yYW5nZShWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01BWF9NQiwgblNsaWNlc2l6ZSkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIHNldHRpbmdzLCBoYXJkd2FyZSBkb2Vzbid0IHN1cHBvcnQgJXUgYXMgc2xpY2VzaXplIiwgblNsaWNlc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc2xpY2VfaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01BWF9NQjsKLQotICAgIH0gZWxzZSBpZiAoblNsaWNlbW9kZSA9PSBWNEwyX01QRUdfVklERU9fTVVMVElfU0lDRV9NT0RFX01BWF9CWVRFUykgewotICAgICAgICBpZiAoIXZlbmNfdmFsaWRhdGVfcmFuZ2UoVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfQllURVMsIG5TbGljZXNpemUpKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiSW52YWxpZCBzZXR0aW5ncywgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0ICV1IGFzIHNsaWNlc2l6ZSIsIG5TbGljZXNpemUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHNsaWNlX2lkID0gVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfQllURVM7Ci0KLSAgICB9IGVsc2UgaWYgKG5TbGljZXNpemUpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgc2V0dGluZ3MsIHVuZXhwZWN0ZWQgc2xpY2Vtb2RlID0gJXUgYW5kIHNsaWNlIHNpemUgPSAldSIsIG5TbGljZW1vZGUsIG5TbGljZXNpemUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29udHJvbC5pZCAgICA9IFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERTsKLSAgICBjb250cm9sLnZhbHVlID0gblNsaWNlbW9kZTsKLQotICAgIERFQlVHX1BSSU5UX0xPVygiQ2FsbGluZyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbD0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgY29udHJvbCwgaWQgJSN4LCB2YWx1ZSAlZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJTdWNjZXNzIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsdWU9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLQotICAgIGlmIChuU2xpY2Vtb2RlID09IFY0TDJfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFX1NJTkdMRSkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIGNvbnRyb2wuaWQgICAgPSBzbGljZV9pZDsKLSAgICBjb250cm9sLnZhbHVlID0gblNsaWNlc2l6ZTsKLQotICAgIERFQlVHX1BSSU5UX0xPVygiQ2FsbGluZyBTTElDRV9NQiBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbD0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgY29udHJvbCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJTdWNjZXNzIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsdWU9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLQotICAgIG11bHRpc2xpY2UubXNsaWNlX21vZGUgPSBuU2xpY2Vtb2RlOwotICAgIG11bHRpc2xpY2UubXNsaWNlX3NpemUgPSBuU2xpY2VzaXplOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19zZXRfaW50cmFfcmVmcmVzaChPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRSBpcl9tb2RlLCBPTVhfVTMyIGlyTUJzKQotewotICAgIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLSAgICBpbnQgcmM7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sX21vZGUsIGNvbnRyb2xfbWJzOwotICAgIGNvbnRyb2xfbW9kZS5pZCAgID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0lOVFJBX1JFRlJFU0hfTU9ERTsKLSAgICBjb250cm9sX21icy5pZCAgICA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19JUl9NQlM7Ci0gICAgY29udHJvbF9tYnMudmFsdWUgPSAwOwotICAgIC8vIFRoZXJlIGlzIG5vIGRpc2FibGVkIG1vZGUuICBEaXNhYmxlZCBtb2RlIGlzIGluZGljYXRlZCBieSBhIDAgY291bnQuCi0gICAgaWYgKGlyX21vZGUgPT0gT01YX1ZJREVPX0ludHJhUmVmcmVzaE1heCB8fCBpck1CcyA9PSAwKSB7Ci0gICAgICAgIGNvbnRyb2xfbW9kZS52YWx1ZSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19JTlRSQV9SRUZSRVNIX05PTkU7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfSBlbHNlIGlmIChpcl9tb2RlID09IE9NWF9WSURFT19JbnRyYVJlZnJlc2hDeWNsaWMpIHsKLSAgICAgICAgY29udHJvbF9tb2RlLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0lOVFJBX1JFRlJFU0hfQ1lDTElDOwotICAgICAgICBjb250cm9sX21icy52YWx1ZSAgPSBpck1CczsKLSAgICB9IGVsc2UgaWYgKGlyX21vZGUgPT0gT01YX1ZJREVPX0ludHJhUmVmcmVzaFJhbmRvbSkgewotICAgICAgICBjb250cm9sX21vZGUudmFsdWUgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fSU5UUkFfUkVGUkVTSF9SQU5ET007Ci0gICAgICAgIGNvbnRyb2xfbWJzLnZhbHVlICA9IGlyTUJzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogSW52YWxpZCBJbnRyYVJlZnJlc2ggUGFyYW1ldGVyczoiCi0gICAgICAgICAgICAgICAgIiBtYiBtb2RlOiVkIiwgaXJfbW9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkNhbGxpbmcgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSV1LCB2YWw9JWQiLCBjb250cm9sX21vZGUuaWQsIGNvbnRyb2xfbW9kZS52YWx1ZSk7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sX21vZGUpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNvbnRyb2wsIGlkICUjeCwgdmFsdWUgJWQiLCBjb250cm9sX21vZGUuaWQsIGNvbnRyb2xfbW9kZS52YWx1ZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2xfbW9kZS5pZCwgY29udHJvbF9tb2RlLnZhbHVlKTsKLQotICAgIERFQlVHX1BSSU5UX0xPVygiQ2FsbGluZyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JXUsIHZhbD0lZCIsIGNvbnRyb2xfbWJzLmlkLCBjb250cm9sX21icy52YWx1ZSk7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sX21icyk7Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgY29udHJvbCwgaWQgJSN4LCB2YWx1ZSAlZCIsIGNvbnRyb2xfbWJzLmlkLCBjb250cm9sX21icy52YWx1ZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2xfbWJzLmlkLCBjb250cm9sX21icy52YWx1ZSk7Ci0KLSAgICBpbnRyYV9yZWZyZXNoLmlybW9kZSAgPSBjb250cm9sX21vZGUudmFsdWU7Ci0gICAgaW50cmFfcmVmcmVzaC5tYmNvdW50ID0gY29udHJvbF9tYnMudmFsdWU7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9lcnJvcl9yZXNpbGllbmNlKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFKiBlcnJvcl9yZXNpbGllbmNlKQotewotICAgIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLSAgICBzdHJ1Y3QgdmVuY19oZWFkZXJleHRlbnNpb24gaGVjX2NmZzsKLSAgICBzdHJ1Y3QgdmVuY19tdWx0aWNsaWNlY2ZnIG11bHRpc2xpY2VfY2ZnOwotICAgIGludCByYzsKLSAgICBPTVhfVTMyIHJlc3luY2hNYXJrZXJTcGFjaW5nQnl0ZXMgPSAwOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLQotICAgIG1lbXNldCgmY29udHJvbCwgMCwgc2l6ZW9mKGNvbnRyb2wpKTsKLQotICAgIGlmIChtX3NWZW5jX2NmZy5jb2RlY3R5cGUgPT0gVjRMMl9QSVhfRk1UX01QRUc0KSB7Ci0gICAgICAgIGlmIChlcnJvcl9yZXNpbGllbmNlLT5iRW5hYmxlSEVDKSB7Ci0gICAgICAgICAgICBoZWNfY2ZnLmhlYWRlcl9leHRlbnNpb24gPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGVjX2NmZy5oZWFkZXJfZXh0ZW5zaW9uID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGhlYy5oZWFkZXJfZXh0ZW5zaW9uID0gZXJyb3JfcmVzaWxpZW5jZS0+YkVuYWJsZUhFQzsKLSAgICB9Ci0KLSAgICBpZiAoZXJyb3JfcmVzaWxpZW5jZS0+YkVuYWJsZVJWTEMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlJWTEMgaXMgbm90IFN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCggbV9zVmVuY19jZmcuY29kZWN0eXBlICE9IFY0TDJfUElYX0ZNVF9IMjYzKSAmJgotICAgICAgICAgICAgKGVycm9yX3Jlc2lsaWVuY2UtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRGF0YVBhcnRpb25pbmcgYXJlIG5vdCBTdXBwb3J0ZWQgZm9yIE1QRUc0L0gyNjQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChlcnJvcl9yZXNpbGllbmNlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmcpIHsKLSAgICAgICAgcmVzeW5jaE1hcmtlclNwYWNpbmdCeXRlcyA9IGVycm9yX3Jlc2lsaWVuY2UtPm5SZXN5bmNoTWFya2VyU3BhY2luZzsKLSAgICAgICAgcmVzeW5jaE1hcmtlclNwYWNpbmdCeXRlcyA9IEFMSUdOKHJlc3luY2hNYXJrZXJTcGFjaW5nQnl0ZXMsIDgpID4+IDM7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gdmVuY19zZXRfbXVsdGlzbGljZV9jZmcoVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NJQ0VfTU9ERV9NQVhfQllURVMsIHJlc3luY2hNYXJrZXJTcGFjaW5nQnl0ZXMpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19zZXRfaW5sb29wX2ZpbHRlcihPTVhfVklERU9fQVZDTE9PUEZJTFRFUlRZUEUgbG9vcGZpbHRlcikKLXsKLSAgICBpbnQgcmM7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIGNvbnRyb2wuaWQ9VjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREU7Ci0gICAgY29udHJvbC52YWx1ZT0wOwotCi0gICAgaWYgKGxvb3BmaWx0ZXIgPT0gT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGUpIHsKLSAgICAgICAgY29udHJvbC52YWx1ZT1WNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0VOQUJMRUQ7Ci0gICAgfSBlbHNlIGlmIChsb29wZmlsdGVyID09IE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZSkgewotICAgICAgICBjb250cm9sLnZhbHVlPVY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRElTQUJMRUQ7Ci0gICAgfSBlbHNlIGlmIChsb29wZmlsdGVyID09IE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZVNsaWNlQm91bmRhcnkpIHsKLSAgICAgICAgY29udHJvbC52YWx1ZT1WNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0RJU0FCTEVEX0FUX1NMSUNFX0JPVU5EQVJZOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiQ2FsbGluZyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbD0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgY29udHJvbCwgaWQgJSN4LCB2YWx1ZSAlZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJTdWNjZXNzIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsdWU9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLQotICAgIGRia2ZpbHRlci5kYl9tb2RlPWNvbnRyb2wudmFsdWU7Ci0KLSAgICBjb250cm9sLmlkPVY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9BTFBIQTsKLSAgICBjb250cm9sLnZhbHVlPTA7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkNhbGxpbmcgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWw9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNvbnRyb2wsIGlkICUjeCwgdmFsdWUgJWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiU3VjY2VzcyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbHVlPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgY29udHJvbC5pZD1WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfQkVUQTsKLSAgICBjb250cm9sLnZhbHVlPTA7Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLQotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBjb250cm9sLCBpZCAlI3gsIHZhbHVlICVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotCi0KLSAgICBkYmtmaWx0ZXIuc2xpY2VhbHBoYV9vZmZzZXQgPSBkYmtmaWx0ZXIuc2xpY2ViZXRhX29mZnNldCA9IDA7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X3RhcmdldF9iaXRyYXRlKE9NWF9VMzIgblRhcmdldEJpdHJhdGUpCi17Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX3NldF90YXJnZXRfYml0cmF0ZTogYml0cmF0ZSA9ICV1IiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpblRhcmdldEJpdHJhdGUpOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICBpbnQgcmMgPSAwOwotCi0gICAgaWYgKHZxemlwX3NlaV9pbmZvLmVuYWJsZWQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRm9yIFZRWklQIDEuMCwgQml0cmF0ZSBzZXR0aW5nIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURTsKLSAgICBjb250cm9sLnZhbHVlID0gblRhcmdldEJpdHJhdGU7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkNhbGxpbmcgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWw9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBjb250cm9sLCBpZCAlI3gsIHZhbHVlICVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotCi0KLSAgICBtX3NWZW5jX2NmZy50YXJnZXRiaXRyYXRlID0gY29udHJvbC52YWx1ZTsKLSAgICBiaXRyYXRlLnRhcmdldF9iaXRyYXRlID0gY29udHJvbC52YWx1ZTsKLQotICAgIC8vIENvbmZpZ3VyZSBsYXllci13aXNlIGJpdHJhdGUgaWYgdGVtcG9yYWwgbGF5ZXJzIGFyZSBlbmFibGVkIGFuZCBsYXllci13aXNlIGRpc3RyaWJ1dGlvbgotICAgIC8vICBoYXMgYmVlbiBzcGVjaWZpZWQKLSAgICBpZiAodGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5iSXNCaXRyYXRlUmF0aW9WYWxpZCAmJiB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5QTGF5ZXJzKSB7Ci0gICAgICAgIE9NWF9VMzIgbGF5ZXJCaXRyYXRlc1tPTVhfVklERU9fTUFYX0hQX0xBWUVSU10gPSB7MH0sCi0gICAgICAgICAgICAgICAgbnVtTGF5ZXJzID0gdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uUExheWVycyArIHRlbXBvcmFsX2xheWVyc19jb25maWcubkJMYXllcnM7Ci0KLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJUZW1wb3JhbExheWVyOiBjb25maWd1cmluZyBsYXllcndpc2UgYml0cmF0ZSIpOwotICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBudW1MYXllcnM7ICsraSkgewotICAgICAgICAgICAgbGF5ZXJCaXRyYXRlc1tpXSA9Ci0gICAgICAgICAgICAgICAgICAgICh0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5UZW1wb3JhbExheWVyQml0cmF0ZUZyYWN0aW9uW2ldICogYml0cmF0ZS50YXJnZXRfYml0cmF0ZSkgLyAxMDA7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlRlbXBvcmFsTGF5ZXI6IGxheWVyWyV1XSByYXRpbz0ldSUlIGJpdHJhdGU9JXUob2YgJWxkKSIsCi0gICAgICAgICAgICAgICAgICAgIGksIHRlbXBvcmFsX2xheWVyc19jb25maWcublRlbXBvcmFsTGF5ZXJCaXRyYXRlRnJhY3Rpb25baV0sCi0gICAgICAgICAgICAgICAgICAgIGxheWVyQml0cmF0ZXNbaV0sIGJpdHJhdGUudGFyZ2V0X2JpdHJhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdmVuY19zZXRfbGF5ZXJfYml0cmF0ZXMoKE9NWF9VMzIgKilsYXllckJpdHJhdGVzLCBudW1MYXllcnMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19zZXRfZW5jb2RlX2ZyYW1lcmF0ZShPTVhfVTMyIGVuY29kZV9mcmFtZXJhdGUpCi17Ci0gICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSBwYXJtOwotICAgIGludCByYyA9IDA7Ci0gICAgc3RydWN0IHZlbmNfZnJhbWVyYXRlIGZyYW1lX3JhdGVfY2ZnOwotICAgIFExNlRvRnJhY3Rpb24oZW5jb2RlX2ZyYW1lcmF0ZSxmcmFtZV9yYXRlX2NmZy5mcHNfbnVtZXJhdG9yLGZyYW1lX3JhdGVfY2ZnLmZwc19kZW5vbWluYXRvcik7Ci0gICAgcGFybS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotICAgIHBhcm0ucGFybS5vdXRwdXQudGltZXBlcmZyYW1lLm51bWVyYXRvciA9IGZyYW1lX3JhdGVfY2ZnLmZwc19kZW5vbWluYXRvcjsKLSAgICBwYXJtLnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IGZyYW1lX3JhdGVfY2ZnLmZwc19udW1lcmF0b3I7Ci0KLSAgICBpZiAodnF6aXBfc2VpX2luZm8uZW5hYmxlZCkgewotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJGb3IgVlFaSVAgMS4wLCBGcmFtZXJhdGUgc2V0dGluZyBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgaWYgKGZyYW1lX3JhdGVfY2ZnLmZwc19udW1lcmF0b3IgPiAwKQotICAgICAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfUEFSTSwgJnBhcm0pOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJFUlJPUjogUmVxdWVzdCBmb3Igc2V0dGluZyBmcmFtZXJhdGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBtX3NWZW5jX2NmZy5mcHNfZGVuID0gZnJhbWVfcmF0ZV9jZmcuZnBzX2Rlbm9taW5hdG9yOwotICAgIG1fc1ZlbmNfY2ZnLmZwc19udW0gPSBmcmFtZV9yYXRlX2NmZy5mcHNfbnVtZXJhdG9yOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgdmVuY19kZXY6OnZlbmNfZ2V0X2NvZGVjdHlwZShPTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBjb2RlY3R5cGUgPSBWNEwyX1BJWF9GTVRfSDI2NDsKLQotICAgIHN3aXRjaCAoKGludCllQ29tcHJlc3Npb25Gb3JtYXQpIHsKLSAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdBVkM6Ci0gICAgICAgIGNvZGVjdHlwZSA9IFY0TDJfUElYX0ZNVF9IMjY0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdWUDg6Ci0gICAgICAgIGNvZGVjdHlwZSA9IFY0TDJfUElYX0ZNVF9WUDg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1ZQOToKLSAgICAgICAgY29kZWN0eXBlID0gVjRMMl9QSVhfRk1UX1ZQOTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPTVhfVklERU9fQ29kaW5nSEVWQzoKLSAgICAgICAgY29kZWN0eXBlID0gVjRMMl9QSVhfRk1UX0hFVkM7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJVbnN1cHBvcnRlZCBlQ29tcHJlc3Npb25Gb3JtYXQgJSN4IiwgZUNvbXByZXNzaW9uRm9ybWF0KTsKLSAgICAgICAgY29kZWN0eXBlID0gVjRMMl9QSVhfRk1UX0gyNjQ7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBjb2RlY3R5cGU7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgdmVuY19kZXY6OnZlbmNfZ2V0X2NvbG9yX2Zvcm1hdChPTVhfQ09MT1JfRk9STUFUVFlQRSBlQ29sb3JGb3JtYXQpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBmb3JtYXQgPSBWNEwyX0RFRkFVTFRfT1VUUFVUX0NPTE9SX0ZNVDsKLQotICAgIHN3aXRjaCAoKGludCllQ29sb3JGb3JtYXQpIHsKLSAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgotICAgIGNhc2UgUU9NWF9DT0xPUl9GT1JNQVRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtOgotICAgICAgICBmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYxMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRT01YX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXI6Ci0gICAgICAgIGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9OVjIxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybUNvbXByZXNzZWQ6Ci0gICAgICAgIGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9OVjEyX1VCV0M7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUU9NWF9DT0xPUl9Gb3JtYXQzMmJpdFJHQkE4ODg4OgotICAgICAgICBmb3JtYXQgPSBWNEwyX1BJWF9GTVRfUkdCMzI7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUU9NWF9DT0xPUl9Gb3JtYXQzMmJpdFJHQkE4ODg4Q29tcHJlc3NlZDoKLSAgICAgICAgZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQkE4ODg4X1VCV0M7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJVbnN1cHBvcnRlZCBlQ29sb3JGb3JtYXQgJSN4IiwgZUNvbG9yRm9ybWF0KTsKLSAgICAgICAgZm9ybWF0ID0gVjRMMl9ERUZBVUxUX09VVFBVVF9DT0xPUl9GTVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBmb3JtYXQ7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X2NvbG9yX2Zvcm1hdChPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvcl9mb3JtYXQpCi17Ci0gICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKLSAgICBpbnQgY29sb3Jfc3BhY2UgPSAwOwotICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfY29sb3JfZm9ybWF0OiBjb2xvcl9mb3JtYXQgPSAldSAiLCBjb2xvcl9mb3JtYXQpOwotCi0gICAgc3dpdGNoICgoaW50KWNvbG9yX2Zvcm1hdCkgewotICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgotICAgICAgICBjYXNlIFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybToKLSAgICAgICAgICAgIG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0ID0gVjRMMl9QSVhfRk1UX05WMTI7Ci0gICAgICAgICAgICBjb2xvcl9zcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUU9NWF9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgotICAgICAgICAgICAgbV9zVmVuY19jZmcuaW5wdXRmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYyMTsKLSAgICAgICAgICAgIGNvbG9yX3NwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBRT01YX0NPTE9SX0ZPUk1BVFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm1Db21wcmVzc2VkOgotICAgICAgICAgICAgbV9zVmVuY19jZmcuaW5wdXRmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYxMl9VQldDOwotICAgICAgICAgICAgY29sb3Jfc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFFPTVhfQ09MT1JfRm9ybWF0MzJiaXRSR0JBODg4ODoKLSAgICAgICAgICAgIG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQjMyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUU9NWF9DT0xPUl9Gb3JtYXQzMmJpdFJHQkE4ODg4Q29tcHJlc3NlZDoKLSAgICAgICAgICAgIG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQkE4ODg4X1VCV0M7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0hJR0goIldBUk5JTkc6IFVuc3VwcG9ydGVkIENvbG9yIGZvcm1hdCBbJWRdIiwgY29sb3JfZm9ybWF0KTsKLSAgICAgICAgICAgIG1fc1ZlbmNfY2ZnLmlucHV0Zm9ybWF0ID0gVjRMMl9ERUZBVUxUX09VVFBVVF9DT0xPUl9GTVQ7Ci0gICAgICAgICAgICBjb2xvcl9zcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRGVmYXVsdCBjb2xvciBmb3JtYXQgTlYxMiBVQldDIGlzIHNldCIpOwotI2lmZGVmIF9QUV8KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJZiBDbGllbnQgaXMgdXNpbmcgT3BhcXVlLCBZVVYgZm9ybWF0IHdpbGwgYmUgaW5mb3JtZWQgd2l0aAotICAgICAgICAgICAgICogZmlyc3QgRVRCLiBUaWxsIHRoYXQgcG9pbnQsIGl0IGlzIHVua25vd24uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1fcHEuaXNfWVVWX2Zvcm1hdF91bmNlcnRhaW4gPSB0cnVlOwotI2VuZGlmIC8vIF9QUV8KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIG1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7Ci0gICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7Ci0gICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBtX3NWZW5jX2NmZy5pbnB1dGZvcm1hdDsKLSAgICBmbXQuZm10LnBpeF9tcC5jb2xvcnNwYWNlID0gY29sb3Jfc3BhY2U7Ci0gICAgZm10LmZtdC5waXhfbXAuaGVpZ2h0ID0gbV9zVmVuY19jZmcuaW5wdXRfaGVpZ2h0OwotICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gbV9zVmVuY19jZmcuaW5wdXRfd2lkdGg7Ci0KLSAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19GTVQsICZmbXQpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgc2V0dGluZyBjb2xvciBmb3JtYXQgJXgiLCBjb2xvcl9mb3JtYXQpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X2ludHJhX3ZvcF9yZWZyZXNoKE9NWF9CT09MIGludHJhX3ZvcF9yZWZyZXNoKQotewotICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfaW50cmFfdm9wX3JlZnJlc2g6IGludHJhX3ZvcCA9ICV1YyIsIGludHJhX3ZvcF9yZWZyZXNoKTsKLQotICAgIGlmIChpbnRyYV92b3BfcmVmcmVzaCA9PSBPTVhfVFJVRSkgewotICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0gICAgICAgIGludCByYzsKLSAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19SRVFVRVNUX0lGUkFNRTsKLSAgICAgICAgY29udHJvbC52YWx1ZSA9IDE7Ci0KLSAgICAgICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLSAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBJbnRyYSBGcmFtZSBSZXF1ZXN0IGNvbnRyb2wiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJTdWNjZXNzIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0leCwgdmFsdWU9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFZPUCBSZWZyZXNoIGlzIEZhbHNlLCBubyBlZmZlY3QiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19jYWxpYnJhdGVfZ29wKCkKLXsKLSAgICBpbnQgcmF0aW8sIHN1Yl9nb3Bfc2l6ZSwgZ29wX3NpemUsIG5QZnJhbWVzLCBuQmZyYW1lcywgbkxheWVyczsKLSAgICBpbnQgbnVtX3N1Yl9nb3BzX2luX2FfZ29wOwotICAgIG5QZnJhbWVzID0gaW50cmFfcGVyaW9kLm51bV9wZnJhbWVzOwotICAgIG5CZnJhbWVzID0gaW50cmFfcGVyaW9kLm51bV9iZnJhbWVzOwotICAgIG5MYXllcnMgPSB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5QTGF5ZXJzICsgdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uQkxheWVyczsKLQotICAgIGlmICghblBmcmFtZXMgJiYgbkxheWVycykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiblBmcmFtZXMgc2hvdWxkIGJlIG5vbi16ZXJvIHdoZW4gbkxheWVycyBhcmUgcHJlc2VudFxuIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobkxheWVycyA+IDEpIHsgLypNdWx0aS1sYXllciBlbmNvZGluZyovCi0gICAgICAgIHN1Yl9nb3Bfc2l6ZSA9IDEgPDwgKG5MYXllcnMgLSAxKTsKLSAgICAgICAgLyogQWN0dWFsIEdPUCBkZWZpbml0aW9uIGlzIG5QZnJhbWVzICsgbkJmcmFtZXMgKyAxIGJ1dCBmb3IgdGhlIHNha2Ugb2YKLSAgICAgICAgICogYmVsb3cgY2FsY3VsYXRpb25zIHdlIGFyZSBpZ25vcmluZyArMSAuIElnbm9yaW5nICsxIGluIGJlbG93Ci0gICAgICAgICAqIGNhbGN1bGF0aW9ucyBpcyBub3QgYSBtaXN0YWtlIGJ1dCBpbnRlbnRpb25hbC4KLSAgICAgICAgICovCi0gICAgICAgIGdvcF9zaXplID0gTUFYKHN1Yl9nb3Bfc2l6ZSwgUk9VTkQoblBmcmFtZXMgKyAoblBmcmFtZXMgKiBuQmZyYW1lcyksIHN1Yl9nb3Bfc2l6ZSkpOwotICAgICAgICBudW1fc3ViX2dvcHNfaW5fYV9nb3AgPSBnb3Bfc2l6ZS9zdWJfZ29wX3NpemU7Ci0gICAgICAgIGlmIChuQmZyYW1lcykgeyAvKkhpZXItQiBjYXNlKi8KLSAgICAgICAgLyoKLSAgICAgICAgICAgICogRnJhbWUgVHlwZS0tPiBJICBCICBCICBCICBQICBCICBCICBCICBQICBJICBCICBCICBQIC4uLgotICAgICAgICAgICAgKiBMYXllciAtLT4gICAgIDAgIDIgIDEgIDIgIDAgIDIgIDEgIDIgIDAgIDAgIDIgIDEgIDIgLi4uCi0gICAgICAgICAgICAqIG5QZnJhbWVzID0gMiwgbkJmcmFtZXMgPSAzLCBuTGF5ZXJzID0gMwotICAgICAgICAgICAgKgotICAgICAgICAgICAgKiBJbnRlbnRpb24gaXMgdG8ga2VlcCB0aGUgaW50cmFwZXJpb2QgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gd2hhdCBpcyBkZXNpcmVkCi0gICAgICAgICAgICAqIGJ5IHRoZSBjbGllbnQgd2hpbGUgYWRqdXN0aW5nIG5QZnJhbWVzIGFuZCBuQmZyYW1lcyB0byBtZWV0IG90aGVyIGNvbnN0cmFpbnRzLgotICAgICAgICAgICAgKiBlZzE6IElucHV0IGJ5IGNsaWVudDogblBmcmFtZXMgPSAgOSwgbkJmcmFtZXMgPSAxNCwgbkxheWVycyA9IDIKLSAgICAgICAgICAgICogICAgT3V0cHV0IG9mIHRoaXMgZm46IG5QZnJhbWVzID0gMTIsIG5CZnJhbWVzID0gMTIsIG5MYXllcnMgPSAyCi0gICAgICAgICAgICAqCi0gICAgICAgICAgICAqIGVnMjogSW5wdXQgYnkgY2xpZW50OiBuUGZyYW1lcyA9IDksIG5CZnJhbWVzID0gNCwgbkxheWVycyA9IDIKLSAgICAgICAgICAgICogICAgT3V0cHV0IG9mIHRoaXMgZm46IG5QZnJhbWVzID0gNywgbkJmcmFtZXMgPSA3LCBuTGF5ZXJzID0gMgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG5QZnJhbWVzID0gbnVtX3N1Yl9nb3BzX2luX2FfZ29wOwotICAgICAgICAgICAgbkJmcmFtZXMgPSBzdWJfZ29wX3NpemUgLSAxOwotICAgICAgICB9IGVsc2UgeyAvKkhpZXItUCBjYXNlKi8KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIEZyYW1lIFR5cGUtLT4gSSAgUCAgUCAgUCAgUCAgUCAgUCAgUCAgSSAgUCAgUCAgUCAgUCAuLi4KLSAgICAgICAgICAgICogTGF5ZXItLT4gICAgICAwICAyICAxICAyICAwICAyICAxICAyICAwICAyICAxICAyICAwIC4uLgotICAgICAgICAgICAgKiBuUGZyYW1lcyA9ICA3LCBuQmZyYW1lcyA9IDAsIG5MYXllcnMgPSAzCi0gICAgICAgICAgICAqCi0gICAgICAgICAgICAqIEludGVudGlvbiBpcyB0byBrZWVwIHRoZSBpbnRyYXBlcmlvZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB3aGF0IGlzIGRlc2lyZWQKLSAgICAgICAgICAgICogYnkgdGhlIGNsaWVudCB3aGlsZSBhZGp1c3RpbmcgblBmcmFtZXMgYW5kIG5CZnJhbWVzIHRvIG1lZXQgb3RoZXIgY29uc3RyYWludHMuCi0gICAgICAgICAgICAqIGVnMTogSW5wdXQgYnkgY2xpZW50OiBuUGZyYW1lcyA9IDksIG5CZnJhbWVzID0gMCwgbkxheWVycyA9IDMKLSAgICAgICAgICAgICogICAgT3V0cHV0IG9mIHRoaXMgZm46IG5QZnJhbWVzID0gNywgbkJmcmFtZXMgPSAwLCBuTGF5ZXJzID0gMwotICAgICAgICAgICAgKgotICAgICAgICAgICAgKiBlZzI6IElucHV0IGJ5IGNsaWVudDogblBmcmFtZXMgPSAxMCwgbkJmcmFtZXMgPSAwLCBuTGF5ZXJzID0gMwotICAgICAgICAgICAgKiAgICAgT3V0cHV0IG9mIHRoaXMgZm46blBmcmFtZXMgPSAxMiwgbkJmcmFtZXMgPSAwLCBuTGF5ZXJzID0gMwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG5QZnJhbWVzID0gZ29wX3NpemUgLSAxOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsgLypTaW5nbGUtbGF5ZXIgZW5jb2RpbmcqLwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogTm8gc3BlY2lhbCBoYW5kbGluZyBuZWVkZWQgZm9yIHNpbmdsZSBsYXllcgotICAgICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coIlAvQiBGcmFtZXMgY2hhbmdlZCBmcm9tOiAlbGQvJWxkIHRvICVkLyVkIiwKLSAgICAgICAgaW50cmFfcGVyaW9kLm51bV9wZnJhbWVzLCBpbnRyYV9wZXJpb2QubnVtX2JmcmFtZXMsIG5QZnJhbWVzLCBuQmZyYW1lcyk7Ci0gICAgaW50cmFfcGVyaW9kLm51bV9wZnJhbWVzID0gblBmcmFtZXM7Ci0gICAgaW50cmFfcGVyaW9kLm51bV9iZnJhbWVzID0gbkJmcmFtZXM7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X2JpdHJhdGVfdHlwZShPTVhfVTMyIHR5cGUpCi17Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIGludCByYyA9IDA7Ci0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19WRU5DX0JJVFJBVEVfVFlQRTsKLSAgICBjb250cm9sLnZhbHVlID0gdHlwZTsKLSAgICBERUJVR19QUklOVF9MT1coIlNldCBCaXRyYXRlIHR5cGUgdG8gJXMgZm9yICVkIFxuIiwgYml0cmF0ZV90eXBlX3N0cmluZyh0eXBlKSwgdHlwZSk7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlJlcXVlc3QgdG8gc2V0IEJpdHJhdGUgdHlwZSB0byAlcyBmYWlsZWQiLAotICAgICAgICAgICAgYml0cmF0ZV90eXBlX3N0cmluZyh0eXBlKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X2xheWVyX2JpdHJhdGVzKE9NWF9VMzIgKmxheWVyQml0cmF0ZSwgT01YX1UzMiBudW1MYXllcnMpCi17Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX3NldF9sYXllcl9iaXRyYXRlcyIpOwotICAgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sIGN0cmxbMl07Ci0gICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzIGNvbnRyb2xzOwotICAgIGludCByYyA9IDA7Ci0gICAgT01YX1UzMiBpOwotCi0gICAgaWYgKCF2ZW5jX3NldF9iaXRyYXRlX3R5cGUoVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1ZFTkNfQklUUkFURV9FTkFCTEUpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGxheWVyd2lzZSBiaXRyYXRlIHR5cGUgJWQiLCByYyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBudW1MYXllcnMgJiYgaSA8IE9NWF9WSURFT19BTkRST0lEX01BWFRFTVBPUkFMTEFZRVJTOyArK2kpIHsKLSAgICAgICAgaWYgKCFsYXllckJpdHJhdGVbaV0pIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIGJpdHJhdGUgc2V0dGluZ3MgZm9yIGxheWVyICVkIiwgaSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjdHJsWzBdLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0xBWUVSX0lEOwotICAgICAgICAgICAgY3RybFswXS52YWx1ZSA9IGk7Ci0gICAgICAgICAgICBjdHJsWzFdLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZFTkNfUEFSQU1fTEFZRVJfQklUUkFURTsKLSAgICAgICAgICAgIGN0cmxbMV0udmFsdWUgPSBsYXllckJpdHJhdGVbaV07Ci0KLSAgICAgICAgICAgIGNvbnRyb2xzLmNvdW50ID0gMjsKLSAgICAgICAgICAgIGNvbnRyb2xzLmN0cmxfY2xhc3MgPSBWNEwyX0NUUkxfQ0xBU1NfTVBFRzsKLSAgICAgICAgICAgIGNvbnRyb2xzLmNvbnRyb2xzID0gY3RybDsKLQotICAgICAgICAgICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0VYVF9DVFJMUywgJmNvbnRyb2xzKTsKLSAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGxheWVyd2lzZSBiaXRyYXRlICVkIiwgcmMpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJMYXllcndpc2UgYml0cmF0ZSBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseSBmb3IgbGF5ZXIgOiAldSBiaXRyYXRlIDogJXUgIixpLCBsYXllckJpdHJhdGVbaV0pOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9sdHJtb2RlKE9NWF9VMzIgZW5hYmxlLCBPTVhfVTMyIGNvdW50KQotewotICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfbHRybW9kZTogZW5hYmxlID0gJXUiLCAodW5zaWduZWQgaW50KWVuYWJsZSk7Ci0gICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgY3RybFsyXTsKLSAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgY29udHJvbHM7Ci0gICAgaW50IHJjOwotCi0gICAgaWYgKGVuYWJsZSAmJiB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLmhpZXJfbW9kZSA9PSBISUVSX1BfSFlCUklEKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIHNldHRpbmdzLCBMVFIgaXMgYmVpbmcgZW5hYmxlZCB3aXRoIEh5YnJpZEhQIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvL0lmIExUUiBpcyBlbmFibGVkIGFuZCBjb2RlYyBpcyBWUDggd2UgY2Fubm90IGhhdmUgbGF5ZXJlZCBlbmNvZGluZyAtIGRpc2FibGUgaXQKLSAgICBpZihtX3NWZW5jX2NmZy5jb2RlY3R5cGUgPT0gVjRMMl9QSVhfRk1UX1ZQOCAmJiB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLmhpZXJfbW9kZSAhPSBISUVSX05PTkUgJiYgZW5hYmxlKSB7Ci0gICAgICAgIE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdUWVBFIHBUZW1wb3JhbFBhcmFtczsKLSAgICAgICAgcFRlbXBvcmFsUGFyYW1zLmVQYXR0ZXJuID0gT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybk5vbmU7Ci0gICAgICAgIGlmKHZlbmNfc2V0X3RlbXBvcmFsX2xheWVycygmcFRlbXBvcmFsUGFyYW1zKSkgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBkaXNhYmxlIGxheWVyIGVuY29kaW5nIGZvciBWUDggd2hlbiBMVFIgaXMgZW5hYmxlZFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY3RybFswXS5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19MVFJNT0RFOwotICAgIGlmIChlbmFibGUpCi0gICAgICAgIGN0cmxbMF0udmFsdWUgPSBWNEwyX01QRUdfVklEQ19WSURFT19MVFJfTU9ERV9NQU5VQUw7Ci0gICAgZWxzZQotICAgICAgICBjdHJsWzBdLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fTFRSX01PREVfRElTQUJMRTsKLQotICAgIGN0cmxbMV0uaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fTFRSQ09VTlQ7Ci0gICAgaWYgKGVuYWJsZSAmJiBjb3VudCA+IDApCi0gICAgICAgIGN0cmxbMV0udmFsdWUgPSBjb3VudDsKLSAgICBlbHNlIGlmIChlbmFibGUpCi0gICAgICAgIGN0cmxbMV0udmFsdWUgPSAxOwotICAgIGVsc2UKLSAgICAgICAgY3RybFsxXS52YWx1ZSA9IDA7Ci0KLSAgICBjb250cm9scy5jb3VudCA9IDI7Ci0gICAgY29udHJvbHMuY3RybF9jbGFzcyA9IFY0TDJfQ1RSTF9DTEFTU19NUEVHOwotICAgIGNvbnRyb2xzLmNvbnRyb2xzID0gY3RybDsKLQotICAgIERFQlVHX1BSSU5UX0xPVygiQ2FsbGluZyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JXgsIHZhbD0lZCBpZD0leCwgdmFsPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbHMuY29udHJvbHNbMF0uaWQsIGNvbnRyb2xzLmNvbnRyb2xzWzBdLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICBjb250cm9scy5jb250cm9sc1sxXS5pZCwgY29udHJvbHMuY29udHJvbHNbMV0udmFsdWUpOwotCi0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0VYVF9DVFJMUywgJmNvbnRyb2xzKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgbHRybW9kZSAlZCIsIHJjKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBsdHJpbmZvLmVuYWJsZWQgPSBlbmFibGU7Ci0gICAgbHRyaW5mby5jb3VudCA9IGNvdW50OwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJTdWNjZXNzIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0leCwgdmFsPSVkIGlkPSV4LCB2YWw9JWQiLAotICAgICAgICAgICAgICAgICAgICBjb250cm9scy5jb250cm9sc1swXS5pZCwgY29udHJvbHMuY29udHJvbHNbMF0udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzLmNvbnRyb2xzWzFdLmlkLCBjb250cm9scy5jb250cm9sc1sxXS52YWx1ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X3VzZWx0cihPTVhfVTMyIGZyYW1lSWR4KQotewotICAgIERFQlVHX1BSSU5UX0xPVygidmVuY191c2VfZ29sZGVuZnJhbWUiKTsKLSAgICBpbnQgcmMgPSB0cnVlOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLQotICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fVVNFTFRSRlJBTUU7Ci0gICAgY29udHJvbC52YWx1ZSA9IGZyYW1lSWR4OwotCi0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgdXNlX2x0ciAlZCIsIHJjKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiU3VjY2VzcyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JXgsIHZhbD0lZCIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9tYXJrbHRyKE9NWF9VMzIgZnJhbWVJZHgpCi17Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJ2ZW5jX3NldF9nb2xkZW5mcmFtZSIpOwotICAgIGludCByYyA9IHRydWU7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19NQVJLTFRSRlJBTUU7Ci0gICAgY29udHJvbC52YWx1ZSA9IGZyYW1lSWR4OwotCi0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgbHRybW9kZSAlZCIsIHJjKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiU3VjY2VzcyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JXgsIHZhbD0lZCIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF92cGVfcm90YXRpb24oT01YX1MzMiByb3RhdGlvbl9hbmdsZSkKLXsKLSAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3ZwZV9yb3RhdGlvbjogcm90YXRpb24gYW5nbGUgPSAlZCIsIChpbnQpcm90YXRpb25fYW5nbGUpOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICBpbnQgcmM7Ci0gICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKLSAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyBidWZyZXE7Ci0gICAgYm9vbCBmbGlwX2RpbWVuc2lvbnMgPSBmYWxzZTsKLQotICAgIGlmICgoT01YX1MzMiltX3JvdGF0aW9uLnJvdGF0aW9uID09IHJvdGF0aW9uX2FuZ2xlKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goInZlbmNfc2V0X3ZwZV9yb3RhdGlvbjogcm90YXRpb24gKCVkKSBub3QgY2hhbmdlZCIsIHJvdGF0aW9uX2FuZ2xlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19ST1RBVElPTjsKLSAgICBpZiAocm90YXRpb25fYW5nbGUgPT0gMCkgewotICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JPVEFUSU9OX05PTkU7Ci0gICAgICAgIGlmIChtX3JvdGF0aW9uLnJvdGF0aW9uID09IDkwIHx8IG1fcm90YXRpb24ucm90YXRpb24gPT0gMjcwKQotICAgICAgICAgICAgZmxpcF9kaW1lbnNpb25zID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHJvdGF0aW9uX2FuZ2xlID09IDkwKSB7Ci0gICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUk9UQVRJT05fOTA7Ci0gICAgICAgIGlmIChtX3JvdGF0aW9uLnJvdGF0aW9uID09IDAgfHwgbV9yb3RhdGlvbi5yb3RhdGlvbiA9PSAxODApCi0gICAgICAgICAgICBmbGlwX2RpbWVuc2lvbnMgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAocm90YXRpb25fYW5nbGUgPT0gMTgwKSB7Ci0gICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUk9UQVRJT05fMTgwOwotICAgICAgICBpZiAobV9yb3RhdGlvbi5yb3RhdGlvbiA9PSA5MCB8fCBtX3JvdGF0aW9uLnJvdGF0aW9uID09IDI3MCkKLSAgICAgICAgICAgIGZsaXBfZGltZW5zaW9ucyA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChyb3RhdGlvbl9hbmdsZSA9PSAyNzApIHsKLSAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19ST1RBVElPTl8yNzA7Ci0gICAgICAgIGlmIChtX3JvdGF0aW9uLnJvdGF0aW9uID09IDAgfHwgbV9yb3RhdGlvbi5yb3RhdGlvbiA9PSAxODApCi0gICAgICAgICAgICBmbGlwX2RpbWVuc2lvbnMgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gZmluZCB2YWxpZCByb3RhdGlvbiBhbmdsZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0leCwgdmFsPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiRmFpbGVkIHRvIHNldCBWUEUgUm90YXRpb24gY29udHJvbCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIERFQlVHX1BSSU5UX0xPVygiU3VjY2VzcyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JXgsIHZhbHVlPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0KLSAgICAvKiBzdWNjZXNzZnVsbHkgc2V0IHJvdGF0aW9uX2FuZ2xlLCBzYXZlIGl0ICovCi0gICAgbV9yb3RhdGlvbi5yb3RhdGlvbiA9IHJvdGF0aW9uX2FuZ2xlOwotCi0gICAgbWVtc2V0KCZmbXQsIDAsIHNpemVvZihmbXQpKTsKLSAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7Ci0gICAgaWYgKGZsaXBfZGltZW5zaW9ucykgewotICAgICAgICBPTVhfVTMyIG5XaWR0aCA9IG1fc1ZlbmNfY2ZnLmR2c19oZWlnaHQ7Ci0gICAgICAgIE9NWF9VMzIgbkhlaWdodCA9IG1fc1ZlbmNfY2ZnLmR2c193aWR0aDsKLSAgICAgICAgbV9zVmVuY19jZmcuZHZzX2hlaWdodCA9IG5IZWlnaHQ7Ci0gICAgICAgIG1fc1ZlbmNfY2ZnLmR2c193aWR0aCA9IG5XaWR0aDsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJSb3RhdGlvbiAoJXUpIEZsaXBwaW5nIHd4aCB0byAlbHV4JWx1IiwKLSAgICAgICAgICAgICAgICByb3RhdGlvbl9hbmdsZSwgbV9zVmVuY19jZmcuZHZzX3dpZHRoLCBtX3NWZW5jX2NmZy5kdnNfaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBmbXQuZm10LnBpeF9tcC5oZWlnaHQgPSBtX3NWZW5jX2NmZy5kdnNfaGVpZ2h0OwotICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gbV9zVmVuY19jZmcuZHZzX3dpZHRoOwotICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gbV9zVmVuY19jZmcuY29kZWN0eXBlOwotICAgIGlmIChpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0ZNVCwgJmZtdCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgZm9ybWF0IG9uIGNhcHR1cmUgcG9ydCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbV9zT3V0cHV0X2J1ZmZfcHJvcGVydHkuZGF0YXNpemUgPSBmbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlOwotICAgIGJ1ZnJlcS5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOwotICAgIGJ1ZnJlcS5jb3VudCA9IG1fc091dHB1dF9idWZmX3Byb3BlcnR5LmFjdHVhbGNvdW50OwotICAgIGJ1ZnJlcS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLFZJRElPQ19SRVFCVUZTLCAmYnVmcmVxKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRVJST1I6IFJlcXVlc3QgZm9yIG8vcCBidWZmZXIgY291bnQgZmFpbGVkIGZvciByb3RhdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoYnVmcmVxLmNvdW50ID49IG1fc091dHB1dF9idWZmX3Byb3BlcnR5Lm1pbmNvdW50KQotICAgICAgICBtX3NPdXRwdXRfYnVmZl9wcm9wZXJ0eS5hY3R1YWxjb3VudCA9IG1fc091dHB1dF9idWZmX3Byb3BlcnR5Lm1pbmNvdW50ID0gYnVmcmVxLmNvdW50OwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X3NlYXJjaHJhbmdlKCkKLXsKLSAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3NlYXJjaHJhbmdlIik7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sIGN0cmxbNl07Ci0gICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzIGNvbnRyb2xzOwotICAgIGludCByYzsKLQotICAgIGlmICgobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IMjY0KSB8fAotICAgICAgICAgICAgICAgKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfVlA4KSkgewotICAgICAgICBjdHJsWzBdLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0lGUkFNRV9YX1JBTkdFOwotICAgICAgICBjdHJsWzBdLnZhbHVlID0gMTY7Ci0gICAgICAgIGN0cmxbMV0uaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fSUZSQU1FX1lfUkFOR0U7Ci0gICAgICAgIGN0cmxbMV0udmFsdWUgPSA0OwotICAgICAgICBjdHJsWzJdLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1BGUkFNRV9YX1JBTkdFOwotICAgICAgICBjdHJsWzJdLnZhbHVlID0gMTY7Ci0gICAgICAgIGN0cmxbM10uaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUEZSQU1FX1lfUkFOR0U7Ci0gICAgICAgIGN0cmxbM10udmFsdWUgPSA0OwotICAgICAgICBjdHJsWzRdLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0JGUkFNRV9YX1JBTkdFOwotICAgICAgICBjdHJsWzRdLnZhbHVlID0gMTI7Ci0gICAgICAgIGN0cmxbNV0uaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fQkZSQU1FX1lfUkFOR0U7Ci0gICAgICAgIGN0cmxbNV0udmFsdWUgPSA0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJJbnZhbGlkIGNvZGVjIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjb250cm9scy5jb3VudCA9IDY7Ci0gICAgY29udHJvbHMuY3RybF9jbGFzcyA9IFY0TDJfQ1RSTF9DTEFTU19NUEVHOwotICAgIGNvbnRyb2xzLmNvbnRyb2xzID0gY3RybDsKLQotICAgIERFQlVHX1BSSU5UX0xPVygiIENhbGxpbmcgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIgotICAgICAgICAiaWQ9JXgsIHZhbD0lZCBpZD0leCwgdmFsPSVkIgotICAgICAgICAiaWQ9JXgsIHZhbD0lZCBpZD0leCwgdmFsPSVkIgotICAgICAgICAiaWQ9JXgsIHZhbD0lZCBpZD0leCwgdmFsPSVkIiwKLSAgICAgICAgY29udHJvbHMuY29udHJvbHNbMF0uaWQsIGNvbnRyb2xzLmNvbnRyb2xzWzBdLnZhbHVlLAotICAgICAgICBjb250cm9scy5jb250cm9sc1sxXS5pZCwgY29udHJvbHMuY29udHJvbHNbMV0udmFsdWUsCi0gICAgICAgIGNvbnRyb2xzLmNvbnRyb2xzWzJdLmlkLCBjb250cm9scy5jb250cm9sc1syXS52YWx1ZSwKLSAgICAgICAgY29udHJvbHMuY29udHJvbHNbM10uaWQsIGNvbnRyb2xzLmNvbnRyb2xzWzNdLnZhbHVlLAotICAgICAgICBjb250cm9scy5jb250cm9sc1s0XS5pZCwgY29udHJvbHMuY29udHJvbHNbNF0udmFsdWUsCi0gICAgICAgIGNvbnRyb2xzLmNvbnRyb2xzWzVdLmlkLCBjb250cm9scy5jb250cm9sc1s1XS52YWx1ZSk7Ci0KLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfRVhUX0NUUkxTLCAmY29udHJvbHMpOwotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBzZWFyY2ggcmFuZ2UgJWQiLCByYyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X3JhdGVjdHJsX2NmZyhPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGVDb250cm9sUmF0ZSkKLXsKLSAgICBib29sIHN0YXR1cyA9IHRydWU7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIGludCByYyA9IDA7Ci0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19SQVRFX0NPTlRST0w7Ci0KLSAgICBzd2l0Y2ggKChPTVhfVTMyKWVDb250cm9sUmF0ZSkgewotICAgICAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZURpc2FibGU6Ci0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JBVEVfQ09OVFJPTF9PRkY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZVNraXBGcmFtZXM6Ci0gICAgICAgICAgICAoc3VwcG9ydGVkX3JjX21vZGVzICYgUkNfVkJSX1ZGUikgPwotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUkFURV9DT05UUk9MX1ZCUl9WRlIgOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGU6Ci0gICAgICAgICAgICAoc3VwcG9ydGVkX3JjX21vZGVzICYgUkNfVkJSX0NGUikgPwotICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUkFURV9DT05UUk9MX1ZCUl9DRlIgOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnRTa2lwRnJhbWVzOgotICAgICAgICAgICAgKHN1cHBvcnRlZF9yY19tb2RlcyAmIFJDX0NCUl9WRlIpID8KLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JBVEVfQ09OVFJPTF9DQlJfVkZSIDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50OgotICAgICAgICAgICAgKHN1cHBvcnRlZF9yY19tb2RlcyAmIFJDX0NCUl9DRlIpID8KLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JBVEVfQ09OVFJPTF9DQlJfQ0ZSIDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFFPTVhfVmlkZW9fQ29udHJvbFJhdGVNYXhCaXRyYXRlOgotICAgICAgICAgICAgKHN1cHBvcnRlZF9yY19tb2RlcyAmIFJDX01CUl9DRlIpID8KLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JBVEVfQ09OVFJPTF9NQlJfQ0ZSOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUU9NWF9WaWRlb19Db250cm9sUmF0ZU1heEJpdHJhdGVTa2lwRnJhbWVzOgotICAgICAgICAgICAgKHN1cHBvcnRlZF9yY19tb2RlcyAmIFJDX01CUl9WRlIpID8KLSAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JBVEVfQ09OVFJPTF9NQlJfVkZSOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMpIHsKLQotICAgICAgICBERUJVR19QUklOVF9MT1coIkNhbGxpbmcgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSVkLCB2YWw9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLQotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNvbnRyb2wiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiU3VjY2VzcyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbHVlPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0KLSAgICAgICAgcmF0ZV9jdHJsLnJjbW9kZSA9IGNvbnRyb2wudmFsdWU7Ci0gICAgfQotCi0jaWZkZWYgX1ZRWklQXwotICAgIGlmIChlQ29udHJvbFJhdGUgPT0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGUgJiYgKHN1cHBvcnRlZF9yY19tb2RlcyAmIFJDX1ZCUl9DRlIpCi0gICAgICAgICAgICAmJiBtX3NWZW5jX2NmZy5jb2RlY3R5cGUgPT0gVjRMMl9QSVhfRk1UX0gyNjQpIHsKLSAgICAgICAgLyogRW5hYmxlIFZRWklQIFNFSSBieSBkZWZhdWx0IGZvciBjYW1jb3JkZXIgUkMgbW9kZXMgKi8KLQotICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1ZRWklQX1NFSTsKLSAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19WUVpJUF9TRUlfRU5BQkxFOwotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJTZXQgVlFaSVAgU0VJOiIpOwotICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkgPCAwKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJOb24tRmF0YWw6IFJlcXVlc3QgdG8gc2V0IFZRWklQIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9hc3BlY3RyYXRpbyh2b2lkICpuU2FyKQotewotICAgIGludCByYzsKLSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0gICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgY3RybFsyXTsKLSAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgY29udHJvbHM7Ci0gICAgUU9NWF9FWFROSU5ERVhfVklERU9fVkVOQ19TQVIgKnNhcjsKLQotICAgIHNhciA9IChRT01YX0VYVE5JTkRFWF9WSURFT19WRU5DX1NBUiAqKSBuU2FyOwotCi0gICAgY3RybFswXS5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WRU5DX1BBUkFNX1NBUl9XSURUSDsKLSAgICBjdHJsWzBdLnZhbHVlID0gc2FyLT5uU0FSV2lkdGg7Ci0gICAgY3RybFsxXS5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WRU5DX1BBUkFNX1NBUl9IRUlHSFQ7Ci0gICAgY3RybFsxXS52YWx1ZSA9IHNhci0+blNBUkhlaWdodDsKLQotICAgIGNvbnRyb2xzLmNvdW50ID0gMjsKLSAgICBjb250cm9scy5jdHJsX2NsYXNzID0gVjRMMl9DVFJMX0NMQVNTX01QRUc7Ci0gICAgY29udHJvbHMuY29udHJvbHMgPSBjdHJsOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0leCB2YWw9JWQsIGlkPSV4IHZhbD0lZCIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzLmNvbnRyb2xzWzBdLmlkLCBjb250cm9scy5jb250cm9sc1swXS52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbHMuY29udHJvbHNbMV0uaWQsIGNvbnRyb2xzLmNvbnRyb2xzWzFdLnZhbHVlKTsKLQotICAgIHJjID0gaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19FWFRfQ1RSTFMsICZjb250cm9scyk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IFNBUiAlZCIsIHJjKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiU3VjY2VzcyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JXggdmFsPSVkLCBpZD0leCB2YWw9JWQiLAotICAgICAgICAgICAgICAgICAgICBjb250cm9scy5jb250cm9sc1swXS5pZCwgY29udHJvbHMuY29udHJvbHNbMF0udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzLmNvbnRyb2xzWzFdLmlkLCBjb250cm9scy5jb250cm9sc1sxXS52YWx1ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X2xvd2xhdGVuY3lfbW9kZShPTVhfQk9PTCBlbmFibGUpCi17Ci0gICAgaW50IHJjID0gMDsKLSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0KLSAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0xPV0xBVEVOQ1lfTU9ERTsKLSAgICBpZiAoZW5hYmxlKQotICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0xPV0xBVEVOQ1lfRU5BQkxFOwotICAgIGVsc2UKLSAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19MT1dMQVRFTkNZX0RJU0FCTEU7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIkNhbGxpbmcgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSV4LCB2YWw9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBsb3dsYXRlbmN5IGNvbnRyb2wiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSV4LCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X2lmcmFtZXNpemVfdHlwZShRT01YX1ZJREVPX0lGUkFNRVNJWkVfVFlQRSB0eXBlKQotewotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLSAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0lGUkFNRV9TSVpFX1RZUEU7Ci0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBRT01YX0lGUkFNRVNJWkVfREVGQVVMVDoKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fSUZSQU1FX1NJWkVfREVGQVVMVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFFPTVhfSUZSQU1FU0laRV9NRURJVU06Ci0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0lGUkFNRV9TSVpFX01FRElVTTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFFPTVhfSUZSQU1FU0laRV9IVUdFOgotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19JRlJBTUVfU0laRV9IVUdFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUU9NWF9JRlJBTUVTSVpFX1VOTElNSVRFRDoKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fSUZSQU1FX1NJWkVfVU5MSU1JVEVEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBERUJVR19QUklOVF9JTkZPKCJVbmtub3duIElmcmFtZSBTaXplIGZvdW5kIHNldHRpbmcgaXQgdG8gZGVmYXVsdCIpOwotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19JRlJBTUVfU0laRV9ERUZBVUxUOwotICAgIH0KLQotICAgIGlmIChpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBpZnJhbWUgc2l6ZSBoaW50Iik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19zZXRfYmFzZWxheWVyaWQoT01YX1UzMiBiYXNlaWQpCi17Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIGlmICh0ZW1wb3JhbF9sYXllcnNfY29uZmlnLmhpZXJfbW9kZSA9PSBISUVSX1ApIHsKLSAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19CQVNFTEFZRVJfSUQ7Ci0gICAgICAgIGNvbnRyb2wudmFsdWUgPSBiYXNlaWQ7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiR29pbmcgdG8gc2V0IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19CQVNFTEFZRVJfSUQiKTsKLSAgICAgICAgaWYgKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fQkFTRUxBWUVSX0lEIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgbW9kZSBzZXQgZm9yIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19CQVNFTEFZRVJfSUQ6ICVkIiwKLSAgICAgICAgICAgICAgICB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLmhpZXJfbW9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X3Z1aV90aW1pbmdfaW5mbyhPTVhfQk9PTCBlbmFibGUpCi17Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIGludCByYyA9IDA7Ci0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19WVUlfVElNSU5HX0lORk87Ci0KLSAgICBpZiAoZW5hYmxlKQotICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fVlVJX1RJTUlOR19JTkZPX0VOQUJMRUQ7Ci0gICAgZWxzZQotICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fVlVJX1RJTUlOR19JTkZPX0RJU0FCTEVEOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0leCwgdmFsPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgVlVJIHRpbWluZyBpbmZvIGNvbnRyb2wiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBERUJVR19QUklOVF9MT1coIlN1Y2Nlc3MgSU9DVEwgc2V0IGNvbnRyb2wgZm9yIGlkPSV4LCB2YWx1ZT0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9wZWFrX2JpdHJhdGUoT01YX1UzMiBuUGVha0JpdHJhdGUpCi17Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIGludCByYyA9IDA7Ci0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLOwotICAgIGNvbnRyb2wudmFsdWUgPSBuUGVha0JpdHJhdGU7Ci0KLSAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3BlYWtfYml0cmF0ZTogYml0cmF0ZSA9ICV1IiwgKHVuc2lnbmVkIGludCluUGVha0JpdHJhdGUpOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgcmMgPSBpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKTsKLQotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBwZWFrIGJpdHJhdGUgY29udHJvbCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJTdWNjZXNzIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsdWU9JWQiLCBjb250cm9sLmlkLCBjb250cm9sLnZhbHVlKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF92cHhfZXJyb3JfcmVzaWxpZW5jZShPTVhfQk9PTCBlbmFibGUpCi17Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIGludCByYyA9IDA7Ci0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19WUFhfRVJST1JfUkVTSUxJRU5DRTsKLQotICAgIGlmIChlbmFibGUpCi0gICAgICAgIGNvbnRyb2wudmFsdWUgPSAxOwotICAgIGVsc2UKLSAgICAgICAgY29udHJvbC52YWx1ZSA9IDA7Ci0KLSAgICBERUJVR19QUklOVF9MT1coInZlbmNfc2V0X3ZweF9lcnJvcl9yZXNpbGllbmNlOiAlZCIsIGNvbnRyb2wudmFsdWUpOwotCi0gICAgREVCVUdfUFJJTlRfTE9XKCJDYWxsaW5nIElPQ1RMIHNldCBjb250cm9sIGZvciBpZD0lZCwgdmFsPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0KLSAgICByYyA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotICAgIGlmIChyYykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBWUFggRXJyb3IgUmVzaWxpZW5jZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHZweF9lcnJfcmVzaWxpZW5jZS5lbmFibGUgPSAxOwotICAgIERFQlVHX1BSSU5UX0xPVygiU3VjY2VzcyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbHVlPSVkIiwgY29udHJvbC5pZCwgY29udHJvbC52YWx1ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X3ByaW9yaXR5KE9NWF9VMzIgcHJpb3JpdHkpIHsKLSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0KLSAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1BSSU9SSVRZOwotICAgIGlmIChwcmlvcml0eSA9PSAwKQotICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fUFJJT1JJVFlfUkVBTFRJTUVfRU5BQkxFOwotICAgIGVsc2UKLSAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX1ZJREVPX1BSSU9SSVRZX1JFQUxUSU1FX0RJU0FCTEU7Ci0KLSAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgVjRMMl9NUEVHX1ZJRENfVklERU9fUFJJT1JJVFlfUkVBTFRJTUVfJXMiLAotICAgICAgICAgICAgICAgIHByaW9yaXR5ID09IDAgPyAiRU5BQkxFIiA6ICJESVNBQkxFIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X29wZXJhdGluZ3JhdGUoT01YX1UzMiByYXRlKSB7Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19PUEVSQVRJTkdfUkFURTsKLSAgICBjb250cm9sLnZhbHVlID0gcmF0ZTsKLQotICAgIERFQlVHX1BSSU5UX0xPVygidmVuY19zZXRfb3BlcmF0aW5nX3JhdGU6ICVkIGZwcyIsIHJhdGUgPj4gMTYpOwotICAgIERFQlVHX1BSSU5UX0xPVygiQ2FsbGluZyBJT0NUTCBzZXQgY29udHJvbCBmb3IgaWQ9JWQsIHZhbD0lZCIsIGNvbnRyb2wuaWQsIGNvbnRyb2wudmFsdWUpOwotCi0gICAgaWYoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgaHdfb3ZlcmxvYWQgPSBlcnJubyA9PSBFQlVTWTsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgb3BlcmF0aW5nIHJhdGUgJWQgZnBzICglcykiLAotICAgICAgICAgICAgICAgIHJhdGUgPj4gMTYsIGh3X292ZXJsb2FkID8gIkhXIG92ZXJsb2FkIiA6IHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgb3BlcmF0aW5nX3JhdGUgPSByYXRlOwotICAgIERFQlVHX1BSSU5UX0xPVygiT3BlcmF0aW5nIFJhdGUgU2V0ID0gJWQgZnBzIiwgIHJhdGUgPj4gMTYpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX3NldF9yb2lfcXBfaW5mbyhPTVhfUVRJX1ZJREVPX0NPTkZJR19ST0lJTkZPICpyb2lJbmZvKQotewotICAgIHN0cnVjdCByb2lkYXRhIHJvaTsKLQotICAgIGlmICghbV9yb2lfZW5hYmxlZCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiUk9JIGluZm8gbm90IGVuYWJsZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghcm9pSW5mbykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiTm8gUk9JIGluZm8gcHJlc2VudCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChtX3NWZW5jX2NmZy5jb2RlY3R5cGUgIT0gVjRMMl9QSVhfRk1UX0gyNjQgJiYKLSAgICBtX3NWZW5jX2NmZy5jb2RlY3R5cGUgIT0gVjRMMl9QSVhfRk1UX0hFVkMpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIk9NWF9RVElJbmRleENvbmZpZ1ZpZGVvUm9pSW5mbyBpcyBub3Qgc3VwcG9ydGVkIGZvciAlZCBjb2RlYyIsIChPTVhfVTMyKSBtX3NWZW5jX2NmZy5jb2RlY3R5cGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRfSElHSCgiUk9JIFFQIGluZm8gcmVjZWl2ZWQiKTsKLSAgICBtZW1zZXQoJnJvaSwgMCwgc2l6ZW9mKHN0cnVjdCByb2lkYXRhKSk7Ci0KLSNpZmRlZiBfUFFfCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX3BxLmxvY2spOwotICAgIHJvaS5pbmZvLm5VcHBlclFwT2Zmc2V0ID0gcm9pSW5mby0+blVwcGVyUXBPZmZzZXQ7Ci0gICAgcm9pLmluZm8ubkxvd2VyUXBPZmZzZXQgPSByb2lJbmZvLT5uTG93ZXJRcE9mZnNldDsKLSAgICByb2kuaW5mby5iVXNlUm9pSW5mbyA9IHJvaUluZm8tPmJVc2VSb2lJbmZvOwotICAgIHJvaS5pbmZvLm5Sb2lNQkluZm9TaXplID0gcm9pSW5mby0+blJvaU1CSW5mb1NpemU7Ci0KLSAgICByb2kuaW5mby5wUm9pTUJJbmZvID0gbWFsbG9jKHJvaS5pbmZvLm5Sb2lNQkluZm9TaXplKTsKLSAgICBpZiAoIXJvaS5pbmZvLnBSb2lNQkluZm8pIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInZlbmNfc2V0X3JvaV9xcF9pbmZvOiBtYWxsb2MgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbWVtY3B5KHJvaS5pbmZvLnBSb2lNQkluZm8sIHJvaUluZm8tPnBSb2lNQkluZm8sIHJvaUluZm8tPm5Sb2lNQkluZm9TaXplKTsKLSAgICAvKgotICAgICAqIHNldCB0aGUgdGltZXN0YW1wIGVxdWFsIHRvIHByZXZpb3VzIGV0YiB0aW1lc3RhbXAgKyAxCi0gICAgICogdG8ga25vdyB0aGlzIHJvaSBkYXRhIGFycml2ZWQgYWZ0ZXIgcHJldmlvdXMgZXRiCi0gICAgICovCi0gICAgaWYgKHZlbmNfaGFuZGxlLT5tX2V0Yl9jb3VudCkKLSAgICAgICAgcm9pLnRpbWVzdGFtcCA9IHZlbmNfaGFuZGxlLT5tX2V0Yl90aW1lc3RhbXAgKyAxOwotICAgIGVsc2UKLSAgICAgICAgcm9pLnRpbWVzdGFtcCA9IDA7Ci0KLSAgICByb2kuZGlydHkgPSB0cnVlOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX3JvaWxvY2spOwotICAgIERFQlVHX1BSSU5UX0xPVygibGlzdCBhZGQgcm9pZGF0YSB3aXRoIHRpbWVzdGFtcCAlbGxkIHVzIiwgcm9pLnRpbWVzdGFtcCk7Ci0gICAgbV9yb2lsaXN0LnB1c2hfYmFjayhyb2kpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX3JvaWxvY2spOwotCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fcHEubG9jayk7Ci0jZWxzZSAvLyBfUFFfCi0gICAgcm9pLmluZm8ublVwcGVyUXBPZmZzZXQgPSByb2lJbmZvLT5uVXBwZXJRcE9mZnNldDsKLSAgICByb2kuaW5mby5uTG93ZXJRcE9mZnNldCA9IHJvaUluZm8tPm5Mb3dlclFwT2Zmc2V0OwotICAgIHJvaS5pbmZvLmJVc2VSb2lJbmZvID0gcm9pSW5mby0+YlVzZVJvaUluZm87Ci0gICAgcm9pLmluZm8ublJvaU1CSW5mb1NpemUgPSByb2lJbmZvLT5uUm9pTUJJbmZvU2l6ZTsKLQotICAgIHJvaS5pbmZvLnBSb2lNQkluZm8gPSBtYWxsb2Mocm9pLmluZm8ublJvaU1CSW5mb1NpemUpOwotICAgIGlmICghcm9pLmluZm8ucFJvaU1CSW5mbykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigidmVuY19zZXRfcm9pX3FwX2luZm86IG1hbGxvYyBmYWlsZWQuIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbWVtY3B5KHJvaS5pbmZvLnBSb2lNQkluZm8sIHJvaUluZm8tPnBSb2lNQkluZm8sIHJvaUluZm8tPm5Sb2lNQkluZm9TaXplKTsKLSAgICAvKgotICAgICAqIHNldCB0aGUgdGltZXN0YW1wIGVxdWFsIHRvIHByZXZpb3VzIGV0YiB0aW1lc3RhbXAgKyAxCi0gICAgICogdG8ga25vdyB0aGlzIHJvaSBkYXRhIGFycml2ZWQgYWZ0ZXIgcHJldmlvdXMgZXRiCi0gICAgICovCi0gICAgaWYgKHZlbmNfaGFuZGxlLT5tX2V0Yl9jb3VudCkKLSAgICAgICAgcm9pLnRpbWVzdGFtcCA9IHZlbmNfaGFuZGxlLT5tX2V0Yl90aW1lc3RhbXAgKyAxOwotICAgIGVsc2UKLSAgICAgICAgcm9pLnRpbWVzdGFtcCA9IDA7Ci0KLSAgICByb2kuZGlydHkgPSB0cnVlOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX3JvaWxvY2spOwotICAgIERFQlVHX1BSSU5UX0xPVygibGlzdCBhZGQgcm9pZGF0YSB3aXRoIHRpbWVzdGFtcCAlbGxkIHVzLiIsIHJvaS50aW1lc3RhbXApOwotICAgIG1fcm9pbGlzdC5wdXNoX2JhY2socm9pKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9yb2lsb2NrKTsKLSNlbmRpZiAvLyBfUFFfCi0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19zZXRfYmx1cl9yZXNvbHV0aW9uKE9NWF9RVElfVklERU9fQ09ORklHX0JMVVJJTkZPICpibHVySW5mbykKLXsKLSAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCBjdHJsWzJdOwotICAgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyBjb250cm9sczsKLQotICAgIGludCBibHVyX3dpZHRoID0gMCwgYmx1cl9oZWlnaHQgPSAwOwotCi0gICAgc3dpdGNoIChibHVySW5mby0+ZVRhcmdldFJlc29sKSB7Ci0gICAgICAgIGNhc2UgQkxVUl9SRVNPTF9ESVNBQkxFRDoKLSAgICAgICAgICAgIGJsdXJfd2lkdGggPSAwOwotICAgICAgICAgICAgYmx1cl9oZWlnaHQgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQkxVUl9SRVNPTF8yNDA6Ci0gICAgICAgICAgICBibHVyX3dpZHRoID0gNDI2OwotICAgICAgICAgICAgYmx1cl9oZWlnaHQgPSAyNDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCTFVSX1JFU09MXzQ4MDoKLSAgICAgICAgICAgIGJsdXJfd2lkdGggPSA4NTQ7Ci0gICAgICAgICAgICBibHVyX2hlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJMVVJfUkVTT0xfNzIwOgotICAgICAgICAgICAgYmx1cl93aWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBibHVyX2hlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJMVVJfUkVTT0xfMTA4MDoKLSAgICAgICAgICAgIGJsdXJfd2lkdGggPSAxOTIwOwotICAgICAgICAgICAgYmx1cl9oZWlnaHQgPSAxMDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiQmx1ciByZXNvbHV0aW9uIG5vdCByZWNvZ25pemVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY3RybFswXS5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19CTFVSX1dJRFRIOwotICAgIGN0cmxbMF0udmFsdWUgPSBibHVyX3dpZHRoOwotCi0gICAgY3RybFsxXS5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19CTFVSX0hFSUdIVDsKLSAgICBjdHJsWzFdLnZhbHVlID0gYmx1cl9oZWlnaHQ7Ci0KLSAgICBjb250cm9scy5jb3VudCA9IDI7Ci0gICAgY29udHJvbHMuY3RybF9jbGFzcyA9IFY0TDJfQ1RSTF9DTEFTU19NUEVHOwotICAgIGNvbnRyb2xzLmNvbnRyb2xzID0gY3RybDsKLQotICAgIGlmKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfRVhUX0NUUkxTLCAmY29udHJvbHMpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGJsdXIgcmVzb2x0aW9uIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJCbHVyIHJlc29sdXRpb24gc2V0ID0gJWQgeCAlZCIsIGJsdXJfd2lkdGgsIGJsdXJfaGVpZ2h0KTsKLSAgICByZXR1cm4gdHJ1ZTsKLQotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX2gyNjRfdHJhbnNmb3JtXzh4OChPTVhfQk9PTCBlbmFibGUpCi17Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotCi0gICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19IMjY0X1RSQU5TRk9STV84eDg7Ci0gICAgaWYgKGVuYWJsZSkKLSAgICAgICAgY29udHJvbC52YWx1ZSA9IFY0TDJfTVBFR19WSURDX1ZJREVPX0gyNjRfVFJBTlNGT1JNXzh4OF9FTkFCTEU7Ci0gICAgZWxzZQotICAgICAgICBjb250cm9sLnZhbHVlID0gVjRMMl9NUEVHX1ZJRENfVklERU9fSDI2NF9UUkFOU0ZPUk1fOHg4X0RJU0FCTEU7Ci0KLSAgICBERUJVR19QUklOVF9MT1coIlNldCBoMjY0X3RyYW5zZm9ybV84eDggbW9kZTogJWQiLCBjb250cm9sLnZhbHVlKTsKLSAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoInNldCBjb250cm9sOiBIMjY0IHRyYW5zZm9ybSA4eDggZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19nZXRfdGVtcG9yYWxfbGF5ZXJfY2FwcyhPTVhfVTMyICpuTWF4TGF5ZXJzLAotICAgICAgICBPTVhfVTMyICpuTWF4QkxheWVycywgT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFICplU3VwcG9ydGVkUGF0dGVybikgewotICAgIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxdWVyeV9jdHJsOwotCi0gICAgaWYobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IRVZDIHx8IG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfSDI2NCkgewotICAgICAgICAqZVN1cHBvcnRlZFBhdHRlcm4gPSBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuQW5kcm9pZDsKLSAgICB9IGVsc2UgaWYgKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfVlA4KSB7Ci0gICAgICAgICplU3VwcG9ydGVkUGF0dGVybiA9IE9NWF9WSURFT19BbmRyb2lkVGVtcG9yYWxMYXllcmluZ1BhdHRlcm5XZWJSVEM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmVTdXBwb3J0ZWRQYXR0ZXJuID0gT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybk5vbmU7Ci0gICAgfQotCi0gICAgaWYodmVuY19jaGVja19mb3JfaHlicmlkX2hwKCplU3VwcG9ydGVkUGF0dGVybikpIHsKLSAgICAgICAgcXVlcnlfY3RybC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19IWUJSSURfSElFUlBfTU9ERTsKLSAgICB9IGVsc2UgewotICAgICAgICBxdWVyeV9jdHJsLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0hJRVJfUF9OVU1fTEFZRVJTOwotICAgIH0KLQotICAgIERFQlVHX1BSSU5UX0xPVygiUXVlcnlpbmcgUCBsYXllciBjYXBzXG4iKTsKLSAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfUVVFUllDVFJMLCAmcXVlcnlfY3RybCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIlF1ZXJ5IGNvbnRyb2wgUCBsYXllciBjYXBzIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvL1JldHVybiArMSBhcyBkcml2ZXIgd29ya3Mgb24gbnVtIG1heCBlbmhhbmNlbWVudCBsYXllcnMgYW5kIE9NWCBvbiBudW0gbGF5ZXJzCi0gICAgKm5NYXhMYXllcnMgPSBxdWVyeV9jdHJsLm1heGltdW0gKyAxOwotCi0gICAgcXVlcnlfY3RybC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19ISUVSX0JfTlVNX0xBWUVSUzsKLSAgICBERUJVR19QUklOVF9MT1coIlF1ZXJ5aW5nIEIgbGF5ZXIgY2Fwc1xuIik7Ci0gICAgaWYgKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1FVRVJZQ1RSTCwgJnF1ZXJ5X2N0cmwpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJRdWVyeSBjb250cm9sIEIgbGF5ZXIgY2FwcyBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKm5NYXhCTGF5ZXJzID0gcXVlcnlfY3RybC5tYXhpbXVtOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX2NoZWNrX2Zvcl9oeWJyaWRfaHAoT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFIGVQYXR0ZXJuKSB7Ci0gICAgLy9IeWJyaWQgSFAgaXMgb25seSBmb3IgSDI2NCBhbmQgVkJSCi0gICAgYm9vbCBiSXNBdmMgPSAobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IMjY0ICYmCi0gICAgICAgICAgICAgICAgICAgZVBhdHRlcm4gPT0gT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybkFuZHJvaWQpOwotICAgIGJvb2wgYklzVkJSID0gKHJhdGVfY3RybC5yY21vZGUgPT0gUkNfVkJSX0NGUiB8fCByYXRlX2N0cmwucmNtb2RlID09IFJDX1ZCUl9WRlIpOwotCi0gICAgcmV0dXJuIGJJc0F2YyAmJiBiSXNWQlI7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfY2hlY2tfZm9yX2hpZXJwKE9NWF9WSURFT19BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdQQVRURVJOVFlQRSBlUGF0dGVybikgewotICAgIC8vIElmIHBhdHRlcm4gaXMgYW5kcm9pZCBjb2RlYyBzaG91bGQgYmUgSDI2NC9IRVZDIGlmIHBhdHRlcm4gaXMgd2VicnRjIGNvZGVjIHNob3VsZCBiZSBWUDgKLSAgICBib29sIGJWYWxpZENvZGVjQW5kUGF0dGVybiA9ICgoKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfSDI2NCB8fCBtX3NWZW5jX2NmZy5jb2RlY3R5cGUgPT0gVjRMMl9QSVhfRk1UX0hFVkMpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVQYXR0ZXJuID09IE9NWF9WSURFT19BbmRyb2lkVGVtcG9yYWxMYXllcmluZ1BhdHRlcm5BbmRyb2lkKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9WUDggJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUGF0dGVybiA9PSBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuV2ViUlRDKSk7Ci0gICAgLy8gVlA4IHdpdGggbHRyIGVuYWJsZWQgY2Fubm90IGhhdmUgbGF5ZXJlZCBlbmNvZGluZwotICAgIGJvb2wgYlZQOFZhbGlkYXRpb24gPSAhKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfVlA4ICYmIGx0cmluZm8uZW5hYmxlZCk7Ci0KLSAgICByZXR1cm4gYlZhbGlkQ29kZWNBbmRQYXR0ZXJuICYmIGJWUDhWYWxpZGF0aW9uOwotfQotCi1PTVhfRVJST1JUWVBFIHZlbmNfZGV2Ojp2ZW5jX3NldF90ZW1wb3JhbF9sYXllcnMoCi0gICAgICAgIE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdUWVBFICpwVGVtcG9yYWxQYXJhbXMpIHsKLSAgICBib29sIGJVc2VIeWJyaWRIUCwgYlVzZUhpZXJQOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLQotICAgIC8vIElmIHBhdHRlcm4gc2V0IGlzIG5vbmUgaXQgbWVhbnMgaXQgaXMgYSByZXF1ZXN0IHRvIGRpc2FibGUgZXhpc3RpbmcgbGF5ZXIgZW5jb2RpbmcKLSAgICBpZihwVGVtcG9yYWxQYXJhbXMtPmVQYXR0ZXJuID09IE9NWF9WSURFT19BbmRyb2lkVGVtcG9yYWxMYXllcmluZ1BhdHRlcm5Ob25lKSB7Ci0gICAgICAgIGlmKHRlbXBvcmFsX2xheWVyc19jb25maWcuaGllcl9tb2RlID09IEhJRVJfUF9IWUJSSUQpIHsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSAwOwotICAgICAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19IWUJSSURfSElFUlBfTU9ERTsKLSAgICAgICAgICAgIGlmIChpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSkgewotICAgICAgICAgICAgICAgIGJVc2VIeWJyaWRIUCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGh5YnJpZCBIUC4gVHJ5IEhpZXJQIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZih0ZW1wb3JhbF9sYXllcnNfY29uZmlnLmhpZXJfbW9kZSA9PSBISUVSX1ApIHsKLSAgICAgICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fTUFYX0hJRVJQX0xBWUVSUzsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSAwOwotICAgICAgICAgICAgaWYgKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgbWF4IEhQIGxheWVycyB0byAldSIsIGNvbnRyb2wudmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0hJRVJfUF9OVU1fTEFZRVJTOwotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBIUCBsYXllcnMgdG8gJXUiLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1lbXNldCgmdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZywgMHgwLCBzaXplb2YodGVtcG9yYWxfbGF5ZXJzX2NvbmZpZykpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICBiVXNlSHlicmlkSFAgPSB2ZW5jX2NoZWNrX2Zvcl9oeWJyaWRfaHAocFRlbXBvcmFsUGFyYW1zLT5lUGF0dGVybik7Ci0gICAgYlVzZUhpZXJQID0gdmVuY19jaGVja19mb3JfaGllcnAocFRlbXBvcmFsUGFyYW1zLT5lUGF0dGVybik7Ci0KLSAgICBpZighYlVzZUh5YnJpZEhQICYmICFiVXNlSGllclApIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgc2V0dGluZ3MgY2Fubm90IHN1cHBvcnQgSGllclAvSHlicmlkSFBcbiIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgIH0KLQotICAgIGlmKHBUZW1wb3JhbFBhcmFtcy0+bkJMYXllckNvdW50QWN0dWFsKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJDdXJyZW50bHkgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgQkxheWVycyIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgIH0KLQotICAgIGlmKGJVc2VIeWJyaWRIUCkgewotICAgICAgICAvLyBJZiBMVFIgd2FzIGVuYWJsZWQgZGlzYWJsZSBpdC4KLSAgICAgICAgaWYobHRyaW5mby5lbmFibGVkKSB7Ci0gICAgICAgICAgICBpZighdmVuY19zZXRfbHRybW9kZSgwLCAwKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gZGlzYWJsZSBMVFIgd2hlbiBIeWJyaWRIUCBpcyBlbmFibGVkXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGlzYWJsZSBub3JtYWwgSFAgaWYgSHlicmlkIG1vZGUgaXMgYmVpbmcgZW5hYmxlZAotICAgICAgICBpZiAodGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5oaWVyX21vZGUgPT0gSElFUl9QKSB7Ci0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX01BWF9ISUVSUF9MQVlFUlM7Ci0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gMDsKLSAgICAgICAgICAgIGlmIChpb2N0bChtX25Ecml2ZXJfZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IG1heCBIUCBsYXllcnMgdG8gJXUiLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19ISUVSX1BfTlVNX0xBWUVSUzsKLSAgICAgICAgICAgIGNvbnRyb2wudmFsdWUgPSAwOwotICAgICAgICAgICAgaWYgKGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgSFAgbGF5ZXJzIHRvICV1IiwgY29udHJvbC52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE51bSBlbmhhbmNlbWVudHMgbGF5ZXJzIGRvZXMgbm90IGluY2x1ZGUgdGhlIGJhc2UtbGF5ZXIKLSAgICAgICAgY29udHJvbC52YWx1ZSA9IHBUZW1wb3JhbFBhcmFtcy0+blBMYXllckNvdW50QWN0dWFsIC0gMTsKLSAgICAgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19IWUJSSURfSElFUlBfTU9ERTsKLSAgICAgICAgREVCVUdfUFJJTlRfTE9XKCJTZXR0aW5nIEh5YnJpZEhQIHdpdGggbnVtIGxheWVycyA6ICV1XG4iLGNvbnRyb2wudmFsdWUpOwotICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgIGJVc2VIeWJyaWRIUCA9IGZhbHNlOwotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgaHlicmlkIEhQLiBUcnkgSGllclAiKTsKLSAgICAgICAgfQotICAgICAgICB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5NYXhMYXllcnMgPSBjb250cm9sLnZhbHVlICsgMTsKLSAgICB9Ci0KLSAgICBpZiAoIWJVc2VIeWJyaWRIUCkgewotICAgICAgICAvLyBEaXNhYmxlIGh5YnJpZCBtb2RlIGlmIGl0IHdhcyBlbmFibGVkIGFscmVhZHkKLSAgICAgICAgaWYgKHRlbXBvcmFsX2xheWVyc19jb25maWcuaGllcl9tb2RlID09IEhJRVJfUF9IWUJSSUQpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0xPVygiVGVtcG9yYWxMYXllcjogZGlzYWJsZSBoeWJyaWQgSFAgKG5vcm1hbC1IUCBwcmVmZXJyZWQpIik7Ci0gICAgICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0hZQlJJRF9ISUVSUF9NT0RFOwotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIGRpc2FibGUgaHlicmlkIEhQICEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29uZmlndXJlIG1heCBsYXllcnMgZm9yIGEgc2Vzc2lvbi4uIFVzZSBjdXJyZW50IG51bS1sYXllcnMgYXMgbWF4Ci0gICAgICAgIC8vIGlmIG1heCBpcyBub3Qgc2V0Ci0gICAgICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fTUFYX0hJRVJQX0xBWUVSUzsKLSAgICAgICAgaWYocFRlbXBvcmFsUGFyYW1zLT5uTGF5ZXJDb3VudE1heCA+IHBUZW1wb3JhbFBhcmFtcy0+blBMYXllckNvdW50QWN0dWFsKQotICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9IHBUZW1wb3JhbFBhcmFtcy0+bkxheWVyQ291bnRNYXggLSAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250cm9sLnZhbHVlID0gcFRlbXBvcmFsUGFyYW1zLT5uUExheWVyQ291bnRBY3R1YWwgLSAxOwotCi0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiU2V0dGluZyBIUCB3aXRoIG1heCBsYXllcnM6ICV1ICBudW0gbGF5ZXJzIDogJXVcbiIsY29udHJvbC52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wb3JhbFBhcmFtcy0+blBMYXllckNvdW50QWN0dWFsIC0gMSk7Ci0gICAgICAgIHRlbXBvcmFsX2xheWVyc19jb25maWcubk1heExheWVycyA9IGNvbnRyb2wudmFsdWUgKyAxOwotICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IG1heCBIUCBsYXllcnMgdG8gJXUiLCBjb250cm9sLnZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0hJRVJfUF9OVU1fTEFZRVJTOwotICAgICAgICBjb250cm9sLnZhbHVlID0gcFRlbXBvcmFsUGFyYW1zLT5uUExheWVyQ291bnRBY3R1YWwgLSAxOwotICAgICAgICBpZiAoaW9jdGwobV9uRHJpdmVyX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkpIHsKLSAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGh5YnJpZCBoaWVycC9oaWVycCBOdW1MYXllcnMgOiAldVxuIixjb250cm9sLnZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLmhpZXJfbW9kZSA9IGJVc2VIeWJyaWRIUCA/IEhJRVJfUF9IWUJSSUQgOiBISUVSX1A7Ci0gICAgdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uUExheWVycyA9IHBUZW1wb3JhbFBhcmFtcy0+blBMYXllckNvdW50QWN0dWFsOwotICAgIHRlbXBvcmFsX2xheWVyc19jb25maWcubkJMYXllcnMgPSBwVGVtcG9yYWxQYXJhbXMtPm5CTGF5ZXJDb3VudEFjdHVhbDsKLQotICAgIC8vIFNldCBpbnRyYSBwZXJpb2QgZXZlbiBpZiBuQnJhbWVzIGlzIHByZXZpb3VzbHkgMAotICAgIC8vIFRoaXMgd2lsbCBpbnRlcm5hbGx5IGNhbGlicmF0ZSBnb3AgYW5kIHJlY2FsY3VsYXRlICBhbmQgc2V0IHBmcmFtZQotCi0gICAgaWYoIXZlbmNfc2V0X2ludHJhX3BlcmlvZChpbnRyYV9wZXJpb2QubnVtX3BmcmFtZXMsIGludHJhX3BlcmlvZC5udW1fYmZyYW1lcykpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgblBmcmFtZXMvbkJmcmFtZXNcbiIpOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgIH0KLQotICAgIHRlbXBvcmFsX2xheWVyc19jb25maWcuYklzQml0cmF0ZVJhdGlvVmFsaWQgPSBPTVhfRkFMU0U7Ci0gICAgaWYgKHBUZW1wb3JhbFBhcmFtcy0+YkJpdHJhdGVSYXRpb3NTcGVjaWZpZWQgPT0gT01YX0ZBTFNFKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0xPVygiVGVtcG9yYWxMYXllcjogbGF5ZXJ3aXNlIGJpdHJhdGUgcmF0aW8gbm90IHNwZWNpZmllZC4gV2lsbCB1c2UgY3VtdWxhdGl2ZS4iKTsKLSAgICAgICAgaWYgKCF2ZW5jX3NldF9iaXRyYXRlX3R5cGUoVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1ZFTkNfQklUUkFURV9ESVNBQkxFKSkgewotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0gICAgREVCVUdfUFJJTlRfTE9XKCJUZW1wb3JhbExheWVyOiBsYXllcndpc2UgYml0cmF0ZSByYXRpbyBzcGVjaWZpZWQiKTsKLQotICAgIE9NWF9VMzIgbGF5ZXJCaXRyYXRlc1tPTVhfVklERU9fTUFYX0hQX0xBWUVSU10gPSB7MH0sCi0gICAgICAgIG51bUxheWVycyA9IHBUZW1wb3JhbFBhcmFtcy0+blBMYXllckNvdW50QWN0dWFsICsgcFRlbXBvcmFsUGFyYW1zLT5uQkxheWVyQ291bnRBY3R1YWw7Ci0KLSAgICBPTVhfVTMyIGkgPSAwOwotICAgIGZvciAoOyBpIDwgbnVtTGF5ZXJzOyArK2kpIHsKLSAgICAgICAgT01YX1UzMiBwcmV2aW91c0xheWVyc0FjY3VtdWxhdGVkQml0cmF0ZVJhdGlvID0gaSA9PSAwID8gMCA6IHBUZW1wb3JhbFBhcmFtcy0+bkJpdHJhdGVSYXRpb3NbaS0xXTsKLSAgICAgICAgT01YX1UzMiBjdXJyZW50TGF5ZXJCaXRyYXRlUmF0aW8gPSBwVGVtcG9yYWxQYXJhbXMtPm5CaXRyYXRlUmF0aW9zW2ldIC0gcHJldmlvdXNMYXllcnNBY2N1bXVsYXRlZEJpdHJhdGVSYXRpbzsKLSAgICAgICAgaWYgKHByZXZpb3VzTGF5ZXJzQWNjdW11bGF0ZWRCaXRyYXRlUmF0aW8gPiBwVGVtcG9yYWxQYXJhbXMtPm5CaXRyYXRlUmF0aW9zW2ldKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiaW52YWxpZCBiaXRyYXRlIHJhdGlvIGZvciBsYXllciAlZC4uIFdpbGwgZmFsbGJhY2sgdG8gY3VtdWxhdGl2ZSIsIGkpOwotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxheWVyQml0cmF0ZXNbaV0gPSAoY3VycmVudExheWVyQml0cmF0ZVJhdGlvICogYml0cmF0ZS50YXJnZXRfYml0cmF0ZSkgLyAxMDA7Ci0gICAgICAgICAgICB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW2ldID0gcFRlbXBvcmFsUGFyYW1zLT5uQml0cmF0ZVJhdGlvc1tpXTsKLSAgICAgICAgICAgIHRlbXBvcmFsX2xheWVyc19jb25maWcublRlbXBvcmFsTGF5ZXJCaXRyYXRlRnJhY3Rpb25baV0gPSBjdXJyZW50TGF5ZXJCaXRyYXRlUmF0aW87Ci0gICAgICAgICAgICBERUJVR19QUklOVF9MT1coIlRlbXBvcmFsTGF5ZXI6IGxheWVyWyV1XSByYXRpbz0ldSUlIGJpdHJhdGU9JXUob2YgJWxkKSIsCi0gICAgICAgICAgICAgICAgICAgIGksIGN1cnJlbnRMYXllckJpdHJhdGVSYXRpbywgbGF5ZXJCaXRyYXRlc1tpXSwgYml0cmF0ZS50YXJnZXRfYml0cmF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLmJJc0JpdHJhdGVSYXRpb1ZhbGlkID0gT01YX1RSVUU7Ci0KLSAgICAvLyBTZXR0aW5nIGxheWVyd2lzZSBiaXRyYXRlIG1ha2VzIHNlbnNlIG9ubHkgaWYgdGFyZ2V0IGJpdHJhdGUgaXMgY29uZmlndXJlZCwgZWxzZSBkZWZlciB1bnRpbCBsYXRlci4uCi0gICAgaWYgKGJpdHJhdGUudGFyZ2V0X2JpdHJhdGUgPiAwKSB7Ci0gICAgICAgIGlmICghdmVuY19zZXRfbGF5ZXJfYml0cmF0ZXMoKE9NWF9VMzIgKilsYXllckJpdHJhdGVzLCBudW1MYXllcnMpKSB7Ci0gICAgICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIHNldCBsYXllciBiaXRyYXRlXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJEZWZlciBzZXR0aW5nIGxheWVyd2lzZSBiaXRyYXRlIHNpbmNlIHRhcmdldCBiaXRyYXRlIGlzIG5vdCB5ZXQgc2V0Iik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgdmVuY19kZXY6OnZlbmNfc2V0X3RlbXBvcmFsX2xheWVyc19pbnRlcm5hbCgpIHsKLSAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HVFlQRSBwVGVtcG9yYWxQYXJhbXM7Ci0gICAgbWVtc2V0KCZwVGVtcG9yYWxQYXJhbXMsIDB4MCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdUWVBFKSk7Ci0KLSAgICBpZiAoIXRlbXBvcmFsX2xheWVyc19jb25maWcublBMYXllcnMpIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotICAgIHBUZW1wb3JhbFBhcmFtcy5uTGF5ZXJDb3VudE1heCA9IHRlbXBvcmFsX2xheWVyc19jb25maWcubk1heExheWVyczsKLSAgICBwVGVtcG9yYWxQYXJhbXMubkJMYXllckNvdW50TWF4ID0gdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uTWF4QkxheWVyczsKLSAgICBpZihtX3NWZW5jX2NmZy5jb2RlY3R5cGUgPT0gVjRMMl9QSVhfRk1UX0gyNjQgfHwgbV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IRVZDKQotICAgICAgICBwVGVtcG9yYWxQYXJhbXMuZVBhdHRlcm4gPSBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuQW5kcm9pZDsKLSAgICBlbHNlIGlmKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfVlA4KQotICAgICAgICBwVGVtcG9yYWxQYXJhbXMuZVBhdHRlcm4gPSBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuV2ViUlRDOwotICAgIGVsc2UKLSAgICAgICAgcFRlbXBvcmFsUGFyYW1zLmVQYXR0ZXJuID0gT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybk5vbmU7Ci0gICAgcFRlbXBvcmFsUGFyYW1zLm5QTGF5ZXJDb3VudEFjdHVhbCA9IHRlbXBvcmFsX2xheWVyc19jb25maWcublBMYXllcnM7Ci0gICAgcFRlbXBvcmFsUGFyYW1zLm5CTGF5ZXJDb3VudEFjdHVhbCA9IHRlbXBvcmFsX2xheWVyc19jb25maWcubkJMYXllcnM7Ci0gICAgcFRlbXBvcmFsUGFyYW1zLmJCaXRyYXRlUmF0aW9zU3BlY2lmaWVkID0gdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5iSXNCaXRyYXRlUmF0aW9WYWxpZDsKLSAgICBpZiAodGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5iSXNCaXRyYXRlUmF0aW9WYWxpZCA9PSBPTVhfVFJVRSkgewotICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5QTGF5ZXJzICsgdGVtcG9yYWxfbGF5ZXJzX2NvbmZpZy5uQkxheWVyczsgKytpKSB7Ci0gICAgICAgICAgICBwVGVtcG9yYWxQYXJhbXMubkJpdHJhdGVSYXRpb3NbaV0gPQotICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbF9sYXllcnNfY29uZmlnLm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2ZW5jX3NldF90ZW1wb3JhbF9sYXllcnMoJnBUZW1wb3JhbFBhcmFtcyk7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfZ2V0X3Byb2ZpbGVfbGV2ZWwoT01YX1UzMiAqZVByb2ZpbGUsT01YX1UzMiAqZUxldmVsKQotewotICAgIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLQotICAgIGlmIChlUHJvZmlsZSA9PSBOVUxMIHx8IGVMZXZlbCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IMjY0KSB7Ci0gICAgICAgIHN3aXRjaCAoY29kZWNfcHJvZmlsZS5wcm9maWxlKSB7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQkFTRUxJTkU6Ci0gICAgICAgICAgICAgICAgKmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9DT05TVFJBSU5FRF9CQVNFTElORToKLSAgICAgICAgICAgICAgICAqZVByb2ZpbGUgPSBRT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0NPTlNUUkFJTkVEX0hJR0g6Ci0gICAgICAgICAgICAgICAgKmVQcm9maWxlID0gUU9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01BSU46Ci0gICAgICAgICAgICAgICAgKmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0g6Ci0gICAgICAgICAgICAgICAgKmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0VYVEVOREVEOgotICAgICAgICAgICAgICAgICplUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlRXh0ZW5kZWQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMDoKLSAgICAgICAgICAgICAgICAqZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gxMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQyMjoKLSAgICAgICAgICAgICAgICAqZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0MjI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80NDRfUFJFRElDVElWRToKLSAgICAgICAgICAgICAgICAqZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0NDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICplUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlTWF4OwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdGF0dXMpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHByb2ZpbGVfbGV2ZWwubGV2ZWwpIHsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8wOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xQjoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMWI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMToKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMjoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMzoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMDoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwyMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8yOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwyMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18wOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzE6Ci0gICAgICAgICAgICAgICAgKmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDMxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzI6Ci0gICAgICAgICAgICAgICAgKmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDMyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzA6Ci0gICAgICAgICAgICAgICAgKmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMToKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMjoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNDI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMDoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw1MTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8yOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw1MjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWxNYXg7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fc1ZlbmNfY2ZnLmNvZGVjdHlwZSA9PSBWNEwyX1BJWF9GTVRfVlA4KSB7Ci0gICAgICAgIHN3aXRjaCAoY29kZWNfcHJvZmlsZS5wcm9maWxlKSB7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURDX1ZJREVPX1ZQOF9VTlVTRUQ6Ci0gICAgICAgICAgICAgICAgKmVQcm9maWxlID0gT01YX1ZJREVPX1ZQOFByb2ZpbGVNYWluOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAqZVByb2ZpbGUgPSBPTVhfVklERU9fVlA4UHJvZmlsZU1heDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0YXR1cykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAocHJvZmlsZV9sZXZlbC5sZXZlbCkgewotICAgICAgICAgICAgY2FzZSBWNEwyX01QRUdfVklEQ19WSURFT19WUDhfVkVSU0lPTl8wOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fVlA4TGV2ZWxfVmVyc2lvbjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURDX1ZJREVPX1ZQOF9WRVJTSU9OXzE6Ci0gICAgICAgICAgICAgICAgKmVMZXZlbCA9IE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgKmVMZXZlbCA9IE9NWF9WSURFT19WUDhMZXZlbE1heDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9zVmVuY19jZmcuY29kZWN0eXBlID09IFY0TDJfUElYX0ZNVF9IRVZDKSB7Ci0gICAgICAgIHN3aXRjaCAoY29kZWNfcHJvZmlsZS5wcm9maWxlKSB7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURDX1ZJREVPX0hFVkNfUFJPRklMRV9NQUlOOgotICAgICAgICAgICAgICAgICplUHJvZmlsZSA9IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFY0TDJfTVBFR19WSURDX1ZJREVPX0hFVkNfUFJPRklMRV9NQUlOMTA6Ci0gICAgICAgICAgICAgICAgKmVQcm9maWxlID0gT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAqZVByb2ZpbGUgPSBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYXg7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzdGF0dXMpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHByb2ZpbGVfbGV2ZWwubGV2ZWwpIHsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfMToKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfMToKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfMjoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfMjoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfMl8xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwyMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfMl8xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWwyMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfMzoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfMzoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfM18xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwzMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfM18xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWwzMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNDoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfNDoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNF8xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0MTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfNF8xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw0MTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNToKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfNToKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNV8xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfNV8xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw1MTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNV8yOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfNV8yOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw1MjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNjoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfNjoKLSAgICAgICAgICAgICAgICAqZUxldmVsID0gT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNl8xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw2MTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9ISUdIX1RJRVJfTEVWRUxfNl8xOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw2MTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVjRMMl9NUEVHX1ZJRENfVklERU9fSEVWQ19MRVZFTF9NQUlOX1RJRVJfTEVWRUxfNl8yOgotICAgICAgICAgICAgICAgICplTGV2ZWwgPSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw2MjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgKmVMZXZlbCA9IE9NWF9WSURFT19IRVZDTGV2ZWxNYXg7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0jaWZkZWYgX0FORFJPSURfSUNTXwotYm9vbCB2ZW5jX2Rldjo6dmVuY19zZXRfbWV0YV9tb2RlKGJvb2wgbW9kZSkKLXsKLSAgICBtZXRhZGF0YW1vZGUgPSBtb2RlOwotICAgIHJldHVybiB0cnVlOwotfQotI2VuZGlmCi0KLWJvb2wgdmVuY19kZXY6OnZlbmNfaXNfdmlkZW9fc2Vzc2lvbl9zdXBwb3J0ZWQodW5zaWduZWQgbG9uZyB3aWR0aCwKLSAgICAgICAgdW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgaWYgKCh3aWR0aCAqIGhlaWdodCA8IGNhcGFiaWxpdHkubWluX3dpZHRoICogIGNhcGFiaWxpdHkubWluX2hlaWdodCkgfHwKLSAgICAgICAgICAgICh3aWR0aCAqIGhlaWdodCA+IGNhcGFiaWxpdHkubWF4X3dpZHRoICogIGNhcGFiaWxpdHkubWF4X2hlaWdodCkpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoCi0gICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHZpZGVvIHJlc29sdXRpb24gV3hIID0gKCVsdSl4KCVsdSkgc3VwcG9ydGVkIHJhbmdlID0gbWluICglZCl4KCVkKSAtIG1heCAoJWQpeCglZCkiLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNhcGFiaWxpdHkubWluX3dpZHRoLCBjYXBhYmlsaXR5Lm1pbl9oZWlnaHQsCi0gICAgICAgICAgICAgICAgY2FwYWJpbGl0eS5tYXhfd2lkdGgsIGNhcGFiaWxpdHkubWF4X2hlaWdodCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBERUJVR19QUklOVF9MT1coInZpZGVvIHNlc3Npb24gc3VwcG9ydGVkIik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdmVuY19kZXY6OnZlbmNfc2V0X2JhdGNoX3NpemUoT01YX1UzMiBiYXRjaFNpemUpCi17Ci0gICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwotICAgIGludCByZXQ7Ci0KLSAgICBjb250cm9sLmlkID0gVjRMMl9DSURfVklEQ19RQlVGX01PREU7Ci0gICAgY29udHJvbC52YWx1ZSA9IGJhdGNoU2l6ZSA/IFY0TDJfVklEQ19RQlVGX0JBVENIRUQgOiBWNEwyX1ZJRENfUUJVRl9TVEFOREFSRDsKLQotICAgIHJldCA9IGlvY3RsKG1fbkRyaXZlcl9mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZhaWxlZCB0byBzZXQgYmF0Y2hpbmcgbW9kZTogJWQiLCByZXQpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbUJhdGNoU2l6ZSA9IGJhdGNoU2l6ZTsKLSAgICBERUJVR19QUklOVF9ISUdIKCJVc2luZyBiYXRjaCBzaXplIG9mICVkIiwgbUJhdGNoU2l6ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZlbmNfZGV2OjpCYXRjaEluZm86OkJhdGNoSW5mbygpCi0gICAgOiBtTnVtUGVuZGluZygwKSB7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZtTG9jaywgTlVMTCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4QnVmczsgKytpKSB7Ci0gICAgICAgIG1CdWZNYXBbaV0gPSBrQnVmSURGcmVlOwotICAgIH0KLX0KLQotaW50IHZlbmNfZGV2OjpCYXRjaEluZm86OnJlZ2lzdGVyQnVmZmVyKGludCBidWZmZXJJZCkgewotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbUxvY2spOwotICAgIGludCBhdmFpbElkID0gMDsKLSAgICBmb3IoIDsgYXZhaWxJZCA8IGtNYXhCdWZzICYmIG1CdWZNYXBbYXZhaWxJZF0gIT0ga0J1ZklERnJlZTsgKythdmFpbElkKTsKLSAgICBpZiAoYXZhaWxJZCA+PSBrTWF4QnVmcykgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiRmFpbGVkIHRvIGZpbmQgZnJlZSBlbnRyeSAhIik7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTG9jayk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgbUJ1Zk1hcFthdmFpbElkXSA9IGJ1ZmZlcklkOwotICAgIG1OdW1QZW5kaW5nKys7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1Mb2NrKTsKLSAgICByZXR1cm4gYXZhaWxJZDsKLX0KLQotaW50IHZlbmNfZGV2OjpCYXRjaEluZm86OnJldHJpZXZlQnVmZmVyQXQoaW50IHY0bDJJZCkgewotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbUxvY2spOwotICAgIGlmICh2NGwySWQgPj0ga01heEJ1ZnMgfHwgdjRsMklkIDwgMCkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiQmF0Y2g6IGludmFsaWQgaW5kZXggJWQiLCB2NGwySWQpOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUxvY2spOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChtQnVmTWFwW3Y0bDJJZF0gPT0ga0J1ZklERnJlZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiQmF0Y2g6IGJ1ZmZlciBAICVkIHdhcyBub3QgcmVnaXN0ZXJlZCAhIiwgdjRsMklkKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1Mb2NrKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgYnVmZmVySWQgPSBtQnVmTWFwW3Y0bDJJZF07Ci0gICAgbUJ1Zk1hcFt2NGwySWRdID0ga0J1ZklERnJlZTsKLSAgICBtTnVtUGVuZGluZy0tOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTG9jayk7Ci0gICAgcmV0dXJuIGJ1ZmZlcklkOwotfQotCi1ib29sIHZlbmNfZGV2OjpCYXRjaEluZm86OmlzUGVuZGluZyhpbnQgYnVmZmVySWQpIHsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm1Mb2NrKTsKLSAgICBpbnQgZXhpc3RzSWQgPSAwOwotICAgIGZvcig7IGV4aXN0c0lkIDwga01heEJ1ZnMgJiYgbUJ1Zk1hcFtleGlzdHNJZF0gIT0gYnVmZmVySWQ7ICsrZXhpc3RzSWQpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTG9jayk7Ci0gICAgcmV0dXJuIGV4aXN0c0lkIDwga01heEJ1ZnM7Ci19Ci0KLSNpZmRlZiBfVlFaSVBfCi12ZW5jX2Rldjo6dmVuY19kZXZfdnF6aXA6OnZlbmNfZGV2X3ZxemlwKCkKLXsKLSAgICBtTGliSGFuZGxlID0gTlVMTDsKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJmxvY2ssIE5VTEwpOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX2Rldl92cXppcDo6aW5pdCgpCi17Ci0gICAgYm9vbCBzdGF0dXMgPSB0cnVlOwotICAgIGlmIChtTGliSGFuZGxlKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJWUVpJUCBpbml0IGNhbGxlZCB0d2ljZSIpOwotICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBtTGliSGFuZGxlID0gZGxvcGVuKCJsaWJ2cXppcC5zbyIsIFJUTERfTk9XKTsKLSAgICAgICAgaWYgKG1MaWJIYW5kbGUpIHsKLSAgICAgICAgICAgIG1WUVpJUEluaXQgPSAodnF6aXBfaW5pdF90KQotICAgICAgICAgICAgICAgIGRsc3ltKG1MaWJIYW5kbGUsIlZRWmlwSW5pdCIpOwotICAgICAgICAgICAgbVZRWklQRGVJbml0ID0gKHZxemlwX2RlaW5pdF90KQotICAgICAgICAgICAgICAgIGRsc3ltKG1MaWJIYW5kbGUsIlZRWmlwRGVJbml0Iik7Ci0gICAgICAgICAgICBtVlFaSVBDb21wdXRlU3RhdHMgPSAodnF6aXBfY29tcHV0ZV9zdGF0c190KQotICAgICAgICAgICAgICAgIGRsc3ltKG1MaWJIYW5kbGUsIlZRWmlwQ29tcHV0ZVN0YXRzIik7Ci0gICAgICAgICAgICBpZiAoIW1WUVpJUEluaXQgfHwgIW1WUVpJUERlSW5pdCB8fCAhbVZRWklQQ29tcHV0ZVN0YXRzKQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZBVEFMIEVSUk9SOiBjb3VsZCBub3QgZGxvcGVuIGxpYnZxemlwLnNvOiAlcyIsIGRsZXJyb3IoKSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBtVlFaSVBIYW5kbGUgPSBtVlFaSVBJbml0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFzdGF0dXMgJiYgbUxpYkhhbmRsZSkgewotICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOwotICAgICAgICBtTGliSGFuZGxlID0gTlVMTDsKLSAgICAgICAgbVZRWklQSGFuZGxlID0gTlVMTDsKLSAgICAgICAgbVZRWklQSW5pdCA9IE5VTEw7Ci0gICAgICAgIG1WUVpJUERlSW5pdCA9IE5VTEw7Ci0gICAgICAgIG1WUVpJUENvbXB1dGVTdGF0cyA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLWludCB2ZW5jX2Rldjo6dmVuY19kZXZfdnF6aXA6OmZpbGxfc3RhdHNfZGF0YSh2b2lkKiBwQnVmLCB2b2lkKiBleHRyYURhdGEpCi17Ci0gICAgVlFaaXBTdGF0dXMgcmVzdWx0OwotICAgIFZRWmlwU3RhdHMgKnBTdGF0cyA9IChWUVppcFN0YXRzICopZXh0cmFEYXRhOwotICAgIHBDb25maWcucFNFSVBheWxvYWQgPSBOVUxMOwotICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotICAgIGlmICghcEJ1ZiB8fCAhcFN0YXRzIHx8ICFtVlFaSVBIYW5kbGUpIHsKLSAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkludmFsaWQgZGF0YSBwYXNzZWQgdG8gc3RhdHMgZnVuY3Rpb24iKTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gbVZRWklQQ29tcHV0ZVN0YXRzKG1WUVpJUEhhbmRsZSwgKHZvaWQqIClwQnVmLCAmcENvbmZpZywgcFN0YXRzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIHZlbmNfZGV2Ojp2ZW5jX2Rldl92cXppcDo6ZGVpbml0KCkKLXsKLSAgICBpZiAobUxpYkhhbmRsZSkgewotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmxvY2spOwotICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOwotICAgICAgICBtVlFaSVBEZUluaXQobVZRWklQSGFuZGxlKTsKLSAgICAgICAgbUxpYkhhbmRsZSA9IE5VTEw7Ci0gICAgICAgIG1WUVpJUEhhbmRsZSA9IE5VTEw7Ci0gICAgICAgIG1WUVpJUEluaXQgPSBOVUxMOwotICAgICAgICBtVlFaSVBEZUluaXQgPSBOVUxMOwotICAgICAgICBtVlFaSVBDb21wdXRlU3RhdHMgPSBOVUxMOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbG9jayk7Ci0gICAgfQotfQotCi12ZW5jX2Rldjo6dmVuY19kZXZfdnF6aXA6On52ZW5jX2Rldl92cXppcCgpCi17Ci0gICAgREVCVUdfUFJJTlRfSElHSCgiRGVzdHJveSBDMkQgaW5zdGFuY2UiKTsKLSAgICBpZiAobUxpYkhhbmRsZSkgewotICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOwotICAgIH0KLSAgICBtTGliSGFuZGxlID0gTlVMTDsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmxvY2spOwotfQotI2VuZGlmCi0KLSNpZmRlZiBfUFFfCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX2NoZWNrX2Zvcl9wcSh2b2lkKQotewotICAgIGJvb2wgcmNfbW9kZV9zdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICBib29sIGNvZGVjX3N1cHBvcnRlZCA9IGZhbHNlOwotICAgIGJvb2wgcmVzb2x1dGlvbl9zdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICBib29sIGZyYW1lX3JhdGVfc3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgYm9vbCB5dXZfZm9ybWF0X3N1cHBvcnRlZCA9IGZhbHNlOwotICAgIGJvb2wgaXNfbm9uX3NlY3VyZV9zZXNzaW9uID0gZmFsc2U7Ci0gICAgYm9vbCBpc19wcV9oYW5kbGVfdmFsaWQgPSBmYWxzZTsKLSAgICBib29sIGlzX25vbl92cGVfc2Vzc2lvbiA9IGZhbHNlOwotICAgIGJvb2wgZW5hYmxlID0gZmFsc2U7Ci0KLSAgICBjb2RlY19zdXBwb3J0ZWQgPSBtX3NWZW5jX2NmZy5jb2RlY3R5cGUgPT0gVjRMMl9QSVhfRk1UX0gyNjQ7Ci0KLSAgICByY19tb2RlX3N1cHBvcnRlZCA9IChyYXRlX2N0cmwucmNtb2RlID09IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19SQVRFX0NPTlRST0xfVkJSX0NGUikgfHwKLSAgICAgICAgKHJhdGVfY3RybC5yY21vZGUgPT0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JBVEVfQ09OVFJPTF9NQlJfQ0ZSKSB8fAotICAgICAgICAocmF0ZV9jdHJsLnJjbW9kZSA9PSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUkFURV9DT05UUk9MX01CUl9WRlIpOwotCi0gICAgcmVzb2x1dGlvbl9zdXBwb3J0ZWQgPSBtX3NWZW5jX2NmZy5pbnB1dF9oZWlnaHQgKiBtX3NWZW5jX2NmZy5pbnB1dF93aWR0aCA8PQotICAgICAgICBtX3BxLmNhcHMubWF4X3dpZHRoICogbV9wcS5jYXBzLm1heF9oZWlnaHQ7Ci0KLSAgICBmcmFtZV9yYXRlX3N1cHBvcnRlZCA9Ci0gICAgICAgIChtX3NWZW5jX2NmZy5mcHNfbnVtIC8gbV9zVmVuY19jZmcuZnBzX2RlbikgPD0KLSAgICAgICAgKG1fcHEuY2Fwcy5tYXhfbWJfcGVyX3NlYyAvICgobV9zVmVuY19jZmcuaW5wdXRfaGVpZ2h0ICogbV9zVmVuY19jZmcuaW5wdXRfd2lkdGgpIC8gMjU2KSk7Ci0KLSAgICBmcmFtZV9yYXRlX3N1cHBvcnRlZCA9ICgoKG9wZXJhdGluZ19yYXRlID4+IDE2KSA+IDApICYmICgob3BlcmF0aW5nX3JhdGUgPj4gMTYpIDwgNSkpID8gZmFsc2UgOiBmcmFtZV9yYXRlX3N1cHBvcnRlZDsKLQotICAgIHl1dl9mb3JtYXRfc3VwcG9ydGVkID0gKChtX3NWZW5jX2NmZy5pbnB1dGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfTlYxMiAmJiAobV9wcS5jYXBzLmNvbG9yX2Zvcm1hdHMgJiBCSVQoQ09MT1JfRk1UX05WMTIpKSkKLSAgICAgICAgICAgIHx8IChtX3NWZW5jX2NmZy5pbnB1dGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfTlYyMSAmJiAobV9wcS5jYXBzLmNvbG9yX2Zvcm1hdHMgJiBCSVQoQ09MT1JfRk1UX05WMjEpKSkKLSAgICAgICAgICAgIHx8IChtX3NWZW5jX2NmZy5pbnB1dGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfTlYxMl9VQldDICYmIChtX3BxLmNhcHMuY29sb3JfZm9ybWF0cyAmIEJJVChDT0xPUl9GTVRfTlYxMl9VQldDKSkpKTsKLQotICAgIHl1dl9mb3JtYXRfc3VwcG9ydGVkIHw9IG1fcHEuaXNfWVVWX2Zvcm1hdF91bmNlcnRhaW47IC8vIFdoZW4gWVVWIGZvcm1hdCBpcyB1bmNlcnRhaW4sIExldCB0aGlzIGNvbmRpdGlvbiBwYXNzCi0KLSAgICBpc19ub25fc2VjdXJlX3Nlc3Npb24gPSAhdmVuY19oYW5kbGUtPmlzX3NlY3VyZV9zZXNzaW9uKCk7Ci0KLSAgICBpc19ub25fdnBlX3Nlc3Npb24gPSAobV9zVmVuY19jZmcuaW5wdXRfaGVpZ2h0ID09IG1fc1ZlbmNfY2ZnLmR2c19oZWlnaHQgJiYgbV9zVmVuY19jZmcuaW5wdXRfd2lkdGggPT0gbV9zVmVuY19jZmcuZHZzX3dpZHRoKTsKLQotICAgIGlzX3BxX2hhbmRsZV92YWxpZCA9IG1fcHEuaXNfcHFfaGFuZGxlX3ZhbGlkKCk7Ci0KLSAgICAvKiBBZGQgZnV0dXJlIFBRIGNvbmRpdGlvbnMgaGVyZSAqLwotCi0gICAgZW5hYmxlID0gKCFtX3BxLmlzX3BxX2ZvcmNlX2Rpc2FibGUgICAmJgotICAgICAgICAgICAgICAgY29kZWNfc3VwcG9ydGVkICAgICAgICYmCi0gICAgICAgICAgICAgICByY19tb2RlX3N1cHBvcnRlZCAgICAgJiYKLSAgICAgICAgICAgICAgIHJlc29sdXRpb25fc3VwcG9ydGVkICAmJgotICAgICAgICAgICAgICAgZnJhbWVfcmF0ZV9zdXBwb3J0ZWQgICYmCi0gICAgICAgICAgICAgICB5dXZfZm9ybWF0X3N1cHBvcnRlZCAgJiYKLSAgICAgICAgICAgICAgIGlzX25vbl9zZWN1cmVfc2Vzc2lvbiAmJgotICAgICAgICAgICAgICAgaXNfbm9uX3ZwZV9zZXNzaW9uICAgICYmCi0gICAgICAgICAgICAgICBpc19wcV9oYW5kbGVfdmFsaWQpOwotCi0gICAgREVCVUdfUFJJTlRfSElHSCgiUFEgQ29uZGl0aW9uIDogRm9yY2UgZGlzYWJsZSA9ICVkIENvZGVjID0gJWQsIFJDID0gJWQsIFJFUyA9ICVkLCBGUFMgPSAlZCwgWVVWID0gJWQsIE5vbiAtIFNlY3VyZSA9ICVkLCBQUSBsaWIgPSAlZCBOb24gLSBWUEUgPSAlZCBQUSBlbmFibGUgPSAlZCIsCi0gICAgICAgICAgICBtX3BxLmlzX3BxX2ZvcmNlX2Rpc2FibGUsIGNvZGVjX3N1cHBvcnRlZCwgcmNfbW9kZV9zdXBwb3J0ZWQsIHJlc29sdXRpb25fc3VwcG9ydGVkLCBmcmFtZV9yYXRlX3N1cHBvcnRlZCwgeXV2X2Zvcm1hdF9zdXBwb3J0ZWQsCi0gICAgICAgICAgICBpc19ub25fc2VjdXJlX3Nlc3Npb24sIGlzX3BxX2hhbmRsZV92YWxpZCwgaXNfbm9uX3ZwZV9zZXNzaW9uLCBlbmFibGUpOwotCi0gICAgbV9wcS5pc19wcV9lbmFibGVkID0gZW5hYmxlOwotCi0gICAgcmV0dXJuIGVuYWJsZTsKLX0KLQotdm9pZCB2ZW5jX2Rldjo6dmVuY19jb25maWd1cmVfcHEoKQotewotICAgIHZlbmNfc2V0X2V4dHJhZGF0YShPTVhfRXh0cmFEYXRhRW5jb2Rlck92ZXJyaWRlUVBJbmZvLCAoT01YX0JPT0wpdHJ1ZSk7Ci0gICAgZXh0cmFkYXRhIHw9IHRydWU7Ci0gICAgbV9wcS5jb25maWd1cmUobV9zVmVuY19jZmcuaW5wdXRfd2lkdGgsIG1fc1ZlbmNfY2ZnLmlucHV0X2hlaWdodCk7Ci0gICAgcmV0dXJuOwotfQotCi12b2lkIHZlbmNfZGV2Ojp2ZW5jX3RyeV9lbmFibGVfcHEodm9pZCkKLXsKLSAgICBpZih2ZW5jX2NoZWNrX2Zvcl9wcSgpKSB7Ci0gICAgICAgIHZlbmNfY29uZmlndXJlX3BxKCk7Ci0gICAgfQotfQotCi12ZW5jX2Rldjo6dmVuY19kZXZfcHE6OnZlbmNfZGV2X3BxKCkKLXsKLSAgICBtTGliSGFuZGxlID0gTlVMTDsKLSAgICBtUFFIYW5kbGUgPSBOVUxMOwotICAgIG1QUUluaXQgPSBOVUxMOwotICAgIG1QUURlSW5pdCA9IE5VTEw7Ci0gICAgbVBRR2V0Q2FwcyA9IE5VTEw7Ci0gICAgbVBRQ29uZmlndXJlID0gTlVMTDsKLSAgICBtUFFDb21wdXRlU3RhdHMgPSBOVUxMOwotICAgIGNvbmZpZ3VyZWRfZm9ybWF0ID0gMDsKLSAgICBpc19wcV9mb3JjZV9kaXNhYmxlID0gMDsKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJmxvY2ssIE5VTEwpOwotICAgIG1lbXNldCgmcENvbmZpZywgMCwgc2l6ZW9mKGdwdV9zdGF0c19saWJfaW5wdXRfY29uZmlnKSk7Ci0gICAgbWVtc2V0KCZyb2lfZXh0cmFkYXRhX2luZm8sIDAsIHNpemVvZihleHRyYWRhdGFfYnVmZmVyX2luZm8pKTsKLSAgICByb2lfZXh0cmFkYXRhX2luZm8uc2l6ZSA9IDE2ICogMTAyNDsgICAgICAgICAgICAvLyBNYXggc2l6ZSBjb25zaWRlcmluZyA0awotICAgIHJvaV9leHRyYWRhdGFfaW5mby5idWZmZXJfc2l6ZSA9IDE2ICogMTAyNDsgICAgIC8vIE1heCBzaXplIGNvbnNpZGVyaW5nIDRrCi0gICAgcm9pX2V4dHJhZGF0YV9pbmZvLnBvcnRfaW5kZXggPSBPVVRQVVRfUE9SVDsKLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19kZXZfcHE6OmluaXQodW5zaWduZWQgbG9uZyBmb3JtYXQpCi17Ci0gICAgYm9vbCBzdGF0dXMgPSB0cnVlOwotICAgIGVudW0gY29sb3JfY29tcHJlc3Npb25fZm9ybWF0IHl1dl9mb3JtYXQ7Ci0KLSAgICBpZiAobUxpYkhhbmRsZSkgewotICAgICAgICBERUJVR19QUklOVF9FUlJPUigiUFEgaW5pdCBjYWxsZWQgdHdpY2UiKTsKLSAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgfQotCi0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKLSAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKLSAgICAgICAgICAgIHl1dl9mb3JtYXQgPSBjb2xvcl9jb21wcmVzc2lvbl9mb3JtYXQ6OkxJTkVBUl9OVjEyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTJfVUJXQzoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHl1dl9mb3JtYXQgPSBjb2xvcl9jb21wcmVzc2lvbl9mb3JtYXQ6OlVCV0NfTlYxMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIEFUUkFDRV9CRUdJTigiUFEgaW5pdCIpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgbUxpYkhhbmRsZSA9IGRsb3BlbihZVVZfU1RBVFNfTElCUkFSWV9OQU1FLCBSVExEX05PVyk7Ci0gICAgICAgIGlmIChtTGliSGFuZGxlKSB7Ci0gICAgICAgICAgICBtUFFJbml0ID0gKGdwdV9zdGF0c19saWJfaW5pdF90KQotICAgICAgICAgICAgICAgIGRsc3ltKG1MaWJIYW5kbGUsImdwdV9zdGF0c19saWJfaW5pdCIpOwotICAgICAgICAgICAgbVBRRGVJbml0ID0gKGdwdV9zdGF0c19saWJfZGVpbml0X3QpCi0gICAgICAgICAgICAgICAgZGxzeW0obUxpYkhhbmRsZSwiZ3B1X3N0YXRzX2xpYl9kZWluaXQiKTsKLSAgICAgICAgICAgIG1QUUdldENhcHMgPSAoZ3B1X3N0YXRzX2xpYl9nZXRfY2Fwc190KQotICAgICAgICAgICAgICAgIGRsc3ltKG1MaWJIYW5kbGUsImdwdV9zdGF0c19saWJfZ2V0X2NhcHMiKTsKLSAgICAgICAgICAgIG1QUUNvbmZpZ3VyZSA9IChncHVfc3RhdHNfbGliX2NvbmZpZ3VyZV90KQotICAgICAgICAgICAgICAgIGRsc3ltKG1MaWJIYW5kbGUsImdwdV9zdGF0c19saWJfY29uZmlndXJlIik7Ci0gICAgICAgICAgICBtUFFDb21wdXRlU3RhdHMgPSAoZ3B1X3N0YXRzX2xpYl9maWxsX2RhdGFfdCkKLSAgICAgICAgICAgICAgICBkbHN5bShtTGliSGFuZGxlLCJncHVfc3RhdHNfbGliX2ZpbGxfZGF0YSIpOwotICAgICAgICAgICAgaWYgKCFtUFFJbml0IHx8ICFtUFFEZUluaXQgfHwgIW1QUUdldENhcHMgfHwgIW1QUUNvbmZpZ3VyZSB8fCAhbVBRQ29tcHV0ZVN0YXRzKQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgREVCVUdfUFJJTlRfRVJST1IoIkZBVEFMIEVSUk9SOiBjb3VsZCBub3QgZGxvcGVuICVzOiAlcyIsIFlVVl9TVEFUU19MSUJSQVJZX05BTUUsIGRsZXJyb3IoKSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBtUFFJbml0KCZtUFFIYW5kbGUsIHBlcmZfaGludDo6Tk9STUFMLCB5dXZfZm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChtUFFIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UX0VSUk9SKCJGYWlsZWQgdG8gZ2V0IGhhbmRsZSBmb3IgUFEgTGlicmFyeSIpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBERUJVR19QUklOVF9ISUdIKCJHUFUgUFEgbGliIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0gICAgQVRSQUNFX0VORCgpOwotCi0gICAgaWYgKCFzdGF0dXMgJiYgbUxpYkhhbmRsZSkgewotICAgICAgICBpZiAobUxpYkhhbmRsZSkKLSAgICAgICAgICAgIGRsY2xvc2UobUxpYkhhbmRsZSk7Ci0gICAgICAgIG1MaWJIYW5kbGUgPSBOVUxMOwotICAgICAgICBtUFFIYW5kbGUgPSBOVUxMOwotICAgICAgICBtUFFJbml0ID0gTlVMTDsKLSAgICAgICAgbVBRRGVJbml0ID0gTlVMTDsKLSAgICAgICAgbVBRR2V0Q2FwcyA9IE5VTEw7Ci0gICAgICAgIG1QUUNvbmZpZ3VyZSA9IE5VTEw7Ci0gICAgICAgIG1QUUNvbXB1dGVTdGF0cyA9IE5VTEw7Ci0gICAgfQotICAgIGlzX1lVVl9mb3JtYXRfdW5jZXJ0YWluID0gZmFsc2U7Ci0gICAgY29uZmlndXJlZF9mb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi12b2lkIHZlbmNfZGV2Ojp2ZW5jX2Rldl9wcTo6ZGVpbml0KCkKLXsKLSAgICBpZiAobUxpYkhhbmRsZSkgewotICAgICAgICBtUFFEZUluaXQobVBRSGFuZGxlKTsKLSAgICAgICAgZGxjbG9zZShtTGliSGFuZGxlKTsKLSAgICAgICAgbVBRSGFuZGxlID0gTlVMTDsKLSAgICAgICAgbUxpYkhhbmRsZSA9IE5VTEw7Ci0gICAgICAgIG1QUUluaXQgPSBOVUxMOwotICAgICAgICBtUFFEZUluaXQgPSBOVUxMOwotICAgICAgICBtUFFHZXRDYXBzID0gTlVMTDsKLSAgICAgICAgbVBRQ29uZmlndXJlID0gTlVMTDsKLSAgICAgICAgbVBRQ29tcHV0ZVN0YXRzID0gTlVMTDsKLSAgICAgICAgY29uZmlndXJlZF9mb3JtYXQgPSAwOwotICAgIH0KLX0KLQotYm9vbCB2ZW5jX2Rldjo6dmVuY19kZXZfcHE6OnJlaW5pdCh1bnNpZ25lZCBsb25nIGZvcm1hdCkKLXsKLSAgICBib29sIHN0YXR1cyA9IGZhbHNlOwotCi0gICAgaWYgKChjb25maWd1cmVkX2Zvcm1hdCAhPSBmb3JtYXQpICYmIChpc19jb2xvcl9mb3JtYXRfc3VwcG9ydGVkKGZvcm1hdCkpKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIk5ldyBmb3JtYXQgKCVsdSkgaXMgZGlmZmVyZW50IGZyb20gY29uZmlndXJlIGZvcm1hdCAoJWx1KTsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVpbml0aWFsaXppbmcgUFEgbGliIiwgZm9ybWF0LCBjb25maWd1cmVkX2Zvcm1hdCk7Ci0gICAgICAgIGRlaW5pdCgpOwotICAgICAgICBzdGF0dXMgPSBpbml0KGZvcm1hdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gaWdub3JlIGlmIG5ldyBmb3JtYXQgaXMgc2FtZSBhcyBjb25maWd1cmVkCi0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCB2ZW5jX2Rldjo6dmVuY19kZXZfcHE6OmdldF9jYXBzKCkKLXsKLSAgICBtZW1zZXQoJmNhcHMsIDAsIHNpemVvZihncHVfc3RhdHNfbGliX2NhcHNfdCkpOwotICAgIGlmIChtUFFIYW5kbGUpCi0gICAgICAgIG1QUUdldENhcHMobVBRSGFuZGxlLCAmY2Fwcyk7Ci0gICAgREVCVUdfUFJJTlRfSElHSCgiR1BVIGxpYiBzdGF0cyBjYXBzIG1heCAodyxoKSA9ICgldSwgJXUpIixjYXBzLm1heF93aWR0aCwgY2Fwcy5tYXhfaGVpZ2h0KTsKLSAgICBERUJVR19QUklOVF9ISUdIKCJHUFUgbGliIHN0YXRzIGNhcHMgbWF4IG1iIHBlciBzZWMgPSAldSIsY2Fwcy5tYXhfbWJfcGVyX3NlYyk7Ci0gICAgREVCVUdfUFJJTlRfSElHSCgiR1BVIGxpYiBzdGF0cyBjYXBzIGNvbG9yX2Zvcm1hdCA9ICV1IixjYXBzLmNvbG9yX2Zvcm1hdHMpOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX2Rldl9wcTo6aXNfY29sb3JfZm9ybWF0X3N1cHBvcnRlZCh1bnNpZ25lZCBsb25nIGZvcm1hdCkKLXsKLSAgICBib29sIHN1cHBvcnQgPSBmYWxzZTsKLSAgICBpbnQgY29sb3JfZm9ybWF0ID0gLTE7Ci0KLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyOgotICAgICAgICAgICAgY29sb3JfZm9ybWF0ID0gQ09MT1JfRk1UX05WMTI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKLSAgICAgICAgICAgIGNvbG9yX2Zvcm1hdCA9IENPTE9SX0ZNVF9OVjIxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTJfVUJXQzoKLSAgICAgICAgICAgIGNvbG9yX2Zvcm1hdCA9IENPTE9SX0ZNVF9OVjEyX1VCV0M7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzI6Ci0gICAgICAgICAgICBjb2xvcl9mb3JtYXQgPSBDT0xPUl9GTVRfUkdCQTg4ODg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCQTg4ODhfVUJXQzoKLSAgICAgICAgICAgIGNvbG9yX2Zvcm1hdCA9IENPTE9SX0ZNVF9SR0JBODg4OF9VQldDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBjb2xvcl9mb3JtYXQgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChjb2xvcl9mb3JtYXQgPj0gMCkgewotICAgICAgICBzdXBwb3J0ID0gKGNhcHMuY29sb3JfZm9ybWF0cyAmIEJJVChjb2xvcl9mb3JtYXQpKSA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoc3VwcG9ydCA9PSB0cnVlKQotICAgICAgICBERUJVR19QUklOVF9ISUdIKCJHUFUgbGliIHN1cHBvcnRzIHRoaXMgZm9ybWF0ICVsdSIsZm9ybWF0KTsKLSAgICBlbHNlCi0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkdQVSBsaWIgZG9lc24ndCBzdXBwb3J0IHRoaXMgZm9ybWF0ICVsdSIsZm9ybWF0KTsKLQotICAgIHJldHVybiBzdXBwb3J0OwotfQotCi1pbnQgdmVuY19kZXY6OnZlbmNfZGV2X3BxOjpjb25maWd1cmUodW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgaWYgKG1QUUhhbmRsZSkgewotICAgICAgICBwQ29uZmlnLmFsZ28gPSBBREFQVElWRV9RUDsKLSAgICAgICAgcENvbmZpZy5oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHBDb25maWcud2lkdGggPSB3aWR0aDsKLSAgICAgICAgcENvbmZpZy5tYl9oZWlnaHQgPSAxNjsKLSAgICAgICAgcENvbmZpZy5tYl93aWR0aCA9IDE2OwotICAgICAgICBwQ29uZmlnLmFfcXAucHFfZW5hYmxlZCA9IHRydWU7Ci0gICAgICAgIHBDb25maWcuc3RyaWRlID0gVkVOVVNfWV9TVFJJREUoQ09MT1JfRk1UX05WMTIsIHBDb25maWcud2lkdGgpOwotICAgICAgICBwQ29uZmlnLmFfcXAuZ2FpbiA9IDEuMDM5NzsKLSAgICAgICAgcENvbmZpZy5hX3FwLm9mZnNldCA9IDE0LjQyNzsKLSAgICAgICAgaWYgKHBDb25maWcuYV9xcC5yb2lfZW5hYmxlZCkgewotICAgICAgICAgICAgcENvbmZpZy5hX3FwLm1pbkRlbHRhUVBsaW1pdCA9IC0xNjsKLSAgICAgICAgICAgIHBDb25maWcuYV9xcC5tYXhEZWx0YVFQbGltaXQgPSAxNTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBDb25maWcuYV9xcC5taW5EZWx0YVFQbGltaXQgPSAtNjsKLSAgICAgICAgICAgIHBDb25maWcuYV9xcC5tYXhEZWx0YVFQbGltaXQgPSA5OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtUFFDb25maWd1cmUobVBRSGFuZGxlLCAmcENvbmZpZyk7Ci0gICAgfQotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi1ib29sIHZlbmNfZGV2Ojp2ZW5jX2Rldl9wcTo6aXNfcHFfaGFuZGxlX3ZhbGlkKCkKLXsKLSAgICByZXR1cm4gKChtUFFIYW5kbGUpID8gdHJ1ZSA6IGZhbHNlKTsKLX0KLQotaW50IHZlbmNfZGV2Ojp2ZW5jX2Rldl9wcTo6ZmlsbF9wcV9zdGF0cyhzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmLAotICAgIHVuc2lnbmVkIGludCBkYXRhX29mZnNldCkKLXsKLSAgICBncHVfc3RhdHNfbGliX2J1ZmZlcl9wYXJhbXNfdCBpbnB1dCwgb3V0cHV0OwotICAgIGdwdV9zdGF0c19saWJfYnVmZmVyX3BhcmFtc190IHJvaV9pbnB1dDsKLQotICAgIGlmICghbVBRSGFuZGxlIHx8ICFpc19wcV9lbmFibGVkKSB7Ci0gICAgICAgIERFQlVHX1BSSU5UX0hJR0goIkludmFsaWQgVXNhZ2UgOiBIYW5kbGUgPSAlcCBQUSA9ICVkIiwKLSAgICAgICAgICAgICAgICBtUFFIYW5kbGUsIGlzX3BxX2VuYWJsZWQpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQVRSQUNFX0JFR0lOKCJQUSBDb21wdXRlIFN0YXRzIik7Ci0gICAgaW5wdXQuZmQgPSAgYnVmLm0ucGxhbmVzWzBdLnJlc2VydmVkWzBdOwotICAgIGlucHV0LmRhdGFfb2Zmc2V0ID0gIGJ1Zi5tLnBsYW5lc1swXS5kYXRhX29mZnNldDsKLSAgICBpbnB1dC5hbGxvY19sZW4gPSAgYnVmLm0ucGxhbmVzWzBdLmxlbmd0aDsKLSAgICBpbnB1dC5maWxsZWRfbGVuID0gIGJ1Zi5tLnBsYW5lc1swXS5ieXRlc3VzZWQ7Ci0KLSAgICBvdXRwdXQuZmQgPSAgYnVmLm0ucGxhbmVzWzFdLnJlc2VydmVkWzBdOwotICAgIG91dHB1dC5kYXRhX29mZnNldCA9IGJ1Zi5tLnBsYW5lc1sxXS5yZXNlcnZlZFsxXTsgLy8gVGhpcyBpcyBjdXJyZW50IEV4dHJhZGF0YSBidWZmZXIKLSAgICBvdXRwdXQuZGF0YV9vZmZzZXQgKz0gZGF0YV9vZmZzZXQ7IC8vIE9mZnNldCB0byBzdGFydCBpbiBjdXJyZW50IGJ1ZmZlcgotICAgIG91dHB1dC5hbGxvY19sZW4gPSAgYnVmLm0ucGxhbmVzWzFdLnJlc2VydmVkWzJdOwotICAgIG91dHB1dC5maWxsZWRfbGVuID0gIGJ1Zi5tLnBsYW5lc1sxXS5ieXRlc3VzZWQ7Ci0KLSAgICBERUJVR19QUklOVF9ISUdIKCJJbnB1dCBmZCA9ICVkLCBkYXRhX29mZnNldCA9ICVkIiwgaW5wdXQuZmQsIGlucHV0LmRhdGFfb2Zmc2V0KTsKLSAgICBERUJVR19QUklOVF9ISUdIKCJGaW5hbCBPdXRwdXQgZmQgPSAlZCwgZGF0YV9vZmZzZXQgPSAlZCIsIG91dHB1dC5mZCwgb3V0cHV0LmRhdGFfb2Zmc2V0KTsKLQotICAgIGlmIChwQ29uZmlnLmFfcXAucm9pX2VuYWJsZWQpIHsKLSAgICAgICAgcm9pX2lucHV0LmZkID0gIHJvaV9leHRyYWRhdGFfaW5mby5pb24uZmRfaW9uX2RhdGEuZmQ7Ci0gICAgICAgIHJvaV9pbnB1dC5kYXRhX29mZnNldCA9ICAwOwotICAgICAgICByb2lfaW5wdXQuYWxsb2NfbGVuID0gcm9pX2V4dHJhZGF0YV9pbmZvLnNpemU7Ci0gICAgICAgIHJvaV9pbnB1dC5maWxsZWRfbGVuID0gMDsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiUk9JIGZkID0gJWQsIG9mZnNldCA9ICVkIExlbmd0aCA9ICVkIiwgcm9pX2lucHV0LmZkLCByb2lfaW5wdXQuZGF0YV9vZmZzZXQsIHJvaV9pbnB1dC5hbGxvY19sZW4pOwotICAgICAgICBtUFFDb21wdXRlU3RhdHMobVBRSGFuZGxlLCAmaW5wdXQsICZyb2lfaW5wdXQsICZvdXRwdXQsIE5VTEwsIE5VTEwpOwotICAgICAgICBtZW1zZXQocm9pX2V4dHJhZGF0YV9pbmZvLnVhZGRyLCAwLCByb2lfZXh0cmFkYXRhX2luZm8uc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREVCVUdfUFJJTlRfSElHSCgiT3V0cHV0IGZkID0gJWQsIGRhdGFfb2Zmc2V0ID0gJWQiLCBvdXRwdXQuZmQsIG91dHB1dC5kYXRhX29mZnNldCk7Ci0gICAgICAgIG1QUUNvbXB1dGVTdGF0cyhtUFFIYW5kbGUsICZpbnB1dCwgTlVMTCwgJm91dHB1dCwgTlVMTCwgTlVMTCk7Ci0gICAgfQotICAgIEFUUkFDRV9FTkQoKTsKLSAgICBERUJVR19QUklOVF9ISUdIKCJQUSBkYXRhIGxlbmd0aCA9ICVkIiwgb3V0cHV0LmZpbGxlZF9sZW4pOwotICAgIHJldHVybiBvdXRwdXQuZmlsbGVkX2xlbjsKLX0KLQotdmVuY19kZXY6OnZlbmNfZGV2X3BxOjp+dmVuY19kZXZfcHEoKQotewotICAgIGlmIChtTGliSGFuZGxlKSB7Ci0gICAgICAgIG1QUURlSW5pdChtUFFIYW5kbGUpOwotICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOwotICAgIH0KLSAgICBtTGliSGFuZGxlID0gTlVMTDsKLSAgICBtUFFIYW5kbGUgPSBOVUxMOwotICAgIG1QUUluaXQgPSBOVUxMOwotICAgIG1QUURlSW5pdCA9IE5VTEw7Ci0gICAgbVBRR2V0Q2FwcyA9IE5VTEw7Ci0gICAgbVBRQ29uZmlndXJlID0gTlVMTDsKLSAgICBtUFFDb21wdXRlU3RhdHMgPSBOVUxMOwotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbG9jayk7Ci19Ci0jZW5kaWYgLy8gX1BRXwo=