IyEvdXNyL2Jpbi9wZXJsIC13CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAkSWQkCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAojIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCj1oZWFkMSBOQU1FCgpWQ0w6Ok1vZHVsZTo6T1M6OldpbmRvd3M6OlZlcnNpb25fNS5wbSAtIFZDTCBtb2R1bGUgdG8gc3VwcG9ydCBXaW5kb3dzIDUueCBvcGVyYXRpbmcgc3lzdGVtcwoKPWhlYWQxIERFU0NSSVBUSU9OCgogVGhpcyBtb2R1bGUgcHJvdmlkZXMgVkNMIHN1cHBvcnQgZm9yIFdpbmRvd3MgdmVyc2lvbiA1Lnggb3BlcmF0aW5nIHN5c3RlbXMuCiBWZXJzaW9uIDUueCBXaW5kb3dzIE9TJ3MgaW5jbHVkZSBXaW5kb3dzIFhQIGFuZCBXaW5kb3dzIFNlcnZlciAyMDAzLgoKPWN1dAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpwYWNrYWdlIFZDTDo6TW9kdWxlOjpPUzo6V2luZG93czo6VmVyc2lvbl81OwoKIyBTcGVjaWZ5IHRoZSBsaWIgcGF0aCB1c2luZyBGaW5kQmluCnVzZSBGaW5kQmluOwp1c2UgbGliICIkRmluZEJpbjo6QmluLy4uLy4uLy4uLy4uIjsKCiMgQ29uZmlndXJlIGluaGVyaXRhbmNlCnVzZSBiYXNlIHF3KFZDTDo6TW9kdWxlOjpPUzo6V2luZG93cyk7CgojIFNwZWNpZnkgdGhlIHZlcnNpb24gb2YgdGhpcyBtb2R1bGUKb3VyICRWRVJTSU9OID0gJzIuNS4xJzsKCiMgU3BlY2lmeSB0aGUgdmVyc2lvbiBvZiBQZXJsIHRvIHVzZQp1c2UgNS4wMDgwMDA7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBkaWFnbm9zdGljczsKCnVzZSBWQ0w6OnV0aWxzOwp1c2UgRmlsZTo6QmFzZW5hbWU7Cgp1c2UgSU86OkZpbGU7CnVzZSBQT1NJWCBxdyh0bXBuYW0pOwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKPWhlYWQxIENMQVNTIFZBUklBQkxFUwoKPWN1dAoKPWhlYWQyICRTT1VSQ0VfQ09ORklHVVJBVElPTl9ESVJFQ1RPUlkKCiBEYXRhIHR5cGUgICA6IFNjYWxhcgogRGVzY3JpcHRpb24gOiBMb2NhdGlvbiBvbiBtYW5hZ2VtZW50IG5vZGUgb2Ygc2NyaXB0L3V0aWx0eS9jb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgIGZpbGVzIG5lZWRlZCB0byBjb25maWd1cmUgdGhlIE9TLiBUaGlzIGlzIG5vcm1hbGx5IHRoZQogICAgICAgICAgICAgICBkaXJlY3RvcnkgdW5kZXIgdGhlICd0b29scycgZGlyZWN0b3J5IHNwZWNpZmljIHRvIHRoaXMgT1MuCgo9Y3V0CgpvdXIgJFNPVVJDRV9DT05GSUdVUkFUSU9OX0RJUkVDVE9SWSA9ICIkVE9PTFMvV2luZG93c19WZXJzaW9uXzUiOwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKPWhlYWQxIElOVEVSRkFDRSBPQkpFQ1QgTUVUSE9EUwoKPWN1dAoKIy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKPWhlYWQyIHByZV9jYXB0dXJlCgogUGFyYW1ldGVycyAgOgogUmV0dXJucyAgICAgOgogRGVzY3JpcHRpb24gOgoKPWN1dAoKc3ViIHByZV9jYXB0dXJlIHsKCW15ICRzZWxmID0gc2hpZnQ7CglteSAkYXJncyA9IHNoaWZ0OwoJaWYgKHJlZigkc2VsZikgIX4gL3dpbmRvd3MvaSkgewoJCW5vdGlmeSgkRVJST1JTeydDUklUSUNBTCd9LCAwLCAic3Vicm91dGluZSB3YXMgY2FsbGVkIGFzIGEgZnVuY3Rpb24sIGl0IG11c3QgYmUgY2FsbGVkIGFzIGEgY2xhc3MgbWV0aG9kIik7CgkJcmV0dXJuOwoJfQoJCgkjIENhbGwgcGFyZW50IGNsYXNzJ3MgcHJlX2NhcHR1cmUoKSBzdWJyb3V0aW5lCglub3RpZnkoJEVSUk9SU3snT0snfSwgMCwgImNhbGxpbmcgcGFyZW50IGNsYXNzIHByZV9jYXB0dXJlKCkgc3Vicm91dGluZSIpOwoJaWYgKCRzZWxmLT5TVVBFUjo6cHJlX2NhcHR1cmUoJGFyZ3MpKSB7CgkJbm90aWZ5KCRFUlJPUlN7J09LJ30sIDAsICJzdWNjZXNzZnVsbHkgZXhlY3V0ZWQgcGFyZW50IGNsYXNzIHByZV9jYXB0dXJlKCkgc3Vicm91dGluZSIpOwoJfQoJZWxzZSB7CgkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgImZhaWxlZCB0byBleGVjdXRlIHBhcmVudCBjbGFzcyBwcmVfY2FwdHVyZSgpIHN1YnJvdXRpbmUiKTsKCQlyZXR1cm4gMDsKCX0KCQoJbm90aWZ5KCRFUlJPUlN7J09LJ30sIDAsICJiZWdpbm5pbmcgV2luZG93cyB2ZXJzaW9uIDUgaW1hZ2UgY2FwdHVyZSBwcmVwYXJhdGlvbiB0YXNrcyIpOwoKCSMgQ2hlY2sgaWYgU3lzcHJlcCBzaG91bGQgYmUgdXNlZAoJaWYgKCRzZWxmLT5kYXRhLT5nZXRfaW1hZ2VtZXRhX3N5c3ByZXAoKSkgewoJCWlmICghJHNlbGYtPnJ1bl9zeXNwcmVwKCkpIHsKCQkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgImNhcHR1cmUgcHJlcGFyYXRpb24gZmFpbGVkLCBmYWlsZWQgdG8gcnVuIFN5c3ByZXAiKTsKCQkJcmV0dXJuOwoJCX0KCX0KCWVsc2UgewoJCWlmICghJHNlbGYtPnByZXBhcmVfcG9zdF9sb2FkKCkpIHsKCQkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgImNhcHR1cmUgcHJlcGFyYXRpb24gZmFpbGVkLCBmYWlsZWQgdG8gcnVuIHByZXBhcmUgcG9zdF9sb2FkIik7CgkJCXJldHVybjsKCQl9Cgl9CgkKCW5vdGlmeSgkRVJST1JTeydPSyd9LCAwLCAicmV0dXJuaW5nIDEiKTsKCXJldHVybiAxOwp9ICMjIGVuZCBzdWIgcHJlX2NhcHR1cmUKCiMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCj1oZWFkMiBwb3N0X2xvYWQKCiBQYXJhbWV0ZXJzICA6IG5vbmUKIFJldHVybnMgICAgIDogYm9vbGVhbgogRGVzY3JpcHRpb24gOiBQZXJmb3JtcyBzdGVwcyBhZnRlciBhbiBpbWFnZSBpcyBsb2FkZWQgd2hpY2ggYXJlIHNwZWNpZmljIHRvCiAgICAgICAgICAgICAgIFdpbmRvd3MgdmVyc2lvbiA1LnguCgo9b3ZlciAzCgo9Y3V0CgpzdWIgcG9zdF9sb2FkIHsKCW15ICRzZWxmID0gc2hpZnQ7CgkKCSMgQ2hlY2sgaWYgc3Vicm91dGluZSB3YXMgY2FsbGVkIGFzIGFuIG9iamVjdCBtZXRob2QKCXVubGVzcyAocmVmKCRzZWxmKSAmJiAkc2VsZi0+aXNhKCdWQ0w6Ok1vZHVsZScpKSB7CgkJbm90aWZ5KCRFUlJPUlN7J0NSSVRJQ0FMJ30sIDAsICJzdWJyb3V0aW5lIGNhbiBvbmx5IGJlIGNhbGxlZCBhcyBhIFZDTDo6TW9kdWxlIG9iamVjdCBtZXRob2QiKTsKCQlyZXR1cm47Cgl9CgkKCW5vdGlmeSgkRVJST1JTeydERUJVRyd9LCAwLCAiYmVnaW5uaW5nIFdpbmRvd3MgdmVyc2lvbiA1LnggcG9zdC1sb2FkIHRhc2tzIik7Cgo9aXRlbSAqIENhbGwgV2luZG93cy5wbTo6cG9zdF9sb2FkKCkKCj1jdXQKCglyZXR1cm4gJHNlbGYtPlNVUEVSOjpwb3N0X2xvYWQoKTsKCj1iYWNrCgo9Y3V0Cgp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgo9aGVhZDEgQVVYSUxJQVJZIE9CSkVDVCBNRVRIT0RTCgo9Y3V0CgojLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgo9aGVhZDIgcnVuX3N5c3ByZXAKCiBQYXJhbWV0ZXJzICA6IE5vbmUKIFJldHVybnMgICAgIDogSWYgc3VjY2Vzc2Z1bDogdHJ1ZQogICAgICAgICAgICAgICBJZiBmYWlsZWQ6IGZhbHNlCiBEZXNjcmlwdGlvbiA6IFByZXBhcmVzIGFuZCBydW5zIFN5c3ByZXAgb24gYSBXaW5kb3dzIFhQIG9yIFNlcnZlciAyMDAzCiAgICAgICAgICAgICAgIGNvbXB1dGVyOgogICAgICAgICAgICAgICAtZ2VuZXJhdGVzIHN5c3ByZXAuaW5mIGZpbGUKICAgICAgICAgICAgICAgLWNvcGllcyBTeXNwcmVwIGZpbGVzIHRvIEM6XFN5c3ByZXAKICAgICAgICAgICAgICAgLWNsZWFucyB1cCBvbGQgU3lzcHJlcCBsb2cgZmlsZXMKICAgICAgICAgICAgICAgLXNldHMgdGhlIERldmljZVBhdGggcmVnaXN0cnkga2V5CiAgICAgICAgICAgICAgIC1ydW5zIHN5c3ByZXAuZXhlCiAgICAgICAgICAgICAgIC13YWl0cyBmb3IgY29tcHV0ZXIgdG8gYmVjb21lIHVucmVzcG9uc2l2ZQogICAgICAgICAgICAgICAtc2h1dHMgZG93biBjb21wdXRlcgoKPWN1dAoKc3ViIHJ1bl9zeXNwcmVwIHsKCW15ICRzZWxmID0gc2hpZnQ7CglpZiAocmVmKCRzZWxmKSAhfiAvd2luZG93cy9pKSB7CgkJbm90aWZ5KCRFUlJPUlN7J0NSSVRJQ0FMJ30sIDAsICJzdWJyb3V0aW5lIHdhcyBjYWxsZWQgYXMgYSBmdW5jdGlvbiwgaXQgbXVzdCBiZSBjYWxsZWQgYXMgYSBjbGFzcyBtZXRob2QiKTsKCQlyZXR1cm47Cgl9CgoJbXkgJGNvbXB1dGVyX25vZGVfbmFtZSAgID0gJHNlbGYtPmRhdGEtPmdldF9jb21wdXRlcl9ub2RlX25hbWUoKTsKCW15ICRzeXN0ZW0zMl9wYXRoICAgICAgICA9ICRzZWxmLT5nZXRfc3lzdGVtMzJfcGF0aCgpOwoJCgkjIFNwZWNpZnkgd2hlcmUgb24gdGhlIG5vZGUgdGhlIHN5c3ByZXAuaW5mIGZpbGUgd2lsbCByZXNpZGUKCW15ICRub2RlX2NvbmZpZ3VyYXRpb25fZGlyZWN0b3J5ID0gJHNlbGYtPmdldF9ub2RlX2NvbmZpZ3VyYXRpb25fZGlyZWN0b3J5KCk7CglteSAkbm9kZV9jb25maWd1cmF0aW9uX3N5c3ByZXBfZGlyZWN0b3J5ID0gIiRub2RlX2NvbmZpZ3VyYXRpb25fZGlyZWN0b3J5L1V0aWxpdGllcy9TeXNwcmVwIjsKCW15ICRub2RlX2NvbmZpZ3VyYXRpb25fc3lzcHJlcF9pbmZfcGF0aCA9ICIkbm9kZV9jb25maWd1cmF0aW9uX3N5c3ByZXBfZGlyZWN0b3J5L3N5c3ByZXAuaW5mIjsKCW15ICRub2RlX3dvcmtpbmdfc3lzcHJlcF9kaXJlY3RvcnkgPSAnQzovU3lzcHJlcCc7CglteSAkbm9kZV93b3JraW5nX3N5c3ByZXBfZXhlX3BhdGggPSAnQzpcXFN5c3ByZXBcXHN5c3ByZXAuZXhlJzsKCQoJIyBHZXQgdGhlIHN5c3ByZXAuaW5mIGZpbGUgY29udGVudHMKCW15ICRzeXNwcmVwX2NvbnRlbnRzID0gJHNlbGYtPmdldF9zeXNwcmVwX2luZl9jb250ZW50cygpOwoJaWYgKCEkc3lzcHJlcF9jb250ZW50cykgewoJCW5vdGlmeSgkRVJST1JTeydXQVJOSU5HJ30sIDAsICJmYWlsZWQgdG8gZ2V0IHN5c3ByZXAuaW5mIGNvbnRlbnRzIik7CgkJcmV0dXJuOwoJfQoJCgkjIENyZWF0ZSBhIHRlbXBmaWxlIG9uIHRoZSBtYW5hZ2VtZW50IG5vZGUgdG8gc3RvcmUgdGhlIHN5c3ByZXAuaW5mIGNvbnRlbnRzCglteSAkdG1wX3N5c3ByZXBfaW5mX3BhdGg7CglteSAkdG1wX3N5c3ByZXBfaW5mX2ZoOwoJZG8gewoJCSR0bXBfc3lzcHJlcF9pbmZfcGF0aCA9IHRtcG5hbSgpOwoJfQoJdW50aWwgJHRtcF9zeXNwcmVwX2luZl9maCA9IElPOjpGaWxlLT5uZXcoJHRtcF9zeXNwcmVwX2luZl9wYXRoLCBPX1JEV1J8T19DUkVBVHxPX0VYQ0wpOwoJbm90aWZ5KCRFUlJPUlN7J0RFQlVHJ30sIDAsICJjcmVhdGVkIHRlbXBmaWxlOiAkdG1wX3N5c3ByZXBfaW5mX3BhdGgiKTsKCQoJIyBQcmludCB0aGUgc3lzcHJlcC5pbmYgY29udGVudHMgdG8gdGhlIHRlbXBmaWxlCglpZiAocHJpbnQgJHRtcF9zeXNwcmVwX2luZl9maCAkc3lzcHJlcF9jb250ZW50cykgewoJCW5vdGlmeSgkRVJST1JTeydERUJVRyd9LCAwLCAicHJpbnRlZCBzeXNwcmVwLmluZiBjb250ZW50cyB0byB0ZW1wZmlsZTogJHRtcF9zeXNwcmVwX2luZl9wYXRoIik7Cgl9CgllbHNlIHsKCQlub3RpZnkoJEVSUk9SU3snV0FSTklORyd9LCAwLCAiZmFpbGVkIHRvIHByaW50IHN5c3ByZXAuaW5mIGNvbnRlbnRzIHRvIHRlbXBmaWxlOiAkdG1wX3N5c3ByZXBfaW5mX3BhdGgiKTsKCQlyZXR1cm47Cgl9CgkKCSMgU0NQIHRoZSBzeXNwcmVwLmluZiB0ZW1wZmlsZSB0byB0aGUgY29tcHV0ZXIKCWlmICghJHNlbGYtPmNvcHlfZmlsZV90bygkdG1wX3N5c3ByZXBfaW5mX3BhdGgsICRub2RlX2NvbmZpZ3VyYXRpb25fc3lzcHJlcF9pbmZfcGF0aCkpIHsKCQlub3RpZnkoJEVSUk9SU3snV0FSTklORyd9LCAwLCAiZmFpbGVkIHRvIGNvcHkgJHRtcF9zeXNwcmVwX2luZl9wYXRoIHRvICRjb21wdXRlcl9ub2RlX25hbWU6JG5vZGVfY29uZmlndXJhdGlvbl9zeXNwcmVwX2luZl9wYXRoIik7CgkJcmV0dXJuOwoJfQoJCgkjIERlbGV0ZSB0aGUgc3lzcHJlcC5pbmYgdGVtcGZpbGUgZnJvbSB0aGUgbWFuYWdlbWVudCBub2RlCglpZiAodW5saW5rICR0bXBfc3lzcHJlcF9pbmZfcGF0aCkgewoJCW5vdGlmeSgkRVJST1JTeydERUJVRyd9LCAwLCAiZGVsZXRlZCBzeXNwcmVwLmluZiB0ZW1wZmlsZTogJHRtcF9zeXNwcmVwX2luZl9wYXRoIik7Cgl9CgllbHNlIHsKCQlub3RpZnkoJEVSUk9SU3snV0FSTklORyd9LCAwLCAiZmFpbGVkIHRvIGRlbGV0ZSBzeXNwcmVwLmluZiB0ZW1wZmlsZTogJHRtcF9zeXNwcmVwX2luZl9wYXRoLCAkISIpOwoJfQoKCQoJIyBSZW1vdmUgb2xkIEM6XFN5c3ByZXAgZGlyZWN0b3J5IGlmIGl0IGV4aXN0cwoJbm90aWZ5KCRFUlJPUlN7J0RFQlVHJ30sIDAsICJhdHRlbXB0aW5nIHRvIHJlbW92ZSBvbGQgJG5vZGVfd29ya2luZ19zeXNwcmVwX2RpcmVjdG9yeSBkaXJlY3RvcnkgaWYgaXQgZXhpc3RzIik7CglpZiAoISRzZWxmLT5kZWxldGVfZmlsZSgkbm9kZV93b3JraW5nX3N5c3ByZXBfZGlyZWN0b3J5KSkgewoJCW5vdGlmeSgkRVJST1JTeydXQVJOSU5HJ30sIDAsICJ1bmFibGUgdG8gcmVtb3ZlIGV4aXN0aW5nICRub2RlX3dvcmtpbmdfc3lzcHJlcF9kaXJlY3RvcnkgZGlyZWN0b3J5Iik7CgkJcmV0dXJuIDA7Cgl9CgkKCSMgQ29weSBTeXNwcmVwIGZpbGVzIHRvIEM6XFN5c3ByZXAKCW15ICR4Y29weV9jb21tYW5kID0gImNwIC1ydmYgXCIkbm9kZV9jb25maWd1cmF0aW9uX3N5c3ByZXBfZGlyZWN0b3J5XCIgXCIkbm9kZV93b3JraW5nX3N5c3ByZXBfZGlyZWN0b3J5XCIiOwoJbXkgKCR4Y29weV9zdGF0dXMsICR4Y29weV9vdXRwdXQpID0gJHNlbGYtPmV4ZWN1dGUoJHhjb3B5X2NvbW1hbmQpOwoJaWYgKGRlZmluZWQoJHhjb3B5X3N0YXR1cykgJiYgJHhjb3B5X3N0YXR1cyA9PSAwKSB7CgkJbm90aWZ5KCRFUlJPUlN7J09LJ30sIDAsICJjb3BpZWQgU3lzcHJlcCBmaWxlcyB0byAkbm9kZV93b3JraW5nX3N5c3ByZXBfZGlyZWN0b3J5Iik7Cgl9CgllbHNpZiAoZGVmaW5lZCgkeGNvcHlfc3RhdHVzKSkgewoJCW5vdGlmeSgkRVJST1JTeydXQVJOSU5HJ30sIDAsICJmYWlsZWQgdG8gY29weSBTeXNwcmVwIGZpbGVzIHRvICRub2RlX3dvcmtpbmdfc3lzcHJlcF9kaXJlY3RvcnksIGV4aXQgc3RhdHVzOiAkeGNvcHlfc3RhdHVzLCBvdXRwdXQ6XG5AeyR4Y29weV9vdXRwdXR9Iik7CgkJcmV0dXJuIDA7Cgl9CgllbHNlIHsKCQlub3RpZnkoJEVSUk9SU3snV0FSTklORyd9LCAwLCAidW5hYmxlIHRvIHJ1biBzc2ggY29tbWFuZCB0byBjb3B5IFN5c3ByZXAgZmlsZXMgdG8gJG5vZGVfd29ya2luZ19zeXNwcmVwX2RpcmVjdG9yeSIpOwoJCXJldHVybiAwOwoJfQoJCgkKCSMgU2V0IHRoZSBEZXZpY2VQYXRoIHJlZ2lzdHJ5IGtleQoJIyBUaGlzIGlzIHVzZWQgdG8gbG9jYXRlIGRldmljZSBkcml2ZXJzCglpZiAoISRzZWxmLT5zZXRfZGV2aWNlX3BhdGhfa2V5KCkpIHsKCQlub3RpZnkoJEVSUk9SU3snV0FSTklORyd9LCAwLCAiZmFpbGVkIHRvIHNldCB0aGUgRGV2aWNlUGF0aCByZWdpc3RyeSBrZXkiKTsKCQlyZXR1cm47Cgl9CgkKCSMgRGVsZXRlIGRyaXZlciBjYWNoZSBmaWxlcwoJJHNlbGYtPmRlbGV0ZV9maWxlc19ieV9wYXR0ZXJuKCckU1lTVEVNUk9PVC9pbmYnLCAnLipJTkZDQUNIRS4qJywgMSk7Cgkkc2VsZi0+ZGVsZXRlX2ZpbGVzX2J5X3BhdHRlcm4oJyRTWVNURU1ST09UL2luZicsICcuKm9lbVswLTldK1xcLi4qJywgMSk7CgkKCSMgRGVsZXRlIHNldHVwYXBpLmxvZyAtIHRoaXMgaXMgdGhlIG1haW4gbG9nIGZpbGUgZm9yIHRyb3VibGVzaG9vdGluZyBTeXNwcmVwCgkjIENvbnRhaW5zIGRldmljZSAmIGRyaXZlciBjaGFuZ2VzLCBtYWpvciBzeXN0ZW0gY2hhbmdlcywgc2VydmljZSBwYWNrIGluc3RhbGxhdGlvbnMsIGhvdGZpeCBpbnN0YWxsYXRpb25zCgkkc2VsZi0+ZGVsZXRlX2ZpbGVzX2J5X3BhdHRlcm4oJyRTWVNURU1ST09UJywgJy4qXC9zZXR1cGFwaS4qJywgMSk7CgkKCSMgRGVsZXRlIFdpbmRvd3Mgc2V0dXAgbG9nIGZpbGVzCgkkc2VsZi0+ZGVsZXRlX2ZpbGVzX2J5X3BhdHRlcm4oJyRTWVNURU1ST09UJywgJy4qXC9zZXR1cGVyclxcLi4qJywgMSk7Cgkkc2VsZi0+ZGVsZXRlX2ZpbGVzX2J5X3BhdHRlcm4oJyRTWVNURU1ST09UJywgJy4qXC9zZXR1cGxvZ1xcLi4qJywgMSk7Cgkkc2VsZi0+ZGVsZXRlX2ZpbGVzX2J5X3BhdHRlcm4oJyRTWVNURU1ST09UJywgJy4qXC9zZXR1cGFjdFxcLi4qJywgMSk7CgkKCSMgQ29uZmlndXJlIHRoZSBmaXJld2FsbCB0byBhbGxvdyB0aGUgc2Vzc21nci5leGUgcHJvZ3JhbQoJIyBTeXNwcmVwIG1heSBoYW5nIHdpdGggYSBkaWFsb2cgYm94IGFza2luZyB0byBhbGxvdyB0aGlzIHByb2dyYW0KCWlmICghJHNlbGYtPmZpcmV3YWxsX2VuYWJsZV9zZXNzbWdyKCkpIHsKCQlub3RpZnkoJEVSUk9SU3snV0FSTklORyd9LCAwLCAidW5hYmxlIHRvIGNvbmZpZ3VyZSBmaXJld2FsbCB0byBhbGxvdyBzZXNzbWdyLmV4ZSBwcm9ncmFtLCBTeXNwcmVwIG1heSBoYW5nIik7Cgl9CgkKCSMgS2lsbCB0aGUgc2NyZWVuIHNhdmVyIHByb2Nlc3MsIGl0IG9jY2FzaW9uYWxseSBwcmV2ZW50cyByZWJvb3RzIGFuZCBzaHV0ZG93bnMgZnJvbSB3b3JraW5nCgkkc2VsZi0+a2lsbF9wcm9jZXNzKCdsb2dvbi5zY3InKTsKCQoJIyBBc3NlbWJsZSB0aGUgU3lzcHJlcCBjb21tYW5kCgkjIFJ1biBTeXNwcmVwLmV4ZSwgdXNlIGN5Z3N0YXJ0IHRvIGxhdWNoIHRoZSAuZXhlIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkKCW15ICRzeXNwcmVwX2NvbW1hbmQgPSAiL2Jpbi9jeWdzdGFydC5leGUgXCRTWVNURU1ST09UL3N5c3RlbTMyL2NtZC5leGUgL2MgXCIiOwoJCgkjIFJ1biBTeXNwcmVwLmV4ZQoJJHN5c3ByZXBfY29tbWFuZCAuPSAiQzovU3lzcHJlcC9zeXNwcmVwLmV4ZSAvcXVpZXQgL3Jlc2VhbCAvbWluaSAvZm9yY2VzaHV0ZG93biAmICI7CgkKCSMgU2h1dGRvd24gdGhlIGNvbXB1dGVyIC0gU3lzcHJlcCBkb2VzIG5vdCBhbHdheXMgc2h1dCB0aGUgY29tcHV0ZXIgZG93biBhdXRvbWF0aWNhbGx5CgkjIENoZWNrIGlmIHRzc2h1dGRuLmV4ZSBleGlzdHMgb24gdGhlIGNvbXB1dGVyCgkjIHRzc2h1dGRuLmV4ZSBpcyB0aGUgcHJlZmVycmVkIHV0aWxpdHksIHNodXRkb3duLmV4ZSBvZnRlbiBmYWlscyBvbiBXaW5kb3dzIFNlcnZlciAyMDAzCglteSAkd2luZG93c19wcm9kdWN0X25hbWUgPSAkc2VsZi0+Z2V0X3Byb2R1Y3RfbmFtZSgpIHx8ICcnOwoJaWYgKCR3aW5kb3dzX3Byb2R1Y3RfbmFtZSA9fiAvMjAwMy8gJiYgJHNlbGYtPmZpbGVfZXhpc3RzKCIkc3lzdGVtMzJfcGF0aC90c3NodXRkbi5leGUiKSkgewoJCSRzeXNwcmVwX2NvbW1hbmQgLj0gIiRzeXN0ZW0zMl9wYXRoL3Rzc2h1dGRuLmV4ZSAwIC9QT1dFUkRPV04gL0RFTEFZOjAgL1YiOwoJfQoJZWxzZSB7CgkJJHN5c3ByZXBfY29tbWFuZCAuPSAiJHN5c3RlbTMyX3BhdGgvc2h1dGRvd24uZXhlIC9zIC90IDAgL2YiOwoJfQoJCgkkc3lzcHJlcF9jb21tYW5kIC49ICJcIiI7CgkKCW15ICgkc3lzcHJlcF9zdGF0dXMsICRzeXNwcmVwX291dHB1dCkgPSAkc2VsZi0+ZXhlY3V0ZSgkc3lzcHJlcF9jb21tYW5kKTsKCWlmIChkZWZpbmVkKCRzeXNwcmVwX3N0YXR1cykgJiYgJHN5c3ByZXBfc3RhdHVzID09IDApIHsKCQlub3RpZnkoJEVSUk9SU3snT0snfSwgMCwgImluaXRpYXRlZCBTeXNwcmVwLmV4ZSwgd2FpdGluZyBmb3IgJGNvbXB1dGVyX25vZGVfbmFtZSB0byBiZWNvbWUgdW5yZXNwb25zaXZlIik7Cgl9CgllbHNpZiAoZGVmaW5lZCgkc3lzcHJlcF9zdGF0dXMpKSB7CgkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgImZhaWxlZCB0byBpbml0aWF0ZSBTeXNwcmVwLmV4ZSwgZXhpdCBzdGF0dXM6ICRzeXNwcmVwX3N0YXR1cywgb3V0cHV0OlxuQHskc3lzcHJlcF9vdXRwdXR9Iik7CgkJcmV0dXJuIDA7Cgl9CgllbHNlIHsKCQlub3RpZnkoJEVSUk9SU3snV0FSTklORyd9LCAwLCAidW5hYmxlIHRvIHJ1biBzc2ggY29tbWFuZCB0byBpbml0aWF0ZSBTeXNwcmVwLmV4ZSIpOwoJCXJldHVybiAwOwoJfQoKCSMgV2FpdCBtYXhpbXVtIG9mIDEwIG1pbnV0ZXMgZm9yIHRoZSBjb21wdXRlciB0byBiZWNvbWUgdW5yZXNwb25zaXZlCglpZiAoISRzZWxmLT53YWl0X2Zvcl9ub19waW5nKDYwMCkpIHsKCQkjIENvbXB1dGVyIG5ldmVyIHN0b3BwZWQgcmVzcG9uZGluZyB0byBwaW5nCgkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgIiRjb21wdXRlcl9ub2RlX25hbWUgbmV2ZXIgYmVjYW1lIHVucmVzcG9uc2l2ZSB0byBwaW5nIik7CgkJcmV0dXJuIDA7Cgl9CgkKCSMgV2FpdCBtYXhpbXVtIG9mIDEwIG1pbnV0ZXMgZm9yIGNvbXB1dGVyIHRvIHBvd2VyIG9mZgoJbXkgJHBvd2VyX29mZiA9ICRzZWxmLT5wcm92aXNpb25lci0+d2FpdF9mb3JfcG93ZXJfb2ZmKDYwMCk7CglpZiAoIWRlZmluZWQoJHBvd2VyX29mZikpIHsKCQkjIHdhaXRfZm9yX3Bvd2VyX29mZiByZXN1bHQgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhlIHByb3Zpc2lvbmluZyBtb2R1bGUgZG9lc24ndCBpbXBsZW1lbnQgYSBwb3dlcl9zdGF0dXMgc3Vicm91dGluZQoJCW5vdGlmeSgkRVJST1JTeydPSyd9LCAwLCAidW5hYmxlIHRvIGRldGVybWluZSBwb3dlciBzdGF0dXMgb2YgJGNvbXB1dGVyX25vZGVfbmFtZSBmcm9tIHByb3Zpc2lvbmluZyBtb2R1bGUsIHNsZWVwaW5nIDUgbWludXRlcyB0byBhbGxvdyBjb21wdXRlciB0aW1lIHRvIHBvd2VyIG9mZiIpOwoJCXNsZWVwIDMwMDsKCX0KCWVsc2lmICgkcG93ZXJfb2ZmKSB7CgkJbm90aWZ5KCRFUlJPUlN7J09LJ30sIDAsICIkY29tcHV0ZXJfbm9kZV9uYW1lIHBvd2VyZWQgb2ZmIGFmdGVyIHJ1bm5pbmcgU3lzcHJlcC5leGUiKTsKCQlyZXR1cm4gMTsKCX0KCWVsc2UgewoJCW5vdGlmeSgkRVJST1JTeydXQVJOSU5HJ30sIDAsICIkY29tcHV0ZXJfbm9kZV9uYW1lIG5ldmVyIHBvd2VyZWQgb2ZmIGFmdGVyIHJ1bm5pbmcgc3lzcHJlcC5leGUiKTsKCX0KCQoJIyBDb21wdXRlciBuZXZlciBwb3dlcmVkIG9mZiwgY2hlY2sgaWYgcHJvdmlzaW9uaW5nIG1vZHVsZSBjYW4gZm9yY2VmdWxseSBwb3dlciBvZmYgdGhlIGNvbXB1dGVyCglpZiAoISRzZWxmLT5wcm92aXNpb25lci0+Y2FuKCdwb3dlcl9vZmYnKSkgewoJCW5vdGlmeSgkRVJST1JTeydPSyd9LCAwLCAicHJvdmlzaW9uaW5nIG1vZHVsZSBkb2VzIG5vdCBpbXBsZW1lbnQgYSBwb3dlcl9vZmYgc3Vicm91dGluZSIpOwoJCXJldHVybiAxOwoJfQoJZWxzaWYgKCRzZWxmLT5wcm92aXNpb25lci0+cG93ZXJfb2ZmKCkpIHsKCQlub3RpZnkoJEVSUk9SU3snT0snfSwgMCwgImZvcmNlZnVsbHkgcG93ZXJlZCBvZmYgJGNvbXB1dGVyX25vZGVfbmFtZSIpOwoJCXJldHVybiAxOwoJfQoJZWxzZSB7CgkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgImZhaWxlZCB0byBmb3JjZWZ1bGx5IHBvd2VyIG9mZiAkY29tcHV0ZXJfbm9kZV9uYW1lIik7CgkJcmV0dXJuIDA7Cgl9Cn0KCiMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCj1oZWFkMiBnZXRfc3lzcHJlcF9pbmZfY29udGVudHMKCiBQYXJhbWV0ZXJzICA6IE5vbmUKIFJldHVybnMgICAgIDogSWYgc3VjY2Vzc2Z1bDogc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIGEgc3lzcHJlcC5pbmYgZmlsZQogICAgICAgICAgICAgICBJZiBmYWlsZWQ6IGZhbHNlCiBEZXNjcmlwdGlvbiA6IEdlbmVyYXRlcyB0aGUgY29udGVudHMgb2YgYSBzeXNwcmVwLmluZiBmaWxlLiBUaGUgcHJvZHVjdCBrZXkgaXMKICAgICAgICAgICAgICAgcmV0cmlldmVkIGZyb20gdGhlIHdpblByb2R1Y3RLZXkgdGFibGUgaW4gdGhlIGRhdGFiYXNlLiBUaGUKICAgICAgICAgICAgICAgU3lzcHJlcE1hc3NTdG9yYWdlIHNlY3Rpb24gaXMgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZQogICAgICAgICAgICAgICBtYXNzIHN0b3JhZ2UgZHJpdmVycyBjb3BpZWQgdG8gdGhlIGNvbXB1dGVyLgoKPWN1dAoKc3ViIGdldF9zeXNwcmVwX2luZl9jb250ZW50cyB7CglteSAkc2VsZiA9IHNoaWZ0OwoJaWYgKHJlZigkc2VsZikgIX4gL3dpbmRvd3MvaSkgewoJCW5vdGlmeSgkRVJST1JTeydDUklUSUNBTCd9LCAwLCAic3Vicm91dGluZSB3YXMgY2FsbGVkIGFzIGEgZnVuY3Rpb24sIGl0IG11c3QgYmUgY2FsbGVkIGFzIGEgY2xhc3MgbWV0aG9kIik7CgkJcmV0dXJuOwoJfQoJCgkjIEdldCB0aGUgcHJvZHVjdCBrZXkKCW15ICRwcm9kdWN0X2tleSA9ICRzZWxmLT5nZXRfcHJvZHVjdF9rZXkoKTsKCWlmICghJHByb2R1Y3Rfa2V5KSB7CgkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgInVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHByb2R1Y3Qga2V5Iik7CgkJcmV0dXJuOwoJfQoJCgkjIEdldCB0aGUgaW1hZ2UgYWZmaWxpYXRpb24gbmFtZSBvciB1c2UgQVNGIGFzIHRoZSBkZWZhdWx0CglteSAkaW1hZ2VfYWZmaWxpYXRpb25fbmFtZSA9ICRzZWxmLT5kYXRhLT5nZXRfaW1hZ2VfYWZmaWxpYXRpb25fbmFtZSgpIHx8ICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiI7CgkKCSMgR2V0IHRoZSBXaW5kb3dzIHRpbWUgem9uZSBjb2RlIGJhc2VkIG9uIHRoZSB0aW1lIHpvbmUgY29uZmlndXJlZCBmb3IgdGhlIG1hbmFnZW1lbnQgbm9kZQoJbXkgJHRpbWVfem9uZV9jb2RlID0gJHNlbGYtPmdldF90aW1lX3pvbmVfY29kZSgpOwoJCglteSAlc3lzcHJlcF9pbmZfaGFzaDsKCQoJIyBbVW5hdHRlbmRlZF0gLSBTZXR1cC9TeXNwcmVwIGV4ZWN1dGlvbiBjb25maWd1cmF0aW9uCgkkc3lzcHJlcF9pbmZfaGFzaHtVbmF0dGVuZGVkfXtEcml2ZXJTaWduaW5nUG9saWN5fSA9ICdJZ25vcmUnOyAgICAgICAgICMgU3BlY2lmaWVzIGhvdyB0byBwcm9jZXNzIHVuc2lnbmVkIGRyaXZlcnMgZHVyaW5nIHVuYXR0ZW5kZWQgU2V0dXAKCSRzeXNwcmVwX2luZl9oYXNoe1VuYXR0ZW5kZWR9e0V4dGVuZE9lbVBhcnRpdGlvbn0gPSAnTm8nOyAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgd2hldGhlciB0byBleHRlbmQgdGhlIHBhcnRpdGlvbiBvbiB3aGljaCB5b3UgaW5zdGFsbCB0aGUgTWljcm9zb2Z0riBXaW5kb3dzriBvcGVyYXRpbmcgc3lzdGVtCgkjJHN5c3ByZXBfaW5mX2hhc2h7VW5hdHRlbmRlZH17SGliZXJuYXRpb259ID0gJ05vJzsgICAgICAgICAgICAgICAgICAgICMgU3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSBoaWJlcm5hdGlvbiBvcHRpb24gaW4gdGhlIFBvd2VyIE9wdGlvbnMgY29udHJvbCBwYW5lbAoJJHN5c3ByZXBfaW5mX2hhc2h7VW5hdHRlbmRlZH17SW5zdGFsbEZpbGVzUGF0aH0gPSAnQzpcU3lzcHJlcFxpMzg2JzsgICAjIFNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgZmlsZXMgbmVjZXNzYXJ5IGZvciBpbnN0YWxsYXRpb24gZHVyaW5nIE1pbmktU2V0dXAKCSMkc3lzcHJlcF9pbmZfaGFzaHtVbmF0dGVuZGVkfXtLZWVwUGFnZUZpbGV9ID0gJyc7ICAgICAgICAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgd2hldGhlciB0byByZWdlbmVyYXRlIHRoZSBwYWdlIGZpbGUKCSMkc3lzcHJlcF9pbmZfaGFzaHtVbmF0dGVuZGVkfXtPZW1QblBEcml2ZXJzUGF0aH0gPSAnJzsgICAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgdGhlIHBhdGggdG8gb25lIG9yIG1vcmUgZm9sZGVycyB0aGF0IGNvbnRhaW4gUGx1ZyBhbmQgUGxheSBkcml2ZXJzIG5vdCBkaXN0cmlidXRlZCB3aXRoIERyaXZlcnMuY2FiIG9uIHRoZSBXaW5kb3dzIHByb2R1Y3QgQ0QKCSRzeXNwcmVwX2luZl9oYXNoe1VuYXR0ZW5kZWR9e09lbVByZWluc3RhbGx9ID0gJ1llcyc7ICAgICAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgd2hldGhlciBTZXR1cCBpbnN0YWxscyBpdHMgZmlsZXMgZnJvbSBkaXN0cmlidXRpb24gZm9sZGVycwoJJHN5c3ByZXBfaW5mX2hhc2h7VW5hdHRlbmRlZH17T2VtU2tpcEV1bGF9ID0gJ1llcyc7ICAgICAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmQgdXNlciBhY2NlcHRzIHRoZSBFbmQtVXNlciBMaWNlbnNlIEFncmVlbWVudCAoRVVMQSkgaW5jbHVkZWQgd2l0aCBXaW5kb3dzCgkjJHN5c3ByZXBfaW5mX2hhc2h7VW5hdHRlbmRlZH17UmVzZXRTb3VyY2VQYXRofSA9ICcnOyAgICAgICAgICAgICAgICAgICMgU3BlY2lmaWVzIHdoZXRoZXIgdG8gY2hhbmdlIHRoZSByZWdpc3RyeSBzZXR0aW5nIG9mIHRoZSBzb3VyY2UgcGF0aCBmb3IgdGhlIFNldHVwIGZpbGVzCgkjJHN5c3ByZXBfaW5mX2hhc2h7VW5hdHRlbmRlZH17VGFwaUNvbmZpZ3VyZWR9ID0gJyc7ICAgICAgICAgICAgICAgICAgICMgU3BlY2lmaWVzIHdoZXRoZXIgdG8gcHJlY29uZmlndXJlIHRlbGVwaG9ueSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UgKFRBUEkpIHNldHRpbmdzIG9uIHRoZSBpbnN0YWxsYXRpb24KCSRzeXNwcmVwX2luZl9oYXNoe1VuYXR0ZW5kZWR9e1RhcmdldFBhdGh9ID0gJ1xcV2luZG93cyc7ICAgICAgICAgICAgICAgIyBEZXRlcm1pbmVzIHRoZSBpbnN0YWxsYXRpb24gZm9sZGVyIGluIHdoaWNoIHlvdSBpbnN0YWxsIFdpbmRvd3MKCSMkc3lzcHJlcF9pbmZfaGFzaHtVbmF0dGVuZGVkfXtVcGRhdGVIQUx9ID0gJyc7ICAgICAgICAgICAgICAgICAgICAgICAgIyBMb2FkcyB0aGUgbXVsdGlwcm9jZXNzb3IgaGFyZHdhcmUgYWJzdHJhY3Rpb24gbGF5ZXIgKEhBTCkgb24gdGhlIGRlc3RpbmF0aW9uIGNvbXB1dGVyLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgYSB1bmlwcm9jZXNzb3Igb3IgYW4gbXVsdGlwcm9jZXNzb3IgY29tcHV0ZXIKCSRzeXNwcmVwX2luZl9oYXNoe1VuYXR0ZW5kZWR9e1VwZGF0ZUluc3RhbGxlZERyaXZlcnN9ID0gJ1llcyc7ICAgICAgICAgIyBTcGVjaWZpZXMgd2hldGhlciB0byBjYWxsIFBsdWcgYW5kIFBsYXkgYWZ0ZXIgTWluaS1TZXR1cCwgdG8gcmUtZW51bWVyYXRlIGFsbCB0aGUgaW5zdGFsbGVkIGRyaXZlcnMsIGFuZCB0byBpbnN0YWxsIGFueSB1cGRhdGVkIGRyaXZlcnMgaW4gdGhlIGRyaXZlciBwYXRoCgkjJHN5c3ByZXBfaW5mX2hhc2h7VW5hdHRlbmRlZH17VXBkYXRlVVBIQUx9ID0gJyc7ICAgICAgICAgICAgICAgICAgICAgICMgSWRlbnRpZmllcyB0aGUgcHJvY2Vzc29yIHR5cGUgYW5kIGxvYWRzIHRoZSBhcHByb3ByaWF0ZSBrZXJuZWwKCQoJIyBbR3VpVW5hdHRlbmRlZF0gLSBjb25maWd1cmF0aW9uIGZvciB0aGUgR1VJIHN0YWdlIG9mIFNldHVwL1N5c3ByZXAKCSRzeXNwcmVwX2luZl9oYXNoe0d1aVVuYXR0ZW5kZWR9e0FkbWluUGFzc3dvcmR9ID0gJyonOyAgICAgICAgICAgICAgICAgIyBTZXRzIHRoZSBBZG1pbmlzdHJhdG9yIGFjY291bnQgcGFzc3dvcmQKCSMkc3lzcHJlcF9pbmZfaGFzaHtHdWlVbmF0dGVuZGVkfXtBdXRvTG9nb259ID0gJyc7ICAgICAgICAgICAgICAgICAgICAgIyBDb25maWd1cmVzIHRoZSBjb21wdXRlciB0byBsb2cgb24gYXV0b21hdGljYWxseSB3aXRoIHRoZSBBZG1pbmlzdHJhdG9yIGFjY291bnQgb24gdGhlIGZpcnN0IHJlYm9vdAoJIyRzeXNwcmVwX2luZl9oYXNoe0d1aVVuYXR0ZW5kZWR9e0F1dG9Mb2dvbkNvdW50fSA9ICcnOyAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIGNvbXB1dGVyIGF1dG9tYXRpY2FsbHkgbG9ncyBvbiB1c2luZyB0aGUgc3BlY2lmaWVkIEFkbWluaXN0cmF0b3IgYWNjb3VudCBhbmQgcGFzc3dvcmQKCSRzeXNwcmVwX2luZl9oYXNoe0d1aVVuYXR0ZW5kZWR9e0VuY3J5cHRlZEFkbWluUGFzc3dvcmR9ID0gJ05vJzsgICAgICAgIyBFbmFibGVzIFNldHVwIHRvIGluc3RhbGwgZW5jcnlwdGVkIHBhc3N3b3JkcyBmb3IgdGhlIEFkbWluaXN0cmF0b3IgYWNjb3VudAoJJHN5c3ByZXBfaW5mX2hhc2h7R3VpVW5hdHRlbmRlZH17T0VNRHVwbGljYXRvclN0cmluZ30gPSAnVkNMJzsgICAgICAgICAjIFNwZWNpZmllcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkdXBsaWNhdGlvbiB1dGlsaXR5IHVzZWQsIGFzIHdlbGwgYXMgYW55IG90aGVyIGluZm9ybWF0aW9uIHRoYXQgYW4gT0VNIG9yIGFkbWluaXN0cmF0b3Igd2FudHMgdG8gc3RvcmUgaW4gdGhlIHJlZ2lzdHJ5Cgkkc3lzcHJlcF9pbmZfaGFzaHtHdWlVbmF0dGVuZGVkfXtPZW1Ta2lwUmVnaW9uYWx9ID0gJzEnOyAgICAgICAgICAgICAgICMgU3BlY2lmaWVzIHdoZXRoZXIgdW5hdHRlbmRlZCBTZXR1cCBza2lwcyB0aGUgUmVnaW9uYWwgYW5kIExhbmd1YWdlIE9wdGlvbnMgcGFnZSBpbiBHVUktbW9kZSBTZXR1cCBhbmQgTWluaS1TZXR1cAoJJHN5c3ByZXBfaW5mX2hhc2h7R3VpVW5hdHRlbmRlZH17T2VtU2tpcFdlbGNvbWV9ID0gJzEnOyAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyB3aGV0aGVyIHVuYXR0ZW5kZWQgU2V0dXAgc2tpcHMgdGhlIFdlbGNvbWUgcGFnZSBpbiBHVUktbW9kZSBTZXR1cCBhbmQgTWluaS1TZXR1cAoJJHN5c3ByZXBfaW5mX2hhc2h7R3VpVW5hdHRlbmRlZH17VGltZVpvbmV9ID0gJHRpbWVfem9uZV9jb2RlOyAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgdGltZSB6b25lIG9mIHRoZSBjb21wdXRlcidzIGxvY2F0aW9uCgkKCSMgW0Rpc3BsYXldIC0gZGlzcGxheS9ncmFwaGljcyBzZXR0aW5ncwoJJHN5c3ByZXBfaW5mX2hhc2h7RGlzcGxheX17Qml0c1BlclBlbH0gPSAnMzInOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgdmFsaWQgYml0cyBwZXIgcGl4ZWwgZm9yIHRoZSBncmFwaGljcyBkZXZpY2UKCSRzeXNwcmVwX2luZl9oYXNoe0Rpc3BsYXl9e1ZyZWZyZXNofSA9ICc3NSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgYSB2YWxpZCByZWZyZXNoIHJhdGUgZm9yIHRoZSBncmFwaGljcyBkZQoJJHN5c3ByZXBfaW5mX2hhc2h7RGlzcGxheX17WHJlc29sdXRpb259ID0gJzgwMCc7ICAgICAgICAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyBhIHZhbGlkIHggcmVzb2x1dGlvbiBmb3IgdGhlIGdyYXBoaWNzIGRldmljZQoJJHN5c3ByZXBfaW5mX2hhc2h7RGlzcGxheX17WXJlc29sdXRpb259ID0gJzYwMCc7ICAgICAgICAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyBhIHZhbGlkIHkgcmVzb2x1dGlvbiBmb3IgdGhlIGdyYXBoaWNzIGRldmljZQoJCgkjIFtHdWlSdW5PbmNlXSAtIGNvbW1hbmRzIHRvIGV4ZWN1dGUgdGhlIGZpcnN0IHRpbWUgYW4gZW5kIHVzZXIgbG9ncyBvbiB0byB0aGUgY29tcHV0ZXIgYWZ0ZXIgR1VJIHN0YWdlIGNvbXBsZXRlcwoJIyBDb21tYW5kcyBjYWxsZWQgaW4gdGhlIFtHdWlSdW5PbmNlXSBzZWN0aW9uIHByb2Nlc3Mgc3luY2hyb25vdXNseQoJIyBFYWNoIGFwcGxpY2F0aW9uIHJ1bnMgaW4gdGhlIG9yZGVyIGxpc3RlZCBpbiB0aGlzIHNlY3Rpb24KCSMgRWFjaCBjb21tYW5kIG11c3QgZmluaXNoIGJlZm9yZSB5b3UgcnVuIHRoZSBuZXh0IGNvbW1hbmQKCSMkc3lzcHJlcF9pbmZfaGFzaHtHdWlSdW5PbmNlfSA9IFtdOwoJCgkjIFtJZGVudGlmaWNhdGlvbl0gLSBjb21wdXRlciBuZXR3b3JrIGlkZW50aWZpY2F0aW9uCgkjIElmIHRoZXNlIGVudHJpZXMgYXJlIG5vdCBwcmVzZW50LCBTZXR1cCBhZGRzIHRoZSBjb21wdXRlciB0byB0aGUgZGVmYXVsdCB3b3JrZ3JvdXAKCSMkc3lzcHJlcF9pbmZfaGFzaHtJZGVudGlmaWNhdGlvbn17RG9tYWluQWRtaW59ID0gJyc7ICAgICAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHVzZXIgYWNjb3VudCBpbiB0aGUgZG9tYWluIHRoYXQgaGFzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgY29tcHV0ZXIgYWNjb3VudCBpbiB0aGF0IGRvbWFpbgoJIyRzeXNwcmVwX2luZl9oYXNoe0lkZW50aWZpY2F0aW9ufXtEb21haW5BZG1pblBhc3N3b3JkfSA9ICcnOyAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgcGFzc3dvcmQgb2YgdGhlIHVzZXIgYWNjb3VudCBhcyBkZWZpbmVkIGJ5IHRoZSBEb21haW5BZG1pbiBlbnRyeQoJIyRzeXNwcmVwX2luZl9oYXNoe0lkZW50aWZpY2F0aW9ufXtKb2luRG9tYWlufSA9ICcnOyAgICAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZG9tYWluIGluIHdoaWNoIHRoZSBjb21wdXRlciBwYXJ0aWNpcGF0ZXMKCSRzeXNwcmVwX2luZl9oYXNoe0lkZW50aWZpY2F0aW9ufXtKb2luV29ya2dyb3VwfSA9ICdWQ0wnOyAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHdvcmtncm91cCBpbiB3aGljaCB0aGUgY29tcHV0ZXIgcGFydGljaXBhdGVzCgkjJHN5c3ByZXBfaW5mX2hhc2h7SWRlbnRpZmljYXRpb259e01hY2hpbmVPYmplY3RPVX0gPSAnJzsgICAgICAgICAgICAgICMgU3BlY2lmaWVzIHRoZSBmdWxsIExEQVAgcGF0aCBuYW1lIG9mIHRoZSBPVSBpbiB3aGljaCB0aGUgY29tcHV0ZXIgYmVsb25ncwoJCgkjIAoJIyRzeXNwcmVwX2luZl9oYXNoe0lFSGFyZGVuaW5nfXtMb2NhbEludHJhbmV0U2l0ZXN9ID0gJyc7ICAgICAgICAgICAgICAjIExvY2FsIGludHJhbmV0IHNpdGVzIHdob3NlIGNvbnRlbnQgeW91IHRydXN0CgkjJHN5c3ByZXBfaW5mX2hhc2h7SUVIYXJkZW5pbmd9e1RydXN0ZWRTaXRlc30gPSAnJzsgICAgICAgICAgICAgICAgICAgICMgSW50ZXJuZXQgc2l0ZXMgd2hvc2UgY29udGVudCB5b3UgdHJ1c3QKCQoJIyBbSUVQb3B1cEJsb2NrZXJdIC0gSUUgcG9wLXVwIGJsb2NrZXIgc2V0dGluZ3MKCSMkc3lzcHJlcF9pbmZfaGFzaHtJRVBvcHVwQmxvY2tlcn17QWxsb3dlZFNpdGVzfSA9ICcnOyAgICAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgdGhlIHNpdGVzIGFsbG93ZWQgYnkgUG9wLXVwIEJsb2NrZXIKCSMkc3lzcHJlcF9pbmZfaGFzaHtJRVBvcHVwQmxvY2tlcn17QmxvY2tQb3B1cHN9ID0gJyc7ICAgICAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gYmxvY2sgcG9wLXVwcwoJIyRzeXNwcmVwX2luZl9oYXNoe0lFUG9wdXBCbG9ja2VyfXtGaWx0ZXJMZXZlbH0gPSAnJzsgICAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgbGV2ZWwgb2YgUG9wLXVwIEJsb2NrZXIgZmlsdGVyaW5nCgkjJHN5c3ByZXBfaW5mX2hhc2h7SUVQb3B1cEJsb2NrZXJ9e1Nob3dJbmZvcm1hdGlvbkJhcn0gPSAnJzsgICAgICAgICAgICMgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNob3cgdGhlIEluZm9ybWF0aW9uIEJhciB3aGVuIHBvcC11cHMgYXJlIGJsb2NrZWQKCQoJIyBbTGljZW5zZUZpbGVQcmludERhdGFdIC0gbGljZW5zaW5nIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBXaW5kb3dzIFNlcnZlciAyMDAzCgkkc3lzcHJlcF9pbmZfaGFzaHtMaWNlbnNlRmlsZVByaW50RGF0YX17QXV0b01vZGV9ID0gJ1BlclNlYXQnOyAgICAgICAgICMgRGV0ZXJtaW5lcyBwZXItc2VhdCBvciBhIHBlci1zZXJ2ZXIgbGljZW5zZSBtb2RlCgkjJHN5c3ByZXBfaW5mX2hhc2h7TGljZW5zZUZpbGVQcmludERhdGF9e0F1dG9Vc2Vyc30gPSAnJzsgICAgICAgICAgICAgICMgSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY2xpZW50IGxpY2Vuc2VzIHB1cmNoYXNlZCBmb3IgdGhlIHNlcnZlcgoJCgkjIFtOZXR3b3JraW5nXSAtIGNvbnRhaW5zIG5vIGVudHJpZXMKCSMgVG8gdXNlIFN5c3ByZXAgeW91IG11c3QgaW5jbHVkZSB0aGUgW05ldHdvcmtpbmddIHNlY3Rpb24gbmFtZSBpbiB5b3VyIGFuc3dlciBmaWxlCgkkc3lzcHJlcF9pbmZfaGFzaHtOZXR3b3JraW5nfXtJbnN0YWxsRGVmYXVsdENvbXBvbmVudHN9ID0gJ1llcyc7CgkKCSMgW1JlZ2lvbmFsU2V0dGluZ3NdIC0gcmVnaW9uYWwvaW50ZXJuYXRpb25hbCBzZXR0aW5ncwoJIyRzeXNwcmVwX2luZl9oYXNoe1JlZ2lvbmFsU2V0dGluZ3N9e0lucHV0TG9jYWxlfSA9ICcnOyAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgaW5wdXQgbG9jYWxlIGFuZCBrZXlib2FyZCBsYXlvdXQgY29tYmluYXRpb25zIHRvIGluc3RhbGwKCSMkc3lzcHJlcF9pbmZfaGFzaHtSZWdpb25hbFNldHRpbmdzfXtJbnB1dExvY2FsZV9EZWZhdWx0VXNlcn0gPSAnJzsgICAgIyBTcGVjaWZpZXMgdGhlIGlucHV0IGxvY2FsZSBhbmQga2V5Ym9hcmQgbGF5b3V0IGNvbWJpbmF0aW9uIGZvciB0aGUgZGVmYXVsdCB1c2VyCgkjJHN5c3ByZXBfaW5mX2hhc2h7UmVnaW9uYWxTZXR0aW5nc317TGFuZ3VhZ2V9ID0gJyc7ICAgICAgICAgICAgICAgICAgICMgU3BlY2lmaWVzIHRoZSBsYW5ndWFnZS9sb2NhbGUgdG8gaW5zdGFsbAoJIyRzeXNwcmVwX2luZl9oYXNoe1JlZ2lvbmFsU2V0dGluZ3N9e0xhbmd1YWdlR3JvdXB9ID0gJyc7ICAgICAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgbGFuZ3VhZ2UgZ3JvdXAgZm9yIHRoaXMgaW5zdGFsbGF0aW9uCgkjJHN5c3ByZXBfaW5mX2hhc2h7UmVnaW9uYWxTZXR0aW5nc317U3lzdGVtTG9jYWxlfSA9ICcnOyAgICAgICAgICAgICAgICMgU3BlY2lmaWVzIHRoZSBzeXN0ZW0gbG9jYWxlIHRvIGluc3RhbGwKCSMkc3lzcHJlcF9pbmZfaGFzaHtSZWdpb25hbFNldHRpbmdzfXtVc2VyTG9jYWxlfSA9ICcnOyAgICAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgdGhlIHVzZXIgbG9jYWxlIHRvIGluc3RhbGwKCSMkc3lzcHJlcF9pbmZfaGFzaHtSZWdpb25hbFNldHRpbmdzfXtVc2VyTG9jYWxlX0RlZmF1bHRVc2VyfSA9ICcnOyAgICAgIyBTcGVjaWZpZXMgdGhlIHVzZXIgbG9jYWxlIGZvciB0aGUgZGVmYXVsdCB1c2VyCgkKCSMgW1RhcGlMb2NhdGlvbl0gLSB0ZWxlcGhvbnkgQVBJIChUQVBJKSBzZXR0aW5ncwoJIyBJdCBpcyB2YWxpZCBvbmx5IGlmIGEgbW9kZW0gaXMgcHJlc2VudCBvbiB0aGUgY29tcHV0ZXIKCSMkc3lzcHJlcF9pbmZfaGFzaHtUYXBpTG9jYXRpb259e0FyZWFDb2RlfSA9ICcnOyAgICAgICAgICAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgdGhlIGFyZWEgY29kZSBmb3IgdGhlIGNvbXB1dGVyJ3MgbG9jYXRpb24KCSMkc3lzcHJlcF9pbmZfaGFzaHtUYXBpTG9jYXRpb259e0NvdW50cnlDb2RlfSA9ICcnOyAgICAgICAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgdGhlIGNvdW50cnkvcmVnaW9uIGNvZGUgdG8gdXNlIGZvciB0ZWxlcGhvbnkKCSMkc3lzcHJlcF9pbmZfaGFzaHtUYXBpTG9jYXRpb259e0RpYWxpbmd9ID0gJyc7ICAgICAgICAgICAgICAgICAgICAgICAgIyBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgZGlhbGluZyB0byB1c2UgZm9yIHRoZSB0ZWxlcGhvbnkgZGV2aWNlIGluIHRoZSBjb21wdXRlcgoJIyRzeXNwcmVwX2luZl9oYXNoe1RhcGlMb2NhdGlvbn17TG9uZ0Rpc3RhbmNlQWNjZXNzfSA9ICcnOyAgICAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgbnVtYmVyIHRvIGRpYWwgdG8gZ2FpbiBhY2Nlc3MgdG8gYW4gb3V0c2lkZSBsaW5lLCBzdWNoIGFzIDkKCQoJIyBbVXNlckRhdGFdIC0gdXNlciBpZGVudGlmaWNhdGlvbiBzZXR0aW5ncwoJJHN5c3ByZXBfaW5mX2hhc2h7VXNlckRhdGF9e0NvbXB1dGVyTmFtZX0gPSAnKic7ICAgICAgICAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgY29tcHV0ZXIgbmFtZQoJJHN5c3ByZXBfaW5mX2hhc2h7VXNlckRhdGF9e0Z1bGxOYW1lfSA9ICdWaXJ0dWFsIENvbXB1dGluZyBMYWInOyAgICAgICAjIFNwZWNpZmllcyB0aGUgZW5kIHVzZXKScyBmdWxsIG5hbWUKCSRzeXNwcmVwX2luZl9oYXNoe1VzZXJEYXRhfXtPcmdOYW1lfSA9ICRpbWFnZV9hZmZpbGlhdGlvbl9uYW1lOyAgICAgICAgIyBTcGVjaWZpZXMgYW4gb3JnYW5pemF0aW9uknMgbmFtZQoJJHN5c3ByZXBfaW5mX2hhc2h7VXNlckRhdGF9e1Byb2R1Y3RLZXl9ID0gJHByb2R1Y3Rfa2V5OyAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgUHJvZHVjdCBLZXkgZm9yIGVhY2ggdW5pcXVlIGluc3RhbGxhdGlvbiBvZiBXaW5kb3dzCgkKCSMgW1N5c3ByZXBdIHNlY3Rpb24gY29udGFpbnMgYW4gZW50cnkgZm9yIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGluZyB0aGUgZW50cmllcyBpbiB0aGUgcHJlLWV4aXN0aW5nIFtTeXNwcmVwTWFzc1N0b3JhZ2VdIHNlY3Rpb24gYW5kIHRoZW4gaW5zdGFsbGluZyB0aG9zZSBtYXNzLXN0b3JhZ2UgY29udHJvbGxlcnMKCSMkc3lzcHJlcF9pbmZfaGFzaHtTeXNwcmVwfXtCdWlsZE1hc3NTdG9yYWdlU2VjdGlvbn0gPSAnJzsgICAgICAgICAgICAgIyBHZW5lcmF0ZXMgdGhlIGVudHJpZXMgaW4gdGhlIFtTeXNwcmVwTWFzc1N0b3JhZ2VdIHNlY3Rpb24KCSMKCSMgW1N5c3ByZXBNYXNzU3RvcmFnZV0gY29udGFpbnMgYW4gZW50cnkgZm9yIGlkZW50aWZ5aW5nIHRoZSBkaWZmZXJlbnQgbWFzcy1zdG9yYWdlIGNvbnRyb2xsZXJzCgkjIFN5c3ByZXAgcHJlcG9wdWxhdGVzIHRoZSBuZWNlc3NhcnkgZHJpdmVyIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSBlbnRyaWVzIHRoYXQgeW91IHByb3ZpZGUKCSMgUmVxdWlyZWQgc28gdGhhdCB0aGUgY29ycmVjdCBkcml2ZXJzIHdpbGwgYmUgbG9hZGVkIHdoZW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3RhcnRzIG9uIGEgY29tcHV0ZXIgdGhhdCB1c2VzIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCBtYXNzLXN0b3JhZ2UgY29udHJvbGxlcnMKCSMkc3lzcHJlcF9pbmZfaGFzaHtTeXNwcmVwTWFzc1N0b3JhZ2V9ID0gW107CgkKCW15ICRzeXNwcmVwX2NvbnRlbnRzOwoJJHN5c3ByZXBfY29udGVudHMgLj0gIjsgc3lzcHJlcC5pbmYgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBWQ0xcclxuIjsKCSRzeXNwcmVwX2NvbnRlbnRzIC49ICI7ICIgLiBsb2NhbHRpbWUoKSAuICJcclxuIjsKCQoJZm9yZWFjaCBteSAkc3lzcHJlcF9zZWN0aW9uIChrZXlzICVzeXNwcmVwX2luZl9oYXNoKSB7CgkJJHN5c3ByZXBfY29udGVudHMgLj0gIlskc3lzcHJlcF9zZWN0aW9uXVxuIjsKCQkKCQlmb3JlYWNoIG15ICRzeXNwcmVwX3Byb3BlcnR5IChrZXlzICV7JHN5c3ByZXBfaW5mX2hhc2h7JHN5c3ByZXBfc2VjdGlvbn19KSB7CgkJCW15ICRzeXNwcmVwX3ZhbHVlID0gJHN5c3ByZXBfaW5mX2hhc2h7JHN5c3ByZXBfc2VjdGlvbn17JHN5c3ByZXBfcHJvcGVydHl9OwoJCQkkc3lzcHJlcF9jb250ZW50cyAuPSAiJHN5c3ByZXBfcHJvcGVydHk9JHN5c3ByZXBfdmFsdWVcbiIgaWYgJHN5c3ByZXBfdmFsdWU7CgkJfQoJCQoJCSRzeXNwcmVwX2NvbnRlbnRzIC49ICJcbiI7Cgl9CgkKCSMgQWRkIHRoZSBTeXNwcmVwTWFzc1N0b3JhZ2Ugc2VjdGlvbgoJbXkgJG1hc3Nfc3RvcmFnZV9zZWN0aW9uID0gJHNlbGYtPmdldF9zeXNwcmVwX2luZl9tYXNzX3N0b3JhZ2Vfc2VjdGlvbigpOwoJaWYgKCRtYXNzX3N0b3JhZ2Vfc2VjdGlvbikgewoJCSRzeXNwcmVwX2NvbnRlbnRzIC49ICJbU3lzcHJlcE1hc3NTdG9yYWdlXVxuJG1hc3Nfc3RvcmFnZV9zZWN0aW9uIjsKCX0KCWVsc2lmICghZGVmaW5lZCgkbWFzc19zdG9yYWdlX3NlY3Rpb24pKSB7CgkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgInVuYWJsZSB0byBidWlsZCBzeXNwcmVwLmluZiBTeXNwcmVwTWFzc1N0b3JhZ2Ugc2VjdGlvbiIpOwoJCXJldHVybjsKCX0KCQoJCgkjIFJlcGxhY2UgVW5peFxMaW51eCBuZXdsaW5lcyB3aXRoIFdpbmRvd3MgbmV3bGluZXMKCSRzeXNwcmVwX2NvbnRlbnRzID1+IHMvXG4vXHJcbi9nOwoJCglub3RpZnkoJEVSUk9SU3snREVCVUcnfSwgMCwgInN5c3ByZXAuaW5mIGNvbnRlbnRzOlxuJHN5c3ByZXBfY29udGVudHMiKTsKCXJldHVybiAkc3lzcHJlcF9jb250ZW50czsKfQoKIy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKPWhlYWQyIGdldF9zeXNwcmVwX2luZl9tYXNzX3N0b3JhZ2Vfc2VjdGlvbgoKIFBhcmFtZXRlcnMgIDogTm9uZQogUmV0dXJucyAgICAgOiBJZiBzdWNjZXNzZnVsOiBzdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYSBzeXNwcmVwLmluZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXNwcmVwTWFzc1N0b3JhZ2Ugc2VjdGlvbgogICAgICAgICAgICAgICBJZiBmYWlsZWQ6IGZhbHNlCiBEZXNjcmlwdGlvbiA6IEdlbmVyYXRlcyB0aGUgU3lzcHJlcE1hc3NTdG9yYWdlIHNlY3Rpb24gb2YgYSBzeXNwcmVwLmluZiBmaWxlLgogICAgICAgICAgICAgICBTdG9yYWdlIGRyaXZlciAuaW5mIGZpbGVzIGFyZSBmaXJzdCBsb2NhdGVkIGFuZCByZWFkLiBUaGUgc3RvcmFnZQogICAgICAgICAgICAgICBoYXJkd2FyZSBJRHMgYXJlIHJldHJpZXZlZCBmcm9tIHRoZSAuaW5mIGZpbGVzIGFuZCB0aGUKICAgICAgICAgICAgICAgU3lzcHJlcE1hc3NTdG9yYWdlIHNlY3Rpb24gaXMgY3JlYXRlZCBkeW5hbWljYWxseS4KCj1jdXQKCnN1YiBnZXRfc3lzcHJlcF9pbmZfbWFzc19zdG9yYWdlX3NlY3Rpb24gewoJbXkgJHNlbGYgPSBzaGlmdDsKCWlmIChyZWYoJHNlbGYpICF+IC93aW5kb3dzL2kpIHsKCQlub3RpZnkoJEVSUk9SU3snQ1JJVElDQUwnfSwgMCwgInN1YnJvdXRpbmUgd2FzIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBpdCBtdXN0IGJlIGNhbGxlZCBhcyBhIGNsYXNzIG1ldGhvZCIpOwoJCXJldHVybjsKCX0KCQoJbXkgJGRyaXZlcnNfZGlyZWN0b3J5ID0gJHNlbGYtPmdldF9ub2RlX2NvbmZpZ3VyYXRpb25fZGlyZWN0b3J5KCkgLiAnL0RyaXZlcnMnOwoJCgkjIEZpbmQgdGhlIHBhdGhzIG9mIC5pbmYgZmlsZXMgaW4gdGhlIGRyaXZlcnMgZGlyZWN0b3J5IHdpdGggYSBDbGFzcz1TQ1NJQWRhcHRlciBvciBIREMgbGluZQoJIyBUaGVzZSBhcmUgdGhlIHN0b3JhZ2UgZHJpdmVyIC5pbmYgZmlsZXMKCW15IEBzdG9yYWdlX2luZl9wYXRocyA9ICRzZWxmLT5nZXRfZHJpdmVyX2luZl9wYXRocygnc2NzaWFkYXB0ZXInKTsKCSNteSBAc3RvcmFnZV9pbmZfcGF0aHMgPSAkc2VsZi0+Z2V0X2RyaXZlcl9pbmZfcGF0aHMoJyhzY3NpYWRhcHRlcnxoZGMpJyk7CglpZiAoIUBzdG9yYWdlX2luZl9wYXRocykgewoJCW5vdGlmeSgkRVJST1JTeydPSyd9LCAwLCAibm8gc3RvcmFnZSBkcml2ZXIgLmluZiBwYXRocyB3ZXJlIGZvdW5kIik7CgkJcmV0dXJuICcnOwoJfQoJCgkjIEV4dHJhY3QgaGFyZHdhcmUgSURzIGZyb20gZWFjaCBzdG9yYWdlIGRyaXZlciAuaW5mIGZpbGUgCgkjIExvb2tpbmcgZm9yIGxpbmVzIGxpa2UgdGhpczoKCSMgICAgJU15RGV2JSA9IG15ZGV2SW5zdGFsbCxteWRldkh3aWQKCSMgICAgJURldkRlc2NEMiUgPSBTWU1NUElfSW5zdCwgUENJXFZFTl8xMDAwJkRFVl8wMDU0JlNVQlNZU18xRjA1MTAyOAoJIyBBc3NlbWJsZSB0aGUgbGluZXMgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIHRoZSBzeXNwcmVwLmluZiBbU3lzcHJlcE1hc3NTdG9yYWdlXSBzZWN0aW9uCgkjIEZvcm1hdDoKCSMgICAgbXlkZXZId2lkID0gIjwuaW5mIHBhdGg+IgoJbXkgJG1hc3Nfc3RvcmFnZV9zZWN0aW9uOwoJZm9yIG15ICRzdG9yYWdlX2luZl9wYXRoIChAc3RvcmFnZV9pbmZfcGF0aHMpIHsKCQlteSBAaHdpZF9saW5lczsKCQlteSAkZ3JlcF9od2lkX2NvbW1hbmQgLj0gJy91c3IvYmluL2dyZXAgLUUgIixbIF0qUENJLlZFTlteXHNdKiIgJyAuICRzdG9yYWdlX2luZl9wYXRoOwoJCW15ICgkZ3JlcF9od2lkX2V4aXRfc3RhdHVzLCAkZ3JlcF9od2lkX291dHB1dCkgPSAkc2VsZi0+ZXhlY3V0ZSgkZ3JlcF9od2lkX2NvbW1hbmQsIDEpOwoJCWlmIChkZWZpbmVkKCRncmVwX2h3aWRfZXhpdF9zdGF0dXMpICYmICRncmVwX2h3aWRfZXhpdF9zdGF0dXMgPT0gMCkgewoJCQlAaHdpZF9saW5lcyA9IEAkZ3JlcF9od2lkX291dHB1dDsKCQkJbm90aWZ5KCRFUlJPUlN7J0RFQlVHJ30sIDAsICJmb3VuZCBoYXJkd2FyZSBJRCBsaW5lcyBpbiAkc3RvcmFnZV9pbmZfcGF0aDpcbiIgLiBqb2luKCJcbiIsIEBod2lkX2xpbmVzKSk7CgkJfQoJCWVsc2lmICgkZ3JlcF9od2lkX2V4aXRfc3RhdHVzKSB7CgkJCW5vdGlmeSgkRVJST1JTeydXQVJOSU5HJ30sIDAsICJmYWlsZWQgdG8gZmluZCBoYXJkd2FyZSBJRCBsaW5lcyBpbiAkc3RvcmFnZV9pbmZfcGF0aCwgZXhpdCBzdGF0dXM6ICRncmVwX2h3aWRfZXhpdF9zdGF0dXMsIG91dHB1dDpcbkB7JGdyZXBfaHdpZF9vdXRwdXR9Iik7CgkJCXJldHVybjsKCQl9CgkJZWxzZSB7CgkJCW5vdGlmeSgkRVJST1JTeydXQVJOSU5HJ30sIDAsICJmYWlsZWQgdG8gcnVuIFNTSCBjb21tYW5kIHRvIGZpbmQgaGFyZHdhcmUgSUQgbGluZXMgaW4gJHN0b3JhZ2VfaW5mX3BhdGgiKTsKCQkJcmV0dXJuOwoJCX0KCQkKCQkjIENvbnZlcnQgdGhlIC5pbmYgcGF0aCB0byBET1MgZm9ybWF0IHdpdGggYmFja3NsYXNoZXMKCQkobXkgJHN0b3JhZ2VfaW5mX3BhdGhfZG9zID0gJHN0b3JhZ2VfaW5mX3BhdGgpID1+IHMvXC8vXFwvZzsKCQkKCQkjIExvb3AgdGhyb3VnaCB0aGUgaGFyZHdhcmUgSURzLCBhc3NlbWJsZSBhIG1hc3Mgc3RvcmFnZSBzZWN0aW9uIGxpbmUgZm9yIGVhY2gKCQlmb3IgbXkgJGh3aWRfbGluZSAoQGh3aWRfbGluZXMpIHsKCQkJIyBFeHRyYWN0IHRoZSBoYXJkd2FyZSBJRCBzZWN0aW9uIGZyb20gdGhlIGxpbmUKCQkJJGh3aWRfbGluZSA9fiAvLFxzKihQQ0kuKikvOwoJCQlteSAkaHdpZCA9ICQxOwoJCQkKCQkJIyBSZW1vdmUgc3BhY2VzIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBoYXJkd2FyZSBJRAoJCQkjIEN5Z3dpbiBncmVwIGRvZXNuJ3QgY2F0Y2ggXHIgYXMgYmVpbmcgaW5jbHVkZWQgaW4gXHMKCQkJJGh3aWQgPX4gcy8oXlxzKnxccyokKS8vZzsKCQkJCgkJCSMgQXNzZW1ibGUgdGhlIG1hc3Mgc3RvcmFnZSBsaW5lIGFuZCBhZGQgaXQgdG8gdGhlIHNlY3Rpb24sIHB1dCAuaW5mIHBhdGggaW4gcXVvdGVzCgkJCSRtYXNzX3N0b3JhZ2Vfc2VjdGlvbiAuPSAiJGh3aWQgPSBcIiRzdG9yYWdlX2luZl9wYXRoX2Rvc1wiXG4iOwoJCX0KCX0KCQoJI25vdGlmeSgkRVJST1JTeydERUJVRyd9LCAwLCAiYnVpbHQgc3lzcHJlcC5pbmYgU3lzcHJlcE1hc3NTdG9yYWdlIHNlY3Rpb246XG4kbWFzc19zdG9yYWdlX3NlY3Rpb24iKTsKCXJldHVybiAkbWFzc19zdG9yYWdlX3NlY3Rpb247Cn0KCiMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCj1oZWFkMiBmaXJld2FsbF9lbmFibGVfc2Vzc21ncgoKIFBhcmFtZXRlcnMgIDogCiBSZXR1cm5zICAgICA6IDEgaWYgc3VjY2VlZGVkLCAwIG90aGVyd2lzZQogRGVzY3JpcHRpb24gOiAKCj1jdXQKCnN1YiBmaXJld2FsbF9lbmFibGVfc2Vzc21nciB7CglteSAkc2VsZiA9IHNoaWZ0OwoJaWYgKHJlZigkc2VsZikgIX4gL3dpbmRvd3MvaSkgewoJCW5vdGlmeSgkRVJST1JTeydDUklUSUNBTCd9LCAwLCAic3Vicm91dGluZSB3YXMgY2FsbGVkIGFzIGEgZnVuY3Rpb24sIGl0IG11c3QgYmUgY2FsbGVkIGFzIGEgY2xhc3MgbWV0aG9kIik7CgkJcmV0dXJuOwoJfQoJCglteSAkc3lzdGVtMzJfcGF0aCA9ICRzZWxmLT5nZXRfc3lzdGVtMzJfcGF0aCgpOwoJCgkjIENvbmZpZ3VyZSB0aGUgZmlyZXdhbGwgdG8gYWxsb3cgdGhlIHNlc3NtZ3IuZXhlIHByb2dyYW0KCW15ICRuZXRzaF9jb21tYW5kID0gIiRzeXN0ZW0zMl9wYXRoL25ldHNoLmV4ZSBmaXJld2FsbCBzZXQgYWxsb3dlZHByb2dyYW0gbmFtZSA9IFwiTWljcm9zb2Z0IFJlbW90ZSBEZXNrdG9wIEhlbHAgU2Vzc2lvbiBNYW5hZ2VyXCIgbW9kZSA9IEVOQUJMRSBzY29wZSA9IEFMTCBwcm9maWxlID0gQUxMIHByb2dyYW0gPSBcIiRzeXN0ZW0zMl9wYXRoL3Nlc3NtZ3IuZXhlXCIiOwoJbXkgKCRuZXRzaF9zdGF0dXMsICRuZXRzaF9vdXRwdXQpID0gJHNlbGYtPmV4ZWN1dGUoJG5ldHNoX2NvbW1hbmQpOwoJaWYgKGRlZmluZWQoJG5ldHNoX3N0YXR1cykgJiYgJG5ldHNoX3N0YXR1cyA9PSAwKSB7CgkJbm90aWZ5KCRFUlJPUlN7J0RFQlVHJ30sIDAsICJjb25maWd1cmVkIGZpcmV3YWxsIHRvIGFsbG93IHNlc3NtZ3IuZXhlIik7Cgl9CgllbHNpZiAoZGVmaW5lZCgkbmV0c2hfc3RhdHVzKSkgewoJCW5vdGlmeSgkRVJST1JTeydXQVJOSU5HJ30sIDAsICJmYWlsZWQgdG8gY29uZmlndXJlIGZpcmV3YWxsIHRvIGFsbG93IHNlc3NtZ3IuZXhlLCBleGl0IHN0YXR1czogJG5ldHNoX3N0YXR1cywgb3V0cHV0OlxuQHskbmV0c2hfb3V0cHV0fSIpOwoJfQoJZWxzZSB7CgkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgInVuYWJsZSB0byBydW4gc3NoIGNvbW1hbmQgdG8gY29uZmlndXJlIGZpcmV3YWxsIHRvIGFsbG93IHNlc3NtZ3IuZXhlIik7Cgl9CgkKCXJldHVybiAxOwp9CgojLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgo9aGVhZDIgc2FuaXRpemVfZmlsZXMKCiBQYXJhbWV0ZXJzICA6IG5vbmUKIFJldHVybnMgICAgIDogYm9vbGVhbgogRGVzY3JpcHRpb24gOiBSZW1vdmVzIHRoZSBXaW5kb3dzIHJvb3QgcGFzc3dvcmQgZnJvbSBmaWxlcyBvbiB0aGUgY29tcHV0ZXIuCgo9Y3V0CgpzdWIgc2FuaXRpemVfZmlsZXMgewoJbXkgJHNlbGYgPSBzaGlmdDsKCXVubGVzcyAocmVmKCRzZWxmKSAmJiAkc2VsZi0+aXNhKCdWQ0w6Ok1vZHVsZScpKSB7CgkJbm90aWZ5KCRFUlJPUlN7J0NSSVRJQ0FMJ30sIDAsICJzdWJyb3V0aW5lIHdhcyBjYWxsZWQgYXMgYSBmdW5jdGlvbiwgaXQgbXVzdCBiZSBjYWxsZWQgYXMgYSBjbGFzcyBtZXRob2QiKTsKCQlyZXR1cm47Cgl9CgkKCW15IEBmaWxlX3BhdGhzID0gKAoJCSckU1lTVEVNRFJJVkUvU3lzcHJlcCcsCgkpOwoJCgkjIENhbGwgdGhlIHN1YnJvdXRpbmUgaW4gV2luZG93cy5wbQoJcmV0dXJuICRzZWxmLT5TVVBFUjo6c2FuaXRpemVfZmlsZXMoQGZpbGVfcGF0aHMpOwp9CgojLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgo9aGVhZDIgZGlzYWJsZV9zbGVlcAoKIFBhcmFtZXRlcnMgIDogTm9uZQogUmV0dXJucyAgICAgOiBJZiBzdWNjZXNzZnVsOiB0cnVlCiAgICAgICAgICAgICAgIElmIGZhaWxlZDogZmFsc2UKIERlc2NyaXB0aW9uIDogRGlzYWJsZXMgdGhlIHNsZWVwIHBvd2VyIG1vZGUuCgo9Y3V0CgpzdWIgZGlzYWJsZV9zbGVlcCB7CglteSAkc2VsZiA9IHNoaWZ0OwoJdW5sZXNzIChyZWYoJHNlbGYpICYmICRzZWxmLT5pc2EoJ1ZDTDo6TW9kdWxlJykpIHsKCQlub3RpZnkoJEVSUk9SU3snQ1JJVElDQUwnfSwgMCwgInN1YnJvdXRpbmUgY2FuIG9ubHkgYmUgY2FsbGVkIGFzIGEgVkNMOjpNb2R1bGUgbW9kdWxlIG9iamVjdCBtZXRob2QiKTsKCQlyZXR1cm47CQoJfQoJCglteSAkc3lzdGVtMzJfcGF0aCA9ICRzZWxmLT5nZXRfc3lzdGVtMzJfcGF0aCgpIHx8IHJldHVybjsKCQoJbXkgJHF1ZXJ5X2NvbW1hbmQgPSAiJHN5c3RlbTMyX3BhdGgvcG93ZXJjZmcuZXhlIC9RVUVSWSI7CglteSAoJHF1ZXJ5X2V4aXRfc3RhdHVzLCAkcXVlcnlfb3V0cHV0KSA9ICRzZWxmLT5leGVjdXRlKCRxdWVyeV9jb21tYW5kLCAxKTsKCWlmICghZGVmaW5lZCgkcXVlcnlfb3V0cHV0KSkgewoJCW5vdGlmeSgkRVJST1JTeydXQVJOSU5HJ30sIDAsICJmYWlsZWQgdG8gcnVuIFNTSCBjb21tYW5kIHRvIHJldHJpZXZlIHBvd2VyIHNjaGVtZSBuYW1lIik7CgkJcmV0dXJuOwoJfQoJCgkjIEpvaW4gdGhlIHBvd2VyY2ZnLmV4ZSBvdXRwdXQgbGluZXMgaW50byBhIHN0cmluZyB0aGVuIHBhcnNlIHRoZSBsaW5lIGJlZ2lubmluZyB3aXRoICdOYW1lICcKCWpvaW4oIlxuIiwgQCRxdWVyeV9vdXRwdXQpID1+IC9OYW1lXHMrKC4qKS87CglteSAkc2NoZW1lX25hbWUgPSAkMTsKCWlmICghJHNjaGVtZV9uYW1lKSB7CgkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgImZhaWxlZCB0byByZXRyaWV2ZSBwb3dlciBzY2hlbWUgbmFtZSBmcm9tIHBvd2VyY2ZnLmV4ZSBxdWVyeSBvdXRwdXQ6XG4iIC4gam9pbigiXG4iLCBAJHF1ZXJ5X291dHB1dCkpOwoJCXJldHVybjsKCX0KCW5vdGlmeSgkRVJST1JTeydERUJVRyd9LCAwLCAicmV0cmlldmVkIHBvd2VyIHNjaGVtZSBuYW1lOiAnJHNjaGVtZV9uYW1lJyIpOwoJCgkjIFJ1biBwb3dlcmNmZy5leGUgdG8gZGlzYWJsZSBzbGVlcAoJbXkgJHBvd2VyY2ZnX2NvbW1hbmQ7CgkkcG93ZXJjZmdfY29tbWFuZCAuPSAiJHN5c3RlbTMyX3BhdGgvcG93ZXJjZmcuZXhlIC9DSEFOR0UgXCIkc2NoZW1lX25hbWVcIiAvbW9uaXRvci10aW1lb3V0LWFjIDAgOyAiOwoJJHBvd2VyY2ZnX2NvbW1hbmQgLj0gIiRzeXN0ZW0zMl9wYXRoL3Bvd2VyY2ZnLmV4ZSAvQ0hBTkdFIFwiJHNjaGVtZV9uYW1lXCIgL21vbml0b3ItdGltZW91dC1kYyAwIDsgIjsKCSRwb3dlcmNmZ19jb21tYW5kIC49ICIkc3lzdGVtMzJfcGF0aC9wb3dlcmNmZy5leGUgL0NIQU5HRSBcIiRzY2hlbWVfbmFtZVwiIC9kaXNrLXRpbWVvdXQtYWMgMCA7ICI7CgkkcG93ZXJjZmdfY29tbWFuZCAuPSAiJHN5c3RlbTMyX3BhdGgvcG93ZXJjZmcuZXhlIC9DSEFOR0UgXCIkc2NoZW1lX25hbWVcIiAvZGlzay10aW1lb3V0LWRjIDAgOyAiOwoJJHBvd2VyY2ZnX2NvbW1hbmQgLj0gIiRzeXN0ZW0zMl9wYXRoL3Bvd2VyY2ZnLmV4ZSAvQ0hBTkdFIFwiJHNjaGVtZV9uYW1lXCIgL3N0YW5kYnktdGltZW91dC1hYyAwIDsgIjsKCSRwb3dlcmNmZ19jb21tYW5kIC49ICIkc3lzdGVtMzJfcGF0aC9wb3dlcmNmZy5leGUgL0NIQU5HRSBcIiRzY2hlbWVfbmFtZVwiIC9zdGFuZGJ5LXRpbWVvdXQtZGMgMCA7ICI7CgkkcG93ZXJjZmdfY29tbWFuZCAuPSAiJHN5c3RlbTMyX3BhdGgvcG93ZXJjZmcuZXhlIC9DSEFOR0UgXCIkc2NoZW1lX25hbWVcIiAvaGliZXJuYXRlLXRpbWVvdXQtYWMgMCA7ICI7CgkkcG93ZXJjZmdfY29tbWFuZCAuPSAiJHN5c3RlbTMyX3BhdGgvcG93ZXJjZmcuZXhlIC9DSEFOR0UgXCIkc2NoZW1lX25hbWVcIiAvaGliZXJuYXRlLXRpbWVvdXQtZGMgMCI7CgkKCW15ICgkcG93ZXJjZmdfZXhpdF9zdGF0dXMsICRwb3dlcmNmZ19vdXRwdXQpID0gJHNlbGYtPmV4ZWN1dGUoJHBvd2VyY2ZnX2NvbW1hbmQsIDEpOwoJaWYgKCFkZWZpbmVkKCRwb3dlcmNmZ19vdXRwdXQpKSB7CgkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgImZhaWxlZCB0byBydW4gU1NIIGNvbW1hbmQgdG8gZGlzYWJsZSBzbGVlcCIpOwoJCXJldHVybjsKCX0KCWVsc2lmIChncmVwKC8oZXJyb3J8aW52YWxpZHxub3QgZm91bmQpL2ksIEAkcG93ZXJjZmdfb3V0cHV0KSkgewoJCW5vdGlmeSgkRVJST1JTeydXQVJOSU5HJ30sIDAsICJmYWlsZWQgdG8gZGlzYWJsZSBzbGVlcCwgcG93ZXJjZmcuZXhlIG91dHB1dDpcbiIgLiBqb2luKCJcbiIsIEAkcG93ZXJjZmdfb3V0cHV0KSk7CgkJcmV0dXJuOwoJfQoJZWxzZSB7CgkJbm90aWZ5KCRFUlJPUlN7J09LJ30sIDAsICJkaXNhYmxlZCBzbGVlcCIpOwoJfQoJCglyZXR1cm4gMTsKfQoKIy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKPWhlYWQyIGhpYmVybmF0ZQoKIFBhcmFtZXRlcnMgIDogbm9uZQogUmV0dXJucyAgICAgOiBib29sZWFuCiBEZXNjcmlwdGlvbiA6IEhpYmVybmF0ZSB0aGUgY29tcHV0ZXIuCgo9Y3V0CgpzdWIgaGliZXJuYXRlIHsKCW15ICRzZWxmID0gc2hpZnQ7Cgl1bmxlc3MgKHJlZigkc2VsZikgJiYgJHNlbGYtPmlzYSgnVkNMOjpNb2R1bGUnKSkgewoJCW5vdGlmeSgkRVJST1JTeydDUklUSUNBTCd9LCAwLCAic3Vicm91dGluZSBjYW4gb25seSBiZSBjYWxsZWQgYXMgYSBWQ0w6Ok1vZHVsZSBtb2R1bGUgb2JqZWN0IG1ldGhvZCIpOwoJCXJldHVybjsKCX0KCQoJbXkgJGNvbXB1dGVyX25vZGVfbmFtZSA9ICRzZWxmLT5kYXRhLT5nZXRfY29tcHV0ZXJfbm9kZV9uYW1lKCk7CglteSAkc3lzdGVtMzJfcGF0aCA9ICRzZWxmLT5nZXRfc3lzdGVtMzJfcGF0aCgpIHx8IHJldHVybjsKCQoJaWYgKCEkc2VsZi0+ZW5hYmxlX2hpYmVybmF0aW9uKCkpIHsKCQlub3RpZnkoJEVSUk9SU3snV0FSTklORyd9LCAwLCAiZmFpbGVkIHRvIGhpYmVybmF0ZSAkY29tcHV0ZXJfbm9kZV9uYW1lLCBoaWJlcm5hdGlvbiBjb3VsZCBub3QgYmUgZW5hYmxlZCIpOwoJCXJldHVybjsKCX0KCQoJIyBSdW4gcG93ZXJjZmcuZXhlIHRvIGVuYWJsZSBoaWJlcm5hdGlvbgoJbXkgJGNvbW1hbmQgPSAiL2Jpbi9jeWdzdGFydC5leGUgXCRTWVNURU1ST09UL3N5c3RlbTMyL2NtZC5leGUgL2MgXCIkc3lzdGVtMzJfcGF0aC9ydW5kbGwzMi5leGUgcG93cnByb2YuZGxsLFNldFN1c3BlbmRTdGF0ZVwiIjsKCW15ICRzdGFydF90aW1lID0gdGltZTsKCW15ICgkZXhpdF9zdGF0dXMsICRvdXRwdXQpID0gJHNlbGYtPmV4ZWN1dGUoJGNvbW1hbmQpOwoJaWYgKCFkZWZpbmVkKCRvdXRwdXQpKSB7CgkJbm90aWZ5KCRFUlJPUlN7J1dBUk5JTkcnfSwgMCwgImZhaWxlZCB0byBleGVjdXRlIGNvbW1hbmQgdG8gaGliZXJuYXRlICRjb21wdXRlcl9ub2RlX25hbWUiKTsKCQlyZXR1cm47Cgl9CgllbHNpZiAoJGV4aXRfc3RhdHVzIGVxIDApIHsKCQlub3RpZnkoJEVSUk9SU3snT0snfSwgMCwgImV4ZWN1dGVkIGNvbW1hbmQgdG8gaGliZXJuYXRlICRjb21wdXRlcl9ub2RlX25hbWU6XG4kY29tbWFuZCIgLiAoc2NhbGFyKEAkb3V0cHV0KSA/ICJcbm91dHB1dDpcbiIgLiBqb2luKCJcbiIsIEAkb3V0cHV0KSA6ICcnKSk7Cgl9CgllbHNlIHsKCQlub3RpZnkoJEVSUk9SU3snV0FSTklORyd9LCAwLCAiZmFpbGVkIHRvIGhpYmVybmF0ZSAkY29tcHV0ZXJfbm9kZV9uYW1lLCBleGl0IHN0YXR1czogJGV4aXRfc3RhdHVzLCBvdXRwdXQ6XG4iIC4gam9pbigiXG4iLCBAJG91dHB1dCkpOwoJCXJldHVybjsKCX0KCQoJIyBXYWl0IGZvciB0aGUgY29tcHV0ZXIgdG8gc3RvcCByZXNwb25kaW5nCglteSAkd2FpdF9zZWNvbmRzID0gMzAwOwoJaWYgKCRzZWxmLT5wcm92aXNpb25lci0+d2FpdF9mb3JfcG93ZXJfb2ZmKCR3YWl0X3NlY29uZHMsIDMpKSB7CgkJbXkgJGR1cmF0aW9uID0gKHRpbWUgLSAkc3RhcnRfdGltZSk7CgkJbm90aWZ5KCRFUlJPUlN7J0RFQlVHJ30sIDAsICJoaWJlcm5hdGUgc3VjY2Vzc2Z1bCwgJGNvbXB1dGVyX25vZGVfbmFtZSBzdG9wcGVkIHJlc3BvbmRpbmcgYWZ0ZXIgJGR1cmF0aW9uIHNlY29uZHMiKTsKCQlyZXR1cm4gMTsKCX0KCWVsc2UgewoJCW5vdGlmeSgkRVJST1JTeydXQVJOSU5HJ30sIDAsICJmYWlsZWQgdG8gaGliZXJuYXRlICRjb21wdXRlcl9ub2RlX25hbWUsIHN0aWxsIHJlc3BvbmRpbmcgdG8gcGluZyBhZnRlciAkd2FpdF9zZWNvbmRzIHNlY29uZHMiKTsKCQlyZXR1cm47Cgl9Cn0KCiMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCjE7Cl9fRU5EX18KCj1oZWFkMSBTRUUgQUxTTwoKTDxodHRwOi8vY3dpa2kuYXBhY2hlLm9yZy9WQ0wvPgoKPWN1dAo=